[pkg-java] r2586 - in branches: . backport-util-concurrent backport-util-concurrent/upstream backport-util-concurrent/upstream/2.2 backport-util-concurrent/upstream/2.2/external backport-util-concurrent/upstream/2.2/src backport-util-concurrent/upstream/2.2/src/edu backport-util-concurrent/upstream/2.2/src/edu/emory backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/helpers backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/locks backport-util-concurrent/upstream/2.2/src/sun backport-util-concurrent/upstream/2.2/src/sun/misc backport-util-concurrent/upstream/2.2/test backport-util-concurrent/upstream/2.2/test/loops backport-util-concurrent/upstream/2.2/test/loops/src backport-util-concurrent/upstream/2.2/test/loops/words backport-util-concurrent/upstream/2.2/test/serialization backport-util-concurrent/upstream/2.2/test/tck backport-util-concurrent/upstream/2.2/test/tck/src

Marcus Better marcusb-guest at costa.debian.org
Tue Oct 10 08:59:30 UTC 2006


Author: marcusb-guest
Date: 2006-10-10 08:59:26 +0000 (Tue, 10 Oct 2006)
New Revision: 2586

Added:
   branches/backport-util-concurrent/
   branches/backport-util-concurrent/upstream/
   branches/backport-util-concurrent/upstream/2.2/
   branches/backport-util-concurrent/upstream/2.2/LEGAL
   branches/backport-util-concurrent/upstream/2.2/README.html
   branches/backport-util-concurrent/upstream/2.2/RECONCILED_ON
   branches/backport-util-concurrent/upstream/2.2/backport-util-concurrent.jpx
   branches/backport-util-concurrent/upstream/2.2/backport-util-concurrent.jpx.local
   branches/backport-util-concurrent/upstream/2.2/build-jbexport.xml
   branches/backport-util-concurrent/upstream/2.2/build.xml
   branches/backport-util-concurrent/upstream/2.2/external/
   branches/backport-util-concurrent/upstream/2.2/external/junit.jar
   branches/backport-util-concurrent/upstream/2.2/junit.library
   branches/backport-util-concurrent/upstream/2.2/license.html
   branches/backport-util-concurrent/upstream/2.2/src/
   branches/backport-util-concurrent/upstream/2.2/src/edu/
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/AbstractCollection.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/AbstractList.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/AbstractMap.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/AbstractQueue.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/AbstractSequentialList.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/AbstractSet.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/ArrayDeque.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/Arrays.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/Collections.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/Deque.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/LinkedList.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/NavigableMap.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/NavigableSet.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/PriorityQueue.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/Queue.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/TreeMap.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/TreeSet.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/AbstractExecutorService.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ArrayBlockingQueue.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/BlockingDeque.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/BlockingQueue.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/BrokenBarrierException.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/Callable.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/CancellationException.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/CompletionService.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ConcurrentHashMap.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ConcurrentLinkedQueue.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ConcurrentMap.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ConcurrentNavigableMap.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ConcurrentSkipListMap.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ConcurrentSkipListSet.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/CopyOnWriteArrayList.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/CopyOnWriteArraySet.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/CountDownLatch.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/CyclicBarrier.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/DelayQueue.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/Delayed.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/Exchanger.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ExecutionException.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/Executor.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ExecutorCompletionService.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ExecutorService.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/Executors.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/Future.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/FutureTask.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/LinkedBlockingDeque.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/LinkedBlockingQueue.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/PriorityBlockingQueue.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/RejectedExecutionException.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/RejectedExecutionHandler.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/RunnableFuture.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/RunnableScheduledFuture.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ScheduledExecutorService.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ScheduledFuture.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ScheduledThreadPoolExecutor.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/Semaphore.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/SynchronousQueue.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ThreadFactory.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ThreadPoolExecutor.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/TimeUnit.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/TimeoutException.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic/
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic/AtomicBoolean.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic/AtomicInteger.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic/AtomicIntegerArray.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic/AtomicLong.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic/AtomicLongArray.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic/AtomicMarkableReference.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic/AtomicReference.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic/AtomicReferenceArray.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic/AtomicStampedReference.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic/package.html
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/helpers/
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/helpers/FIFOWaitQueue.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/helpers/NanoTimer.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/helpers/ThreadHelpers.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/helpers/Utils.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/helpers/WaitQueue.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/helpers/package.html
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/locks/
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/locks/CondVar.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/locks/Condition.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/locks/FIFOCondVar.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/locks/Lock.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/locks/ReadWriteLock.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/locks/ReentrantLock.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/locks/ReentrantReadWriteLock.java
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/locks/package.html
   branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/package.html
   branches/backport-util-concurrent/upstream/2.2/src/sun/
   branches/backport-util-concurrent/upstream/2.2/src/sun/misc/
   branches/backport-util-concurrent/upstream/2.2/src/sun/misc/Perf.java
   branches/backport-util-concurrent/upstream/2.2/stripgenerics.pl
   branches/backport-util-concurrent/upstream/2.2/test/
   branches/backport-util-concurrent/upstream/2.2/test/loops/
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/CASLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/CachedThreadPoolLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/CancelledFutureLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/CancelledLockLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/CancelledProducerConsumerLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/CheckedLockLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/CollectionLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/CollectionWordLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/ConcurrentDequeLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/ConcurrentHashSet.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/ConcurrentQueueLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/ContextSwitchTest.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/CountedMapLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/DequeBash.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/ExchangeLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/ExecutorCompletionServiceLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/FinalLongTest.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/FinalLongTest142.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/Finals.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/IntMapCheck.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/IteratorLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/LastKeyOfSubMap.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/ListBash.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/LockLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/LockOncePerThreadLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/LoopHelpers.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/MapCheck.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/MapLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/MapWordLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/MultipleProducersSingleConsumerLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/Mutex.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/NavigableMapCheck.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/NavigableSetCheck.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/NoopLockLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/NoopMutex.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/NoopNoLockLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/NoopSpinLockLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/PriorityQueueSort.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/ProducerConsumerLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/RLIBar.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/RLJBar.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/RLMap.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/RWCollection.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/RWMap.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/ReadHoldingWriteLock.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/SCollection.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/SMap.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/SetBash.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/SimpleFairReentrantLockLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/SimpleLockLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/SimpleLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/SimpleMutexLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/SimpleNoLockLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/SimpleReentrantLockLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/SimpleSemaphoreLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/SimpleSpinLockLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/SimpleTimedLockLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/SimpleWriteLockLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/SingleProducerMultipleConsumerLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/StringMapLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/Sync100M.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/SynchronizedCollection.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/SynchronizedLinkedListQueue.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/TSPExchangerTest.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/TimeUnitLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/TimeoutExchangerLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/TimeoutLockLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/TimeoutMutexLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/TimeoutProducerConsumerLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/UnboundedQueueFillEmptyLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/src/UncheckedLockLoops.java
   branches/backport-util-concurrent/upstream/2.2/test/loops/words/
   branches/backport-util-concurrent/upstream/2.2/test/loops/words/class.txt
   branches/backport-util-concurrent/upstream/2.2/test/loops/words/dir.txt
   branches/backport-util-concurrent/upstream/2.2/test/loops/words/ids.txt
   branches/backport-util-concurrent/upstream/2.2/test/loops/words/kw.txt
   branches/backport-util-concurrent/upstream/2.2/test/serialization/
   branches/backport-util-concurrent/upstream/2.2/test/serialization/SerializationTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/
   branches/backport-util-concurrent/upstream/2.2/test/tck/LinkedListTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/RECONCILED_ON
   branches/backport-util-concurrent/upstream/2.2/test/tck/backport.util.concurrent.1.4.library
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/AbstractExecutorServiceTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/AbstractQueueTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/AbstractQueuedSynchronizerTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/ArrayBlockingQueueTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/ArrayDequeTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicBooleanTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicIntegerArrayTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicIntegerFieldUpdaterTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicIntegerTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicLongArrayTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicLongFieldUpdaterTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicLongTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicMarkableReferenceTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicReferenceArrayTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicReferenceFieldUpdaterTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicReferenceTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicStampedReferenceTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/ConcurrentHashMapTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/ConcurrentLinkedQueueTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/ConcurrentSkipListMapTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/ConcurrentSkipListSetTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/ConcurrentSkipListSubMapTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/ConcurrentSkipListSubSetTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/CopyOnWriteArrayListTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/CopyOnWriteArraySetTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/CountDownLatchTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/CyclicBarrierTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/DelayQueueTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/EntryTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/ExchangerTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/ExecutorCompletionServiceTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/ExecutorsTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/FutureTaskTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/JSR166TestCase.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/LinkedBlockingDequeTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/LinkedBlockingQueueTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/LinkedListTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/LockSupportTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/PriorityBlockingQueueTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/PriorityQueueTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/ReentrantLockTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/ReentrantReadWriteLockTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/ScheduledExecutorSubclassTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/ScheduledExecutorTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/SemaphoreTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/SynchronousQueueTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/SystemTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/ThreadLocalTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/ThreadPoolExecutorSubclassTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/ThreadPoolExecutorTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/ThreadTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/TimeUnitTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/TreeMapTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/TreeSetTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/TreeSubMapTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/src/TreeSubSetTest.java
   branches/backport-util-concurrent/upstream/2.2/test/tck/tck.jpx
   branches/backport-util-concurrent/upstream/2.2/version.properties
Log:
Import upstream sources.

Added: branches/backport-util-concurrent/upstream/2.2/LEGAL
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/LEGAL	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/LEGAL	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,8 @@
+The backport-util-concurrent software has been released to the public domain, 
+as explained at: http://creativecommons.org/licenses/publicdomain.
+
+Acknowledgements: backport-util-concurrent is based in large part on the public 
+domain sources from: 
+1) JSR166, 
+2) package dl.util.concurrent,
+3) Doug Lea's "collections" package.

Added: branches/backport-util-concurrent/upstream/2.2/README.html
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/README.html	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/README.html	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,614 @@
+<html>
+  <head>
+    <title>backport-util-concurrent - Distributed Computing Laboratory</title>
+    <meta content="java.util.concurrent backport">
+  </head>
+  <body>
+
+<h1>backport-util-concurrent</h1>
+<p>Backport ot JSR 166 (java.util.concurrent) to Java 1.4</p>
+<p><a href="http://dcl.mathcs.emory.edu/util/backport-util-concurrent/">http://dcl.mathcs.emory.edu/util/backport-util-concurrent/</a></p>
+<hr class="hide">
+
+<h2>Overview</h2>
+
+<p>
+This package is the backport of 
+<a href="http://gee.cs.oswego.edu/dl/concurrency-interest/">java.util.concurrent</a> API, 
+introduced in 
+<a href="http://java.sun.com/j2se/1.5.0/docs/guide/concurrency/overview.html">Java 5.0</a>,
+to Java 1.4. The backport is based on public-domain sources from the
+<a href="http://gee.cs.oswego.edu/cgi-bin/viewcvs.cgi/jsr166/src/main/java/">
+JSR 166 CVS repository</a>, the
+<a href="http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html">
+dl.util.concurrent</a> package, and the Doug Lea's
+<a href="http://gee.oswego.edu/dl/classes/collections/">
+collections</a> package.
+
+The backport is close to complete; unsupported functionality is 
+limited to: 1) classes that rely on explicit 
+JVM support and cannot be emulated at a satisfactory
+performance level, 2) some of the functions 
+described in the original javadoc as "designed primarily for use in 
+monitoring in system state, not for synchronization control", or 3) 
+functionality 
+that would require development of substantial amount of new code.
+</p>
+<p>
+The purpose of this library is to enable gradual migration from Java 1.4 
+to 5.0: the library allows to develop concurrent applications for Java 1.4 
+that should work with Java 5.0 simply by changing package names.
+</p>
+
+<h3>License</h3>
+
+<p>
+This software is released to the 
+<a href="http://creativecommons.org/licenses/publicdomain">public domain</a>,
+in the spirit of the original code written by Doug Lea.
+The code can be used for any purpose, modified, and redistributed 
+without acknowledgment. No warranty is provided, either express or implied.
+</p>
+<p>
+<em>Note:</em> versions prior to 2.1 had dependencies on proprietary code.
+	Versions 2.1 and newer do not have such dependencies anymore.
+</p>
+
+<h3>Features</h3>
+
+<p>
+The following functionality of java.util.concurrent is supported in the backport:
+<ul>
+<li>All JSR 166 executors, utilities, and everything related (thread pools, 
+FutureTask, scheduled tasks and executors, etc.)</li>
+<li>Locks: ReentrantLock, Semaphore, ReentrantReadWriteLock, Conditions</li>
+<li>Queues: synchronous, array, linked, delay, and priority queues</li>
+<li>Deques: array, and linked deques</li>
+<li>Atomics: everything except reflection-based updaters</li>
+<li>Other concurrency utils: CountDownLatch, CyclicBarrier, Exchanger</li>
+<li>Concurrent collections: ConcurrentHashMap, CopyOnWriteArrayList, CopyOnWriteArraySet,
+    ConcurrentLinkedQueue, 
+    ConcurrentSkipList[Map,Set]</li>
+<li>Retrofitted standard collections</li>
+</ul>
+</p>
+
+<h2>Compatibility</h2>
+
+JSR 166 functionality is tied closely to the Java 5.0 Virtual Machine, and some aspects of it 
+cannot be fully
+backported to Java 1.4. This section discusses these differences between the backport and
+JSR 166.
+
+<h3>Package Names</h3>
+
+<p>Since user libraries cannot define classes in
+java.* packages, all the original package names have been prefixed with
+<code>edu.emory.mathcs.backport</code>. For instance, <code>java.util.concurrent.Future</code> becomes <code>edu.emory.mathcs.backport.java.util.concurrent.Future</code>.
+</p>
+
+<h3>Differences between versions</h3>
+
+<p>
+The backport, version 1.1 and above, includes
+functionality of JSR 166 that has been added in Java 6.0. 
+Pay attention to the "since" javadoc tags if conformance with specific 
+Java platform versions is desired. Examples of "since 1.6" functionality include:
+deques, navigable maps and sets (including ConcurrentSkipList[Map,Set]),
+"newTaskFor" in AbstractExecutorService,
+"lazySet" in atomics, RunnableFuture and RunnableScheduledFuture, 
+"allowCoreThreadTimeout" in ThreadPoolExecutor, 
+"decorateTask" in ScheduledThreadPoolExecutor, MINUTES, HOURS, and DAYS in TimeUnit,
+and appropriate retrofits in collection classes. As of backport version 2.2, these
+features are based on beta versions of Java 6.0 APIs, which may still change in the future.
+</p>
+<p>Backport is developed carefully to retain link-time compatibility, i.e. it is generally 
+   safe to replace an old library JAR with a new one (with a possible exception of APIs
+   based on beta releases, e.g. current "since 1.6" classes and methods). Serial compatibility 
+   (i.e. ability of
+   one version to deserialize objects that has been serialized using a different version)
+   is maintained on a  best-effort basis, and not always guaranteed.
+   Please see details below. (Note that concurrency tools are usually not intended for
+   persistent storage anyway). Compile-time compatibility: applications using
+   wildcard imports (e.g. java.util.* and edu.emory.mathcs.backport.java.util.*) may
+   cease to compile with updated backport versions (containing new classes) 
+   due to import ambiguities. In such cases, you must dis-ambiguate
+   imports (i.e. use explicit imports as appropriate) and recompile.
+</p>
+<p>Notes for version 2.2:
+   Link-time and serial compatibility is fully preserved for "since 1.5" APIs. For
+   "since 1.6" APIs, link-time and serial compatibility is preserved except for
+   navigable maps and sets, which API has recently changed slightly in 
+   Java 6.0 beta.
+</p>
+<p>Notes for version 2.1: 
+   Link-time compatibility is preserved fully. 
+   Serial compatibility is preserved except for the class ReentrantReadWriteLock.
+</p>
+<p>Notes for version 2.0:
+<ul>
+<li>the "concurrent.Concurrent" class has been removed as of backport 2.0.</li>
+<li>Serialized representations
+    of several lock classes have changed between versions 1.1_01 and 2.0,
+    as a result of certain bug fixes and performance improvements (see changelog).
+    This means that locks and collections serialized with 1.1_01 will not be
+    deserialized properly by 2.0.
+</li>
+</ul>
+</p>
+
+<h3>Unsupported functionality</h3>
+
+<p>
+Detailed listing of functionality that has not been backported
+is presented below.
+</p>
+
+<h4>Java 5.0 Syntax</h4>
+<p>
+Package java.util.concurrent exploits new language features
+introduced in Java 5.0. In particular, most API classes are
+<a href="http://java.sun.com/j2se/1.5.0/docs/guide/language/generics.html">generic types</a>.
+In the backport, they have been flattened to standard, non-generic 
+classes. Still, programs linked against the backport should compile 
+with Java 5.0 (after changing package names). Nevertheless, you may 
+want to consider gradually switching to using generics once you make 
+the transition to Java 5.0, since it gives better compile-time 
+type checking.
+</p>
+
+<h4>In Condition</h4>
+<p>
+Method long awaitNanos(long nanosTimeout) is not supported, since the
+emulation cannot reliably report remaining times with nanosecond 
+precision. Thus, it probably would be too dangerous to leave the
+emulated method in the Condition interface. However, the method is
+still available, for those who know what they are doing,
+in the <a href="doc/api/edu/emory/mathcs/backport/java/util/concurrent/helpers/Utils.html">util.concurrent.helpers.Utils</a> class.
+</p>
+
+<h4>In ReentrantLock</h4>
+<p>
+the following monitoring methods are supported only for fair locks: 
+boolean hasQueuedThreads(), int getQueueLength(), Collection 
+getQueuedThreads(), boolean isQueued(), boolean hasWaiters(Condition),
+int getWaitQueueLength(Condition), 
+Collection getWaitingThreads(Condition).
+</p>
+
+<h4>In ReentrantReadWriteLock</h4>
+<p>
+The current backport implementation is based on dl.util.concurrent class
+ReentrantWriterPreferenceReadWriteLock, and thus slightly departs
+from java.util.concurrent that does not specify acquisition order but 
+allows to enable/disable fairness. The backport implementation does not 
+have a single-parameter constructor allowing to specify fairness policy; 
+it always behaves like writer-preference lock with no fairness guarantees.
+Because of these characteristics, this class is compliant with JSR 166 
+specification of non-fair reentrant read-write locks, while the exact 
+semantics of fair locks are not supported (and the appropriate 
+constructor is thus not provided).
+</p>
+<p>
+Also, the following instrumentation and status methods are not 
+supported: Collection getQueuedWriterThreads(), Collection 
+getQueuedReaderThreads(), boolean hasQueuedThreads(), boolean 
+hasQueuedThread(Thread), Collection getQueuedThreads(), boolean 
+hasWaiters(Condition), int getWaitQueueLength(Condition), Collection 
+getWaitingThreads(Condition).
+</p>
+
+<h4>In Semaphore</h4>
+<p>
+Blocking atomic multi-acquires: acquire(int permits)
+and
+tryAcquire(int permits, long timeout, TimeUnit unit) 
+are supported only for FAIR semaphores.
+</p>
+
+<h4>Platform-level functionality</h4>
+<p>
+To emulate System.nanoTime(), the method 
+<a href="doc/api/edu/emory/mathcs/backport/java/util/concurrent/helpers/Utils.html#nanoTime()">nanoTime()</a> 
+is provided in the class 
+dl.util.concurrent.helpers.Utils. On Java 1.4.2, it attempts to use
+high-precision timer via sun.misc.Perf (thanks to Craig Mattocks
+for suggesting this). On older Java platforms, or when sun.misc.Perf
+is not supported, it falls back to System.currentTimeMillis().
+</p>
+<p>
+Class <a href="doc/api/edu/emory/mathcs/backport/java/util/concurrent/helpers/ThreadHelpers.html">ThreadHelpers</a>
+(added in 1.0_01) is provided to emulate certain aspects of Thread.UncaughtExceptionHandler.
+</p>
+
+<h4>Note on nanosecond precision timing</h4>
+<p>
+The backport strives to honor nanosecond timeouts, if such are requested, 
+by using two-parameter variant of Object.wait(). Note, however, that most 
+Java platforms before 5.0 will round up the timeout to full milliseconds 
+anyway.
+</p>
+
+<h4>Low-level concurrency classes</h4>
+<p>
+The following classes are not supported: 
+LockSupport, AbstractQueuedSynchronizer, AbstractQueuedLongSynchronizer. 
+</p><p><i>Rationale: </i> on Java 5.0, these classes depend on explicit
+JVM support, delegating to low-level OS concurrency primitives. There seems
+to be no simple way of emulating them without introducing prohibitive 
+performance overhead. (If you think they should be present in the backport
+anyway, let me know).
+</p>
+
+<h4>Atomic utilities</h4>
+<p>
+The following "atomic" utilities are not supported: 
+Atomic[Integer,Long,Reference]FieldUpdater.
+
+</p>
+
+<h2>Robustness</h2>
+
+<p>
+Backport-util-concurrent is based in large part on source code from JSR 166 
+and dl.util.concurrent, both very 
+well tested. Whenever possible, the JSR 166 code was used. In cases when 
+it was infeasible (e.g. for performance reasons), 
+the dl.util.concurrent code was adapted. The new 
+code was introduced only when absolutely necessary, e.g. to make 
+dl.util.concurrent code conforming to JSR 166 interfaces and semantics. This
+partially explains why so few bugs have been reported again the backport,
+despite over 10,000 downloads and many deployments in commercial and 
+open-source projects.
+</p>
+
+<h3>Unit tests</h3>
+<p>
+Version 2.1 of the library passes all the relevant 1859 unit tests from 
+<a href="http://gee.cs.oswego.edu/cgi-bin/viewcvs.cgi/jsr166/src/test/tck/">TCK test package</a>
+designed for java.util.concurrent (the tests of unsupported functionality 
+were skipped).
+</p>
+<p>
+The following unit tests have been completed (listed in the alphabetical order):
+AbstractExecutorServiceTest,
+AbstractQueueTest,
+ArrayBlockingQueueTest,
+ArrayDequeTest,
+AtomicBooleanTest,
+AtomicIntegerArrayTest,
+AtomicIntegerTest,
+AtomicLongArrayTest,
+AtomicLongTest,
+AtomicMarkableReferenceTest,
+AtomicReferenceArrayTest,
+AtomicReferenceTest,
+AtomicStampedReferenceTest,
+ConcurrentHashMapTest,
+ConcurrentLinkedQueueTest,
+ConcurrentSkipListMapTest,
+ConcurrentSkipListSubMapTest,
+ConcurrentSkipListSetTest,
+ConcurrentSkipListSubSetTest,
+CopyOnWriteArrayListTest,
+CopyOnWriteArraySetTest,
+CountDownLatchTest,
+CyclicBarrierTest,
+DelayQueueTest,
+EntryTest,
+ExchangerTest,
+ExecutorsTest,
+ExecutorCompletionServiceTest,
+FutureTaskTest,
+LinkedBlockingDequeTest,
+LinkedBlockingQueueTest,
+LinkedListTest,
+PriorityBlockingQueueTest,
+PriorityQueueTest,
+ReentrantLockTest,
+ReentrantReadWriteLockTest,
+ScheduledExecutorTest,
+ScheduledExecutorSubclassTest,
+SemaphoreTest,
+SynchronousQueueTest,
+SystemTest (testing Utils.nanoTime()),
+ThreadLocalTest,
+ThreadPoolExecutorTest,
+ThreadPoolExecutorSubclassTest,
+TimeUnitTest,
+TreeMapTest,
+TreeSubMapTest,
+TreeSetTest,
+TreeSubSetTest.
+</p>
+
+<h3>Stress tests</h3>
+<p>
+Starting from version 1.1_01, the 
+backport is being stress-tested using the "loops" tests from JSR 166 
+(courtesy of Doug Lea and the JSR 166 Expert Group). The tests, included 
+in the development source 
+bundle, thoroughly evaluate behavior and performance of various types 
+of locks, queues, maps, futures, and other API classes, under various 
+conditions (contention etc.) and circumstances, including cancellation.
+</p>
+
+<p>
+Despite exhaustive testing, as any software, this library may still contain 
+bugs. If you find one, please report it, or better yet, contribute a fix. 
+</p>
+
+<h3>Known problems</h3>
+
+<p>
+<strong>Note: </strong>A bug has been reported against Sun 1.4.2_04 JVMs, and fixed in
+1.4.2_06 (see ID 4917709) that makes those JVMs to occassionally crash with SIGSEGV 
+during backport stress tests, 
+particularly MapLoops and MapChecks. It is therefore recommended to use JVM versions 
+1.4.2_06 or newer when using the backport (although the crashes seem to not happen also
+on 1.4.2_03, and perhaps on earlier JVMs). Detected in version: 2.0.
+</p>
+<p>
+<strong>Note: </strong>due to what is apparently a bug in SUN JVM implementations
+for Solaris, observed on 1.4.2_03 and 1.4.2_06,
+the 'ExecutorsTest.testPrivilegedThreadFactory()'
+unit test fails with ClassNotFoundException when launched from a class path
+that has backport classes stored as individual files in the "classes" directory. The 
+problem disappears when the classes are put in a JAR file. The bug is most likely
+related to handling context class loaders. It is therefore advised to use JAR
+files instead of class files when running code that explicitly or implicitly
+modifies context class loaders, as does privileged thread factory.
+Detected in version: 2.0.
+</p>
+<p>
+<strong>Note: </strong>missed signals have been observed on Linux 2.6.3-7 kernel
+for SMP w/64GB support under contention and in the presence of frequent timeouts.
+(The bug was captured during TimeoutProducerConsumerLoops on SynchronousQueue).
+Apparently, this is caused by a kernel bug. The problem have been observed on 
+several different JVMs. It does not occur on newer kernels.
+Detected in version: 2.0.
+</p>
+<p>
+As evident from the above, IT IS CRUCIAL THAT YOU RUN THE STRESS TESTS on the 
+target configuration before using the backport in a production environment.
+Concurrency issues are tricky, and possible bugs in JVMs, operating systems, 
+and this software, usually won't show up until under heavy loads. Stress tests
+included with this distribution test this software under extreme conditions,
+so if they are consistently passing, there's a very good chance that everything
+works fine.
+</p>
+
+<h2>Changelog</h2>
+
+<p>
+
+Version 2.2 (Jun 4, 2006) [<a href="http://www.mathcs.emory.edu/dcl/util/backport-util-concurrent/dist/backport-util-concurrent-2.2/backport-util-concurrent-2.2-changelog.html">CVS log</a>]
+
+<ul>
+<li>New features</li>
+  <ul>
+    <li>The backport now compiles under Java 5.0.</li>
+    <li>Enhancements in the Navigable[Map,Set] interfaces.</li>
+    <li>Blocking atomic multi-acquires in fair semaphores.</li>
+    <li>Javadoc enhancements (reconciled with recent java.util.concurrent).</li>
+    <li>Shutdown upon finalization for factory-created executors.</li>
+  </ul>
+<li>Bug fixes</li>
+  <ul>
+    <li>broken type-checked map in Collections. Thanks for Taras Puchko for finding this bug
+        and submitting the fix.</li>
+    <li>Collections.reverseComparator(Comparator) not working properly when null passed as
+        the argument.</li>
+  </ul>
+<li>Tests</li>
+  <ul>
+    <li>Updated and reconciled with java.util.concurrent tests.</li>
+  </ul>
+</ul>
+
+
+Version 2.1 (Jan 28, 2006) [<a href="http://www.mathcs.emory.edu/dcl/util/backport-util-concurrent/dist/backport-util-concurrent-2.1/backport-util-concurrent-2.1-changelog.html">CVS log</a>]
+<ul>
+<li>New features</li>
+  <ul>
+  <li>Descending iterators in deques</li>
+  <li>Use newTaskFor() in ExecutionCompletionService.submit()</li>
+  <li>toArray(Object[]) appends null at the end in LinkedBlockingQueue</li>
+  <li>Overflow detection in ReentrantLock</li>
+  <li>ReentrantReadWriteLock: better conformance with JSR 166 by adding public inner classes for ReadLock and WriteLock</li>
+  <li>CopyOnWriteArraySet.equals() optimized towards small sets</li>
+  <li>Snapshot iterators in queues</li>
+  <li>Improved performance of toArray() in several collection classes</li>
+  <li>More collection stuff ported, including new things in Arrays, and base collection classes with toArray() supporting
+      concurrent collections</li>
+  <li>Improved comparison of ScheduledFutureTasks in the ScheduledThreadPoolExecutor</li>
+  </ul>
+<li>Licensing</li>
+<ul>
+  <li>New, public domain implementations for CopyOnWriteArrayList, TreeMap, TreeSet, LinkedList, Collections, Arrays</li>
+</ul>
+<li>Bug fixes</li>
+  <ul>
+  <li>Methods equals() and hashCode() were broken in PriorityQueue. The fix allows PriorityQueues to be used as hash keys.</li>
+  <li>ReentrantReadWriteLock.getWriteHoldCount could return a posititive value even if the write lock was not owned by the  inquiring thread</li>
+  <li>Condition variables were not working properly with reentrant locks when the hold count was greater than 1. Await methods were releasing only a single hold, not all of them, as they should</li>
+  <li>Handling of non-comparable entries (which is an erroneous condition) by priority queues has been made more
+      deterministic. (This issue/fix does not affect correctly written programs)</li>
+  <li>Fix of CR 6312056 (ConcurrentHashMap.entrySet().iterator() can return entry with never-existent value)</li>
+  <li>Livelock in Exchanger if used by more than two threads</li>
+  <li>Erroneous behavior of interrupted CyclicBarrier and locks on some (buggy) JVMs (thanks to Yew-Yap Goh for 
+      reporting this)</li>
+  </ul>
+<li>Tests</li>
+  <ul>
+  <li>New and improved "loops" tests, including CollectionLoops, IteratorLoops, StringMapLoops, 
+      TSPExchangerTest, TimeoutExchangerLoops, UnboundedQueueFillEmptyLoops, EntryTest</li>
+  <li>New "serial compatibility" test</li>
+  </ul>
+</ul>
+
+Version 2.0_01 (Aug 3, 2005) [<a href="http://www.mathcs.emory.edu/dcl/util/backport-util-concurrent/dist/backport-util-concurrent-2.0_01/backport-util-concurrent-2.0_01-changelog.html">CVS log</a>]
+<ul>
+<li>Compatibility fix: ConcurrentHashMap was no longer inheriting from java.util.AbstractMap, although it was in version 1.1_01. Now it does again.</li>
+<li>Licensing: new, public-domain implementation of PriorityQueue, and refactoring of backported AbstractMap so that it also contains only the public domain code.</li>
+</ul>
+Version 2.0 (Jul 6, 2005) [<a href="http://www.mathcs.emory.edu/dcl/util/backport-util-concurrent/dist/backport-util-concurrent-2.0/backport-util-concurrent-2.0-changelog.html">CVS log</a>]
+<ul>
+<li>New features</li>
+<ul>
+<li>Features and fixes resulting from reconcillation with JSR 166 as of Jul 4, 
+    such as:
+    lazySet in atomics, 
+    <a href="doc/api/edu/emory/mathcs/backport/java/util/concurrent/AbstractExecutorService.html#newTaskFor(java.lang.Runnable, java.lang.Object)">AbstractExecutorService.newTaskFor()</a>, 
+    <a href="doc/api/edu/emory/mathcs/backport/java/util/concurrent/RunnableFuture.html">RunnableFuture</a>,
+    <a href="doc/api/edu/emory/mathcs/backport/java/util/concurrent/RunnableScheduledFuture.html">RunnableScheduledFuture</a>, 
+    <a href="doc/api/edu/emory/mathcs/backport/java/util/concurrent/ScheduledThreadPoolExecutor.html#decorateTask(java.lang.Runnable, edu.emory.mathcs.backport.java.util.concurrent.RunnableScheduledFuture)">ScheduledThreadPoolExecutor.decorateTask()</a>,
+    better interrupt detection in ThreadPoolExecutor, avoiding garbage retention
+    with timeouts in SynchronousQueue, fixed reset in CyclicBarrier, 
+    remove(x,null) -> false in ConcurrentHashMap, changes in navigable maps,
+    addAll fixed in CopyOnWriteArrayList, etc.
+    
+</li>
+<li>New backported classes: 
+    <a href="doc/api/edu/emory/mathcs/backport/java/util/concurrent/ConcurrentLinkedQueue.html">ConcurrentLinkedQueue</a>, 
+    ConcurrentSkipList[<a href="doc/api/edu/emory/mathcs/backport/java/util/concurrent/ConcurrentSkipListMap.html">Map</a>,<a href="doc/api/edu/emory/mathcs/backport/java/util/concurrent/ConcurrentSkipListSet.html">Set</a>]</li>
+<li>Optimizations (replacement of ReentrantLock by synchronized) in:
+    CyclicBarrier, DelayQueue, Exchanger, ThreadPoolExecutor</li>
+<li>Optimizations of atomic variables (simple reads are now volatile rather than
+    synchronized)</li>
+<li>New backported methods in the fair implementation of the ReentrantLock:
+    <a href="doc/api/edu/emory/mathcs/backport/java/util/concurrent/locks/ReentrantLock.html#hasWaiters(edu.emory.mathcs.backport.java.util.concurrent.locks.Condition)">hasWaiters(Condition)</a>, 
+    <a href="doc/api/edu/emory/mathcs/backport/java/util/concurrent/locks/ReentrantLock.html#getWaitQueueLength(edu.emory.mathcs.backport.java.util.concurrent.locks.Condition)">getWaitQueueLength(Condition)</a>, 
+    <a href="doc/api/edu/emory/mathcs/backport/java/util/concurrent/locks/ReentrantLock.html#getWaitingThreads(edu.emory.mathcs.backport.java.util.concurrent.locks.Condition)">getWaitingThreads(Condition)</a></li>
+<li>Retrofitted collection classes: 
+    <a href="doc/api/edu/emory/mathcs/backport/java/util/AbstractMap.html">AbstractMap</a>,
+    <a href="doc/api/edu/emory/mathcs/backport/java/util/Collections.html">Collections</a>,
+    <a href="doc/api/edu/emory/mathcs/backport/java/util/LinkedList.html">LinkedList</a>,
+    Tree[<a href="doc/api/edu/emory/mathcs/backport/java/util/TreeMap.html">Map</a>,<a href="doc/api/edu/emory/mathcs/backport/java/util/TreeSet.html">Set</a>]</li>
+<li>Numerous javadoc clarifications and fixes</li>
+</ul>
+<li>Bug fixes</li>
+<ul>
+<li>Upon deserialization, ReentrantLock, ReentrantReadWriteLock, and Semaphore 
+    were potentially in a locked (or even illegal) state, contrary to the javadoc</li>
+<li>In the fair implementation of ReentrantLock, wait queues of <em>condition variables</em>
+    were not actually fair - they are now</li>
+<li>LinkedBlockingQueue had potential deadlocks in remove() and toArray(). It has
+    now been replaced by a completely new implementation, based on java.u.c (rather
+    than dl.u.c)</li>
+<li>Race condition in Condition.awaitUninterruptibly() could cause signals to be
+    missed if they were coinciding with interrupt attempts</li>
+</ul>
+
+<li>Tests</li>
+<ul>
+<li>Updated unit tests for atomics, AbstractQueuedSynchonizer, ConcurrentHashMap, 
+    CyclicBarrier, ExecutorCompletionService, LinkedBlockingQueue, ReentrantLock,
+    ReentrantReadWriteLock, ScheduledExecutor, ThreadPoolExecutor</li>
+<li>New unit tests for ConcurrentLinkedQueue, ConcurrentSkipList[Map,Set],
+    Utils.nanoTime(), LinkedList, Tree[Map,Set]</li>
+<li>Updated numerous stress tests, and new ones added: CachedThreadPoolLoops,
+    [Collection,Map]WordLoops, CASLoops, and more</li>
+</ul>
+</ul>
+Version 1.1_01 (Feb 7, 2005) [<a href="http://www.mathcs.emory.edu/dcl/util/backport-util-concurrent/dist/backport-util-concurrent-1.1_01/backport-util-concurrent-1.1_01-changelog.html">CVS log</a>]
+<ul>
+<li>Bugfix: race condition in the fair implementation of ReentrantLock 
+caused it to occassionally cause IllegalMonitorState exceptions. Non-fair
+implementation was not affected, however, classes that depend on fair reentrant locks,
+namely: fair ArrayBlockingQueue, fair SynchronousQueue, and PriorityQueue, were
+affected.
+Thanks to Ramesh Nethi for reporting this bug and helping to track it down.</li>
+
+<li>Testing: backport has been stress-tested using the "loops" tests
+(courtesy of Doug Lea and the JSR 166 Expert Group). The tests
+are included in the development source bundle.</li>
+</ul>
+
+Version 1.1 (Jan 21, 2005) [<a href="http://www.mathcs.emory.edu/dcl/util/backport-util-concurrent/dist/backport-util-concurrent-1.1/backport-util-concurrent-1.1-changelog.html">CVS log</a>]
+<ul>
+<li>Bugfix: on Windows platforms with Java 1.4.2, the library
+were sometimes behaving as if timeouts were ignored or misinterpreted,
+typically resulting in indefinite waits. This resulted from an internal
+timer overflow that occurred every several hours, and was also manifested
+as a discontinuity in System.nanoTime() values. The problem would happen
+if the overflow occurred during blocked timed wait, if additionally
+a spurious wakeup occurred after the overflow but before timeout
+in the underlying Object.wait().
+This has now been fixed; 1.0_01 users are urged to upgrade to version 1.1.
+Thanks to Ramesh Nethi for reporting this bug and greatly contributing
+to tracking it down.</li>
+
+<li>Feature: backport has been reconciled with JSR 166 CVS repository
+    on Jan 14, 2005. This results in a handful of new things:
+    <ul>
+    <li>New 
+        <a href="doc/api/edu/emory/mathcs/backport/java/util/concurrent/TimeUnit.html">time units</a>: 
+        MINUTES, HOURS, and DAYS.</li>
+    <li><a href="doc/api/edu/emory/mathcs/backport/java/util/concurrent/ThreadPoolExecutor.html#allowCoreThreadTimeOut(boolean)">allowCoreThreadTimeOut</a>
+        in ThreadPoolExecutor, which enables <em>bounded</em>
+        pools that kills threads if they are idle for too long.</li>
+    <li>ThreadPoolExecutor now handles excessive interruption requests more gracefully 
+        (previously, it was reported to be able to crash older JVMs).</li>
+    <li><a href="doc/api/edu/emory/mathcs/backport/java/util/Deque.html">Deques</a>.</li>
+    <li>Javadoc improvements.</li>
+    </ul>
+</li>
+</ul>
+
+Version 1.0_01 (Dec 28, 2004) [<a href="http://www.mathcs.emory.edu/dcl/util/backport-util-concurrent/dist/backport-util-concurrent-1.0_01/backport-util-concurrent-1.0_01-changelog.html">CVS log</a>]
+<ul>
+<li>Feature: development source bundle with ant scripts allowing to build and
+    test the distribution is now available for download.</li>
+
+<li>Feature: emulation of UncaughtExceptionHandler, in class
+    <a href="doc/api/edu/emory/mathcs/backport/java/util/concurrent/helpers/ThreadHelpers.html">ThreadHelpers</a>.</li>
+
+<li>Documentation: improved, more consistent and accurate javadoc.</li>
+
+<li>Bugfix: NoClassDefFoundError when using nanoTime() on Java prior to 1.4.2.
+    Thanks to Gabriel Wolosin for reporting this bug.</li>
+
+<li>Bugfix: deadlocks in ConcurrentLinkedQueue when drainTo() or clear() was
+    invoked when there was blocked put(). Thanks to Jean Morissette for
+    reporting this bug.</li>
+
+<li>Bugfix: minor glitch in Utils.nanoTime() would cause timer to lose
+    accuracy, about 1ns every 11 days, if JVM was running continuously.
+    (Note: as it turned out, the fix itself had a bug; see the log for 
+    version 1.1)</li>
+</ul>
+    
+Version 1.0 (Dec 1, 2004)
+<ul>
+<li>Initial revision</li>
+</ul>
+
+<h2>Documentation and Support</h2>
+
+<p>
+For more information:
+<ul>
+<LI><a href="doc/api/">Browse Javadoc</a></LI>
+<LI>Consult the original 
+    <a href="http://gee.cs.oswego.edu/dl/concurrency-interest/">
+    java.util.concurrent</a> documentation and Java 5.0 
+    <a href="http://java.sun.com/j2se/1.5.0/docs/guide/concurrency/overview.html">Concurrency Utilities Overview</a></LI>
+
+<li>Check the <a href="http://dcl.mathcs.emory.edu/util/backport-util-concurrent/">project Web page</a> for updates.</li>
+
+<li>For questions, comments, and discussion, use the
+<a href="http://altair.cs.oswego.edu/mailman/listinfo/concurrency-interest">Concurrency-Interest 
+mailing list</a> (courtesy of Doug Lea and the JSR 166 Expert Group). Please clearly indicate
+that your message regards the backport rather than the original JSR 166 API, by prefixing
+the subject line with "backport: " and including appropriate annotation in the message body.
+You may also send 
+e-mail directly to <a href="mailto:dawidk at mathcs.emory.edu">Dawid Kurzyniec</a>.</li>
+</ul>
+</p>
+
+<hr>
+Copyright (C) 2004-2006 <a href="http://dcl.mathcs.emory.edu/">Distributed Computing Laboratory</a>, Emory University<br>
+
+</body>
+</html>

Added: branches/backport-util-concurrent/upstream/2.2/RECONCILED_ON
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/RECONCILED_ON	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/RECONCILED_ON	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1 @@
+2006-05-23

Added: branches/backport-util-concurrent/upstream/2.2/backport-util-concurrent.jpx
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/backport-util-concurrent.jpx	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/backport-util-concurrent.jpx	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--JBuilder XML Project-->
+<project>
+  <property category="editor.general" name="line_ending.style" value="3"/>
+  <property category="generalFormatting" name="blockIndent" value="4"/>
+  <property category="generalFormatting" name="lineEndingStyle" value="3"/>
+  <property category="generalFormatting2" name="blockIndent" value="4"/>
+  <property category="generalFormatting2" name="lineEndingStyle" value="3"/>
+  <property category="generalFormatting2" name="overrideBasicFormatting" value="1"/>
+  <property category="javaFormatting" name="packagePrefixGroups" value="java;javax;BLANK_LINE;java.awt;javax.swing;BLANK_LINE;org;(*)"/>
+  <property category="javadoc" name="custom.tags.1" value="todo;a;To Do:"/>
+  <property category="module" name="ProjectConvertedToEnsureModulesHaveSupportedFeatures" value="1"/>
+  <property category="module" name="ProjectConvertedToUseFilesAndDependenciesAsDefaultContent" value="1"/>
+  <property category="module" name="ProjectConvertedToUseProperModuleDefaults" value="1"/>
+  <property category="module" name="projectConvertedFromModuleExtensionsToModuleFileTypes" value="1"/>
+  <property category="personality" name="personality" value="com.borland.jbuilder.personality.J2EEPersonality com.borland.jbuilder.webservices.personality.WebServicesPersonality com.borland.jbuilder.personality.EJBPersonality com.borland.jbuilder.personality.WebAppPersonality com.borland.jbuilder.personality.DatabasePersonality com.borland.jbuilder.personality.CorbaPersonality com.borland.jbuilder.personality.J2MEPersonality "/>
+  <property category="runtime" name="ConfigurationCount" value="4"/>
+  <property category="runtime" name="DefaultConfiguration" value="-1"/>
+  <property category="runtime.0" name="BuildTargetOnRun" value="com.borland.jbuilder.build.AntBuilder;build.xml;dist"/>
+  <property category="runtime.0" name="ConfigurationName" value="tck tests"/>
+  <property category="runtime.0" name="RunnableType" value="com.borland.jbuilder.runtime.ApplicationRunner"/>
+  <property category="runtime.0" name="application.class" value="JSR166TestCase"/>
+  <property category="runtime.0" name="application.parameters" value="10"/>
+  <property category="runtime.0" name="application.vmparameters" value="-Xss256000 -Dtck.shortDelay=30"/>
+  <property category="runtime.1" name="BuildTargetOnRun" value="com.borland.jbuilder.build.AntBuilder;build.xml;dist"/>
+  <property category="runtime.1" name="ConfigurationName" value="TSP exchanger test"/>
+  <property category="runtime.1" name="RunnableType" value="com.borland.jbuilder.runtime.ApplicationRunner"/>
+  <property category="runtime.1" name="application.class" value="TSPExchangerTest"/>
+  <property category="runtime.2" name="BuildTargetOnRun" value="com.borland.jbuilder.build.AntBuilder;build.xml;dist"/>
+  <property category="runtime.2" name="ConfigurationName" value="ListBash"/>
+  <property category="runtime.2" name="RunnableType" value="com.borland.jbuilder.runtime.ApplicationRunner"/>
+  <property category="runtime.2" name="application.class" value="ListBash"/>
+  <property category="runtime.2" name="application.parameters" value="edu.emory.mathcs.backport.java.util.LinkedList 4 4"/>
+  <property category="runtime.3" name="BuildTargetOnRun" value="com.borland.jbuilder.build.AntBuilder;build.xml;test.loops"/>
+  <property category="runtime.3" name="ConfigurationName" value="loop tests"/>
+  <property category="runtime.3" name="RunnableType" value="com.borland.jbuilder.runtime.ApplicationRunner"/>
+  <property category="runtime.3" name="application.class" value="JSR166TestCase"/>
+  <property category="runtime.4" name="BuildTargetOnRun" value="com.borland.jbuilder.build.AntBuilder;build.xml;dist"/>
+  <property category="runtime.4" name="ConfigurationName" value="Deserialization test"/>
+  <property category="runtime.4" name="RunnableType" value="com.borland.jbuilder.runtime.ApplicationRunner"/>
+  <property category="runtime.4" name="application.class" value="SerializationTest"/>
+  <property category="runtime.4" name="application.parameters" value="-deserialize &quot;test.ser&quot;"/>
+  <property category="serverservices" name="disabled.services" value=""/>
+  <property category="serverservices" name="single.server.name" value="Tomcat 4.0"/>
+  <property category="sys" name="AuthorLabel" value="@author"/>
+  <property category="sys" name="BackupPath" value="bak"/>
+  <property category="sys" name="CheckStable" value="1"/>
+  <property category="sys" name="Company" value=""/>
+  <property category="sys" name="CompanyLabel" value="Company:"/>
+  <property category="sys" name="Copyright" value="Copyright (c) 2004"/>
+  <property category="sys" name="CopyrightLabel" value="Copyright:"/>
+  <property category="sys" name="DefaultPath" value="src"/>
+  <property category="sys" name="Description" value=""/>
+  <property category="sys" name="DescriptionLabel" value="Description:"/>
+  <property category="sys" name="DocPath" value="doc/api"/>
+  <property category="sys" name="ExcludeClassEnabled" value="0"/>
+  <property category="sys" name="IncludeTestPath" value="1"/>
+  <property category="sys" name="InstanceVisibility" value="2"/>
+  <property category="sys" name="JDK" value="java version 1.4.2_09-b05"/>
+  <property category="sys" name="JvmVersion" value="1.4"/>
+  <property category="sys" name="LastTag" value="0"/>
+  <property category="sys" name="Libraries" value="junit"/>
+  <property category="sys" name="MakeStable" value="0"/>
+  <property category="sys" name="OutPath" value="classes"/>
+  <property category="sys" name="ShowWarnings" value="0"/>
+  <property category="sys" name="SourcePath" value="src;test/tck/src;test/loops/src;test/serialization"/>
+  <property category="sys" name="SourceVersion" value="1.4"/>
+  <property category="sys" name="TestPath" value="test/tck/src"/>
+  <property category="sys" name="Title" value=""/>
+  <property category="sys" name="TitleLabel" value="Title:"/>
+  <property category="sys" name="Version" value="1.0"/>
+  <property category="sys" name="VersionLabel" value="@version"/>
+  <property category="sys" name="WorkingDirectory" value="."/>
+  <property category="sys" name="ant.usehostjdk" value="0"/>
+  <property category="sys" name="antlibraries" value="junit"/>
+  <node name="backport-util-concurrent" type="NavigationDirectory">
+    <property category="directorynode" name="showSubdirectories" value="1"/>
+    <property category="directorynode" name="url" value="."/>
+  </node>
+  <node name="Additional Settings" type="Folder">
+    <property category="sys" name="SettingsFolder" value="1"/>
+    <file path="build-jbexport.xml">
+      <property category="ant" name="isantfile" value="1"/>
+      <property category="antparams" name="build.compiler" value="jikes"/>
+      <property category="antparams" name="build.compiler.emacs" value="true"/>
+    </file>
+  </node>
+  <node name="backport-util-concurrent" type="Archive">
+    <property category="archiving" name="contentRules.1" value="I:edu/**"/>
+    <property category="archiving" name="targetCompressed" value="1"/>
+    <property category="archiving" name="targetPath" value="backport-util-concurrent.jar"/>
+    <property category="archiving" name="usingRules" value="1"/>
+  </node>
+  <node name="backport-util-concurrent-test" type="Archive">
+    <property category="archiving" name="contentRules.1" value="I:**/*.*"/>
+    <property category="archiving" name="obfuscator" value="RetroGuard"/>
+    <property category="archiving" name="targetCompressed" value="1"/>
+    <property category="archiving" name="targetPath" value="backport-util-concurrent-test.jar"/>
+    <property category="archiving" name="usingRules" value="1"/>
+  </node>
+  <node name="Export to Ant" type="Ant">
+    <property category="archiving" name="buildWithProject" value="0"/>
+    <property category="export" name="target" value="build-jbexport.xml"/>
+    <property category="generate" name="destdir" value="classes"/>
+  </node>
+  <file path="build.xml">
+    <property category="ant" name="usebmj" value="0"/>
+    <property category="antparams" name="build.compiler" value="jikes"/>
+    <property category="antparams" name="build.compiler.emacs" value="true"/>
+  </file>
+  <file path="test/SerializationTest.java"/>
+</project>

Added: branches/backport-util-concurrent/upstream/2.2/backport-util-concurrent.jpx.local
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/backport-util-concurrent.jpx.local	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/backport-util-concurrent.jpx.local	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,7 @@
+build.menu.1[0]=com.borland.primetime.build.ProjectBuildActionContainer;Make distribution##com.borland.jbuilder.build.AntBuilder;build.xml;dist##
+build.menu.2[0]=com.borland.primetime.build.ProjectBuildActionContainer;Rebuild distribution##com.borland.jbuilder.build.AntBuilder;build.xml;rebuild.dist##
+classFilter.unittest.1[0]=junit.framework.*
+classFilter.unittest.2[0]=java.lang.reflect.Method
+classFilter.unittest.3[0]=com.borland.jbuilder.unittest.JBTestRunner
+classFilter.unittest.4[0]=sun.reflect.NativeMethodAccessorImpl
+classFilter.unittest.5[0]=sun.reflect.DelegatingMethodAccessorImpl

Added: branches/backport-util-concurrent/upstream/2.2/build-jbexport.xml
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/build-jbexport.xml	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/build-jbexport.xml	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,137 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--Exported by JBuilder on Jul 3, 2005 8:16:13 PM-->
+<!--It is RECOMMENDED that JBuilder builds and Ant builds done with
+this exported Ant file be kept separate and be written to different
+directories. For example, the JBuilder output directory might be "classes"
+and the Ant output directory might be "classes.ant".-->
+<project basedir="." default="rebuild" name="backport-util-concurrent.jpx">
+  <property name="jbuilder.home" value="/usr/local/share/JBuilder2005"/>
+  <property name="jdk.home" value="${jbuilder.home}/jdk1.4"/>
+  <property name="dest" value="classes"/>
+  <property name="Generated.Source" value="${dest}/Temporary_Files"/>
+  <property name="junit.home" value="external"/>
+  <property name="src" value="src"/>
+  <property name="src2" value="test/tck/src"/>
+  <property name="src3" value="test/loops/src"/>
+  <property name="testsrc" value="${src2}"/>
+  <path id="project.class.path">
+    <pathelement location="${dest}"/>
+    <pathelement location="${junit.home}/junit.jar"/>
+    <pathelement location="${jdk.home}/jre/lib/ext/sunjce_provider.jar"/>
+    <pathelement location="${jdk.home}/jre/lib/ext/dnsns.jar"/>
+    <pathelement location="${jdk.home}/jre/lib/ext/ldapsec.jar"/>
+    <pathelement location="${jdk.home}/jre/lib/ext/localedata.jar"/>
+    <pathelement location="${jdk.home}/jre/lib/sunrsasign.jar"/>
+    <pathelement location="${jdk.home}/jre/lib/jce.jar"/>
+    <pathelement location="${jdk.home}/jre/lib/im/indicim.jar"/>
+    <pathelement location="${jdk.home}/jre/lib/im/thaiim.jar"/>
+    <pathelement location="${jdk.home}/jre/lib/jsse.jar"/>
+    <pathelement location="${jdk.home}/jre/lib/charsets.jar"/>
+    <pathelement location="${jdk.home}/jre/lib/plugin.jar"/>
+    <pathelement location="${jdk.home}/jre/lib/rt.jar"/>
+    <pathelement location="${jdk.home}/jre/javaws/javaws.jar"/>
+    <pathelement location="${jdk.home}/lib/dt.jar"/>
+    <pathelement location="${jdk.home}/lib/htmlconverter.jar"/>
+    <pathelement location="${jdk.home}/lib/tools.jar"/>
+  </path>
+  <!--Patternset to exclude files from the output directory:-->
+  <patternset id="dest.exclude">
+    <exclude name="Temporary_Files/"/>
+    <exclude name="Generated Source/"/>
+    <exclude name="package cache/"/>
+    <exclude name="dependency cache/"/>
+    <exclude name="jsp cache/"/>
+    <exclude name="cache files/"/>
+  </patternset>
+  <target depends="init" name="javacompile">
+    <javac bootclasspathref="project.class.path" debug="true" deprecation="true" destdir="${dest}" nowarn="true" source="1.4" target="1.4">
+      <src path="${src}"/>
+      <src path="${src2}"/>
+      <src path="${src3}"/>
+      <src path="${Generated.Source}"/>
+    </javac>
+  </target>
+  <target depends="resource" name="archive">
+    <jar compress="true" destfile="backport-util-concurrent.jar">
+      <fileset dir="${dest}">
+        <patternset refid="dest.exclude"/>
+        <include name="edu/**"/>
+      </fileset>
+    </jar>
+    <jar compress="true" destfile="backport-util-concurrent-test.jar">
+      <fileset dir="${dest}">
+        <patternset refid="dest.exclude"/>
+        <include name="**/*.*"/>
+      </fileset>
+    </jar>
+  </target>
+  <target name="cleanup">
+    <delete file="backport-util-concurrent.jar"/>
+    <delete file="backport-util-concurrent-test.jar"/>
+    <delete failonerror="false" includeemptydirs="true">
+      <fileset dir="${dest}"/>
+    </delete>
+  </target>
+  <target name="resource">
+    <copy todir="${dest}">
+      <fileset dir="${src}">
+        <include name="**/*.jpe"/>
+        <include name="**/*.jpeg"/>
+        <include name="**/*.rmf"/>
+        <include name="**/*.wav"/>
+        <include name="**/*.mid"/>
+        <include name="**/*.midi"/>
+        <include name="**/*.au"/>
+        <include name="**/*.gif"/>
+        <include name="**/*.png"/>
+        <include name="**/*.jpg"/>
+        <include name="**/*.aiff"/>
+        <include name="**/*.properties"/>
+      </fileset>
+      <fileset dir="${src2}">
+        <include name="**/*.jpe"/>
+        <include name="**/*.jpeg"/>
+        <include name="**/*.rmf"/>
+        <include name="**/*.wav"/>
+        <include name="**/*.mid"/>
+        <include name="**/*.midi"/>
+        <include name="**/*.au"/>
+        <include name="**/*.gif"/>
+        <include name="**/*.png"/>
+        <include name="**/*.jpg"/>
+        <include name="**/*.aiff"/>
+        <include name="**/*.properties"/>
+      </fileset>
+      <fileset dir="${src3}">
+        <include name="**/*.jpe"/>
+        <include name="**/*.jpeg"/>
+        <include name="**/*.rmf"/>
+        <include name="**/*.wav"/>
+        <include name="**/*.mid"/>
+        <include name="**/*.midi"/>
+        <include name="**/*.au"/>
+        <include name="**/*.gif"/>
+        <include name="**/*.png"/>
+        <include name="**/*.jpg"/>
+        <include name="**/*.aiff"/>
+        <include name="**/*.properties"/>
+      </fileset>
+    </copy>
+  </target>
+  <target name="javadoc"/>
+  <target name="ant">
+    <ant antfile="build.xml" dir="."/>
+  </target>
+  <target depends="cleanup" name="clean"/>
+  <target name="precompile"/>
+  <target depends="javacompile" name="compile"/>
+  <target name="postcompile"/>
+  <target depends="archive,javadoc,resource" name="package"/>
+  <target name="deploy"/>
+  <target depends="precompile,compile,postcompile,package,deploy" name="make"/>
+  <target depends="clean,make" name="rebuild"/>
+  <target name="init">
+    <mkdir dir="${dest}"/>
+    <mkdir dir="${Generated.Source}"/>
+  </target>
+</project>

Added: branches/backport-util-concurrent/upstream/2.2/build.xml
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/build.xml	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/build.xml	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,352 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="backport-util-concurrent" default="dist">
+
+    <!-- where to build the distribution -->
+    <condition property="buc.dist.dir" value="${dist.dir}">
+      <isset property="dist.dir"/>
+    </condition>
+    <property name="buc.dist.dir" location="backport-util-concurrent-dist"/>
+
+    <!-- see the comments on the "test" target -->
+    <property name="tck.shortDelay" value="300"/>
+
+    <property name="build.compiler.emacs" value="true"/>
+
+    <import file="build-jbexport.xml"/>
+
+    <target name="dist" depends="jbuild,copy.dist,javadoc"/>
+
+    <target name="copy.dist">
+        <copy file="backport-util-concurrent.jar" todir="${buc.dist.dir}/"/>
+        <copy file="license.html" todir="${buc.dist.dir}"/>
+        <copy file="README.html" todir="${buc.dist.dir}"/>
+        <copy file="LEGAL" todir="${buc.dist.dir}"/>
+        <copy todir="${buc.dist.dir}/src">
+            <fileset dir="src" includes="**/*" excludes="**/CVS"/>
+        </copy>
+    </target>
+
+    <target name="jbuild" depends="jdeps,make"/>
+
+    <target depends="init" name="javacompile">
+      <javac classpathref="project.class.path" debug="true"
+             deprecation="true" destdir="${dest}" nowarn="false"
+             source="1.4" target="1.4">
+        <src path="src"/>
+        <src path="test/tck/src"/>
+        <src path="test/loops/src"/>
+        <src path="test/serialization"/>
+      </javac>
+    </target>
+
+    <target name="jdeps">
+      <dependset>
+        <srcfileset dir="src" includes="**/*"/>
+        <srcfileset dir="test/tck/src" includes="**/*"/>
+        <srcfileset dir="test/loops/src" includes="**/*"/>
+        <srcfileset dir="." includes="*.xml"/>
+        <targetfileset dir="classes" includes="**/*"/>
+        <targetfileset dir="doc/api" includes="**/*"/>
+      </dependset>
+    </target>
+
+    <target name="javadoc" depends="javadoc.uptodateCheck" unless="javadoc.uptodate">
+      <javadoc source="1.4"
+               destdir="doc/api"
+               protected="true"
+               packagenames="edu.emory.mathcs.*"
+               sourcepath="src">
+        <tag description="To Do:" name="todo" scope="all"/>
+      </javadoc>
+      <copy todir="${buc.dist.dir}/doc">
+          <fileset dir="doc" includes="**/*"/>
+      </copy>
+    </target>
+
+    <target name="javadoc.uptodateCheck">
+      <uptodate property="javadoc.uptodate" targetfile="doc/api/index.html">
+        <srcfiles dir="src" includes="**/*"/>
+      </uptodate>
+    </target>
+
+    <target name="clean.dist" depends="clean"
+            description="Deletes distribution and all generated files">
+      <delete dir="${buc.dist.dir}"/>
+      <delete dir="doc/api"/>
+    </target>
+
+    <target name="rebuild.dist" depends="clean.dist,dist"
+            description="Rebuilds the distribution from scratch">
+    </target>
+
+
+   <!-- tests -->
+
+    <!--
+
+    Please note that the TCK unit tests have been written in a way so that
+    they depend on certain race conditions (e.g. that a given thread completes
+    within a given time frame etc.). In other words, failing unit test does
+    NOT immediately imply that there is a bug in the backport - it may simply
+    be the effect of a missed race, e.g. resulting from the background load
+    interferring with the tests.
+
+    To balance robustness with time-to-completion, the "tck.shortDelay" property
+    can be used. The bigger its value, the more reliable the test suite
+    becomes, but the time to completion increases proportionally. For these
+    tests to be representative, you need to make sure that no other CPU- or
+    IO-bound programs are running, and use sufficiently large value of the
+    "tck.shortDelay" property (default is 300ms). Good value to start with is
+    50ms, although it may be insufficient on machines below 1 GHz. On fast
+    computers (3 GHz) you can get away with values of 10ms. However, if you
+    observe failures, increase this value. Please report errors ONLY if the
+    failures occur consistently (with constant probability) regardless of the
+    value of the "tck.shortDelay" property, and with no background load.
+
+     -->
+
+    <target name="test" depends="jdeps,make"
+            description="runs TCK unit tests on the backport">
+
+        <java classname="JSR166TestCase">
+            <classpath>
+                <pathelement location="backport-util-concurrent-test.jar"/>
+                <pathelement location="external/junit.jar"/>
+            </classpath>
+            <sysproperty key="tck.shortDelay" value="${tck.shortDelay}"/>
+        </java>
+
+<!--        <junit printsummary="true" showoutput="true">
+            <classpath>
+                <pathelement location="external/junit.jar"/>
+                <pathelement location="classes/"/>
+            </classpath>
+
+            <test name="JSR166TestCase" haltonfailure="no" fork="true"/>
+        </junit>
+-->
+    </target>
+
+    <target name="test.loops"
+            depends="test.loops.locks, test.loops.producer-consumer, test.loops.executors,
+                     test.loops.concurrentQueues, test.loops.deques, test.loops.other1,
+                     test.loops.mapChecks, test.loops.setChecks, test.loops.mapLoops,
+                     test.loops.stringMapLoops, test.loops.mapWordLoops,
+                     test.loops.collectionLoops, test.loops.collectionWordLoops,
+                     test.loops.lists, test.loops.other2, test.loops.rljbars,
+                     test.loops.unboundedQueueFill,test.loops.iterators"/>
+
+
+    <target name="test.loops.init" depends="init,jdeps,make">
+        <property name="max.trials" value="8"/>
+    </target>
+
+    <target name="test.loops.locks" depends="test.loops.init">
+        <runloop class="CASLoops" args="4"/>
+        <runloop.maxtrials class="SimpleReentrantLockLoops"/>
+        <runloop.maxtrials class="SimpleSemaphoreLoops"/>
+        <runloop.maxtrials class="SimpleLockLoops"/>
+        <runloop.maxtrials class="SimpleWriteLockLoops"/>
+        <runloop.maxtrials class="SimpleTimedLockLoops"/>
+        <runloop.maxtrials class="SimpleSpinLockLoops"/>
+        <runloop.maxtrials class="TimeoutLockLoops"/>
+        <runloop.maxtrials class="CheckedLockLoops"/>
+        <runloop.maxtrials class="UncheckedLockLoops"/>
+        <runloop.maxtrials class="CancelledLockLoops"/>
+        <runloop.maxtrials class="LockOncePerThreadLoops"/>
+    </target>
+
+    <target name="test.loops.producer-consumer" depends="test.loops.init">
+        <runloop.maxtrials class="ProducerConsumerLoops"/>
+        <runloop.maxtrials class="MultipleProducersSingleConsumerLoops"/>
+        <runloop.maxtrials class="SingleProducerMultipleConsumerLoops"/>
+        <runloop.maxtrials class="CancelledProducerConsumerLoops"/>
+        <runloop.maxtrials class="TimeoutProducerConsumerLoops"/>
+    </target>
+
+    <target name="test.loops.executors" depends="test.loops.init">
+        <runloop.maxtrials class="ExecutorCompletionServiceLoops"/>
+        <runloop.maxtrials class="CachedThreadPoolLoops"/>
+    </target>
+
+    <target name="test.loops.concurrentQueues" depends="test.loops.init">
+        <runloop class="ConcurrentQueueLoops"
+                 args="edu.emory.mathcs.backport.java.util.concurrent.ConcurrentLinkedQueue ${max.trials}"/>
+        <runloop class="ConcurrentQueueLoops"
+                 args="SynchronizedLinkedListQueue ${max.trials}"/>
+        <runloop class="ConcurrentDequeLoops"
+                 args="edu.emory.mathcs.backport.java.util.concurrent.LinkedBlockingDeque ${max.trials}"/>
+    </target>
+
+    <target name="test.loops.deques" depends="test.loops.init">
+        <runloop class="DequeBash"
+                 args="edu.emory.mathcs.backport.java.util.ArrayDeque ${max.trials}"/>
+        <runloop class="DequeBash"
+                 args="edu.emory.mathcs.backport.java.util.LinkedList ${max.trials}"/>
+        <runloop class="DequeBash"
+                 args="edu.emory.mathcs.backport.java.util.concurrent.LinkedBlockingDeque ${max.trials}"/>
+    </target>
+
+    <target name="test.loops.other1" depends="test.loops.init">
+        <runloop.maxtrials class="ExchangeLoops"/>
+        <runloop.maxtrials class="TimeoutExchangerLoops"/>
+        <runloop.maxtrials class="TSPExchangerTest"/>
+        <runloop.maxtrials class="CancelledFutureLoops"/>
+    </target>
+
+    <target name="test.loops.mapChecks" depends="test.loops.init">
+        <runloop class="MapCheck"
+                 args="edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap ${max.trials}"/>
+        <runloop class="IntMapCheck"
+                 args="edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap ${max.trials}"/>
+        <runloop class="IntMapCheck"
+                 args="edu.emory.mathcs.backport.java.util.concurrent.ConcurrentSkipListMap ${max.trials}"/>
+        <runloop class="NavigableMapCheck" args="edu.emory.mathcs.backport.java.util.TreeMap ${max.trials}"/>
+        <runloop class="NavigableMapCheck"
+                 args="edu.emory.mathcs.backport.java.util.concurrent.ConcurrentSkipListMap ${max.trials}"/>
+    </target>
+
+    <target name="test.loops.setChecks" depends="test.loops.init">
+        <runloop class="NavigableSetCheck"
+                 args="edu.emory.mathcs.backport.java.util.TreeSet ${max.trials}"/>
+        <runloop class="SetBash"
+                 args="edu.emory.mathcs.backport.java.util.concurrent.ConcurrentSkipListSet ${max.trials} 100"/>
+        <runloop class="SetBash"
+                 args="edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashSet ${max.trials} 100"/>
+        <runloop class="NavigableSetCheck"
+                 args="edu.emory.mathcs.backport.java.util.concurrent.ConcurrentSkipListSet ${max.trials}"/>
+    </target>
+
+    <target name="test.loops.mapLoops" depends="test.loops.init">
+        <runloop class="MapLoops"
+                 args="edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap ${max.trials}"/>
+        <runloop class="MapLoops"
+                  args="edu.emory.mathcs.backport.java.util.concurrent.ConcurrentSkipListMap ${max.trials}"/>
+        <runloop class="MapLoops" args="RWMap ${max.trials}"/>
+    </target>
+
+    <target name="test.loops.stringMapLoops" depends="test.loops.init">
+        <runloop class="StringMapLoops"
+                 args="edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap ${max.trials}"/>
+        <runloop class="StringMapLoops"
+                  args="edu.emory.mathcs.backport.java.util.concurrent.ConcurrentSkipListMap ${max.trials}"/>
+        <runloop class="StringMapLoops" args="RWMap ${max.trials}"/>
+    </target>
+
+    <target name="test.loops.mapWordLoops" depends="test.loops.init">
+        <runloop class="MapWordLoops"
+                 args="edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap ${max.trials}"/>
+        <runloop class="MapWordLoops"
+                 args="edu.emory.mathcs.backport.java.util.TreeMap ${max.trials}"/>
+        <runloop class="MapWordLoops" args="RWMap ${max.trials}"/>
+        <runloop class="MapWordLoops"
+                 args="edu.emory.mathcs.backport.java.util.concurrent.ConcurrentSkipListMap ${max.trials}"/>
+    </target>
+
+    <target name="test.loops.collectionLoops" depends="test.loops.init">
+        <runloop class="CollectionLoops"
+                 args="RWCollection"/>
+        <runloop class="CollectionLoops"
+                 args="SCollection"/>
+        <runloop class="CollectionLoops"
+                 args="SynchronizedCollection"/>
+    </target>
+
+    <target name="test.loops.collectionWordLoops" depends="test.loops.init">
+        <runloop class="CollectionWordLoops"
+                 args="edu.emory.mathcs.backport.java.util.concurrent.ConcurrentSkipListSet"/>
+        <runloop class="CollectionWordLoops"
+                 args="edu.emory.mathcs.backport.java.util.concurrent.ConcurrentLinkedQueue"/>
+        <runloop class="CollectionWordLoops"
+                 args="edu.emory.mathcs.backport.java.util.concurrent.CopyOnWriteArrayList"/>
+        <runloop class="CollectionWordLoops"
+                 args="edu.emory.mathcs.backport.java.util.ArrayDeque"/>
+    </target>
+
+    <target name="test.loops.lists" depends="test.loops.init">
+        <runloop class="ListBash"
+                 args="edu.emory.mathcs.backport.java.util.concurrent.CopyOnWriteArrayList 100 100"/>
+        <runloop class="ListBash"
+                 args="edu.emory.mathcs.backport.java.util.LinkedList 100 100"/>
+    </target>
+
+    <target name="test.loops.other2" depends="test.loops.init">
+        <runloop class="TimeUnitLoops"/>
+        <runloop class="ReadHoldingWriteLock"/>
+        <runloop class="Finals"/>
+        <runloop class="FinalLongTest"/>
+    </target>
+
+    <target name="test.loops.rljbars" depends="test.loops.init">
+        <runloop class="RLJBar"/>
+        <runloop class="RLJBar" args="-b"/>
+        <runloop class="RLIBar" args="-np ${max.trials}"/>
+        <runloop class="RLIBar" args="-batch 10 -np ${max.trials}"/>
+    </target>
+
+    <target name="test.loops.unboundedQueueFill" depends="test.loops.init">
+        <runloop class="UnboundedQueueFillEmptyLoops"
+                 args="edu.emory.mathcs.backport.java.util.ArrayDeque"/>
+        <runloop class="UnboundedQueueFillEmptyLoops"
+                 args="edu.emory.mathcs.backport.java.util.PriorityQueue"/>
+        <runloop class="UnboundedQueueFillEmptyLoops"
+                 args="edu.emory.mathcs.backport.java.util.concurrent.PriorityBlockingQueue"/>
+        <runloop class="UnboundedQueueFillEmptyLoops"
+                 args="edu.emory.mathcs.backport.java.util.LinkedList"/>
+        <runloop class="UnboundedQueueFillEmptyLoops"
+                 args="edu.emory.mathcs.backport.java.util.concurrent.ConcurrentLinkedQueue"/>
+        <runloop class="UnboundedQueueFillEmptyLoops"
+                 args="edu.emory.mathcs.backport.java.util.concurrent.LinkedBlockingQueue"/>
+        <runloop class="UnboundedQueueFillEmptyLoops"
+                 args="edu.emory.mathcs.backport.java.util.concurrent.LinkedBlockingDeque"/>
+    </target>
+
+    <target name="test.loops.iterators" depends="test.loops.init">
+        <runloop class="IteratorLoops"
+                 args="java.util.ArrayList"/>
+        <runloop class="IteratorLoops"
+                 args="java.util.Vector"/>
+        <runloop class="IteratorLoops"
+                 args="edu.emory.mathcs.backport.java.util.concurrent.CopyOnWriteArrayList"/>
+        <runloop class="IteratorLoops"
+                 args="edu.emory.mathcs.backport.java.util.LinkedList"/>
+        <runloop class="IteratorLoops"
+                 args="edu.emory.mathcs.backport.java.util.concurrent.ConcurrentLinkedQueue"/>
+        <runloop class="IteratorLoops"
+                 args="edu.emory.mathcs.backport.java.util.concurrent.LinkedBlockingQueue"/>
+        <runloop class="IteratorLoops"
+                 args="edu.emory.mathcs.backport.java.util.ArrayDeque"/>
+        <runloop class="IteratorLoops"
+                 args="edu.emory.mathcs.backport.java.util.concurrent.LinkedBlockingDeque"/>
+        <runloop class="IteratorLoops"
+                 args="edu.emory.mathcs.backport.java.util.PriorityQueue"/>
+        <runloop class="IteratorLoops"
+                 args="edu.emory.mathcs.backport.java.util.concurrent.PriorityBlockingQueue"/>
+        <runloop class="IteratorLoops"
+                 args="edu.emory.mathcs.backport.java.util.TreeSet"/>
+        <runloop class="IteratorLoops"
+                 args="edu.emory.mathcs.backport.java.util.concurrent.ConcurrentSkipListSet"/>
+        <runloop class="IteratorLoops"
+                 args="java.util.HashSet"/>
+        <runloop class="IteratorLoops"
+                 args="ConcurrentHashSet"/>
+    </target>
+
+
+    <macrodef name="runloop">
+      <attribute name="class"/>
+      <attribute name="args" default=""/>
+      <sequential>
+        <echo message="@{class} @{args}"/>
+        <java classpath="backport-util-concurrent-test.jar"
+              classname="@{class}" fork="true" dir="test/loops/words">
+          <arg line="@{args}"/>
+        </java>
+      </sequential>
+    </macrodef>
+
+    <presetdef name="runloop.maxtrials">
+      <runloop args="${max.trials}"/>
+    </presetdef>
+
+</project>

Added: branches/backport-util-concurrent/upstream/2.2/external/junit.jar
===================================================================
(Binary files differ)


Property changes on: branches/backport-util-concurrent/upstream/2.2/external/junit.jar
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/backport-util-concurrent/upstream/2.2/junit.library
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/junit.library	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/junit.library	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<library>
+  <!--JBuilder Library Definition File-->
+  <fullname>junit</fullname>
+  <class>
+    <path>[external/junit.jar]</path>
+  </class>
+  <lastmodsaved>1102549187645</lastmodsaved>
+</library>

Added: branches/backport-util-concurrent/upstream/2.2/license.html
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/license.html	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/license.html	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,41 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd">
+<html><head><title>Creative Commons Public Domain</title>
+
+<body>
+
+<p align="center"><em>Copyright-Only Dedication (based on United States law) or Public Domain Certification</em></p>
+
+        <p>The
+person or persons who have associated work with this document (the
+"Dedicator" or "Certifier") hereby either (a) certifies that, to the
+best of his knowledge, the work of authorship identified is in the
+public domain of the country from which the work is published, or (b)
+hereby dedicates whatever copyright the dedicators holds in the work of
+authorship identified below (the "Work") to the public domain. A
+certifier, morever, dedicates any copyright interest he may have in the
+associated work, and for these purposes, is described as a "dedicator"
+below.</p>
+
+        <p>A certifier has taken reasonable steps to verify
+the copyright status of this work. Certifier recognizes that his good
+faith efforts may not shield him from liability if in fact the work
+certified is not in the public domain.</p>
+
+        <p>Dedicator makes
+this dedication for the benefit of the public at large and to the
+detriment of the Dedicator's heirs and successors. Dedicator intends
+this dedication to be an overt act of relinquishment in perpetuity of
+all present and future rights under copyright law, whether vested or
+contingent, in the Work. Dedicator understands that such relinquishment
+of all rights includes the relinquishment of all rights to enforce (by
+lawsuit or otherwise) those copyrights in the Work.</p>
+
+        <p>Dedicator
+recognizes that, once placed in the public domain, the Work may be
+freely reproduced, distributed, transmitted, used, modified, built
+upon, or otherwise exploited by anyone for any purpose, commercial or
+non-commercial, and in any way, including by methods that have not yet
+been invented or conceived.</p>
+	</div>
+</div>
+</body></html>
\ No newline at end of file

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/AbstractCollection.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/AbstractCollection.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/AbstractCollection.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,32 @@
+/*
+ * Written by Dawid Kurzyniec, based on public domain code written by Doug Lea
+ * and publictly available documentation, and released to the public domain, as
+ * explained at http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.Utils;
+
+/**
+ * Overrides toArray() and toArray(Object[]) in AbstractCollection to provide
+ * implementations valid for concurrent collections.
+ *
+ * @author Doug Lea
+ * @author Dawid Kurzyniec
+ */
+public abstract class AbstractCollection extends java.util.AbstractCollection {
+
+    /**
+     * Sole constructor. (For invocation by subclass constructors, typically
+     * implicit.)
+     */
+    protected AbstractCollection() { super(); }
+
+    public Object[] toArray() {
+        return Utils.collectionToArray(this);
+    }
+
+    public Object[] toArray(Object[] a) {
+        return Utils.collectionToArray(this, a);
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/AbstractList.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/AbstractList.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/AbstractList.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,32 @@
+/*
+ * Written by Dawid Kurzyniec, based on public domain code written by Doug Lea
+ * and publictly available documentation, and released to the public domain, as
+ * explained at http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.Utils;
+
+/**
+ * Overrides toArray() and toArray(Object[]) in AbstractCollection to provide
+ * implementations valid for concurrent lists.
+ *
+ * @author Doug Lea
+ * @author Dawid Kurzyniec
+ */
+public abstract class AbstractList extends java.util.AbstractList {
+
+    /**
+     * Sole constructor. (For invocation by subclass constructors, typically
+     * implicit.)
+     */
+    protected AbstractList() { super(); }
+
+    public Object[] toArray() {
+        return Utils.collectionToArray(this);
+    }
+
+    public Object[] toArray(Object[] a) {
+        return Utils.collectionToArray(this, a);
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/AbstractMap.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/AbstractMap.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/AbstractMap.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,238 @@
+/*
+ * Written by Dawid Kurzyniec, based on public domain code written by Doug Lea
+ * and publictly available documentation, and released to the public domain, as
+ * explained at http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util;
+import java.util.Map;
+import java.util.Set;
+import java.util.Iterator;
+
+/**
+ * Convenience base class for map implementations that provides helper classes
+ * representing simple map entries, both mutable and immutable.
+ *
+ * @author Doug Lea
+ * @author Dawid Kurzyniec
+ */
+public abstract class AbstractMap extends java.util.AbstractMap {
+
+    transient Set keySet;
+
+    /**
+     * Sole constructor. (For invocation by subclass constructors, typically
+     * implicit.)
+     */
+    protected AbstractMap() {}
+
+    /**
+     * {@inheritDoc}
+     */
+    public Set keySet() {
+        if (keySet == null) {
+            keySet = new AbstractSet() { // from e.e.m.b. (overrides toArray)
+                public int size() { return AbstractMap.this.size(); }
+                public boolean contains(Object e) { return AbstractMap.this.containsKey(e); }
+                public Iterator iterator() {
+                    return new Iterator() {
+                        final Iterator itr = AbstractMap.this.entrySet().iterator();
+                        public boolean hasNext() { return itr.hasNext(); }
+                        public Object next() { return ((Entry)itr.next()).getKey(); }
+                        public void remove() { itr.remove(); }
+                    };
+                }
+            };
+        }
+        return keySet;
+    }
+
+    /**
+     * An Entry maintaining a key and a value.  The value may be
+     * changed using the <tt>setValue</tt> method.  This class
+     * facilitates the process of building custom map
+     * implementations. For example, it may be convenient to return
+     * arrays of <tt>SimpleEntry</tt> instances in method
+     * <tt>Map.entrySet().toArray</tt>
+     *
+     * @since 1.6
+     */
+    public static class SimpleEntry implements Entry {
+        private final Object key;
+        private Object value;
+
+        /**
+         * Creates an entry representing a mapping from the specified
+         * key to the specified value.
+         *
+         * @param key the key represented by this entry
+         * @param value the value represented by this entry
+         */
+        public SimpleEntry(Object key, Object value) {
+            this.key   = key;
+            this.value = value;
+        }
+
+        /**
+         * Creates an entry representing the same mapping as the
+         * specified entry.
+         *
+         * @param entry the entry to copy
+         */
+        public SimpleEntry(Entry entry) {
+            this.key   = entry.getKey();
+            this.value = entry.getValue();
+        }
+
+        /**
+         * Returns the key corresponding to this entry.
+         *
+         * @return the key corresponding to this entry
+         */
+        public Object getKey() {
+            return key;
+        }
+
+        /**
+         * Returns the value corresponding to this entry.
+         *
+         * @return the value corresponding to this entry
+         */
+        public Object getValue() {
+            return value;
+        }
+
+        /**
+         * Replaces the value corresponding to this entry with the specified
+         * value.
+         *
+         * @param value new value to be stored in this entry
+         * @return the old value corresponding to the entry
+         */
+        public Object setValue(Object value) {
+            Object oldValue = this.value;
+            this.value = value;
+            return oldValue;
+        }
+
+        public boolean equals(Object o) {
+            if (!(o instanceof Map.Entry)) return false;
+            Map.Entry e = (Map.Entry)o;
+            return eq(key, e.getKey()) && eq(value, e.getValue());
+        }
+
+        public int hashCode() {
+            return ((key   == null) ? 0 :   key.hashCode()) ^
+                   ((value == null) ? 0 : value.hashCode());
+        }
+
+        /**
+         * Returns a String representation of this map entry.  This
+         * implementation returns the string representation of this
+         * entry's key followed by the equals character ("<tt>=</tt>")
+         * followed by the string representation of this entry's value.
+         *
+         * @return a String representation of this map entry
+         */
+        public String toString() {
+            return key + "=" + value;
+        }
+
+    }
+
+    /**
+     * An Entry maintaining an immutable key and value, This class
+     * does not support method <tt>setValue</tt>.  This class may be
+     * convenient in methods that return thread-safe snapshots of
+     * key-value mappings.
+     *
+     * @since 1.6
+     */
+    public static class SimpleImmutableEntry implements Entry {
+        private final Object key;
+        private final Object value;
+
+        /**
+         * Creates an entry representing a mapping from the specified
+         * key to the specified value.
+         *
+         * @param key the key represented by this entry
+         * @param value the value represented by this entry
+         */
+        public SimpleImmutableEntry(Object key, Object value) {
+            this.key   = key;
+            this.value = value;
+        }
+
+        /**
+         * Creates an entry representing the same mapping as the
+         * specified entry.
+         *
+         * @param entry the entry to copy
+         */
+        public SimpleImmutableEntry(Entry entry) {
+            this.key   = entry.getKey();
+            this.value = entry.getValue();
+        }
+
+        /**
+         * Returns the key corresponding to this entry.
+         *
+         * @return the key corresponding to this entry
+         */
+        public Object getKey() {
+            return key;
+        }
+
+        /**
+         * Returns the value corresponding to this entry.
+         *
+         * @return the value corresponding to this entry
+         */
+        public Object getValue() {
+            return value;
+        }
+
+        /**
+         * Replaces the value corresponding to this entry with the specified
+         * value (optional operation).  This implementation simply throws
+         * <tt>UnsupportedOperationException</tt>, as this class implements
+         * an <i>immutable</i> map entry.
+         *
+         * @param value new value to be stored in this entry
+         * @return (Does not return)
+         * @throws UnsupportedOperationException always
+         */
+        public Object setValue(Object value) {
+            throw new UnsupportedOperationException();
+        }
+
+        public boolean equals(Object o) {
+            if (!(o instanceof Map.Entry))
+                return false;
+            Map.Entry e = (Map.Entry)o;
+            return eq(key, e.getKey()) && eq(value, e.getValue());
+        }
+
+        public int hashCode() {
+            return ((key   == null) ? 0 :   key.hashCode()) ^
+                   ((value == null) ? 0 : value.hashCode());
+        }
+
+        /**
+         * Returns a String representation of this map entry.  This
+         * implementation returns the string representation of this
+         * entry's key followed by the equals character ("<tt>=</tt>")
+         * followed by the string representation of this entry's value.
+         *
+         * @return a String representation of this map entry
+         */
+        public String toString() {
+            return key + "=" + value;
+        }
+    }
+
+    private static boolean eq(Object o1, Object o2) {
+        return (o1 == null ? o2 == null : o1.equals(o2));
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/AbstractQueue.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/AbstractQueue.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/AbstractQueue.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,170 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util;
+
+import java.util.Iterator;
+import java.util.Collection;
+import java.util.NoSuchElementException;
+
+/**
+ * This class provides skeletal implementations of some {@link Queue}
+ * operations. The implementations in this class are appropriate when
+ * the base implementation does <em>not</em> allow <tt>null</tt>
+ * elements.  Methods {@link #add add}, {@link #remove remove}, and
+ * {@link #element element} are based on {@link #offer offer}, {@link
+ * #poll poll}, and {@link #peek peek}, respectively but throw
+ * exceptions instead of indicating failure via <tt>false</tt> or
+ * <tt>null</tt> returns.
+ *
+ * <p> A <tt>Queue</tt> implementation that extends this class must
+ * minimally define a method {@link Queue#offer} which does not permit
+ * insertion of <tt>null</tt> elements, along with methods {@link
+ * Queue#peek}, {@link Queue#poll}, {@link Collection#size}, and a
+ * {@link Collection#iterator} supporting {@link
+ * Iterator#remove}. Typically, additional methods will be overridden
+ * as well. If these requirements cannot be met, consider instead
+ * subclassing {@link AbstractCollection}.
+ *
+ * <p>This class is a member of the
+ * <a href="{@docRoot}/../guide/collections/index.html">
+ * Java Collections Framework</a>.
+ *
+ * @since 1.5
+ * @author Doug Lea
+ */
+public abstract class AbstractQueue
+    extends AbstractCollection
+    implements Queue {
+
+    /**
+     * Constructor for use by subclasses.
+     */
+    protected AbstractQueue() {
+    }
+
+    /**
+     * Inserts the specified element into this queue if it is possible to do so
+     * immediately without violating capacity restrictions, returning
+     * <tt>true</tt> upon success and throwing an <tt>IllegalStateException</tt>
+     * if no space is currently available.
+     *
+     * <p>This implementation returns <tt>true</tt> if <tt>offer</tt> succeeds,
+     * else throws an <tt>IllegalStateException</tt>.
+     *
+     * @param e the element to add
+     * @return <tt>true</tt> (as specified by {@link Collection#add})
+     * @throws IllegalStateException if the element cannot be added at this
+     *         time due to capacity restrictions
+     * @throws ClassCastException if the class of the specified element
+     *         prevents it from being added to this queue
+     * @throws NullPointerException if the specified element is null and
+     *         this queue does not permit null elements
+     * @throws IllegalArgumentException if some property of this element
+     *         prevents it from being added to this queue
+     */
+    public boolean add(Object e) {
+        if (offer(e))
+            return true;
+        else
+            throw new IllegalStateException("Queue full");
+    }
+
+    /**
+     * Retrieves and removes the head of this queue.  This method differs
+     * from {@link #poll poll} only in that it throws an exception if this
+     * queue is empty.
+     *
+     * <p>This implementation returns the result of <tt>poll</tt>
+     * unless the queue is empty.
+     *
+     * @return the head of this queue
+     * @throws NoSuchElementException if this queue is empty
+     */
+    public Object remove() {
+        Object x = poll();
+        if (x != null)
+            return x;
+        else
+            throw new NoSuchElementException();
+    }
+
+
+    /**
+     * Retrieves, but does not remove, the head of this queue.  This method
+     * differs from {@link #peek peek} only in that it throws an exception if
+     * this queue is empty.
+     *
+     * <p>This implementation returns the result of <tt>peek</tt>
+     * unless the queue is empty.
+     *
+     * @return the head of this queue
+     * @throws NoSuchElementException if this queue is empty
+     */
+    public Object element() {
+        Object x = peek();
+        if (x != null)
+            return x;
+        else
+            throw new NoSuchElementException();
+    }
+
+    /**
+     * Removes all of the elements from this queue.
+     * The queue will be empty after this call returns.
+     *
+     * <p>This implementation repeatedly invokes {@link #poll poll} until it
+     * returns <tt>null</tt>.
+     */
+    public void clear() {
+        while (poll() != null)
+            ;
+    }
+
+    /**
+     * Adds all of the elements in the specified collection to this
+     * queue.  Attempts to addAll of a queue to itself result in
+     * <tt>IllegalArgumentException</tt>. Further, the behavior of
+     * this operation is undefined if the specified collection is
+     * modified while the operation is in progress.
+     *
+     * <p>This implementation iterates over the specified collection,
+     * and adds each element returned by the iterator to this
+     * queue, in turn.  A runtime exception encountered while
+     * trying to add an element (including, in particular, a
+     * <tt>null</tt> element) may result in only some of the elements
+     * having been successfully added when the associated exception is
+     * thrown.
+     *
+     * @param c collection containing elements to be added to this queue
+     * @return <tt>true</tt> if this queue changed as a result of the call
+     * @throws ClassCastException if the class of an element of the specified
+     *         collection prevents it from being added to this queue
+     * @throws NullPointerException if the specified collection contains a
+     *         null element and this queue does not permit null elements,
+     *         or if the specified collection is null
+     * @throws IllegalArgumentException if some property of an element of the
+     *         specified collection prevents it from being added to this
+     *         queue, or if the specified collection is this queue
+     * @throws IllegalStateException if not all the elements can be added at
+     *         this time due to insertion restrictions
+     * @see #add(Object)
+     */
+    public boolean addAll(Collection c) {
+        if (c == null)
+            throw new NullPointerException();
+        if (c == this)
+            throw new IllegalArgumentException();
+        boolean modified = false;
+        Iterator e = c.iterator();
+        while (e.hasNext()) {
+            if (add(e.next()))
+                modified = true;
+        }
+        return modified;
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/AbstractSequentialList.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/AbstractSequentialList.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/AbstractSequentialList.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,32 @@
+/*
+ * Written by Dawid Kurzyniec, based on public domain code written by Doug Lea
+ * and publictly available documentation, and released to the public domain, as
+ * explained at http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.Utils;
+
+/**
+ * Overrides toArray() and toArray(Object[]) in AbstractCollection to provide
+ * implementations valid for concurrent lists.
+ *
+ * @author Doug Lea
+ * @author Dawid Kurzyniec
+ */
+public abstract class AbstractSequentialList extends java.util.AbstractSequentialList {
+
+    /**
+     * Sole constructor. (For invocation by subclass constructors, typically
+     * implicit.)
+     */
+    protected AbstractSequentialList() { super(); }
+
+    public Object[] toArray() {
+        return Utils.collectionToArray(this);
+    }
+
+    public Object[] toArray(Object[] a) {
+        return Utils.collectionToArray(this, a);
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/AbstractSet.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/AbstractSet.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/AbstractSet.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,32 @@
+/*
+ * Written by Dawid Kurzyniec, based on public domain code written by Doug Lea
+ * and publictly available documentation, and released to the public domain, as
+ * explained at http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.Utils;
+
+/**
+ * Overrides toArray() and toArray(Object[]) in AbstractCollection to provide
+ * implementations valid for concurrent sets.
+ *
+ * @author Doug Lea
+ * @author Dawid Kurzyniec
+ */
+public abstract class AbstractSet extends java.util.AbstractSet {
+
+    /**
+     * Sole constructor. (For invocation by subclass constructors, typically
+     * implicit.)
+     */
+    protected AbstractSet() { super(); }
+
+    public Object[] toArray() {
+        return Utils.collectionToArray(this);
+    }
+
+    public Object[] toArray(Object[] a) {
+        return Utils.collectionToArray(this, a);
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/ArrayDeque.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/ArrayDeque.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/ArrayDeque.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,844 @@
+/*
+ * Written by Josh Bloch of Google Inc. and released to the public domain,
+ * as explained at http://creativecommons.org/licenses/publicdomain.
+ */
+
+package edu.emory.mathcs.backport.java.util;
+
+import java.io.Serializable;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+import java.util.ConcurrentModificationException;
+
+/**
+ * Resizable-array implementation of the {@link Deque} interface.  Array
+ * deques have no capacity restrictions; they grow as necessary to support
+ * usage.  They are not thread-safe; in the absence of external
+ * synchronization, they do not support concurrent access by multiple threads.
+ * Null elements are prohibited.  This class is likely to be faster than
+ * {@link java.util.Stack} when used as a stack, and faster than {@link LinkedList}
+ * when used as a queue.
+ *
+ * <p>Most <tt>ArrayDeque</tt> operations run in amortized constant time.
+ * Exceptions include {@link #remove(Object) remove}, {@link
+ * #removeFirstOccurrence removeFirstOccurrence}, {@link #removeLastOccurrence
+ * removeLastOccurrence}, {@link #contains contains}, {@link #iterator
+ * iterator.remove()}, and the bulk operations, all of which run in linear
+ * time.
+ *
+ * <p>The iterators returned by this class's <tt>iterator</tt> method are
+ * <i>fail-fast</i>: If the deque is modified at any time after the iterator
+ * is created, in any way except through the iterator's own <tt>remove</tt>
+ * method, the iterator will generally throw a {@link
+ * ConcurrentModificationException}.  Thus, in the face of concurrent
+ * modification, the iterator fails quickly and cleanly, rather than risking
+ * arbitrary, non-deterministic behavior at an undetermined time in the
+ * future.
+ *
+ * <p>Note that the fail-fast behavior of an iterator cannot be guaranteed
+ * as it is, generally speaking, impossible to make any hard guarantees in the
+ * presence of unsynchronized concurrent modification.  Fail-fast iterators
+ * throw <tt>ConcurrentModificationException</tt> on a best-effort basis.
+ * Therefore, it would be wrong to write a program that depended on this
+ * exception for its correctness: <i>the fail-fast behavior of iterators
+ * should be used only to detect bugs.</i>
+ *
+ * <p>This class and its iterator implement all of the
+ * <em>optional</em> methods of the {@link Collection} and {@link
+ * Iterator} interfaces.
+ *
+ * <p>This class is a member of the
+ * <a href="{@docRoot}/../guide/collections/index.html">
+ * Java Collections Framework</a>.
+ *
+ * @author  Josh Bloch and Doug Lea
+ * @since   1.6
+ */
+public class ArrayDeque extends AbstractCollection
+                           implements Deque, Cloneable, Serializable
+{
+    /**
+     * The array in which the elements of the deque are stored.
+     * The capacity of the deque is the length of this array, which is
+     * always a power of two. The array is never allowed to become
+     * full, except transiently within an addX method where it is
+     * resized (see doubleCapacity) immediately upon becoming full,
+     * thus avoiding head and tail wrapping around to equal each
+     * other.  We also guarantee that all array cells not holding
+     * deque elements are always null.
+     */
+    private transient Object[] elements;
+
+    /**
+     * The index of the element at the head of the deque (which is the
+     * element that would be removed by remove() or pop()); or an
+     * arbitrary number equal to tail if the deque is empty.
+     */
+    private transient int head;
+
+    /**
+     * The index at which the next element would be added to the tail
+     * of the deque (via addLast(E), add(E), or push(E)).
+     */
+    private transient int tail;
+
+    /**
+     * The minimum capacity that we'll use for a newly created deque.
+     * Must be a power of 2.
+     */
+    private static final int MIN_INITIAL_CAPACITY = 8;
+
+    // ******  Array allocation and resizing utilities ******
+
+    /**
+     * Allocate empty array to hold the given number of elements.
+     *
+     * @param numElements  the number of elements to hold
+     */
+    private void allocateElements(int numElements) {
+        int initialCapacity = MIN_INITIAL_CAPACITY;
+        // Find the best power of two to hold elements.
+        // Tests "<=" because arrays aren't kept full.
+        if (numElements >= initialCapacity) {
+            initialCapacity = numElements;
+            initialCapacity |= (initialCapacity >>>  1);
+            initialCapacity |= (initialCapacity >>>  2);
+            initialCapacity |= (initialCapacity >>>  4);
+            initialCapacity |= (initialCapacity >>>  8);
+            initialCapacity |= (initialCapacity >>> 16);
+            initialCapacity++;
+
+            if (initialCapacity < 0)   // Too many elements, must back off
+                initialCapacity >>>= 1;// Good luck allocating 2 ^ 30 elements
+        }
+        elements = (Object[]) new Object[initialCapacity];
+    }
+
+    /**
+     * Double the capacity of this deque.  Call only when full, i.e.,
+     * when head and tail have wrapped around to become equal.
+     */
+    private void doubleCapacity() {
+        assert head == tail;
+        int p = head;
+        int n = elements.length;
+        int r = n - p; // number of elements to the right of p
+        int newCapacity = n << 1;
+        if (newCapacity < 0)
+            throw new IllegalStateException("Sorry, deque too big");
+        Object[] a = new Object[newCapacity];
+        System.arraycopy(elements, p, a, 0, r);
+        System.arraycopy(elements, 0, a, r, p);
+        elements = (Object[])a;
+        head = 0;
+        tail = n;
+    }
+
+    /**
+     * Copies the elements from our element array into the specified array,
+     * in order (from first to last element in the deque).  It is assumed
+     * that the array is large enough to hold all elements in the deque.
+     *
+     * @return its argument
+     */
+    private Object[] copyElements(Object[] a) {
+        if (head < tail) {
+            System.arraycopy(elements, head, a, 0, size());
+        } else if (head > tail) {
+            int headPortionLen = elements.length - head;
+            System.arraycopy(elements, head, a, 0, headPortionLen);
+            System.arraycopy(elements, 0, a, headPortionLen, tail);
+        }
+        return a;
+    }
+
+    /**
+     * Constructs an empty array deque with an initial capacity
+     * sufficient to hold 16 elements.
+     */
+    public ArrayDeque() {
+        elements = (Object[]) new Object[16];
+    }
+
+    /**
+     * Constructs an empty array deque with an initial capacity
+     * sufficient to hold the specified number of elements.
+     *
+     * @param numElements  lower bound on initial capacity of the deque
+     */
+    public ArrayDeque(int numElements) {
+        allocateElements(numElements);
+    }
+
+    /**
+     * Constructs a deque containing the elements of the specified
+     * collection, in the order they are returned by the collection's
+     * iterator.  (The first element returned by the collection's
+     * iterator becomes the first element, or <i>front</i> of the
+     * deque.)
+     *
+     * @param c the collection whose elements are to be placed into the deque
+     * @throws NullPointerException if the specified collection is null
+     */
+    public ArrayDeque(Collection c) {
+        allocateElements(c.size());
+        addAll(c);
+    }
+
+    // The main insertion and extraction methods are addFirst,
+    // addLast, pollFirst, pollLast. The other methods are defined in
+    // terms of these.
+
+    /**
+     * Inserts the specified element at the front of this deque.
+     *
+     * @param e the element to add
+     * @throws NullPointerException if the specified element is null
+     */
+    public void addFirst(Object e) {
+        if (e == null)
+            throw new NullPointerException();
+        elements[head = (head - 1) & (elements.length - 1)] = e;
+        if (head == tail)
+            doubleCapacity();
+    }
+
+    /**
+     * Inserts the specified element at the end of this deque.
+     *
+     * <p>This method is equivalent to {@link #add}.
+     *
+     * @param e the element to add
+     * @throws NullPointerException if the specified element is null
+     */
+    public void addLast(Object e) {
+        if (e == null)
+            throw new NullPointerException();
+        elements[tail] = e;
+        if ( (tail = (tail + 1) & (elements.length - 1)) == head)
+            doubleCapacity();
+    }
+
+    /**
+     * Inserts the specified element at the front of this deque.
+     *
+     * @param e the element to add
+     * @return <tt>true</tt> (as specified by {@link Deque#offerFirst})
+     * @throws NullPointerException if the specified element is null
+     */
+    public boolean offerFirst(Object e) {
+        addFirst(e);
+        return true;
+    }
+
+    /**
+     * Inserts the specified element at the end of this deque.
+     *
+     * @param e the element to add
+     * @return <tt>true</tt> (as specified by {@link Deque#offerLast})
+     * @throws NullPointerException if the specified element is null
+     */
+    public boolean offerLast(Object e) {
+        addLast(e);
+        return true;
+    }
+
+    /**
+     * @throws NoSuchElementException {@inheritDoc}
+     */
+    public Object removeFirst() {
+        Object x = pollFirst();
+        if (x == null)
+            throw new NoSuchElementException();
+        return x;
+    }
+
+    /**
+     * @throws NoSuchElementException {@inheritDoc}
+     */
+    public Object removeLast() {
+        Object x = pollLast();
+        if (x == null)
+            throw new NoSuchElementException();
+        return x;
+    }
+
+    public Object pollFirst() {
+        int h = head;
+        Object result = elements[h]; // Element is null if deque empty
+        if (result == null)
+            return null;
+        elements[h] = null;     // Must null out slot
+        head = (h + 1) & (elements.length - 1);
+        return result;
+    }
+
+    public Object pollLast() {
+        int t = (tail - 1) & (elements.length - 1);
+        Object result = elements[t];
+        if (result == null)
+            return null;
+        elements[t] = null;
+        tail = t;
+        return result;
+    }
+
+    /**
+     * @throws NoSuchElementException {@inheritDoc}
+     */
+    public Object getFirst() {
+        Object x = elements[head];
+        if (x == null)
+            throw new NoSuchElementException();
+        return x;
+    }
+
+    /**
+     * @throws NoSuchElementException {@inheritDoc}
+     */
+    public Object getLast() {
+        Object x = elements[(tail - 1) & (elements.length - 1)];
+        if (x == null)
+            throw new NoSuchElementException();
+        return x;
+    }
+
+    public Object peekFirst() {
+        return elements[head]; // elements[head] is null if deque empty
+    }
+
+    public Object peekLast() {
+        return elements[(tail - 1) & (elements.length - 1)];
+    }
+
+    /**
+     * Removes the first occurrence of the specified element in this
+     * deque (when traversing the deque from head to tail).
+     * If the deque does not contain the element, it is unchanged.
+     * More formally, removes the first element <tt>e</tt> such that
+     * <tt>o.equals(e)</tt> (if such an element exists).
+     * Returns <tt>true</tt> if this deque contained the specified element
+     * (or equivalently, if this deque changed as a result of the call).
+     *
+     * @param o element to be removed from this deque, if present
+     * @return <tt>true</tt> if the deque contained the specified element
+     */
+    public boolean removeFirstOccurrence(Object o) {
+        if (o == null)
+            return false;
+        int mask = elements.length - 1;
+        int i = head;
+        Object x;
+        while ( (x = elements[i]) != null) {
+            if (o.equals(x)) {
+                delete(i);
+                return true;
+            }
+            i = (i + 1) & mask;
+        }
+        return false;
+    }
+
+    /**
+     * Removes the last occurrence of the specified element in this
+     * deque (when traversing the deque from head to tail).
+     * If the deque does not contain the element, it is unchanged.
+     * More formally, removes the last element <tt>e</tt> such that
+     * <tt>o.equals(e)</tt> (if such an element exists).
+     * Returns <tt>true</tt> if this deque contained the specified element
+     * (or equivalently, if this deque changed as a result of the call).
+     *
+     * @param o element to be removed from this deque, if present
+     * @return <tt>true</tt> if the deque contained the specified element
+     */
+    public boolean removeLastOccurrence(Object o) {
+        if (o == null)
+            return false;
+        int mask = elements.length - 1;
+        int i = (tail - 1) & mask;
+        Object x;
+        while ( (x = elements[i]) != null) {
+            if (o.equals(x)) {
+                delete(i);
+                return true;
+            }
+            i = (i - 1) & mask;
+        }
+        return false;
+    }
+
+    // *** Queue methods ***
+
+    /**
+     * Inserts the specified element at the end of this deque.
+     *
+     * <p>This method is equivalent to {@link #addLast}.
+     *
+     * @param e the element to add
+     * @return <tt>true</tt> (as specified by {@link Collection#add})
+     * @throws NullPointerException if the specified element is null
+     */
+    public boolean add(Object e) {
+        addLast(e);
+        return true;
+    }
+
+    /**
+     * Inserts the specified element at the end of this deque.
+     *
+     * <p>This method is equivalent to {@link #offerLast}.
+     *
+     * @param e the element to add
+     * @return <tt>true</tt> (as specified by {@link Queue#offer})
+     * @throws NullPointerException if the specified element is null
+     */
+    public boolean offer(Object e) {
+        return offerLast(e);
+    }
+
+    /**
+     * Retrieves and removes the head of the queue represented by this deque.
+     *
+     * This method differs from {@link #poll poll} only in that it throws an
+     * exception if this deque is empty.
+     *
+     * <p>This method is equivalent to {@link #removeFirst}.
+     *
+     * @return the head of the queue represented by this deque
+     * @throws NoSuchElementException {@inheritDoc}
+     */
+    public Object remove() {
+        return removeFirst();
+    }
+
+    /**
+     * Retrieves and removes the head of the queue represented by this deque
+     * (in other words, the first element of this deque), or returns
+     * <tt>null</tt> if this deque is empty.
+     *
+     * <p>This method is equivalent to {@link #pollFirst}.
+     *
+     * @return the head of the queue represented by this deque, or
+     *         <tt>null</tt> if this deque is empty
+     */
+    public Object poll() {
+        return pollFirst();
+    }
+
+    /**
+     * Retrieves, but does not remove, the head of the queue represented by
+     * this deque.  This method differs from {@link #peek peek} only in
+     * that it throws an exception if this deque is empty.
+     *
+     * <p>This method is equivalent to {@link #getFirst}.
+     *
+     * @return the head of the queue represented by this deque
+     * @throws NoSuchElementException {@inheritDoc}
+     */
+    public Object element() {
+        return getFirst();
+    }
+
+    /**
+     * Retrieves, but does not remove, the head of the queue represented by
+     * this deque, or returns <tt>null</tt> if this deque is empty.
+     *
+     * <p>This method is equivalent to {@link #peekFirst}.
+     *
+     * @return the head of the queue represented by this deque, or
+     *         <tt>null</tt> if this deque is empty
+     */
+    public Object peek() {
+        return peekFirst();
+    }
+
+    // *** Stack methods ***
+
+    /**
+     * Pushes an element onto the stack represented by this deque.  In other
+     * words, inserts the element at the front of this deque.
+     *
+     * <p>This method is equivalent to {@link #addFirst}.
+     *
+     * @param e the element to push
+     * @throws NullPointerException if the specified element is null
+     */
+    public void push(Object e) {
+        addFirst(e);
+    }
+
+    /**
+     * Pops an element from the stack represented by this deque.  In other
+     * words, removes and returns the first element of this deque.
+     *
+     * <p>This method is equivalent to {@link #removeFirst()}.
+     *
+     * @return the element at the front of this deque (which is the top
+     *         of the stack represented by this deque)
+     * @throws NoSuchElementException {@inheritDoc}
+     */
+    public Object pop() {
+        return removeFirst();
+    }
+
+    private void checkInvariants() {
+        assert elements[tail] == null;
+        assert head == tail ? elements[head] == null :
+            (elements[head] != null &&
+             elements[(tail - 1) & (elements.length - 1)] != null);
+        assert elements[(head - 1) & (elements.length - 1)] == null;
+    }
+
+    /**
+     * Removes the element at the specified position in the elements array,
+     * adjusting head and tail as necessary.  This can result in motion of
+     * elements backwards or forwards in the array.
+     *
+     * <p>This method is called delete rather than remove to emphasize
+     * that its semantics differ from those of {@link List#remove(int)}.
+     *
+     * @return true if elements moved backwards
+     */
+    private boolean delete(int i) {
+         checkInvariants();
+        final Object[] elements = this.elements;
+        final int mask = elements.length - 1;
+        final int h = head;
+        final int t = tail;
+        final int front = (i - h) & mask;
+        final int back  = (t - i) & mask;
+
+        // Invariant: head <= i < tail mod circularity
+        if (front >= ((t - h) & mask))
+            throw new ConcurrentModificationException();
+
+        // Optimize for least element motion
+        if (front < back) {
+            if (h <= i) {
+                System.arraycopy(elements, h, elements, h + 1, front);
+            } else { // Wrap around
+                System.arraycopy(elements, 0, elements, 1, i);
+                elements[0] = elements[mask];
+                System.arraycopy(elements, h, elements, h + 1, mask - h);
+            }
+            elements[h] = null;
+            head = (h + 1) & mask;
+            return false;
+        } else {
+            if (i < t) { // Copy the null tail as well
+                System.arraycopy(elements, i + 1, elements, i, back);
+                tail = t - 1;
+            } else { // Wrap around
+                System.arraycopy(elements, i + 1, elements, i, mask - i);
+                elements[mask] = elements[0];
+                System.arraycopy(elements, 1, elements, 0, t);
+                tail = (t - 1) & mask;
+            }
+            return true;
+        }
+    }
+
+    // *** Collection Methods ***
+
+    /**
+     * Returns the number of elements in this deque.
+     *
+     * @return the number of elements in this deque
+     */
+    public int size() {
+        return (tail - head) & (elements.length - 1);
+    }
+
+    /**
+     * Returns <tt>true</tt> if this deque contains no elements.
+     *
+     * @return <tt>true</tt> if this deque contains no elements
+     */
+    public boolean isEmpty() {
+        return head == tail;
+    }
+
+    /**
+     * Returns an iterator over the elements in this deque.  The elements
+     * will be ordered from first (head) to last (tail).  This is the same
+     * order that elements would be dequeued (via successive calls to
+     * {@link #remove} or popped (via successive calls to {@link #pop}).
+     *
+     * @return an iterator over the elements in this deque
+     */
+    public Iterator iterator() {
+        return new DeqIterator();
+    }
+
+    public Iterator descendingIterator() {
+        return new DescendingIterator();
+    }
+
+    private class DeqIterator implements Iterator {
+        /**
+         * Index of element to be returned by subsequent call to next.
+         */
+        private int cursor = head;
+
+        /**
+         * Tail recorded at construction (also in remove), to stop
+         * iterator and also to check for comodification.
+         */
+        private int fence = tail;
+
+        /**
+         * Index of element returned by most recent call to next.
+         * Reset to -1 if element is deleted by a call to remove.
+         */
+        private int lastRet = -1;
+
+        public boolean hasNext() {
+            return cursor != fence;
+        }
+
+        public Object next() {
+            if (cursor == fence)
+                throw new NoSuchElementException();
+            Object result = elements[cursor];
+            // This check doesn't catch all possible comodifications,
+            // but does catch the ones that corrupt traversal
+            if (tail != fence || result == null)
+                throw new ConcurrentModificationException();
+            lastRet = cursor;
+            cursor = (cursor + 1) & (elements.length - 1);
+            return result;
+        }
+
+        public void remove() {
+            if (lastRet < 0)
+                throw new IllegalStateException();
+            if (delete(lastRet)) { // if left-shifted, undo increment in next()
+                cursor = (cursor - 1) & (elements.length - 1);
+                fence = tail;
+            }
+            lastRet = -1;
+        }
+    }
+
+    private class DescendingIterator implements Iterator {
+        /*
+         * This class is nearly a mirror-image of DeqIterator, using
+         * tail instead of head for initial cursor, and head instead of
+         * tail for fence.
+         */
+        private int cursor = tail;
+        private int fence = head;
+        private int lastRet = -1;
+
+        public boolean hasNext() {
+            return cursor != fence;
+        }
+
+        public Object next() {
+            if (cursor == fence)
+                throw new NoSuchElementException();
+            cursor = (cursor - 1) & (elements.length - 1);
+            Object result = elements[cursor];
+            if (head != fence || result == null)
+                throw new ConcurrentModificationException();
+            lastRet = cursor;
+            return result;
+        }
+
+        public void remove() {
+            if (lastRet < 0)
+                throw new IllegalStateException();
+            if (!delete(lastRet)) {
+                cursor = (cursor + 1) & (elements.length - 1);
+                fence = head;
+            }
+            lastRet = -1;
+        }
+    }
+
+    /**
+     * Returns <tt>true</tt> if this deque contains the specified element.
+     * More formally, returns <tt>true</tt> if and only if this deque contains
+     * at least one element <tt>e</tt> such that <tt>o.equals(e)</tt>.
+     *
+     * @param o object to be checked for containment in this deque
+     * @return <tt>true</tt> if this deque contains the specified element
+     */
+    public boolean contains(Object o) {
+        if (o == null)
+            return false;
+        int mask = elements.length - 1;
+        int i = head;
+        Object x;
+        while ( (x = elements[i]) != null) {
+            if (o.equals(x))
+                return true;
+            i = (i + 1) & mask;
+        }
+        return false;
+    }
+
+    /**
+     * Removes a single instance of the specified element from this deque.
+     * If the deque does not contain the element, it is unchanged.
+     * More formally, removes the first element <tt>e</tt> such that
+     * <tt>o.equals(e)</tt> (if such an element exists).
+     * Returns <tt>true</tt> if this deque contained the specified element
+     * (or equivalently, if this deque changed as a result of the call).
+     *
+     * <p>This method is equivalent to {@link #removeFirstOccurrence}.
+     *
+     * @param o element to be removed from this deque, if present
+     * @return <tt>true</tt> if this deque contained the specified element
+     */
+    public boolean remove(Object o) {
+        return removeFirstOccurrence(o);
+    }
+
+    /**
+     * Removes all of the elements from this deque.
+     * The deque will be empty after this call returns.
+     */
+    public void clear() {
+        int h = head;
+        int t = tail;
+        if (h != t) { // clear all cells
+            head = tail = 0;
+            int i = h;
+            int mask = elements.length - 1;
+            do {
+                elements[i] = null;
+                i = (i + 1) & mask;
+            } while (i != t);
+        }
+    }
+
+    /**
+     * Returns an array containing all of the elements in this deque
+     * in proper sequence (from first to last element).
+     *
+     * <p>The returned array will be "safe" in that no references to it are
+     * maintained by this deque.  (In other words, this method must allocate
+     * a new array).  The caller is thus free to modify the returned array.
+     *
+     * <p>This method acts as bridge between array-based and collection-based
+     * APIs.
+     *
+     * @return an array containing all of the elements in this deque
+     */
+    public Object[] toArray() {
+        return copyElements(new Object[size()]);
+    }
+
+    /**
+     * Returns an array containing all of the elements in this deque in
+     * proper sequence (from first to last element); the runtime type of the
+     * returned array is that of the specified array.  If the deque fits in
+     * the specified array, it is returned therein.  Otherwise, a new array
+     * is allocated with the runtime type of the specified array and the
+     * size of this deque.
+     *
+     * <p>If this deque fits in the specified array with room to spare
+     * (i.e., the array has more elements than this deque), the element in
+     * the array immediately following the end of the deque is set to
+     * <tt>null</tt>.
+     *
+     * <p>Like the {@link #toArray()} method, this method acts as bridge between
+     * array-based and collection-based APIs.  Further, this method allows
+     * precise control over the runtime type of the output array, and may,
+     * under certain circumstances, be used to save allocation costs.
+     *
+     * <p>Suppose <tt>x</tt> is a deque known to contain only strings.
+     * The following code can be used to dump the deque into a newly
+     * allocated array of <tt>String</tt>:
+     *
+     * <pre>
+     *     String[] y = x.toArray(new String[0]);</pre>
+     *
+     * Note that <tt>toArray(new Object[0])</tt> is identical in function to
+     * <tt>toArray()</tt>.
+     *
+     * @param a the array into which the elements of the deque are to
+     *          be stored, if it is big enough; otherwise, a new array of the
+     *          same runtime type is allocated for this purpose
+     * @return an array containing all of the elements in this deque
+     * @throws ArrayStoreException if the runtime type of the specified array
+     *         is not a supertype of the runtime type of every element in
+     *         this deque
+     * @throws NullPointerException if the specified array is null
+     */
+    public Object[] toArray(Object[] a) {
+        int size = size();
+        if (a.length < size)
+            a = (Object[])java.lang.reflect.Array.newInstance(
+                    a.getClass().getComponentType(), size);
+        copyElements(a);
+        if (a.length > size)
+            a[size] = null;
+        return a;
+    }
+
+    // *** Object methods ***
+
+    /**
+     * Returns a copy of this deque.
+     *
+     * @return a copy of this deque
+     */
+    public Object clone() {
+        try {
+            ArrayDeque result = (ArrayDeque) super.clone();
+            result.elements = Arrays.copyOf(elements, elements.length);
+            return result;
+
+        } catch (CloneNotSupportedException e) {
+            throw new AssertionError();
+        }
+    }
+
+    /**
+     * Appease the serialization gods.
+     */
+    private static final long serialVersionUID = 2340985798034038923L;
+
+    /**
+     * Serialize this deque.
+     *
+     * @serialData The current size (<tt>int</tt>) of the deque,
+     * followed by all of its elements (each an object reference) in
+     * first-to-last order.
+     */
+    private void writeObject(ObjectOutputStream s) throws IOException {
+        s.defaultWriteObject();
+
+        // Write out size
+        s.writeInt(size());
+
+        // Write out elements in order.
+        int mask = elements.length - 1;
+        for (int i = head; i != tail; i = (i + 1) & mask)
+            s.writeObject(elements[i]);
+    }
+
+    /**
+     * Deserialize this deque.
+     */
+    private void readObject(ObjectInputStream s)
+            throws IOException, ClassNotFoundException {
+        s.defaultReadObject();
+
+        // Read in size and allocate array
+        int size = s.readInt();
+        allocateElements(size);
+        head = 0;
+        tail = size;
+
+        // Read in all elements in the proper order.
+        for (int i = 0; i < size; i++)
+            elements[i] = s.readObject();
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/Arrays.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/Arrays.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/Arrays.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,811 @@
+/*
+ * Written by Dawid Kurzyniec, based on code written by Doug Lea with assistance
+ * from members of JCP JSR-166 Expert Group. Released to the public domain,
+ * as explained at http://creativecommons.org/licenses/publicdomain.
+ */
+
+package edu.emory.mathcs.backport.java.util;
+
+import java.lang.reflect.Array;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Comparator;
+
+public class Arrays {
+
+    private Arrays() {}
+
+    public static void sort(long[] a) {
+        java.util.Arrays.sort(a);
+    }
+
+    public static void sort(long[] a, int fromIndex, int toIndex) {
+        java.util.Arrays.sort(a, fromIndex, toIndex);
+    }
+
+    public static void sort(int[] a) {
+        java.util.Arrays.sort(a);
+    }
+
+    public static void sort(int[] a, int fromIndex, int toIndex) {
+        java.util.Arrays.sort(a, fromIndex, toIndex);
+    }
+
+    public static void sort(short[] a) {
+        java.util.Arrays.sort(a);
+    }
+
+    public static void sort(short[] a, int fromIndex, int toIndex) {
+        java.util.Arrays.sort(a, fromIndex, toIndex);
+    }
+
+    public static void sort(char[] a) {
+        java.util.Arrays.sort(a);
+    }
+
+    public static void sort(char[] a, int fromIndex, int toIndex) {
+        java.util.Arrays.sort(a, fromIndex, toIndex);
+    }
+
+    public static void sort(byte[] a) {
+        java.util.Arrays.sort(a);
+    }
+
+    public static void sort(byte[] a, int fromIndex, int toIndex) {
+        java.util.Arrays.sort(a, fromIndex, toIndex);
+    }
+
+    public static void sort(double[] a) {
+        java.util.Arrays.sort(a);
+    }
+
+    public static void sort(double[] a, int fromIndex, int toIndex) {
+        java.util.Arrays.sort(a, fromIndex, toIndex);
+    }
+
+    public static void sort(float[] a) {
+        java.util.Arrays.sort(a);
+    }
+
+    public static void sort(float[] a, int fromIndex, int toIndex) {
+        java.util.Arrays.sort(a, fromIndex, toIndex);
+    }
+
+
+    public static void sort(Object[] a) {
+        java.util.Arrays.sort(a);
+    }
+
+    public static void sort(Object[] a, int fromIndex, int toIndex) {
+        java.util.Arrays.sort(a, fromIndex, toIndex);
+    }
+
+    public static void sort(Object[] a, Comparator c) {
+        java.util.Arrays.sort(a, c);
+    }
+
+    public static void sort(Object[] a, int fromIndex, int toIndex, Comparator c) {
+        java.util.Arrays.sort(a, fromIndex, toIndex, c);
+    }
+
+
+    // Searching
+
+    public static int binarySearch(long[] a, long key) {
+        return java.util.Arrays.binarySearch(a, key);
+    }
+
+    public static int binarySearch(int[] a, int key) {
+        return java.util.Arrays.binarySearch(a, key);
+    }
+
+    public static int binarySearch(short[] a, short key) {
+        return java.util.Arrays.binarySearch(a, key);
+    }
+
+    public static int binarySearch(char[] a, char key) {
+        return java.util.Arrays.binarySearch(a, key);
+    }
+
+    public static int binarySearch(byte[] a, byte key) {
+        return java.util.Arrays.binarySearch(a, key);
+    }
+
+    public static int binarySearch(double[] a, double key) {
+        return java.util.Arrays.binarySearch(a, key);
+    }
+
+    public static int binarySearch(float[] a, float key) {
+        return java.util.Arrays.binarySearch(a, key);
+    }
+
+    public static int binarySearch(Object[] a, Object key) {
+        return java.util.Arrays.binarySearch(a, key);
+    }
+
+    public static int binarySearch(Object[] a, Object key, Comparator c) {
+        return java.util.Arrays.binarySearch(a, key, c);
+    }
+
+
+    // Equality Testing
+
+    public static boolean equals(long[] a, long[] a2) {
+        return java.util.Arrays.equals(a, a2);
+    }
+
+    public static boolean equals(int[] a, int[] a2) {
+        return java.util.Arrays.equals(a, a2);
+    }
+
+    public static boolean equals(short[] a, short a2[]) {
+        return java.util.Arrays.equals(a, a2);
+    }
+
+    public static boolean equals(char[] a, char[] a2) {
+        return java.util.Arrays.equals(a, a2);
+    }
+
+    public static boolean equals(byte[] a, byte[] a2) {
+        return java.util.Arrays.equals(a, a2);
+    }
+
+    public static boolean equals(boolean[] a, boolean[] a2) {
+        return java.util.Arrays.equals(a, a2);
+    }
+
+    public static boolean equals(double[] a, double[] a2) {
+        return java.util.Arrays.equals(a, a2);
+    }
+
+    public static boolean equals(float[] a, float[] a2) {
+        return java.util.Arrays.equals(a, a2);
+    }
+
+    public static boolean equals(Object[] a, Object[] a2) {
+        return java.util.Arrays.equals(a, a2);
+    }
+
+
+    // Filling
+
+    public static void fill(long[] a, long val) {
+        java.util.Arrays.fill(a, val);
+    }
+
+    public static void fill(long[] a, int fromIndex, int toIndex, long val) {
+        java.util.Arrays.fill(a, fromIndex, toIndex, val);
+    }
+
+    public static void fill(int[] a, int val) {
+        java.util.Arrays.fill(a, val);
+    }
+
+    public static void fill(int[] a, int fromIndex, int toIndex, int val) {
+        java.util.Arrays.fill(a, fromIndex, toIndex, val);
+    }
+
+    public static void fill(short[] a, short val) {
+        java.util.Arrays.fill(a, val);
+    }
+
+    public static void fill(short[] a, int fromIndex, int toIndex, short val) {
+        java.util.Arrays.fill(a, fromIndex, toIndex, val);
+    }
+
+    public static void fill(char[] a, char val) {
+        java.util.Arrays.fill(a, val);
+    }
+
+    public static void fill(char[] a, int fromIndex, int toIndex, char val) {
+        java.util.Arrays.fill(a, fromIndex, toIndex, val);
+    }
+
+    public static void fill(byte[] a, byte val) {
+        java.util.Arrays.fill(a, val);
+    }
+
+    public static void fill(byte[] a, int fromIndex, int toIndex, byte val) {
+        java.util.Arrays.fill(a, fromIndex, toIndex, val);
+    }
+
+    public static void fill(boolean[] a, boolean val) {
+        java.util.Arrays.fill(a, val);
+    }
+
+    public static void fill(boolean[] a, int fromIndex, int toIndex,
+                            boolean val) {
+        java.util.Arrays.fill(a, fromIndex, toIndex, val);
+    }
+
+    public static void fill(double[] a, double val) {
+        java.util.Arrays.fill(a, val);
+    }
+
+    public static void fill(double[] a, int fromIndex, int toIndex,double val) {
+        java.util.Arrays.fill(a, fromIndex, toIndex, val);
+    }
+
+    public static void fill(float[] a, float val) {
+        java.util.Arrays.fill(a, val);
+    }
+
+    public static void fill(float[] a, int fromIndex, int toIndex, float val) {
+        java.util.Arrays.fill(a, fromIndex, toIndex, val);
+    }
+
+    public static void fill(Object[] a, Object val) {
+        java.util.Arrays.fill(a, val);
+    }
+
+    public static void fill(Object[] a, int fromIndex, int toIndex, Object val) {
+        java.util.Arrays.fill(a, fromIndex, toIndex, val);
+    }
+
+
+    // Cloning
+
+    /**
+     * @since 1.6
+     */
+    public static Object[] copyOf(Object[] original, int newLength) {
+        return copyOf(original, newLength, original.getClass());
+    }
+
+    /**
+     * @since 1.6
+     */
+    public static Object[] copyOf(Object[] original, int newLength, Class newType) {
+        Object[] arr = (newType == Object[].class) ? new Object[newLength] :
+            (Object[])Array.newInstance(newType.getComponentType(), newLength);
+        int len  = (original.length < newLength ? original.length : newLength);
+        System.arraycopy(original, 0, arr, 0, len);
+        return arr;
+    }
+
+    /**
+     * @since 1.6
+     */
+    public static byte[] copyOf(byte[] original, int newLength) {
+        byte[] arr = new byte[newLength];
+        int len  = (original.length < newLength ? original.length : newLength);
+        System.arraycopy(original, 0, arr, 0, len);
+        return arr;
+    }
+
+    /**
+     * @since 1.6
+     */
+    public static short[] copyOf(short[] original, int newLength) {
+        short[] arr = new short[newLength];
+        int len  = (original.length < newLength ? original.length : newLength);
+        System.arraycopy(original, 0, arr, 0, len);
+        return arr;
+    }
+
+    /**
+     * @since 1.6
+     */
+    public static int[] copyOf(int[] original, int newLength) {
+        int[] arr = new int[newLength];
+        int len  = (original.length < newLength ? original.length : newLength);
+        System.arraycopy(original, 0, arr, 0, len);
+        return arr;
+    }
+
+    /**
+     * @since 1.6
+     */
+    public static long[] copyOf(long[] original, int newLength) {
+        long[] arr = new long[newLength];
+        int len  = (original.length < newLength ? original.length : newLength);
+        System.arraycopy(original, 0, arr, 0, len);
+        return arr;
+    }
+
+    /**
+     * @since 1.6
+     */
+    public static char[] copyOf(char[] original, int newLength) {
+        char[] arr = new char[newLength];
+        int len  = (original.length < newLength ? original.length : newLength);
+        System.arraycopy(original, 0, arr, 0, len);
+        return arr;
+    }
+
+    /**
+     * @since 1.6
+     */
+    public static float[] copyOf(float[] original, int newLength) {
+        float[] arr = new float[newLength];
+        int len  = (original.length < newLength ? original.length : newLength);
+        System.arraycopy(original, 0, arr, 0, len);
+        return arr;
+    }
+
+    /**
+     * @since 1.6
+     */
+    public static double[] copyOf(double[] original, int newLength) {
+        double[] arr = new double[newLength];
+        int len  = (original.length < newLength ? original.length : newLength);
+        System.arraycopy(original, 0, arr, 0, len);
+        return arr;
+    }
+
+    /**
+     * @since 1.6
+     */
+    public static boolean[] copyOf(boolean[] original, int newLength) {
+        boolean[] arr = new boolean[newLength];
+        int len  = (original.length < newLength ? original.length : newLength);
+        System.arraycopy(original, 0, arr, 0, len);
+        return arr;
+    }
+
+    /**
+     * @since 1.6
+     */
+    public static Object[] copyOfRange(Object[] original, int from, int to) {
+        return copyOfRange(original, from, to, original.getClass());
+    }
+
+    /**
+     * @since 1.6
+     */
+    public static Object[] copyOfRange(Object[] original, int from, int to, Class newType) {
+        int newLength = to - from;
+        if (newLength < 0) throw new IllegalArgumentException(from + " > " + to);
+        Object[] arr = (newType == Object[].class) ? new Object[newLength] :
+            (Object[])Array.newInstance(newType.getComponentType(), newLength);
+        int ceil = original.length-from;
+        int len = (ceil < newLength) ? ceil : newLength;
+        System.arraycopy(original, from, arr, 0, len);
+        return arr;
+    }
+
+    /**
+     * @since 1.6
+     */
+    public static byte[] copyOfRange(byte[] original, int from, int to) {
+        int newLength = to - from;
+        if (newLength < 0) throw new IllegalArgumentException(from + " > " + to);
+        byte[] arr = new byte[newLength];
+        int ceil = original.length-from;
+        int len = (ceil < newLength) ? ceil : newLength;
+        System.arraycopy(original, from, arr, 0, len);
+        return arr;
+    }
+
+    /**
+     * @since 1.6
+     */
+    public static short[] copyOfRange(short[] original, int from, int to) {
+        int newLength = to - from;
+        if (newLength < 0) throw new IllegalArgumentException(from + " > " + to);
+        short[] arr = new short[newLength];
+        int ceil = original.length-from;
+        int len = (ceil < newLength) ? ceil : newLength;
+        System.arraycopy(original, from, arr, 0, len);
+        return arr;
+    }
+
+    /**
+     * @since 1.6
+     */
+    public static int[] copyOfRange(int[] original, int from, int to) {
+        int newLength = to - from;
+        if (newLength < 0) throw new IllegalArgumentException(from + " > " + to);
+        int[] arr = new int[newLength];
+        int ceil = original.length-from;
+        int len = (ceil < newLength) ? ceil : newLength;
+        System.arraycopy(original, from, arr, 0, len);
+        return arr;
+    }
+
+    /**
+     * @since 1.6
+     */
+    public static long[] copyOfRange(long[] original, int from, int to) {
+        int newLength = to - from;
+        if (newLength < 0) throw new IllegalArgumentException(from + " > " + to);
+        long[] arr = new long[newLength];
+        int ceil = original.length-from;
+        int len = (ceil < newLength) ? ceil : newLength;
+        System.arraycopy(original, from, arr, 0, len);
+        return arr;
+    }
+
+    /**
+     * @since 1.6
+     */
+    public static char[] copyOfRange(char[] original, int from, int to) {
+        int newLength = to - from;
+        if (newLength < 0) throw new IllegalArgumentException(from + " > " + to);
+        char[] arr = new char[newLength];
+        int ceil = original.length-from;
+        int len = (ceil < newLength) ? ceil : newLength;
+        System.arraycopy(original, from, arr, 0, len);
+        return arr;
+    }
+
+    /**
+     * @since 1.6
+     */
+    public static float[] copyOfRange(float[] original, int from, int to) {
+        int newLength = to - from;
+        if (newLength < 0) throw new IllegalArgumentException(from + " > " + to);
+        float[] arr = new float[newLength];
+        int ceil = original.length-from;
+        int len = (ceil < newLength) ? ceil : newLength;
+        System.arraycopy(original, from, arr, 0, len);
+        return arr;
+    }
+
+    /**
+     * @since 1.6
+     */
+    public static double[] copyOfRange(double[] original, int from, int to) {
+        int newLength = to - from;
+        if (newLength < 0) throw new IllegalArgumentException(from + " > " + to);
+        double[] arr = new double[newLength];
+        int ceil = original.length-from;
+        int len = (ceil < newLength) ? ceil : newLength;
+        System.arraycopy(original, from, arr, 0, len);
+        return arr;
+    }
+
+    /**
+     * @since 1.6
+     */
+    public static boolean[] copyOfRange(boolean[] original, int from, int to) {
+        int newLength = to - from;
+        if (newLength < 0) throw new IllegalArgumentException(from + " > " + to);
+        boolean[] arr = new boolean[newLength];
+        int ceil = original.length-from;
+        int len = (ceil < newLength) ? ceil : newLength;
+        System.arraycopy(original, from, arr, 0, len);
+        return arr;
+    }
+
+
+    public static List asList(Object[] a) {
+        return java.util.Arrays.asList(a);
+    }
+
+    /**
+     * @since 1.5
+     */
+    public static int hashCode(long a[]) {
+        if (a == null) return 0;
+        int hash = 1;
+        for (int i=0; i<a.length; i++) {
+            long e = a[i];
+            hash = 31*hash + (int)(e ^ (e >>> 32));
+        }
+        return hash;
+    }
+
+    /**
+     * @since 1.5
+     */
+    public static int hashCode(int a[]) {
+        if (a == null) return 0;
+        int hash = 1;
+        for (int i=0; i<a.length; i++) {
+            hash = 31*hash + a[i];
+        }
+        return hash;
+    }
+
+    /**
+     * @since 1.5
+     */
+    public static int hashCode(short a[]) {
+        if (a == null) return 0;
+        int hash = 1;
+        for (int i=0; i<a.length; i++) {
+            hash = 31*hash + a[i];
+        }
+        return hash;
+    }
+
+    /**
+     * @since 1.5
+     */
+    public static int hashCode(char a[]) {
+        if (a == null) return 0;
+        int hash = 1;
+        for (int i=0; i<a.length; i++) {
+            hash = 31*hash + a[i];
+        }
+        return hash;
+    }
+
+    /**
+     * @since 1.5
+     */
+    public static int hashCode(byte a[]) {
+        if (a == null) return 0;
+        int hash = 1;
+        for (int i=0; i<a.length; i++) {
+            hash = 31*hash + a[i];
+        }
+        return hash;
+    }
+
+    /**
+     * @since 1.5
+     */
+    public static int hashCode(boolean a[]) {
+        if (a == null) return 0;
+        int hash = 1;
+        for (int i=0; i<a.length; i++) {
+            hash = 31*hash + (a[i] ? 1231 : 1237);
+        }
+        return hash;
+    }
+
+    /**
+     * @since 1.5
+     */
+    public static int hashCode(float a[]) {
+        if (a == null) return 0;
+        int hash = 1;
+        for (int i=0; i<a.length; i++) {
+            hash = 31*hash + Float.floatToIntBits(a[i]);
+        }
+        return hash;
+    }
+
+    /**
+     * @since 1.5
+     */
+    public static int hashCode(double a[]) {
+        if (a == null) return 0;
+        int hash = 1;
+        for (int i=0; i<a.length; i++) {
+            long e = Double.doubleToLongBits(a[i]);
+            hash = 31*hash + (int)(e ^ (e >>> 32));
+        }
+        return hash;
+    }
+
+    /**
+     * @since 1.5
+     */
+    public static int hashCode(Object a[]) {
+        if (a == null) return 0;
+        int hash = 1;
+        for (int i=0; i<a.length; i++) {
+            Object e = a[i];
+            hash = 31*hash + (e == null ? 0 : e.hashCode());
+        }
+        return hash;
+    }
+
+    /**
+     * @since 1.5
+     */
+    public static int deepHashCode(Object a[]) {
+        if (a == null) return 0;
+        int hash = 1;
+        for (int i=0; i<a.length; i++) {
+            Object e = a[i];
+            hash = 31*hash +
+                   (e instanceof Object[]  ? deepHashCode((Object[])e) :
+                   (e instanceof byte[]    ? hashCode((byte[])e) :
+                   (e instanceof short[]   ? hashCode((short[])e) :
+                   (e instanceof int[]     ? hashCode((int[])e) :
+                   (e instanceof long[]    ? hashCode((long[])e) :
+                   (e instanceof char[]    ? hashCode((char[])e) :
+                   (e instanceof boolean[] ? hashCode((boolean[])e) :
+                   (e instanceof float[]   ? hashCode((float[])e) :
+                   (e instanceof double[]  ? hashCode((double[])e) :
+                   (e != null              ? e.hashCode() : 0))))))))));
+        }
+        return hash;
+
+    }
+
+    /**
+     * @since 1.5
+     */
+    public static boolean deepEquals(Object[] a1, Object[] a2) {
+        if (a1 == a2) return true;
+        if (a1 == null || a2==null) return false;
+        int len = a1.length;
+        if (len != a2.length) return false;
+        for (int i = 0; i < len; i++) {
+            Object e1 = a1[i];
+            Object e2 = a2[i];
+            if (e1 == e2) continue;
+            if (e1 == null) return false;
+            boolean eq =
+                (e1.getClass() != e2.getClass() || e1.getClass().isArray()) ?
+                        e1.equals(e2) :
+                (e1 instanceof Object[] && e2 instanceof Object[]) ?
+                        deepEquals((Object[])e1, (Object[])e2) :
+                (e1 instanceof byte[] && e2 instanceof byte[]) ?
+                        equals((byte[])e1, (byte[])e2) :
+                (e1 instanceof short[] && e2 instanceof short[]) ?
+                        equals((short[])e1, (short[])e2) :
+                (e1 instanceof int[] && e2 instanceof int[]) ?
+                        equals((int[])e1, (int[])e2) :
+                (e1 instanceof long[] && e2 instanceof long[]) ?
+                        equals((long[])e1, (long[])e2) :
+                (e1 instanceof char[] && e2 instanceof char[]) ?
+                        equals((char[])e1, (char[])e2) :
+                (e1 instanceof boolean[] && e2 instanceof boolean[]) ?
+                        equals((boolean[])e1, (boolean[])e2) :
+                (e1 instanceof float[] && e2 instanceof float[]) ?
+                        equals((float[])e1, (float[])e2) :
+                (e1 instanceof double[] && e2 instanceof double[]) ?
+                        equals((double[])e1, (double[])e2) :
+                e1.equals(e2);
+
+            if (!eq) return false;
+        }
+        return true;
+    }
+
+    /**
+     * @since 1.5
+     */
+    public static String toString(long[] a) {
+        if (a == null) return "null";
+        if (a.length == 0) return "[]";
+        StringBuffer buf = new StringBuffer();
+        buf.append('[').append(a[0]);
+        for (int i=1; i<a.length; i++) buf.append(", ").append(a[i]);
+        buf.append(']');
+        return buf.toString();
+    }
+
+    /**
+     * @since 1.5
+     */
+    public static String toString(int[] a) {
+        if (a == null) return "null";
+        if (a.length == 0) return "[]";
+        StringBuffer buf = new StringBuffer();
+        buf.append('[').append(a[0]);
+        for (int i=1; i<a.length; i++) buf.append(", ").append(a[i]);
+        buf.append(']');
+        return buf.toString();
+    }
+
+    /**
+     * @since 1.5
+     */
+    public static String toString(short[] a) {
+        if (a == null) return "null";
+        if (a.length == 0) return "[]";
+        StringBuffer buf = new StringBuffer();
+        buf.append('[').append(a[0]);
+        for (int i=1; i<a.length; i++) buf.append(", ").append(a[i]);
+        buf.append(']');
+        return buf.toString();
+    }
+
+    /**
+     * @since 1.5
+     */
+    public static String toString(char[] a) {
+        if (a == null) return "null";
+        if (a.length == 0) return "[]";
+        StringBuffer buf = new StringBuffer();
+        buf.append('[').append(a[0]);
+        for (int i=1; i<a.length; i++) buf.append(", ").append(a[i]);
+        buf.append(']');
+        return buf.toString();
+    }
+
+    /**
+     * @since 1.5
+     */
+    public static String toString(byte[] a) {
+        if (a == null) return "null";
+        if (a.length == 0) return "[]";
+        StringBuffer buf = new StringBuffer();
+        buf.append('[').append(a[0]);
+        for (int i=1; i<a.length; i++) buf.append(", ").append(a[i]);
+        buf.append(']');
+        return buf.toString();
+    }
+
+    /**
+     * @since 1.5
+     */
+    public static String toString(boolean[] a) {
+        if (a == null) return "null";
+        if (a.length == 0) return "[]";
+        StringBuffer buf = new StringBuffer();
+        buf.append('[').append(a[0]);
+        for (int i=1; i<a.length; i++) buf.append(", ").append(a[i]);
+        buf.append(']');
+        return buf.toString();
+    }
+
+    /**
+     * @since 1.5
+     */
+    public static String toString(float[] a) {
+        if (a == null) return "null";
+        if (a.length == 0) return "[]";
+        StringBuffer buf = new StringBuffer();
+        buf.append('[').append(a[0]);
+        for (int i=1; i<a.length; i++) buf.append(", ").append(a[i]);
+        buf.append(']');
+        return buf.toString();
+    }
+
+    /**
+     * @since 1.5
+     */
+    public static String toString(double[] a) {
+        if (a == null) return "null";
+        if (a.length == 0) return "[]";
+        StringBuffer buf = new StringBuffer();
+        buf.append('[').append(a[0]);
+        for (int i=1; i<a.length; i++) buf.append(", ").append(a[i]);
+        buf.append(']');
+        return buf.toString();
+    }
+
+    /**
+     * @since 1.5
+     */
+    public static String toString(Object[] a) {
+        if (a == null) return "null";
+        if (a.length == 0) return "[]";
+        StringBuffer buf = new StringBuffer();
+        buf.append('[').append(a[0]);
+        for (int i=1; i<a.length; i++) buf.append(", ").append(a[i]);
+        buf.append(']');
+        return buf.toString();
+    }
+
+    /**
+     * @since 1.5
+     */
+    public static String deepToString(Object[] a) {
+        if (a == null) return "null";
+        StringBuffer buf = new StringBuffer();
+        deepToString(a, buf, new ArrayList());
+        return buf.toString();
+    }
+
+    private static void deepToString(Object[] a, StringBuffer buf, List seen) {
+        seen.add(a);
+        buf.append('[');
+        for (int i = 0; i < a.length; i++) {
+            if (i>0) buf.append(", ");
+            Object e = a[i];
+            if (e == null) {
+                buf.append("null");
+            }
+            else if (!e.getClass().isArray()) {
+                buf.append(e.toString());
+            }
+            else if (e instanceof Object[]) {
+                if (seen.contains(e)) buf.append("[...]");
+                else deepToString((Object[])e, buf, seen);
+            }
+            else {
+                // primitive arr
+                buf.append(
+                    (e instanceof byte[]) ? toString( (byte[]) e) :
+                    (e instanceof short[]) ? toString( (short[]) e) :
+                    (e instanceof int[]) ? toString( (int[]) e) :
+                    (e instanceof long[]) ? toString( (long[]) e) :
+                    (e instanceof char[]) ? toString( (char[]) e) :
+                    (e instanceof boolean[]) ? toString( (boolean[]) e) :
+                    (e instanceof float[]) ? toString( (float[]) e) :
+                    (e instanceof double[]) ? toString( (double[]) e) : "");
+            }
+        }
+        buf.append(']');
+        seen.remove(seen.size()-1);
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/Collections.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/Collections.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/Collections.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,791 @@
+/*
+ * Written by Dawid Kurzyniec, on the basis of public specifications and
+ * public domain sources from JSR 166, and released to the public domain,
+ * as explained at http://creativecommons.org/licenses/publicdomain.
+ */
+
+package edu.emory.mathcs.backport.java.util;
+
+import java.io.Serializable;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.lang.reflect.Array;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.ConcurrentModificationException;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+import java.util.Random;
+import java.util.Set;
+import java.util.SortedMap;
+import java.util.SortedSet;
+
+/**
+ * Augments {@link java.util.Collections} with methods added in Java 5.0
+ * and higher. Adds support for dynamically typesafe collection wrappers,
+ * and several utility methods.
+ *
+ * @see java.util.Collections
+ */
+public class Collections {
+
+    private Collections() {}
+
+    public static void sort(List list) {
+        java.util.Collections.sort(list);
+    }
+
+    public static void sort(List list, Comparator c) {
+        java.util.Collections.sort(list, c);
+    }
+
+    public static int binarySearch(List list, Object key) {
+        return java.util.Collections.binarySearch(list, key);
+    }
+
+    public static int binarySearch(List list, Object key, Comparator c) {
+        return java.util.Collections.binarySearch(list, key, c);
+    }
+
+    public static void reverse(List list) {
+        java.util.Collections.reverse(list);
+    }
+
+    public static void shuffle(List list) {
+        java.util.Collections.shuffle(list);
+    }
+
+    public static void shuffle(List list, Random rnd) {
+        java.util.Collections.shuffle(list, rnd);
+    }
+
+    public static void swap(List list, int i, int j) {
+        java.util.Collections.swap(list, i, i);
+    }
+
+    public static void fill(List list, Object obj) {
+        java.util.Collections.fill(list, obj);
+    }
+
+    public static void copy(List dest, List src) {
+        java.util.Collections.copy(dest, src);
+    }
+
+    public static Object min(Collection coll) {
+        return java.util.Collections.min(coll);
+    }
+
+    public static Object min(Collection coll, Comparator comp) {
+        return java.util.Collections.min(coll, comp);
+    }
+
+    public static Object max(Collection coll) {
+        return java.util.Collections.max(coll);
+    }
+
+    public static Object max(Collection coll, Comparator comp) {
+        return java.util.Collections.max(coll, comp);
+    }
+
+    public static void rotate(List list, int distance) {
+        java.util.Collections.rotate(list, distance);
+    }
+
+    public static boolean replaceAll(List list, Object oldVal, Object newVal) {
+        return java.util.Collections.replaceAll(list, oldVal, newVal);
+    }
+
+    public static int indexOfSubList(List source, List target) {
+        return java.util.Collections.indexOfSubList(source, target);
+    }
+
+    public static int lastIndexOfSubList(List source, List target) {
+        return java.util.Collections.lastIndexOfSubList(source, target);
+    }
+
+    // unmodifiable views
+
+    public static Collection unmodifiableCollection(Collection c) {
+        return java.util.Collections.unmodifiableCollection(c);
+    }
+
+    public static Set unmodifiableSet(Set s) {
+        return java.util.Collections.unmodifiableSet(s);
+    }
+
+    public static SortedSet unmodifiableSortedSet(SortedSet s) {
+        return java.util.Collections.unmodifiableSortedSet(s);
+    }
+
+    public static List unmodifiableList(List l) {
+        return java.util.Collections.unmodifiableList(l);
+    }
+
+    public static Map unmodifiableMap(Map m) {
+        return java.util.Collections.unmodifiableMap(m);
+    }
+
+    public static SortedMap unmodifiableSortedMap(SortedMap m) {
+        return java.util.Collections.unmodifiableSortedMap(m);
+    }
+
+    // synchronized views
+
+    public static Collection synchronizedCollection(Collection c) {
+        return java.util.Collections.synchronizedCollection(c);
+    }
+
+    public static Set synchronizedSet(Set s) {
+        return java.util.Collections.synchronizedSet(s);
+    }
+
+    public static SortedSet synchronizedSortedSet(SortedSet s) {
+        return java.util.Collections.synchronizedSortedSet(s);
+    }
+
+    public static List synchronizedList(List l) {
+        return java.util.Collections.synchronizedList(l);
+    }
+
+    public static Map synchronizedMap(Map m) {
+        return java.util.Collections.synchronizedMap(m);
+    }
+
+    public static SortedMap synchronizedSortedMap(SortedMap m) {
+        return java.util.Collections.synchronizedSortedMap(m);
+    }
+
+    // checked views
+
+    public static Collection checkedCollection(Collection c, Class type) {
+        return new CheckedCollection(c, type);
+    }
+
+    public static Set checkedSet(Set s, Class type) {
+        return new CheckedSet(s, type);
+    }
+
+    public static SortedSet checkedSortedSet(SortedSet s, Class type) {
+        return new CheckedSortedSet(s, type);
+    }
+
+    public static List checkedList(List l, Class type) {
+        return new CheckedList(l, type);
+    }
+
+    public static Map checkedMap(Map m, Class keyType, Class valueType) {
+        return new CheckedMap(m, keyType, valueType);
+    }
+
+    public static SortedMap checkedSortedMap(SortedMap m, Class keyType, Class valueType) {
+        return new CheckedSortedMap(m, keyType, valueType);
+    }
+
+    // empty views
+
+    public static Set emptySet() {
+        return java.util.Collections.EMPTY_SET;
+    }
+
+    public static List emptyList() {
+        return java.util.Collections.EMPTY_LIST;
+    }
+
+    public static Map emptyMap() {
+        return java.util.Collections.EMPTY_MAP;
+    }
+
+    // singleton views
+
+    public static Set singleton(Object o) {
+        return java.util.Collections.singleton(o);
+    }
+
+    public static List singletonList(Object o) {
+        return java.util.Collections.singletonList(o);
+    }
+
+    public static Map singletonMap(Object key, Object value) {
+        return java.util.Collections.singletonMap(key, value);
+    }
+
+    // other utils
+
+    public static List nCopies(int n, Object o) {
+        return java.util.Collections.nCopies(n, o);
+    }
+
+    public static Comparator reverseOrder() {
+        return java.util.Collections.reverseOrder();
+    }
+
+    public static Comparator reverseOrder(Comparator cmp) {
+        return (cmp instanceof ReverseComparator)
+            ? ((ReverseComparator)cmp).cmp
+            : cmp == null ? reverseOrder() : new ReverseComparator(cmp);
+    }
+
+    public static Enumeration enumeration(Collection c) {
+        return java.util.Collections.enumeration(c);
+    }
+
+    public static ArrayList list(Enumeration e) {
+        return java.util.Collections.list(e);
+    }
+
+    public static int frequency(Collection c, Object o) {
+        int freq = 0;
+        if (o == null) {
+            for (Iterator itr = c.iterator(); itr.hasNext();) {
+                if (itr.next() == null) freq++;
+            }
+        }
+        else {
+            for (Iterator itr = c.iterator(); itr.hasNext();) {
+                if (o.equals(itr.next())) freq++;
+            }
+        }
+        return freq;
+    }
+
+    public static boolean disjoint(Collection a, Collection b) {
+        // set.contains() is usually faster than for other collections
+        if (a instanceof Set && (!(b instanceof Set) || a.size() < b.size())) {
+            Collection tmp = a;
+            a = b;
+            b = tmp;
+        }
+        for (Iterator itr = a.iterator(); itr.hasNext();) {
+            if (b.contains(itr.next())) return false;
+        }
+        return true;
+    }
+
+    public static boolean addAll(Collection c, Object[] a) {
+        boolean modified = false;
+        for (int i=0; i<a.length; i++) {
+            modified |= c.add(a[i]);
+        }
+        return modified;
+    }
+
+    public static Set newSetFromMap(Map map) {
+        return new SetFromMap(map);
+    }
+
+    public static Queue asLifoQueue(Deque deque) {
+        return new AsLifoQueue(deque);
+    }
+
+
+
+    // Checked collections
+    private static class CheckedCollection implements Collection, Serializable {
+
+        final Collection coll;
+        final Class type;
+        transient Object[] emptyArr;
+        CheckedCollection(Collection coll, Class type) {
+            if (coll == null || type == null) throw new NullPointerException();
+            this.coll = coll;
+            this.type = type;
+        }
+
+        void typeCheck(Object obj) {
+            if (!type.isInstance(obj)) {
+                throw new ClassCastException(
+                    "Attempted to insert an element of type " + obj.getClass().getName() +
+                    " to a collection of type " + type.getName());
+            }
+        }
+
+        public int size()                        { return coll.size(); }
+        public void clear()                      { coll.clear(); }
+        public boolean isEmpty()                 { return coll.isEmpty(); }
+        public Object[] toArray()                { return coll.toArray(); }
+        public Object[] toArray(Object[] a)      { return coll.toArray(a); }
+        public boolean contains(Object o)        { return coll.contains(o); }
+        public boolean remove(Object o)          { return coll.remove(o); }
+        public boolean containsAll(Collection c) { return coll.containsAll(c); }
+        public boolean removeAll(Collection c)   { return coll.removeAll(c); }
+        public boolean retainAll(Collection c)   { return coll.retainAll(c); }
+        public String toString()                 { return coll.toString(); }
+
+        public boolean add(Object o) {
+            typeCheck(o);
+            return coll.add(o);
+        }
+
+        public boolean addAll(Collection c) {
+            Object[] checked;
+            try {
+                checked = c.toArray(getEmptyArr());
+            }
+            catch (ArrayStoreException e) {
+                throw new ClassCastException(
+                    "Attempted to insert an element of invalid type " +
+                    " to a collection of type " + type.getName());
+            }
+            return coll.addAll(Arrays.asList(checked));
+        }
+
+        public Iterator iterator() {
+            return new Itr(coll.iterator());
+        }
+
+        protected Object[] getEmptyArr() {
+            if (emptyArr == null) emptyArr = (Object[])Array.newInstance(type, 0);
+            return emptyArr;
+        }
+
+        class Itr implements Iterator {
+            final Iterator itr;
+            Itr(Iterator itr)            { this.itr = itr; }
+            public boolean hasNext()     { return itr.hasNext(); }
+            public Object next()         { return itr.next(); }
+            public void remove()         { itr.remove(); }
+        }
+    }
+
+    private static class CheckedList extends CheckedCollection
+        implements List, Serializable
+    {
+        final List list;
+        CheckedList(List list, Class type) {
+            super(list, type);
+            this.list = list;
+        }
+        public Object get(int index)     { return list.get(index); }
+        public Object remove(int index)  { return list.remove(index); }
+        public int indexOf(Object o)     { return list.indexOf(o); }
+        public int lastIndexOf(Object o) { return list.lastIndexOf(o); }
+
+        public int hashCode()            { return list.hashCode(); }
+        public boolean equals(Object o)  { return o == this || list.equals(o); }
+
+        public Object set(int index, Object element) {
+            typeCheck(element);
+            return list.set(index, element);
+        }
+
+        public void add(int index, Object element) {
+            typeCheck(element);
+            list.add(index, element);
+        }
+
+        public boolean addAll(int index, Collection c) {
+            Object[] checked;
+            try {
+                checked = c.toArray(getEmptyArr());
+            }
+            catch (ArrayStoreException e) {
+                throw new ClassCastException(
+                    "Attempted to insert an element of invalid type " +
+                    " to a list of type " + type.getName());
+            }
+
+            return list.addAll(index, Arrays.asList(checked));
+        }
+
+        public List subList(int fromIndex, int toIndex) {
+            return new CheckedList(list.subList(fromIndex, toIndex), type);
+        }
+
+        public ListIterator listIterator() {
+            return new ListItr(list.listIterator());
+        }
+
+        public ListIterator listIterator(int index) {
+            return new ListItr(list.listIterator(index));
+        }
+
+        private class ListItr implements ListIterator {
+            final ListIterator itr;
+            ListItr(ListIterator itr)    { this.itr = itr; }
+            public boolean hasNext()     { return itr.hasNext(); }
+            public boolean hasPrevious() { return itr.hasPrevious(); }
+            public int nextIndex()       { return itr.nextIndex(); }
+            public int previousIndex()   { return itr.previousIndex(); }
+            public Object next()         { return itr.next(); }
+            public Object previous()     { return itr.previous(); }
+            public void remove()         { itr.remove(); }
+
+            public void set(Object element) {
+                typeCheck(element);
+                itr.set(element);
+            }
+
+            public void add(Object element) {
+                typeCheck(element);
+                itr.add(element);
+            }
+        }
+    }
+
+    private static class CheckedSet extends CheckedCollection
+        implements Set, Serializable
+    {
+        CheckedSet(Set set, Class type) {
+            super(set, type);
+        }
+
+        public int hashCode()            { return coll.hashCode(); }
+        public boolean equals(Object o)  { return o == this || coll.equals(o); }
+    }
+
+    private static class CheckedSortedSet extends CheckedSet
+        implements SortedSet, Serializable
+    {
+        final SortedSet set;
+        CheckedSortedSet(SortedSet set, Class type) {
+            super(set, type);
+            this.set = set;
+        }
+        public Object first()          { return set.first(); }
+        public Object last()           { return set.last(); }
+        public Comparator comparator() { return set.comparator(); }
+
+        public SortedSet headSet(Object toElement) {
+            return new CheckedSortedSet(set.headSet(toElement), type);
+        }
+
+        public SortedSet tailSet(Object fromElement) {
+            return new CheckedSortedSet(set.tailSet(fromElement), type);
+        }
+
+        public SortedSet subSet(Object fromElement, Object toElement) {
+            return new CheckedSortedSet(set.subSet(fromElement, toElement), type);
+        }
+    }
+
+//    public static NavigableSet checkedNavigableSet(NavigableSet set, Class type) {
+//        return new CheckedNavigableSet(set, type);
+//    }
+//
+//    private static class CheckedNavigableSet extends CheckedSortedSet
+//        implements NavigableSet, Serializable
+//    {
+//        final NavigableSet set;
+//        CheckedNavigableSet(NavigableSet set, Class type) {
+//            super(set, type);
+//            this.set = set;
+//        }
+//        public Object lower(Object e)   { return set.lower(e); }
+//        public Object floor(Object e)   { return set.floor(e); }
+//        public Object ceiling(Object e) { return set.ceiling(e); }
+//        public Object higher(Object e)  { return set.higher(e); }
+//        public Object pollFirst()       { return set.pollFirst(); }
+//        public Object pollLast()        { return set.pollLast(); }
+//
+//        public Iterator descendingIterator() {
+//            return new Itr(set.descendingIterator());
+//        }
+//
+//        public NavigableSet navigableSubSet(Object fromElement,
+//                                            Object toElement) {
+//            return new CheckedNavigableSet(
+//                set.navigableSubSet(fromElement, toElement), type);
+//        }
+//
+//        public NavigableSet navigableHeadSet(Object toElement) {
+//            return new CheckedNavigableSet(set.navigableHeadSet(toElement), type);
+//        }
+//
+//        public NavigableSet navigableTailSet(Object fromElement) {
+//            return new CheckedNavigableSet(set.navigableTailSet(fromElement), type);
+//        }
+//    }
+
+    private static class CheckedMap implements Map {
+        final Map map;
+        final Class keyType, valueType;
+        transient Set entrySet;
+
+        CheckedMap(Map map, Class keyType, Class valueType) {
+            if (map == null || keyType == null || valueType == null) {
+                throw new NullPointerException();
+            }
+            this.map = map;
+            this.keyType = keyType;
+            this.valueType = valueType;
+        }
+
+        private void typeCheckKey(Object key) {
+            if (!keyType.isInstance(key)) {
+                throw new ClassCastException(
+                    "Attempted to use a key of type " + key.getClass().getName() +
+                    " with a map with keys of type " + keyType.getName());
+            }
+        }
+
+        private void typeCheckValue(Object value) {
+            if (!valueType.isInstance(value)) {
+                throw new ClassCastException(
+                    "Attempted to use a value of type " + value.getClass().getName() +
+                    " with a map with values of type " + valueType.getName());
+            }
+        }
+
+        public int hashCode()                  { return map.hashCode(); }
+        public boolean equals(Object o)        { return o == this || map.equals(o); }
+
+        public int size()                      { return map.size(); }
+        public void clear()                    { map.clear(); }
+        public boolean isEmpty()               { return map.isEmpty(); }
+        public boolean containsKey(Object key) { return map.containsKey(key); }
+        public boolean containsValue(Object value)
+                                               { return map.containsValue(value); }
+
+        // key and value sets do not support additions
+        public Collection values()             { return map.values(); }
+        public Set keySet()                    { return map.keySet(); }
+
+        private transient Object[] emptyKeyArray;
+        private transient Object[] emptyValueArray;
+
+        public void putAll(Map m) {
+            // for compatibility with 5.0, all-or-nothing semantics
+            if (emptyKeyArray == null) {
+                emptyKeyArray = (Object[])Array.newInstance(keyType, 0);
+            }
+            if (emptyValueArray == null) {
+                emptyValueArray = (Object[])Array.newInstance(valueType, 0);
+            }
+
+            Object[] keys, values;
+
+            try {
+                keys = m.keySet().toArray(emptyKeyArray);
+            }
+            catch (ArrayStoreException e) {
+                throw new ClassCastException(
+                    "Attempted to use an invalid key type " +
+                    " with a map with keys of type " + keyType.getName());
+            }
+            try {
+                values = m.keySet().toArray(emptyKeyArray);
+            }
+            catch (ArrayStoreException e) {
+                throw new ClassCastException(
+                    "Attempted to use an invalid value type " +
+                    " with a map with values of type " + valueType.getName());
+            }
+            if (keys.length != values.length) {
+                throw new ConcurrentModificationException();
+            }
+            for (int i=0; i<keys.length; i++) {
+                map.put(keys[i], values[i]);
+            }
+        }
+
+        public Set entrySet() {
+            if (entrySet == null) entrySet = new EntrySetView(map.entrySet());
+            return entrySet;
+        }
+
+        public Object get(Object key)          { return map.get(key); }
+        public Object remove(Object key)       { return map.remove(key); }
+
+        public Object put(Object key, Object value) {
+            typeCheckKey(key);
+            typeCheckValue(value);
+            return map.put(key, value);
+        }
+
+        private class EntrySetView extends AbstractSet implements Set {
+            final Set entrySet;
+            EntrySetView(Set entrySet)        { this.entrySet = entrySet; }
+            public int size()                 { return entrySet.size(); }
+            public boolean isEmpty()          { return entrySet.isEmpty(); }
+            public boolean remove(Object o)   { return entrySet.remove(o); }
+            public void clear()               { entrySet.clear(); }
+
+            public boolean contains(Object o) {
+                if (!(o instanceof Map.Entry)) return false;
+                return entrySet.contains(new EntryView((Map.Entry)o));
+            }
+
+            public Iterator iterator() {
+                final Iterator itr = entrySet.iterator();
+                return new Iterator() {
+                    public boolean hasNext() { return itr.hasNext(); }
+                    public Object next()     { return new EntryView((Map.Entry)itr.next()); }
+                    public void remove()     { itr.remove(); }
+                };
+            }
+
+            public Object[] toArray() {
+                Object[] a = entrySet.toArray();
+                if (a.getClass().getComponentType().isAssignableFrom(EntryView.class)) {
+                    for (int i=0; i<a.length; i++) {
+                        a[i] = new EntryView( (Entry) a[i]);
+                    }
+                    return a;
+                }
+                else {
+                    Object[] newa = new Object[a.length];
+                    for (int i=0; i<a.length; i++) {
+                        newa[i] = new EntryView( (Entry) a[i]);
+                    }
+                    return newa;
+                }
+            }
+
+             public Object[] toArray(Object[] a) {
+                 Object[] base;
+                 if (a.length == 0) {
+                     base = a;
+                 }
+                 else {
+                     base = (Object[])(Array.newInstance(a.getClass().getComponentType(), a.length));
+                 }
+                 base = entrySet.toArray(base);
+                 // if the returned array is type-incompatible with EntryView,
+                 // tough - we can't tolerate this anyway
+                 for (int i=0; i<base.length; i++) {
+                     base[i] = new EntryView((Map.Entry)base[i]);
+                 }
+                 if (base.length > a.length) {
+                     a = base;
+                 }
+                 else {
+                     // need to copy back to a
+                     System.arraycopy(base, 0, a, 0, base.length);
+                     if (base.length < a.length) a[base.length] = null;
+                 }
+                 return a;
+            }
+        }
+
+        private class EntryView implements Map.Entry, Serializable {
+            final Map.Entry entry;
+            EntryView(Map.Entry entry) {
+                this.entry = entry;
+            }
+            public Object getKey()          { return entry.getKey(); }
+            public Object getValue()        { return entry.getValue(); }
+            public int hashCode()           { return entry.hashCode(); }
+            public boolean equals(Object o) {
+                if (o == this) return true;
+                if (!(o instanceof Map.Entry)) return false;
+                Map.Entry e = (Map.Entry)o;
+                return eq(getKey(), e.getKey()) && eq(getValue(), e.getValue());
+            }
+
+            public Object setValue(Object val) {
+                typeCheckValue(val);
+                return entry.setValue(val);
+            }
+        }
+    }
+
+    private static boolean eq(Object o1, Object o2) {
+        return (o1 == null) ? o2 == null : o1.equals(o2);
+    }
+
+    private static class CheckedSortedMap extends CheckedMap
+                                          implements SortedMap, Serializable {
+        final SortedMap map;
+        CheckedSortedMap(SortedMap map, Class keyType, Class valueType) {
+            super(map, keyType, valueType);
+            this.map = map;
+        }
+        public Comparator comparator()  { return map.comparator(); }
+        public Object firstKey()        { return map.firstKey(); }
+        public Object lastKey()         { return map.lastKey(); }
+
+        public SortedMap subMap(Object fromKey, Object toKey) {
+            return new CheckedSortedMap(map.subMap(fromKey, toKey), keyType, valueType);
+        }
+
+        public SortedMap headMap(Object toKey) {
+            return new CheckedSortedMap(map.headMap(toKey), keyType, valueType);
+        }
+
+        public SortedMap tailMap(Object fromKey) {
+            return new CheckedSortedMap(map.tailMap(fromKey), keyType, valueType);
+        }
+    }
+
+    private static class SetFromMap extends AbstractSet implements Serializable {
+
+        private final static Object PRESENT = Boolean.TRUE;
+
+        final Map map;
+        transient Set keySet;
+
+        SetFromMap(Map map) {
+            this.map = map;
+            this.keySet = map.keySet();
+        }
+
+        public int hashCode()               { return keySet.hashCode(); }
+        public int size()                   { return map.size(); }
+        public void clear()                 { map.clear(); }
+        public boolean isEmpty()            { return map.isEmpty(); }
+        public boolean add(Object o)        { return map.put(o, PRESENT) == null; }
+        public boolean contains(Object o)   { return map.containsKey(o); }
+        public boolean equals(Object o)     { return o == this || keySet.equals(o); }
+        public boolean remove(Object o)     { return map.remove(o) == PRESENT; }
+
+        public boolean removeAll(Collection c) { return keySet.removeAll(c); }
+        public boolean retainAll(Collection c) { return keySet.retainAll(c); }
+        public Iterator iterator()             { return keySet.iterator(); }
+        public Object[] toArray()              { return keySet.toArray(); }
+        public Object[] toArray(Object[] a)    { return keySet.toArray(a); }
+
+        public boolean addAll(Collection c) {
+            boolean modified = false;
+            for (Iterator it = c.iterator(); it.hasNext();) {
+                modified |= (map.put(it.next(), PRESENT) == null);
+            }
+            return modified;
+        }
+
+        private void readObject(ObjectInputStream in)
+            throws IOException, ClassNotFoundException
+        {
+            in.defaultReadObject();
+            keySet = map.keySet();
+        }
+    }
+
+    private static class AsLifoQueue extends AbstractQueue
+        implements Queue, Serializable
+    {
+        final Deque deque;
+        AsLifoQueue(Deque deque)            { this.deque = deque; }
+        public boolean add(Object e)        { return deque.offerFirst(e); }
+        public boolean offer(Object e)      { return deque.offerFirst(e); }
+        public Object remove()              { return deque.removeFirst(); }
+        public Object poll()                { return deque.pollFirst(); }
+        public Object element()             { return deque.getFirst(); }
+        public Object peek()                { return deque.peekFirst(); }
+        public int size()                   { return deque.size(); }
+        public void clear()                 { deque.clear(); }
+        public boolean isEmpty()            { return deque.isEmpty(); }
+        public Object[] toArray()           { return deque.toArray(); }
+        public Object[] toArray(Object[] a) { return deque.toArray(a); }
+        public boolean contains(Object o)   { return deque.contains(o); }
+        public boolean remove(Object o)     { return deque.remove(o); }
+        public Iterator iterator()          { return deque.iterator(); }
+        public String toString()            { return deque.toString(); }
+	public boolean containsAll(Collection c) { return deque.containsAll(c); }
+        public boolean removeAll(Collection c)   { return deque.removeAll(c); }
+        public boolean retainAll(Collection c)   { return deque.retainAll(c); }
+    }
+
+    private static class ReverseComparator implements Comparator, Serializable {
+        final Comparator cmp;
+        ReverseComparator(Comparator cmp) {
+            this.cmp = cmp;
+        }
+        public int compare(Object o1, Object o2) {
+            return cmp.compare(o2, o1);
+        }
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/Deque.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/Deque.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/Deque.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,547 @@
+/*
+ * Written by Doug Lea and Josh Bloch with assistance from members of
+ * JCP JSR-166 Expert Group and released to the public domain, as explained
+ * at http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util;
+
+import edu.emory.mathcs.backport.java.util.*; // for javadoc
+import java.util.Iterator;
+
+/**
+ * A linear collection that supports element insertion and removal at
+ * both ends.  The name <i>deque</i> is short for "double ended queue"
+ * and is usually pronounced "deck".  Most <tt>Deque</tt>
+ * implementations place no fixed limits on the number of elements
+ * they may contain, but this interface supports capacity-restricted
+ * deques as well as those with no fixed size limit.
+ *
+ * <p>This interface defines methods to access the elements at both
+ * ends of the deque.  Methods are provided to insert, remove, and
+ * examine the element.  Each of these methods exists in two forms:
+ * one throws an exception if the operation fails, the other returns a
+ * special value (either <tt>null</tt> or <tt>false</tt>, depending on
+ * the operation).  The latter form of the insert operation is
+ * designed specifically for use with capacity-restricted
+ * <tt>Deque</tt> implementations; in most implementations, insert
+ * operations cannot fail.
+ *
+ * <p>The twelve methods described above are summarized in the
+ * following table:
+ *
+ * <p>
+ * <table BORDER CELLPADDING=3 CELLSPACING=1>
+ *  <tr>
+ *    <td></td>
+ *    <td ALIGN=CENTER COLSPAN = 2> <b>First Element (Head)</b></td>
+ *    <td ALIGN=CENTER COLSPAN = 2> <b>Last Element (Tail)</b></td>
+ *  </tr>
+ *  <tr>
+ *    <td></td>
+ *    <td ALIGN=CENTER><em>Throws exception</em></td>
+ *    <td ALIGN=CENTER><em>Special value</em></td>
+ *    <td ALIGN=CENTER><em>Throws exception</em></td>
+ *    <td ALIGN=CENTER><em>Special value</em></td>
+ *  </tr>
+ *  <tr>
+ *    <td><b>Insert</b></td>
+ *    <td>{@link #addFirst addFirst(e)}</td>
+ *    <td>{@link #offerFirst offerFirst(e)}</td>
+ *    <td>{@link #addLast addLast(e)}</td>
+ *    <td>{@link #offerLast offerLast(e)}</td>
+ *  </tr>
+ *  <tr>
+ *    <td><b>Remove</b></td>
+ *    <td>{@link #removeFirst removeFirst()}</td>
+ *    <td>{@link #pollFirst pollFirst()}</td>
+ *    <td>{@link #removeLast removeLast()}</td>
+ *    <td>{@link #pollLast pollLast()}</td>
+ *  </tr>
+ *  <tr>
+ *    <td><b>Examine</b></td>
+ *    <td>{@link #getFirst getFirst()}</td>
+ *    <td>{@link #peekFirst peekFirst()}</td>
+ *    <td>{@link #getLast getLast()}</td>
+ *    <td>{@link #peekLast peekLast()}</td>
+ *  </tr>
+ * </table>
+ *
+ * <p>This interface extends the {@link Queue} interface.  When a deque is
+ * used as a queue, FIFO (First-In-First-Out) behavior results.  Elements are
+ * added at the end of the deque and removed from the beginning.  The methods
+ * inherited from the <tt>Queue</tt> interface are precisely equivalent to
+ * <tt>Deque</tt> methods as indicated in the following table:
+ *
+ * <p>
+ * <table BORDER CELLPADDING=3 CELLSPACING=1>
+ *  <tr>
+ *    <td ALIGN=CENTER> <b><tt>Queue</tt> Method</b></td>
+ *    <td ALIGN=CENTER> <b>Equivalent <tt>Deque</tt> Method</b></td>
+ *  </tr>
+ *  <tr>
+ *    <td>{@link edu.emory.mathcs.backport.java.util.Queue#add add(e)}</td>
+ *    <td>{@link #addLast addLast(e)}</td>
+ *  </tr>
+ *  <tr>
+ *    <td>{@link edu.emory.mathcs.backport.java.util.Queue#offer offer(e)}</td>
+ *    <td>{@link #offerLast offerLast(e)}</td>
+ *  </tr>
+ *  <tr>
+ *    <td>{@link edu.emory.mathcs.backport.java.util.Queue#remove remove()}</td>
+ *    <td>{@link #removeFirst removeFirst()}</td>
+ *  </tr>
+ *  <tr>
+ *    <td>{@link edu.emory.mathcs.backport.java.util.Queue#poll poll()}</td>
+ *    <td>{@link #pollFirst pollFirst()}</td>
+ *  </tr>
+ *  <tr>
+ *    <td>{@link edu.emory.mathcs.backport.java.util.Queue#element element()}</td>
+ *    <td>{@link #getFirst getFirst()}</td>
+ *  </tr>
+ *  <tr>
+ *    <td>{@link edu.emory.mathcs.backport.java.util.Queue#peek peek()}</td>
+ *    <td>{@link #peek peekFirst()}</td>
+ *  </tr>
+ * </table>
+ *
+ * <p>Deques can also be used as LIFO (Last-In-First-Out) stacks.  This
+ * interface should be used in preference to the legacy {@link java.util.Stack} class.
+ * When a deque is used as a stack, elements are pushed and popped from the
+ * beginning of the deque.  Stack methods are precisely equivalent to
+ * <tt>Deque</tt> methods as indicated in the table below:
+ *
+ * <p>
+ * <table BORDER CELLPADDING=3 CELLSPACING=1>
+ *  <tr>
+ *    <td ALIGN=CENTER> <b>Stack Method</b></td>
+ *    <td ALIGN=CENTER> <b>Equivalent <tt>Deque</tt> Method</b></td>
+ *  </tr>
+ *  <tr>
+ *    <td>{@link #push push(e)}</td>
+ *    <td>{@link #addFirst addFirst(e)}</td>
+ *  </tr>
+ *  <tr>
+ *    <td>{@link #pop pop()}</td>
+ *    <td>{@link #removeFirst removeFirst()}</td>
+ *  </tr>
+ *  <tr>
+ *    <td>{@link #peek peek()}</td>
+ *    <td>{@link #peekFirst peekFirst()}</td>
+ *  </tr>
+ * </table>
+ *
+ * <p>Note that the {@link #peek peek} method works equally well when
+ * a deque is used as a queue or a stack; in either case, elements are
+ * drawn from the beginning of the deque.
+ *
+ * <p>This interface provides two methods to remove interior
+ * elements, {@link #removeFirstOccurrence removeFirstOccurrence} and
+ * {@link #removeLastOccurrence removeLastOccurrence}.
+ *
+ * <p>Unlike the {@link java.util.List} interface, this interface does not
+ * provide support for indexed access to elements.
+ *
+ * <p>While <tt>Deque</tt> implementations are not strictly required
+ * to prohibit the insertion of null elements, they are strongly
+ * encouraged to do so.  Users of any <tt>Deque</tt> implementations
+ * that do allow null elements are strongly encouraged <i>not</i> to
+ * take advantage of the ability to insert nulls.  This is so because
+ * <tt>null</tt> is used as a special return value by various methods
+ * to indicated that the deque is empty.
+ *
+ * <p><tt>Deque</tt> implementations generally do not define
+ * element-based versions of the <tt>equals</tt> and <tt>hashCode</tt>
+ * methods, but instead inherit the identity-based versions from class
+ * <tt>Object</tt>.
+ *
+ * <p>This interface is a member of the <a
+ * href="{@docRoot}/../guide/collections/index.html"> Java Collections
+ * Framework</a>.
+ *
+ * @author Doug Lea
+ * @author Josh Bloch
+ * @since  1.6
+ */
+
+public interface Deque extends Queue {
+    /**
+     * Inserts the specified element at the front of this deque if it is
+     * possible to do so immediately without violating capacity restrictions.
+     * When using a capacity-restricted deque, it is generally preferable to
+     * use method {@link #offerFirst}.
+     *
+     * @param e the element to add
+     * @throws IllegalStateException if the element cannot be added at this
+     *         time due to capacity restrictions
+     * @throws ClassCastException if the class of the specified element
+     *         prevents it from being added to this deque
+     * @throws NullPointerException if the specified element is null and this
+     *         deque does not permit null elements
+     * @throws IllegalArgumentException if some property of the specified
+     *         element prevents it from being added to this deque
+     */
+    void addFirst(Object e);
+
+    /**
+     * Inserts the specified element at the end of this deque if it is
+     * possible to do so immediately without violating capacity restrictions.
+     * When using a capacity-restricted deque, it is generally preferable to
+     * use method {@link #offerLast}.
+     *
+     * <p>This method is equivalent to {@link #add}.
+     *
+     * @param e the element to add
+     * @throws IllegalStateException if the element cannot be added at this
+     *         time due to capacity restrictions
+     * @throws ClassCastException if the class of the specified element
+     *         prevents it from being added to this deque
+     * @throws NullPointerException if the specified element is null and this
+     *         deque does not permit null elements
+     * @throws IllegalArgumentException if some property of the specified
+     *         element prevents it from being added to this deque
+     */
+    void addLast(Object e);
+
+    /**
+     * Inserts the specified element at the front of this deque unless it would
+     * violate capacity restrictions.  When using a capacity-restricted deque,
+     * this method is generally preferable to the {@link #addFirst} method,
+     * which can fail to insert an element only by throwing an exception.
+     *
+     * @param e the element to add
+     * @return <tt>true</tt> if the element was added to this deque, else
+     *         <tt>false</tt>
+     * @throws ClassCastException if the class of the specified element
+     *         prevents it from being added to this deque
+     * @throws NullPointerException if the specified element is null and this
+     *         deque does not permit null elements
+     * @throws IllegalArgumentException if some property of the specified
+     *         element prevents it from being added to this deque
+     */
+    boolean offerFirst(Object e);
+
+    /**
+     * Inserts the specified element at the end of this deque unless it would
+     * violate capacity restrictions.  When using a capacity-restricted deque,
+     * this method is generally preferable to the {@link #addLast} method,
+     * which can fail to insert an element only by throwing an exception.
+     *
+     * @param e the element to add
+     * @return <tt>true</tt> if the element was added to this deque, else
+     *         <tt>false</tt>
+     * @throws ClassCastException if the class of the specified element
+     *         prevents it from being added to this deque
+     * @throws NullPointerException if the specified element is null and this
+     *         deque does not permit null elements
+     * @throws IllegalArgumentException if some property of the specified
+     *         element prevents it from being added to this deque
+     */
+    boolean offerLast(Object e);
+
+    /**
+     * Retrieves and removes the first element of this deque.  This method
+     * differs from {@link #pollFirst pollFirst} only in that it throws an
+     * exception if this deque is empty.
+     *
+     * @return the head of this deque
+     * @throws NoSuchElementException if this deque is empty
+     */
+    Object removeFirst();
+
+    /**
+     * Retrieves and removes the last element of this deque.  This method
+     * differs from {@link #pollLast pollLast} only in that it throws an
+     * exception if this deque is empty.
+     *
+     * @return the tail of this deque
+     * @throws NoSuchElementException if this deque is empty
+     */
+    Object removeLast();
+
+    /**
+     * Retrieves and removes the first element of this deque,
+     * or returns <tt>null</tt> if this deque is empty.
+     *
+     * @return the head of this deque, or <tt>null</tt> if this deque is empty
+     */
+    Object pollFirst();
+
+    /**
+     * Retrieves and removes the last element of this deque,
+     * or returns <tt>null</tt> if this deque is empty.
+     *
+     * @return the tail of this deque, or <tt>null</tt> if this deque is empty
+     */
+    Object pollLast();
+
+    /**
+     * Retrieves, but does not remove, the first element of this deque.
+     * This method differs from {@link #peekFirst peekFirst} only in that it
+     * throws an exception if this deque is empty.
+     *
+     * @return the head of this deque
+     * @throws NoSuchElementException if this deque is empty
+     */
+    Object getFirst();
+
+    /**
+     * Retrieves, but does not remove, the last element of this deque.
+     * This method differs from {@link #peekLast peekLast} only in that it
+     * throws an exception if this deque is empty.
+     *
+     * @return the tail of this deque
+     * @throws NoSuchElementException if this deque is empty
+     */
+    Object getLast();
+
+    /**
+     * Retrieves, but does not remove, the first element of this deque,
+     * or returns <tt>null</tt> if this deque is empty.
+     *
+     * @return the head of this deque, or <tt>null</tt> if this deque is empty
+     */
+    Object peekFirst();
+
+    /**
+     * Retrieves, but does not remove, the last element of this deque,
+     * or returns <tt>null</tt> if this deque is empty.
+     *
+     * @return the tail of this deque, or <tt>null</tt> if this deque is empty
+     */
+    Object peekLast();
+
+    /**
+     * Removes the first occurrence of the specified element from this deque.
+     * If the deque does not contain the element, it is unchanged.
+     * More formally, removes the first element <tt>e</tt> such that
+     * <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>
+     * (if such an element exists).
+     * Returns <tt>true</tt> if this deque contained the specified element
+     * (or equivalently, if this deque changed as a result of the call).
+     *
+     * @param o element to be removed from this deque, if present
+     * @return <tt>true</tt> if an element was removed as a result of this call
+     * @throws ClassCastException if the class of the specified element
+     *         is incompatible with this deque (optional)
+     * @throws NullPointerException if the specified element is null and this
+     *         deque does not permit null elements (optional)
+     */
+    boolean removeFirstOccurrence(Object o);
+
+    /**
+     * Removes the last occurrence of the specified element from this deque.
+     * If the deque does not contain the element, it is unchanged.
+     * More formally, removes the last element <tt>e</tt> such that
+     * <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>
+     * (if such an element exists).
+     * Returns <tt>true</tt> if this deque contained the specified element
+     * (or equivalently, if this deque changed as a result of the call).
+     *
+     * @param o element to be removed from this deque, if present
+     * @return <tt>true</tt> if an element was removed as a result of this call
+     * @throws ClassCastException if the class of the specified element
+     *         is incompatible with this deque (optional)
+     * @throws NullPointerException if the specified element is null and this
+     *         deque does not permit null elements (optional)
+     */
+    boolean removeLastOccurrence(Object o);
+
+    // *** Queue methods ***
+
+    /**
+     * Inserts the specified element into the queue represented by this deque
+     * (in other words, at the tail of this deque) if it is possible to do so
+     * immediately without violating capacity restrictions, returning
+     * <tt>true</tt> upon success and throwing an
+     * <tt>IllegalStateException</tt> if no space is currently available.
+     * When using a capacity-restricted deque, it is generally preferable to
+     * use {@link #offer(Object) offer}.
+     *
+     * <p>This method is equivalent to {@link #addLast}.
+     *
+     * @param e the element to add
+     * @return <tt>true</tt> (as specified by {@link java.util.Collection#add})
+     * @throws IllegalStateException if the element cannot be added at this
+     *         time due to capacity restrictions
+     * @throws ClassCastException if the class of the specified element
+     *         prevents it from being added to this deque
+     * @throws NullPointerException if the specified element is null and this
+     *         deque does not permit null elements
+     * @throws IllegalArgumentException if some property of the specified
+     *         element prevents it from being added to this deque
+     */
+    boolean add(Object e);
+
+    /**
+     * Inserts the specified element into the queue represented by this deque
+     * (in other words, at the tail of this deque) if it is possible to do so
+     * immediately without violating capacity restrictions, returning
+     * <tt>true</tt> upon success and <tt>false</tt> if no space is currently
+     * available.  When using a capacity-restricted deque, this method is
+     * generally preferable to the {@link #add} method, which can fail to
+     * insert an element only by throwing an exception.
+     *
+     * <p>This method is equivalent to {@link #offerLast}.
+     *
+     * @param e the element to add
+     * @return <tt>true</tt> if the element was added to this deque, else
+     *         <tt>false</tt>
+     * @throws ClassCastException if the class of the specified element
+     *         prevents it from being added to this deque
+     * @throws NullPointerException if the specified element is null and this
+     *         deque does not permit null elements
+     * @throws IllegalArgumentException if some property of the specified
+     *         element prevents it from being added to this deque
+     */
+    boolean offer(Object e);
+
+    /**
+     * Retrieves and removes the head of the queue represented by this deque
+     * (in other words, the first element of this deque).
+     * This method differs from {@link #poll poll} only in that it throws an
+     * exception if this deque is empty.
+     *
+     * <p>This method is equivalent to {@link #removeFirst()}.
+     *
+     * @return the head of the queue represented by this deque
+     * @throws NoSuchElementException if this deque is empty
+     */
+    Object remove();
+
+    /**
+     * Retrieves and removes the head of the queue represented by this deque
+     * (in other words, the first element of this deque), or returns
+     * <tt>null</tt> if this deque is empty.
+     *
+     * <p>This method is equivalent to {@link #pollFirst()}.
+     *
+     * @return the first element of this deque, or <tt>null</tt> if
+     *         this deque is empty
+     */
+    Object poll();
+
+    /**
+     * Retrieves, but does not remove, the head of the queue represented by
+     * this deque (in other words, the first element of this deque).
+     * This method differs from {@link #peek peek} only in that it throws an
+     * exception if this deque is empty.
+     *
+     * <p>This method is equivalent to {@link #getFirst()}.
+     *
+     * @return the head of the queue represented by this deque
+     * @throws NoSuchElementException if this deque is empty
+     */
+    Object element();
+
+    /**
+     * Retrieves, but does not remove, the head of the queue represented by
+     * this deque (in other words, the first element of this deque), or
+     * returns <tt>null</tt> if this deque is empty.
+     *
+     * <p>This method is equivalent to {@link #peekFirst()}.
+     *
+     * @return the head of the queue represented by this deque, or
+     *         <tt>null</tt> if this deque is empty
+     */
+    Object peek();
+
+
+    // *** Stack methods ***
+
+    /**
+     * Pushes an element onto the stack represented by this deque (in other
+     * words, at the head of this deque) if it is possible to do so
+     * immediately without violating capacity restrictions, returning
+     * <tt>true</tt> upon success and throwing an
+     * <tt>IllegalStateException</tt> if no space is currently available.
+     *
+     * <p>This method is equivalent to {@link #addFirst}.
+     *
+     * @param e the element to push
+     * @throws IllegalStateException if the element cannot be added at this
+     *         time due to capacity restrictions
+     * @throws ClassCastException if the class of the specified element
+     *         prevents it from being added to this deque
+     * @throws NullPointerException if the specified element is null and this
+     *         deque does not permit null elements
+     * @throws IllegalArgumentException if some property of the specified
+     *         element prevents it from being added to this deque
+     */
+    void push(Object e);
+
+    /**
+     * Pops an element from the stack represented by this deque.  In other
+     * words, removes and returns the first element of this deque.
+     *
+     * <p>This method is equivalent to {@link #removeFirst()}.
+     *
+     * @return the element at the front of this deque (which is the top
+     *         of the stack represented by this deque)
+     * @throws NoSuchElementException if this deque is empty
+     */
+    Object pop();
+
+
+    // *** Collection methods ***
+
+    /**
+     * Removes the first occurrence of the specified element from this deque.
+     * If the deque does not contain the element, it is unchanged.
+     * More formally, removes the first element <tt>e</tt> such that
+     * <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>
+     * (if such an element exists).
+     * Returns <tt>true</tt> if this deque contained the specified element
+     * (or equivalently, if this deque changed as a result of the call).
+     *
+     * <p>This method is equivalent to {@link #removeFirstOccurrence}.
+     *
+     * @param o element to be removed from this deque, if present
+     * @return <tt>true</tt> if an element was removed as a result of this call
+     * @throws ClassCastException if the class of the specified element
+     *         is incompatible with this deque (optional)
+     * @throws NullPointerException if the specified element is null and this
+     *         deque does not permit null elements (optional)
+     */
+    boolean remove(Object o);
+
+    /**
+     * Returns <tt>true</tt> if this deque contains the specified element.
+     * More formally, returns <tt>true</tt> if and only if this deque contains
+     * at least one element <tt>e</tt> such that
+     * <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>.
+     *
+     * @param o element whose presence in this deque is to be tested
+     * @return <tt>true</tt> if this deque contains the specified element
+     * @throws ClassCastException if the type of the specified element
+     *         is incompatible with this deque (optional)
+     * @throws NullPointerException if the specified element is null and this
+     *         deque does not permit null elements (optional)
+     */
+    boolean contains(Object o);
+
+    /**
+     * Returns the number of elements in this deque.
+     *
+     * @return the number of elements in this deque
+     */
+    public int size();
+
+    /**
+     * Returns an iterator over the elements in this deque in proper sequence.
+     * The elements will be returned in order from first (head) to last (tail).
+     *
+     * @return an iterator over the elements in this deque in proper sequence
+     */
+    Iterator iterator();
+
+    /**
+     * Returns an iterator over the elements in this deque in reverse
+     * sequential order.  The elements will be returned in order from
+     * last (tail) to first (head).
+     *
+     * @return an iterator over the elements in this deque in reverse
+     * sequence
+     */
+    Iterator descendingIterator();
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/LinkedList.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/LinkedList.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/LinkedList.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,535 @@
+package edu.emory.mathcs.backport.java.util;
+
+import java.io.*;
+import java.util.List;
+import java.util.Iterator;
+import java.util.Collection;
+import java.util.ListIterator;
+import java.util.AbstractSequentialList;
+import java.lang.reflect.Array;
+import java.util.NoSuchElementException;
+import java.util.ConcurrentModificationException;
+
+public class LinkedList extends AbstractSequentialList
+    implements List, Deque, Cloneable, Serializable
+{
+    private static final long serialVersionUID = 876323262645176354L;
+
+    private transient int size = 0;
+    private transient int modCount;
+
+    // bi-directional cyclic list; head contains a sentinel entry
+    private transient Entry head;
+
+    private static class Entry {
+        Entry prev;
+        Entry next;
+        Object val;
+        Entry(Object val) {
+            this.val = val;
+        }
+    }
+
+    public LinkedList() {
+        Entry sentinel = new Entry(null);
+        sentinel.next = sentinel.prev = sentinel;
+        head = sentinel;
+    }
+
+    public LinkedList(Collection c) {
+        this();
+        addAll(c);
+    }
+
+    public int size() {
+        return size;
+    }
+
+    public boolean isEmpty() {
+        return size == 0;
+    }
+
+    public boolean contains(Object o) {
+        return findFirst(o) != null;
+    }
+
+    private Entry getAt(int idx) {
+        Entry e;
+        int size = this.size;
+        if (idx < 0 || idx >= size) {
+            throw new ArrayIndexOutOfBoundsException("Index: " + idx +
+                                                     "; Size: " + size);
+        }
+        if (idx < (size >> 1)) {
+            for (e = head.next; idx>0; idx--) e = e.next;
+            return e;
+        }
+        else {
+            idx = size-idx-1;
+            for (e = head.prev; idx>0; idx--) e = e.prev;
+            return e;
+        }
+    }
+
+    private Entry findFirst(Object o) {
+        if (o == null) {
+            for (Entry e = head.next; e != head; e = e.next) {
+                if (e.val == null) return e;
+            }
+        }
+        else {
+            for (Entry e = head.next; e != head; e = e.next) {
+                if (o.equals(e.val)) return e;
+            }
+        }
+        return null;
+    }
+
+    private Entry findLast(Object o) {
+        if (o == null) {
+            for (Entry e = head.prev; e != head; e = e.prev) {
+                if (e.val == null) return e;
+            }
+        }
+        else {
+            for (Entry e = head.prev; e != head; e = e.prev) {
+                if (o.equals(e.val)) return e;
+            }
+        }
+        return null;
+    }
+
+    public int indexOf(Object o) {
+        int idx=0;
+        if (o == null) {
+            for (Entry e = head.next; e != head; e = e.next, idx++) {
+                if (e.val == null) return idx;
+            }
+        }
+        else {
+            for (Entry e = head.next; e != head; e = e.next, idx++) {
+                if (o.equals(e.val)) return idx;
+            }
+        }
+        return -1;
+    }
+
+    public int lastIndexOf(Object o) {
+        int idx=size-1;
+        if (o == null) {
+            for (Entry e = head.prev; e != head; e = e.prev, idx--) {
+                if (e.val == null) return idx;
+            }
+        }
+        else {
+            for (Entry e = head.prev; e != head; e = e.prev, idx--) {
+                if (o.equals(e.val)) return idx;
+            }
+        }
+        return -1;
+    }
+
+    public Object[] toArray() {
+        Object[] a = new Object[size];
+        int i=0;
+        for (Entry e = head.next; e != head; e = e.next) a[i++] = e.val;
+        return a;
+    }
+
+    public Object[] toArray(Object[] a) {
+        int size = this.size;
+        if (a.length < size) {
+            a = (Object[])Array.newInstance(a.getClass().getComponentType(), size);
+        }
+        int i=0;
+        for (Entry e = head.next; e != head; e = e.next) a[i++] = e.val;
+        if (i < a.length) a[i++] = null;
+        return a;
+    }
+
+    public boolean add(Object o) {
+        insertBefore(head, o);
+        return true;
+    }
+
+    private void insertAfter(Entry e, Object val) {
+        modCount++;
+        Entry succ = e.next;
+        Entry newe = new Entry(val);
+        newe.prev = e;
+        newe.next = succ;
+        e.next = newe;
+        succ.prev = newe;
+        size++;
+    }
+
+    private void insertBefore(Entry e, Object val) {
+        modCount++;
+        Entry pred = e.prev;
+        Entry newe = new Entry(val);
+        newe.prev = pred;
+        newe.next = e;
+        pred.next = newe;
+        e.prev = newe;
+        size++;
+    }
+
+    private Object remove(Entry e) {
+        if (e == head) throw new NoSuchElementException();
+        modCount++;
+        Entry succ = e.next;
+        Entry pred = e.prev;
+        pred.next = succ;
+        succ.prev = pred;
+        size--;
+        return e.val;
+    }
+
+    public boolean remove(Object o) {
+        Entry e = findFirst(o);
+        if (e == null) return false;
+        remove(e);
+        return true;
+    }
+
+    public boolean addAll(Collection c) {
+        return insertAllBefore(head, c);
+    }
+
+    public boolean addAll(int index, Collection c) {
+        return insertAllBefore((index == size) ? head : getAt(index), c);
+    }
+
+    private boolean insertAllBefore(Entry succ, Collection c) {
+        Iterator itr = c.iterator();
+        if (!itr.hasNext()) return false;
+        modCount++;
+        Entry first = new Entry(itr.next());
+        Entry prev = first;
+        Entry curr = first;
+        int added = 1;
+        while (itr.hasNext()) {
+            curr = new Entry(itr.next());
+            prev.next = curr;
+            curr.prev = prev;
+            prev = curr;
+            added++;
+        }
+
+        Entry pred = succ.prev;
+        first.prev = pred;
+        curr.next = succ;
+        pred.next = first;
+        succ.prev = curr;
+        size += added;
+
+        return true;
+    }
+
+    public void clear() {
+        modCount++;
+        head.next = head.prev = head;
+        size = 0;
+    }
+
+    public Object get(int index) {
+        return getAt(index).val;
+    }
+
+    public Object set(int index, Object element) {
+        Entry e = getAt(index);
+        Object old = e.val;
+        e.val = element;
+        return old;
+    }
+
+    public void add(int index, Object element) {
+        if (index == size) insertBefore(head, element);
+        else insertBefore(index == size ? head : getAt(index), element);
+    }
+
+    public Object remove(int index) {
+        return remove(getAt(index));
+    }
+
+    public ListIterator listIterator() {
+        return new Itr();
+    }
+
+    public ListIterator listIterator(int index) {
+        return new Itr(index == size ? head : getAt(index), index);
+    }
+
+    public void addFirst(Object e) {
+        insertAfter(head, e);
+    }
+
+    public void addLast(Object e) {
+        insertBefore(head, e);
+    }
+
+    public boolean offerFirst(Object e) {
+        insertAfter(head, e);
+        return true;
+    }
+
+    public boolean offerLast(Object e) {
+        insertBefore(head, e);
+        return true;
+    }
+
+    public Object removeFirst() {
+        return remove(head.next);
+    }
+
+    public Object removeLast() {
+        return remove(head.prev);
+    }
+
+    public Object pollFirst() {
+        return (size == 0) ? null : remove(head.next);
+    }
+
+    public Object pollLast() {
+        return (size == 0) ? null : remove(head.prev);
+    }
+
+    public Object getFirst() {
+        if (size == 0) throw new NoSuchElementException();
+        else return head.next.val;
+    }
+
+    public Object getLast() {
+        if (size == 0) throw new NoSuchElementException();
+        else return head.prev.val;
+    }
+
+    public Object peekFirst() {
+        return (size == 0) ? null : head.next.val;
+    }
+
+    public Object peekLast() {
+        return (size == 0) ? null : head.prev.val;
+    }
+
+    public boolean removeFirstOccurrence(Object o) {
+        Entry e = findFirst(o);
+        if (e == null) return false;
+        remove(e);
+        return true;
+    }
+
+    public boolean removeLastOccurrence(Object o) {
+        Entry e = findLast(o);
+        if (e == null) return false;
+        remove(e);
+        return true;
+    }
+
+    public boolean offer(Object e) {
+        return add(e);
+    }
+
+    public Object remove() {
+        return removeFirst();
+    }
+
+    public Object poll() {
+        return pollFirst();
+    }
+
+    public Object element() {
+        return getFirst();
+    }
+
+    public Object peek() {
+        return peekFirst();
+    }
+
+    public void push(Object e) {
+        addFirst(e);
+    }
+
+    public Object pop() {
+        return removeFirst();
+    }
+
+    public Iterator descendingIterator() {
+        return new DescItr();
+    }
+
+    private class Itr implements ListIterator {
+        int expectedModCount;
+        int idx;
+        Entry cursor;
+        Entry lastRet;
+        Itr(Entry cursor, int idx) {
+            this.cursor = cursor;
+            this.idx = idx;
+            this.expectedModCount = modCount;
+        }
+
+        Itr() {
+            this(head.next, 0);
+        }
+
+        public boolean hasNext() {
+            return cursor != head;
+        }
+
+        public int nextIndex() {
+            return idx;
+        }
+
+        public boolean hasPrevious() {
+            return cursor.prev != head;
+        }
+
+        public int previousIndex() {
+            return idx-1;
+        }
+
+        public Object next() {
+            if (expectedModCount != modCount) throw new ConcurrentModificationException();
+            if (cursor == head) throw new NoSuchElementException();
+            lastRet = cursor;
+            cursor = cursor.next;
+            idx++;
+            return lastRet.val;
+        }
+
+        public Object previous() {
+            if (expectedModCount != modCount) throw new ConcurrentModificationException();
+            if (cursor.prev == head) throw new NoSuchElementException();
+            lastRet = cursor = cursor.prev;
+            idx--;
+            return lastRet.val;
+        }
+
+        public void add(Object val) {
+            if (expectedModCount != modCount) throw new ConcurrentModificationException();
+            insertBefore(cursor, val);
+            lastRet = null;
+            idx++;
+            expectedModCount++;
+        }
+
+        public void set(Object newVal) {
+            if (lastRet == null) throw new IllegalStateException();
+            lastRet.val = newVal;
+        }
+
+        public void remove() {
+            if (expectedModCount != modCount) throw new ConcurrentModificationException();
+            if (lastRet == null) throw new IllegalStateException();
+            if (lastRet.next == cursor) idx--; else cursor = lastRet.next;
+            LinkedList.this.remove(lastRet);
+            lastRet = null;
+            expectedModCount++;
+        }
+    }
+
+    private class DescItr implements ListIterator {
+        int expectedModCount;
+        int idx;
+        Entry cursor;
+        Entry lastRet;
+        DescItr(Entry cursor, int idx) {
+            this.cursor = cursor;
+            this.idx = idx;
+            this.expectedModCount = modCount;
+        }
+
+        DescItr() {
+            this(head.prev, 0);
+        }
+
+        public boolean hasNext() {
+            return cursor != head;
+        }
+
+        public int nextIndex() {
+            return idx;
+        }
+
+        public boolean hasPrevious() {
+            return cursor.next != head;
+        }
+
+        public int previousIndex() {
+            return idx-1;
+        }
+
+        public Object next() {
+            if (expectedModCount != modCount) throw new ConcurrentModificationException();
+            if (cursor == head) throw new NoSuchElementException();
+            lastRet = cursor;
+            cursor = cursor.prev;
+            idx++;
+            return lastRet.val;
+        }
+
+        public Object previous() {
+            if (expectedModCount != modCount) throw new ConcurrentModificationException();
+            if (cursor.next == head) throw new NoSuchElementException();
+            lastRet = cursor = cursor.next;
+            idx--;
+            return lastRet;
+        }
+
+        public void add(Object val) {
+            if (expectedModCount != modCount) throw new ConcurrentModificationException();
+            insertAfter(cursor, val);
+            lastRet = null;
+            idx++;
+            expectedModCount++;
+        }
+
+        public void set(Object newVal) {
+            if (lastRet == null) throw new IllegalStateException();
+            lastRet.val = newVal;
+        }
+
+        public void remove() {
+            if (expectedModCount != modCount) throw new ConcurrentModificationException();
+            if (lastRet == null) throw new IllegalStateException();
+            if (lastRet.next == cursor) idx--; else cursor = lastRet.next;
+            LinkedList.this.remove(lastRet);
+            lastRet = null;
+            expectedModCount++;
+        }
+    }
+
+    private void writeObject(ObjectOutputStream out) throws IOException {
+        out.defaultWriteObject();
+        out.writeInt(size);
+        for (Entry e = head.next; e != head; e = e.next) {
+            out.writeObject(e.val);
+        }
+    }
+
+    private void readObject(ObjectInputStream in)
+        throws IOException, ClassNotFoundException
+    {
+        in.defaultReadObject();
+        int size = in.readInt();
+        Entry head = new Entry(null);
+        head.next = head.prev = head;
+        for (int i=0; i < size; i++) {
+            insertBefore(head, in.readObject());
+        }
+        this.size = size;
+        this.head = head;
+    }
+
+    public Object clone() {
+        LinkedList clone = null;
+        try { clone = (LinkedList) super.clone(); }
+        catch (CloneNotSupportedException e) { throw new InternalError(); }
+        Entry head = new Entry(null);
+        head.next = head.prev = head;
+        clone.head = head;
+        clone.addAll(this);
+        return clone;
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/NavigableMap.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/NavigableMap.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/NavigableMap.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,396 @@
+/*
+ * Written by Doug Lea and Josh Bloch with assistance from members of JCP
+ * JSR-166 Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util;
+
+import java.util.Map;
+import java.util.SortedMap;
+
+/**
+ * A {@link java.util.SortedMap} extended with navigation methods returning the
+ * closest matches for given search targets. Methods
+ * {@code lowerEntry}, {@code floorEntry}, {@code ceilingEntry},
+ * and {@code higherEntry} return {@code Map.Entry} objects
+ * associated with keys respectively less than, less than or equal,
+ * greater than or equal, and greater than a given key, returning
+ * {@code null} if there is no such key.  Similarly, methods
+ * {@code lowerKey}, {@code floorKey}, {@code ceilingKey}, and
+ * {@code higherKey} return only the associated keys. All of these
+ * methods are designed for locating, not traversing entries.
+ *
+ * <p>A {@code NavigableMap} may be accessed and traversed in either
+ * ascending or descending key order.  The {@code descendingMap}
+ * method returns a view of the map with the senses of all relational
+ * and directional methods inverted. The performance of ascending
+ * operations and views is likely to be faster than that of descending
+ * ones.  Methods {@code subMap}, {@code headMap},
+ * and {@code tailMap} differ from the like-named {@code
+ * SortedMap} methods in accepting additional arguments describing
+ * whether lower and upper bounds are inclusive versus exclusive.
+ * Submaps of any {@code NavigableMap} must implement the {@code
+ * NavigableMap} interface.
+ *
+ * <p>This interface additionally defines methods {@code firstEntry},
+ * {@code pollFirstEntry}, {@code lastEntry}, and
+ * {@code pollLastEntry} that return and/or remove the least and
+ * greatest mappings, if any exist, else returning {@code null}.
+ *
+ * <p>Implementations of entry-returning methods are expected to
+ * return {@code Map.Entry} pairs representing snapshots of mappings
+ * at the time they were produced, and thus generally do <em>not</em>
+ * support the optional {@code Entry.setValue} method. Note however
+ * that it is possible to change mappings in the associated map using
+ * method {@code put}.
+ *
+ * <p>Methods
+ * {@link #subMap(Object, Object) subMap(K, K)},
+ * {@link #headMap(Object) headMap(K)}, and
+ * {@link #tailMap(Object) tailMap(K)}
+ * are specified to return {@code SortedMap} to allow existing
+ * implementations of {@code SortedMap} to be compatibly retrofitted to
+ * implement {@code NavigableMap}, but extensions and implementations
+ * of this interface are encouraged to override these methods to return
+ * {@code NavigableMap}.  Similarly,
+ * {@link #keySet()} can be overriden to return {@code NavigableSet}.
+ *
+ * <p>This interface is a member of the
+ * <a href="{@docRoot}/../technotes/guides/collections/index.html">
+ * Java Collections Framework</a>.
+ *
+ * @author Doug Lea
+ * @author Josh Bloch
+ * @since 1.6
+ */
+public interface NavigableMap extends SortedMap {
+    /**
+     * Returns a key-value mapping associated with the greatest key
+     * strictly less than the given key, or {@code null} if there is
+     * no such key.
+     *
+     * @param key the key
+     * @return an entry with the greatest key less than {@code key},
+     *         or {@code null} if there is no such key
+     * @throws ClassCastException if the specified key cannot be compared
+     *         with the keys currently in the map
+     * @throws NullPointerException if the specified key is null
+     *         and this map does not permit null keys
+     */
+    Map.Entry lowerEntry(Object key);
+
+    /**
+     * Returns the greatest key strictly less than the given key, or
+     * {@code null} if there is no such key.
+     *
+     * @param key the key
+     * @return the greatest key less than {@code key},
+     *         or {@code null} if there is no such key
+     * @throws ClassCastException if the specified key cannot be compared
+     *         with the keys currently in the map
+     * @throws NullPointerException if the specified key is null
+     *         and this map does not permit null keys
+     */
+    Object lowerKey(Object key);
+
+    /**
+     * Returns a key-value mapping associated with the greatest key
+     * less than or equal to the given key, or {@code null} if there
+     * is no such key.
+     *
+     * @param key the key
+     * @return an entry with the greatest key less than or equal to
+     *         {@code key}, or {@code null} if there is no such key
+     * @throws ClassCastException if the specified key cannot be compared
+     *         with the keys currently in the map
+     * @throws NullPointerException if the specified key is null
+     *         and this map does not permit null keys
+     */
+    Map.Entry floorEntry(Object key);
+
+    /**
+     * Returns the greatest key less than or equal to the given key,
+     * or {@code null} if there is no such key.
+     *
+     * @param key the key
+     * @return the greatest key less than or equal to {@code key},
+     *         or {@code null} if there is no such key
+     * @throws ClassCastException if the specified key cannot be compared
+     *         with the keys currently in the map
+     * @throws NullPointerException if the specified key is null
+     *         and this map does not permit null keys
+     */
+    Object floorKey(Object key);
+
+    /**
+     * Returns a key-value mapping associated with the least key
+     * greater than or equal to the given key, or {@code null} if
+     * there is no such key.
+     *
+     * @param key the key
+     * @return an entry with the least key greater than or equal to
+     *         {@code key}, or {@code null} if there is no such key
+     * @throws ClassCastException if the specified key cannot be compared
+     *         with the keys currently in the map
+     * @throws NullPointerException if the specified key is null
+     *         and this map does not permit null keys
+     */
+    Map.Entry ceilingEntry(Object key);
+
+    /**
+     * Returns the least key greater than or equal to the given key,
+     * or {@code null} if there is no such key.
+     *
+     * @param key the key
+     * @return the least key greater than or equal to {@code key},
+     *         or {@code null} if there is no such key
+     * @throws ClassCastException if the specified key cannot be compared
+     *         with the keys currently in the map
+     * @throws NullPointerException if the specified key is null
+     *         and this map does not permit null keys
+     */
+    Object ceilingKey(Object key);
+
+    /**
+     * Returns a key-value mapping associated with the least key
+     * strictly greater than the given key, or {@code null} if there
+     * is no such key.
+     *
+     * @param key the key
+     * @return an entry with the least key greater than {@code key},
+     *         or {@code null} if there is no such key
+     * @throws ClassCastException if the specified key cannot be compared
+     *         with the keys currently in the map
+     * @throws NullPointerException if the specified key is null
+     *         and this map does not permit null keys
+     */
+    Map.Entry higherEntry(Object key);
+
+    /**
+     * Returns the least key strictly greater than the given key, or
+     * {@code null} if there is no such key.
+     *
+     * @param key the key
+     * @return the least key greater than {@code key},
+     *         or {@code null} if there is no such key
+     * @throws ClassCastException if the specified key cannot be compared
+     *         with the keys currently in the map
+     * @throws NullPointerException if the specified key is null
+     *         and this map does not permit null keys
+     */
+    Object higherKey(Object key);
+
+    /**
+     * Returns a key-value mapping associated with the least
+     * key in this map, or {@code null} if the map is empty.
+     *
+     * @return an entry with the least key,
+     *         or {@code null} if this map is empty
+     */
+    Map.Entry firstEntry();
+
+    /**
+     * Returns a key-value mapping associated with the greatest
+     * key in this map, or {@code null} if the map is empty.
+     *
+     * @return an entry with the greatest key,
+     *         or {@code null} if this map is empty
+     */
+    Map.Entry lastEntry();
+
+    /**
+     * Removes and returns a key-value mapping associated with
+     * the least key in this map, or {@code null} if the map is empty.
+     *
+     * @return the removed first entry of this map,
+     *         or {@code null} if this map is empty
+     */
+    Map.Entry pollFirstEntry();
+
+    /**
+     * Removes and returns a key-value mapping associated with
+     * the greatest key in this map, or {@code null} if the map is empty.
+     *
+     * @return the removed last entry of this map,
+     *         or {@code null} if this map is empty
+     */
+    Map.Entry pollLastEntry();
+
+    /**
+     * Returns a reverse order view of the mappings contained in this map.
+     * The descending map is backed by this map, so changes to the map are
+     * reflected in the descending map, and vice-versa.  If either map is
+     * modified while an iteration over a collection view of either map
+     * is in progress (except through the iterator's own {@code remove}
+     * operation), the results of the iteration are undefined.
+     *
+     * <p>The returned map has an ordering equivalent to
+     * <tt>{@link Collections#reverseOrder(Comparator) Collections.reverseOrder}(comparator())</tt>.
+     * The expression {@code m.descendingMap().descendingMap()} returns a
+     * view of {@code m} essentially equivalent to {@code m}.
+     *
+     * @return a reverse order view of this map
+     */
+    NavigableMap descendingMap();
+
+    /**
+     * Returns a {@link NavigableSet} view of the keys contained in this map.
+     * The set's iterator returns the keys in ascending order.
+     * The set is backed by the map, so changes to the map are reflected in
+     * the set, and vice-versa.  If the map is modified while an iteration
+     * over the set is in progress (except through the iterator's own {@code
+     * remove} operation), the results of the iteration are undefined.  The
+     * set supports element removal, which removes the corresponding mapping
+     * from the map, via the {@code Iterator.remove}, {@code Set.remove},
+     * {@code removeAll}, {@code retainAll}, and {@code clear} operations.
+     * It does not support the {@code add} or {@code addAll} operations.
+     *
+     * @return a navigable set view of the keys in this map
+     */
+    NavigableSet navigableKeySet();
+
+    /**
+     * Returns a reverse order {@link NavigableSet} view of the keys contained in this map.
+     * The set's iterator returns the keys in descending order.
+     * The set is backed by the map, so changes to the map are reflected in
+     * the set, and vice-versa.  If the map is modified while an iteration
+     * over the set is in progress (except through the iterator's own {@code
+     * remove} operation), the results of the iteration are undefined.  The
+     * set supports element removal, which removes the corresponding mapping
+     * from the map, via the {@code Iterator.remove}, {@code Set.remove},
+     * {@code removeAll}, {@code retainAll}, and {@code clear} operations.
+     * It does not support the {@code add} or {@code addAll} operations.
+     *
+     * @return a reverse order navigable set view of the keys in this map
+     */
+    NavigableSet descendingKeySet();
+
+    /**
+     * Returns a view of the portion of this map whose keys range from
+     * {@code fromKey} to {@code toKey}.  If {@code fromKey} and
+     * {@code toKey} are equal, the returned map is empty unless
+     * {@code fromExclusive} and {@code toExclusive} are both true.  The
+     * returned map is backed by this map, so changes in the returned map are
+     * reflected in this map, and vice-versa.  The returned map supports all
+     * optional map operations that this map supports.
+     *
+     * <p>The returned map will throw an {@code IllegalArgumentException}
+     * on an attempt to insert a key outside of its range, or to construct a
+     * submap either of whose endpoints lie outside its range.
+     *
+     * @param fromKey low endpoint of the keys in the returned map
+     * @param fromInclusive {@code true} if the low endpoint
+     *        is to be included in the returned view
+     * @param toKey high endpoint of the keys in the returned map
+     * @param toInclusive {@code true} if the high endpoint
+     *        is to be included in the returned view
+     * @return a view of the portion of this map whose keys range from
+     *         {@code fromKey} to {@code toKey}
+     * @throws ClassCastException if {@code fromKey} and {@code toKey}
+     *         cannot be compared to one another using this map's comparator
+     *         (or, if the map has no comparator, using natural ordering).
+     *         Implementations may, but are not required to, throw this
+     *         exception if {@code fromKey} or {@code toKey}
+     *         cannot be compared to keys currently in the map.
+     * @throws NullPointerException if {@code fromKey} or {@code toKey}
+     *         is null and this map does not permit null keys
+     * @throws IllegalArgumentException if {@code fromKey} is greater than
+     *         {@code toKey}; or if this map itself has a restricted
+     *         range, and {@code fromKey} or {@code toKey} lies
+     *         outside the bounds of the range
+     */
+    NavigableMap subMap(Object fromKey, boolean fromInclusive,
+                        Object toKey,   boolean toInclusive);
+
+    /**
+     * Returns a view of the portion of this map whose keys are less than (or
+     * equal to, if {@code inclusive} is true) {@code toKey}.  The returned
+     * map is backed by this map, so changes in the returned map are reflected
+     * in this map, and vice-versa.  The returned map supports all optional
+     * map operations that this map supports.
+     *
+     * <p>The returned map will throw an {@code IllegalArgumentException}
+     * on an attempt to insert a key outside its range.
+     *
+     * @param toKey high endpoint of the keys in the returned map
+     * @param inclusive {@code true} if the high endpoint
+     *        is to be included in the returned view
+     * @return a view of the portion of this map whose keys are less than
+     *         (or equal to, if {@code inclusive} is true) {@code toKey}
+     * @throws ClassCastException if {@code toKey} is not compatible
+     *         with this map's comparator (or, if the map has no comparator,
+     *         if {@code toKey} does not implement {@link java.lang.Comparable}).
+     *         Implementations may, but are not required to, throw this
+     *         exception if {@code toKey} cannot be compared to keys
+     *         currently in the map.
+     * @throws NullPointerException if {@code toKey} is null
+     *         and this map does not permit null keys
+     * @throws IllegalArgumentException if this map itself has a
+     *         restricted range, and {@code toKey} lies outside the
+     *         bounds of the range
+     */
+    NavigableMap headMap(Object toKey, boolean inclusive);
+
+    /**
+     * Returns a view of the portion of this map whose keys are greater than (or
+     * equal to, if {@code inclusive} is true) {@code fromKey}.  The returned
+     * map is backed by this map, so changes in the returned map are reflected
+     * in this map, and vice-versa.  The returned map supports all optional
+     * map operations that this map supports.
+     *
+     * <p>The returned map will throw an {@code IllegalArgumentException}
+     * on an attempt to insert a key outside its range.
+     *
+     * @param fromKey low endpoint of the keys in the returned map
+     * @param inclusive {@code true} if the low endpoint
+     *        is to be included in the returned view
+     * @return a view of the portion of this map whose keys are greater than
+     *         (or equal to, if {@code inclusive} is true) {@code fromKey}
+     * @throws ClassCastException if {@code fromKey} is not compatible
+     *         with this map's comparator (or, if the map has no comparator,
+     *         if {@code fromKey} does not implement {@link java.lang.Comparable}).
+     *         Implementations may, but are not required to, throw this
+     *         exception if {@code fromKey} cannot be compared to keys
+     *         currently in the map.
+     * @throws NullPointerException if {@code fromKey} is null
+     *         and this map does not permit null keys
+     * @throws IllegalArgumentException if this map itself has a
+     *         restricted range, and {@code fromKey} lies outside the
+     *         bounds of the range
+     */
+    NavigableMap tailMap(Object fromKey, boolean inclusive);
+
+    /**
+     * {@inheritDoc}
+     *
+     * <p>Equivalent to {@code subMap(fromKey, true, toKey, false)}.
+     *
+     * @throws ClassCastException       {@inheritDoc}
+     * @throws NullPointerException     {@inheritDoc}
+     * @throws IllegalArgumentException {@inheritDoc}
+     */
+    SortedMap subMap(Object fromKey, Object toKey);
+
+    /**
+     * {@inheritDoc}
+     *
+     * <p>Equivalent to {@code headMap(toKey, false)}.
+     *
+     * @throws ClassCastException       {@inheritDoc}
+     * @throws NullPointerException     {@inheritDoc}
+     * @throws IllegalArgumentException {@inheritDoc}
+     */
+    SortedMap headMap(Object toKey);
+
+    /**
+     * {@inheritDoc}
+     *
+     * <p>Equivalent to {@code tailMap(fromKey, true)}.
+     *
+     * @throws ClassCastException       {@inheritDoc}
+     * @throws NullPointerException     {@inheritDoc}
+     * @throws IllegalArgumentException {@inheritDoc}
+     */
+    SortedMap tailMap(Object fromKey);
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/NavigableSet.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/NavigableSet.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/NavigableSet.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,292 @@
+/*
+ * Written by Doug Lea and Josh Bloch with assistance from members of JCP
+ * JSR-166 Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util;
+
+import java.util.SortedSet;
+import java.util.Iterator;
+
+/**
+ * A {@link java.util.SortedSet} extended with navigation methods reporting
+ * closest matches for given search targets. Methods {@code lower},
+ * {@code floor}, {@code ceiling}, and {@code higher} return elements
+ * respectively less than, less than or equal, greater than or equal,
+ * and greater than a given element, returning {@code null} if there
+ * is no such element.  A {@code NavigableSet} may be accessed and
+ * traversed in either ascending or descending order.  The {@code
+ * descendingSet} method returns a view of the set with the senses of
+ * all relational and directional methods inverted. The performance of
+ * ascending operations and views is likely to be faster than that of
+ * descending ones.  This interface additionally defines methods
+ * {@code pollFirst} and {@code pollLast} that return and remove the
+ * lowest and highest element, if one exists, else returning {@code
+ * null}.  Methods {@code subSet}, {@code headSet},
+ * and {@code tailSet} differ from the like-named {@code
+ * SortedSet} methods in accepting additional arguments describing
+ * whether lower and upper bounds are inclusive versus exclusive.
+ * Subsets of any {@code NavigableSet} must implement the {@code
+ * NavigableSet} interface.
+ *
+ * <p> The return values of navigation methods may be ambiguous in
+ * implementations that permit {@code null} elements. However, even
+ * in this case the result can be disambiguated by checking
+ * {@code contains(null)}. To avoid such issues, implementations of
+ * this interface are encouraged to <em>not</em> permit insertion of
+ * {@code null} elements. (Note that sorted sets of {@link
+ * java.lang.Comparable} elements intrinsically do not permit {@code null}.)
+ *
+ * <p>Methods
+ * {@link #subSet(Object, Object) subSet(E, E)},
+ * {@link #headSet(Object) headSet(E)}, and
+ * {@link #tailSet(Object) tailSet(E)}
+ * are specified to return {@code SortedSet} to allow existing
+ * implementations of {@code SortedSet} to be compatibly retrofitted to
+ * implement {@code NavigableSet}, but extensions and implementations
+ * of this interface are encouraged to override these methods to return
+ * {@code NavigableSet}.
+ *
+ * <p>This interface is a member of the
+ * <a href="{@docRoot}/../technotes/guides/collections/index.html">
+ * Java Collections Framework</a>.
+ *
+ * @author Doug Lea
+ * @author Josh Bloch
+ * @since 1.6
+ */
+public interface NavigableSet extends SortedSet {
+    /**
+     * Returns the greatest element in this set strictly less than the
+     * given element, or {@code null} if there is no such element.
+     *
+     * @param e the value to match
+     * @return the greatest element less than {@code e},
+     *         or {@code null} if there is no such element
+     * @throws ClassCastException if the specified element cannot be
+     *         compared with the elements currently in the set
+     * @throws NullPointerException if the specified element is null
+     *         and this set does not permit null elements
+     */
+    Object lower(Object e);
+
+    /**
+     * Returns the greatest element in this set less than or equal to
+     * the given element, or {@code null} if there is no such element.
+     *
+     * @param e the value to match
+     * @return the greatest element less than or equal to {@code e},
+     *         or {@code null} if there is no such element
+     * @throws ClassCastException if the specified element cannot be
+     *         compared with the elements currently in the set
+     * @throws NullPointerException if the specified element is null
+     *         and this set does not permit null elements
+     */
+    Object floor(Object e);
+
+    /**
+     * Returns the least element in this set greater than or equal to
+     * the given element, or {@code null} if there is no such element.
+     *
+     * @param e the value to match
+     * @return the least element greater than or equal to {@code e},
+     *         or {@code null} if there is no such element
+     * @throws ClassCastException if the specified element cannot be
+     *         compared with the elements currently in the set
+     * @throws NullPointerException if the specified element is null
+     *         and this set does not permit null elements
+     */
+    Object ceiling(Object e);
+
+    /**
+     * Returns the least element in this set strictly greater than the
+     * given element, or {@code null} if there is no such element.
+     *
+     * @param e the value to match
+     * @return the least element greater than {@code e},
+     *         or {@code null} if there is no such element
+     * @throws ClassCastException if the specified element cannot be
+     *         compared with the elements currently in the set
+     * @throws NullPointerException if the specified element is null
+     *         and this set does not permit null elements
+     */
+    Object higher(Object e);
+
+    /**
+     * Retrieves and removes the first (lowest) element,
+     * or returns {@code null} if this set is empty.
+     *
+     * @return the first element, or {@code null} if this set is empty
+     */
+    Object pollFirst();
+
+    /**
+     * Retrieves and removes the last (highest) element,
+     * or returns {@code null} if this set is empty.
+     *
+     * @return the last element, or {@code null} if this set is empty
+     */
+    Object pollLast();
+
+    /**
+     * Returns an iterator over the elements in this set, in ascending order.
+     *
+     * @return an iterator over the elements in this set, in ascending order
+     */
+    Iterator iterator();
+
+    /**
+     * Returns a reverse order view of the elements contained in this set.
+     * The descending set is backed by this set, so changes to the set are
+     * reflected in the descending set, and vice-versa.  If either set is
+     * modified while an iteration over either set is in progress (except
+     * through the iterator's own {@code remove} operation), the results of
+     * the iteration are undefined.
+     *
+     * <p>The returned set has an ordering equivalent to
+     * <tt>{@link Collections#reverseOrder(Comparator) Collections.reverseOrder}(comparator())</tt>.
+     * The expression {@code s.descendingSet().descendingSet()} returns a
+     * view of {@code s} essentially equivalent to {@code s}.
+     *
+     * @return a reverse order view of this set
+     */
+    NavigableSet descendingSet();
+
+    /**
+     * Returns an iterator over the elements in this set, in descending order.
+     * Equivalent in effect to {@code descendingSet().iterator()}.
+     *
+     * @return an iterator over the elements in this set, in descending order
+     */
+    Iterator descendingIterator();
+
+    /**
+     * Returns a view of the portion of this set whose elements range from
+     * {@code fromElement} to {@code toElement}.  If {@code fromElement} and
+     * {@code toElement} are equal, the returned set is empty unless {@code
+     * fromExclusive} and {@code toExclusive} are both true.  The returned set
+     * is backed by this set, so changes in the returned set are reflected in
+     * this set, and vice-versa.  The returned set supports all optional set
+     * operations that this set supports.
+     *
+     * <p>The returned set will throw an {@code IllegalArgumentException}
+     * on an attempt to insert an element outside its range.
+     *
+     * @param fromElement low endpoint of the returned set
+     * @param fromInclusive {@code true} if the low endpoint
+     *        is to be included in the returned view
+     * @param toElement high endpoint of the returned set
+     * @param toInclusive {@code true} if the high endpoint
+     *        is to be included in the returned view
+     * @return a view of the portion of this set whose elements range from
+     *         {@code fromElement}, inclusive, to {@code toElement}, exclusive
+     * @throws ClassCastException if {@code fromElement} and
+     *         {@code toElement} cannot be compared to one another using this
+     *         set's comparator (or, if the set has no comparator, using
+     *         natural ordering).  Implementations may, but are not required
+     *         to, throw this exception if {@code fromElement} or
+     *         {@code toElement} cannot be compared to elements currently in
+     *         the set.
+     * @throws NullPointerException if {@code fromElement} or
+     *         {@code toElement} is null and this set does
+     *         not permit null elements
+     * @throws IllegalArgumentException if {@code fromElement} is
+     *         greater than {@code toElement}; or if this set itself
+     *         has a restricted range, and {@code fromElement} or
+     *         {@code toElement} lies outside the bounds of the range.
+     */
+    NavigableSet subSet(Object fromElement, boolean fromInclusive,
+                        Object toElement,   boolean toInclusive);
+
+    /**
+     * Returns a view of the portion of this set whose elements are less than
+     * (or equal to, if {@code inclusive} is true) {@code toElement}.  The
+     * returned set is backed by this set, so changes in the returned set are
+     * reflected in this set, and vice-versa.  The returned set supports all
+     * optional set operations that this set supports.
+     *
+     * <p>The returned set will throw an {@code IllegalArgumentException}
+     * on an attempt to insert an element outside its range.
+     *
+     * @param toElement high endpoint of the returned set
+     * @param inclusive {@code true} if the high endpoint
+     *        is to be included in the returned view
+     * @return a view of the portion of this set whose elements are less than
+     *         (or equal to, if {@code inclusive} is true) {@code toElement}
+     * @throws ClassCastException if {@code toElement} is not compatible
+     *         with this set's comparator (or, if the set has no comparator,
+     *         if {@code toElement} does not implement {@link java.lang.Comparable}).
+     *         Implementations may, but are not required to, throw this
+     *         exception if {@code toElement} cannot be compared to elements
+     *         currently in the set.
+     * @throws NullPointerException if {@code toElement} is null and
+     *         this set does not permit null elements
+     * @throws IllegalArgumentException if this set itself has a
+     *         restricted range, and {@code toElement} lies outside the
+     *         bounds of the range
+     */
+    NavigableSet headSet(Object toElement, boolean inclusive);
+
+    /**
+     * Returns a view of the portion of this set whose elements are greater
+     * than (or equal to, if {@code inclusive} is true) {@code fromElement}.
+     * The returned set is backed by this set, so changes in the returned set
+     * are reflected in this set, and vice-versa.  The returned set supports
+     * all optional set operations that this set supports.
+     *
+     * <p>The returned set will throw an {@code IllegalArgumentException}
+     * on an attempt to insert an element outside its range.
+     *
+     * @param fromElement low endpoint of the returned set
+     * @param inclusive {@code true} if the low endpoint
+     *        is to be included in the returned view
+     * @return a view of the portion of this set whose elements are greater
+     *         than or equal to {@code fromElement}
+     * @throws ClassCastException if {@code fromElement} is not compatible
+     *         with this set's comparator (or, if the set has no comparator,
+     *         if {@code fromElement} does not implement {@link java.lang.Comparable}).
+     *         Implementations may, but are not required to, throw this
+     *         exception if {@code fromElement} cannot be compared to elements
+     *         currently in the set.
+     * @throws NullPointerException if {@code fromElement} is null
+     *         and this set does not permit null elements
+     * @throws IllegalArgumentException if this set itself has a
+     *         restricted range, and {@code fromElement} lies outside the
+     *         bounds of the range
+     */
+    NavigableSet tailSet(Object fromElement, boolean inclusive);
+
+    /**
+     * {@inheritDoc}
+     *
+     * <p>Equivalent to {@code subSet(fromElement, true, toElement, false)}.
+     *
+     * @throws ClassCastException       {@inheritDoc}
+     * @throws NullPointerException     {@inheritDoc}
+     * @throws IllegalArgumentException {@inheritDoc}
+     */
+    SortedSet subSet(Object fromElement, Object toElement);
+
+    /**
+     * {@inheritDoc}
+     *
+     * <p>Equivalent to {@code headSet(toElement, false)}.
+     *
+     * @throws ClassCastException       {@inheritDoc}
+     * @throws NullPointerException     {@inheritDoc}
+     * @throws IllegalArgumentException {@inheritDoc}
+     */
+    SortedSet headSet(Object toElement);
+
+    /**
+     * {@inheritDoc}
+     *
+     * <p>Equivalent to {@code tailSet(fromElement, true)}.
+     *
+     * @throws ClassCastException       {@inheritDoc}
+     * @throws NullPointerException     {@inheritDoc}
+     * @throws IllegalArgumentException {@inheritDoc}
+     */
+    SortedSet tailSet(Object fromElement);
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/PriorityQueue.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/PriorityQueue.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/PriorityQueue.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,623 @@
+/*
+ * Written by Dawid Kurzyniec, on the basis of public specifications of class
+ * java.util.PriorityQueue by Josh Bloch, and released to the public domain,
+ * as explained at http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util;
+
+import java.util.Comparator;
+import java.util.SortedSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Collection;
+import java.util.NoSuchElementException;
+import java.util.ArrayList;
+import java.util.ConcurrentModificationException;
+
+/**
+ * An unbounded {@linkplain Queue queue} that supports element retrieval
+ * in the order of relative priority. The ordering can be defined via an
+ * explicit comparator; otherwise, the natural ordering of elements is used.
+ * Element at the head of the queue is always the <em>smallest</em> one
+ * according to the given ordering.
+ *
+ * <p>While this queue is logically
+ * unbounded, attempted additions may fail due to resource exhaustion
+ * (causing <tt>OutOfMemoryError</tt>). This class does not permit
+ * <tt>null</tt> elements.  A priority queue relying on {@linkplain
+ * Comparable natural ordering} also does not permit insertion of
+ * non-comparable objects (doing so results in
+ * <tt>ClassCastException</tt>).
+ *
+ * <p>This class and its iterator implement all of the
+ * <em>optional</em> methods of the {@link Collection} and {@link
+ * Iterator} interfaces.  The Iterator provided in method {@link
+ * #iterator()} is <em>not</em> guaranteed to traverse the elements of
+ * the PriorityQueue in any particular order. If you need
+ * ordered traversal, consider using
+ * <tt>Arrays.sort(pq.toArray())</tt>.
+ *
+ * <p>Operations on this class make no guarantees about the ordering
+ * of elements with equal priority. If you need to enforce an
+ * ordering, you can define custom classes or comparators that use a
+ * secondary key to break ties in primary priority values.  See
+ * {@link edu.emory.mathcs.backport.java.util.concurrent.PriorityBlockingQueue}
+ * for an example.
+ *
+ * <p><em>Implementation note:</em> basic mutative methods (insert, offer,
+ * remove, poll etc) have complexity O(log(n)). Parameterless inspection methods
+ * (peek, element,isEmpty) have complexity O(1). Methods contains(Object) and
+ * remove(Object) have complexity O(n).
+ *
+ * @since 1.5
+ * @author Dawid Kurzyniec
+ */
+public class PriorityQueue extends AbstractQueue implements java.io.Serializable, Queue {
+
+    private final static long serialVersionUID = -7720805057305804111L;
+
+    private final static int DEFAULT_INIT_CAPACITY = 11;
+
+    private transient Object[] buffer;
+    private int size;
+    private final Comparator comparator;
+    private transient int modCount;
+
+    /**
+     * Creates a <tt>PriorityQueue</tt> with the default
+     * initial capacity (11) that orders its elements according to
+     * their {@linkplain Comparable natural ordering}.
+     */
+    public PriorityQueue() {
+        this(DEFAULT_INIT_CAPACITY, null);
+    }
+
+    /**
+     * Creates a <tt>PriorityQueue</tt> with the specified
+     * initial capacity that orders its elements according to their
+     * {@linkplain Comparable natural ordering}.
+     *
+     * @param initialCapacity the initial capacity for this priority queue
+     * @throws IllegalArgumentException if <tt>initialCapacity</tt> is less
+     * than 1
+     */
+    public PriorityQueue(int initialCapacity) {
+        this(initialCapacity, null);
+    }
+
+    /**
+     * Creates a <tt>PriorityQueue</tt> with the specified initial
+     * capacity that orders its elements according to the specified
+     * comparator.
+     *
+     * @param comparator the comparator used to order this priority queue.
+     * If <tt>null</tt> then the order depends on the elements' natural
+     * ordering.
+     * @throws IllegalArgumentException if <tt>initialCapacity</tt> is less
+     * than 1
+     */
+    public PriorityQueue(Comparator comparator) {
+        this(DEFAULT_INIT_CAPACITY, comparator);
+    }
+
+    public PriorityQueue(int initialCapacity, Comparator comparator) {
+        if (initialCapacity < 1) throw new IllegalArgumentException();
+        this.buffer = new Object[initialCapacity];
+        this.comparator = comparator;
+    }
+
+    /**
+     * Creates a <tt>PriorityQueue</tt> containing the elements from
+     * the specified priority queue. This priority queue has an initial
+     * capacity of 110% of the size of the specified queue, and it is
+     * sorted according to the same comparator as the specified queue,
+     * or according to the natural ordering of its
+     * elements if the specified queue is sorted according to the natural
+     * ordering of its elements.
+     *
+     * @param q the queue whose elements are to be placed
+     *        into this priority queue.
+     * @throws NullPointerException if the specified queue is null
+     */
+    public PriorityQueue(PriorityQueue q) {
+        this((Collection)q);
+    }
+
+    /**
+     * Creates a <tt>PriorityQueue</tt> containing the elements
+     * from the specified sorted set.  This priority queue has an initial
+     * capacity of 110% of the size of the specified set, and it is
+     * sorted according to the same comparator as the specified set,
+     * or according to the natural ordering of its
+     * elements if the specified set is sorted according to the natural
+     * ordering of its elements.
+     *
+     * @param s the set whose elements are to be placed
+     *        into this priority queue.
+     * @throws NullPointerException if the specified set or any
+     *         of its elements are null
+     */
+    public PriorityQueue(SortedSet s) {
+        this((Collection)s);
+    }
+
+    /**
+     * Creates a <tt>PriorityQueue</tt> containing the elements
+     * in the specified collection.  The priority queue has an initial
+     * capacity of 110% of the size of the specified collection.  If
+     * the specified collection is a {@link java.util.SortedSet} or a {@link
+     * PriorityQueue}, this priority queue will be sorted according to
+     * the same comparator, or according to the natural ordering of its
+     * elements if the collection is sorted according to the natural
+     * ordering of its elements.  Otherwise, this priority queue is
+     * ordered according to the natural ordering of its elements.
+     *
+     * @param c the collection whose elements are to be placed
+     *        into this priority queue.
+     * @throws ClassCastException if elements of the specified collection
+     *         cannot be compared to one another according to the priority
+     *         queue's ordering.
+     * @throws NullPointerException if the specified collection or any
+     *         of its elements are null
+     */
+    public PriorityQueue(Collection c) {
+        int capacity = c.size();
+        capacity += size/10;
+        if (capacity < 0) capacity = Integer.MAX_VALUE;
+        else if (capacity == 0) capacity = 1;
+        this.buffer = new Object[capacity];
+
+        if (c instanceof PriorityQueue) {
+            PriorityQueue that = (PriorityQueue)c;
+            this.comparator = that.comparator;
+            this.size = that.size;
+            System.arraycopy(that.buffer, 0, this.buffer, 0, this.size);
+        }
+        else if (c instanceof SortedSet) {
+            SortedSet s = (SortedSet)c;
+            this.comparator = s.comparator();
+            for (Iterator itr = s.iterator(); itr.hasNext();) {
+                buffer[size++] = itr.next();
+            }
+        }
+        else {
+            this.comparator = null;
+            for (Iterator itr = c.iterator(); itr.hasNext();) {
+                buffer[size++] = itr.next();
+            }
+            for (int i=size/2; i>=0; --i) {
+                percolateDown(i, buffer[i]);
+            }
+        }
+    }
+
+    /**
+     * Returns an iterator over the elements in this queue. The
+     * iterator does not return the elements in any particular order.
+     * The returned iterator is a thread-safe "fast-fail" iterator
+     * that will throw {@link java.util.ConcurrentModificationException} upon
+     * detected interference.
+     *
+     * @return an iterator over the elements in this queue
+     */
+    public Iterator iterator() {
+        return new Itr();
+    }
+
+    /**
+     * Returns the comparator used to order the elements in this queue,
+     * or <tt>null</tt> if this queue uses the {@linkplain Comparable
+     * natural ordering} of its elements.
+     *
+     * @return the comparator used to order the elements in this queue,
+     *         or <tt>null</tt> if this queue uses the natural
+     *         ordering of its elements.
+     */
+    public Comparator comparator() {
+        return comparator;
+    }
+
+    /**
+     * Inserts the specified element into this priority queue.
+     *
+     * @param o the element to add
+     * @return <tt>true</tt> (as per the spec for {@link Queue#offer})
+     * @throws ClassCastException if the specified element cannot be compared
+     *         with elements currently in the priority queue according to the
+     *         priority queue's ordering
+     * @throws NullPointerException if the specified element is null
+     */
+    public boolean offer(Object o) {
+        if (o == null) throw new NullPointerException();
+        if (size == buffer.length) {
+            int newlen = buffer.length*2;
+            if (newlen < buffer.length) { // overflow
+                if (buffer.length == Integer.MAX_VALUE) {
+                    throw new OutOfMemoryError();
+                }
+                newlen = Integer.MAX_VALUE;
+            }
+            Object[] newbuffer = new Object[newlen];
+            System.arraycopy(buffer, 0, newbuffer, 0, size);
+            buffer = newbuffer;
+        }
+        modCount++;
+        percolateUp(size++, o);
+        return true;
+    }
+
+    /**
+     * Retrieves, but does not remove, the head of this queue, or returns
+     * <tt>null</tt> if this queue is empty.
+     *
+     * @return the head of this queue, or <tt>null</tt> if this queue is
+     *   empty
+     */
+    public Object peek() {
+        return (size == 0) ? null : buffer[0];
+    }
+
+    /**
+     * Retrieves and removes the head of this queue, or returns <tt>null</tt>
+     * if this queue is empty.
+     *
+     * @return the head of this queue, or <tt>null</tt> if this queue is
+     *   empty
+     */
+    public Object poll() {
+        if (size == 0) return null;
+        modCount++;
+        Object head = buffer[0];
+        --size;
+        percolateDown(0, buffer[size]);
+        buffer[size] = null;
+        return head;
+    }
+
+    /**
+     * Returns the number of elements in this priority queue.
+     *
+     * @return the number of elements in this priority queue
+     */
+    public int size() {
+        return size;
+    }
+
+    /**
+     * Assuming that the 'idx' element is to be overwritten, takes an element
+     * (usually from the end of the queue) to replace 'idx' and percolates it
+     * down the heap.
+     */
+    private int percolateDown(int idx, Object e) {
+        try {
+            if (comparator != null) {
+                while (true) {
+                    int c = (idx<<1)+1;
+                    if (c >= size) break;
+                    if (c+1 < size) {
+                        if (comparator.compare(buffer[c+1], buffer[c]) < 0) c++;
+                    }
+                    if (comparator.compare(e, buffer[c]) <= 0) break;
+                    buffer[idx] = buffer[c];
+                    idx = c;
+                }
+            }
+            else {
+                Comparable ec = (Comparable)e;
+                while (true) {
+                    int c = (idx<<1)+1;
+                    if (c >= size) break;
+                    if (c+1 < size) {
+                        if (((Comparable)buffer[c+1]).compareTo(buffer[c]) < 0) c++;
+                    }
+                    if (ec.compareTo(buffer[c]) <= 0) break;
+                    buffer[idx] = buffer[c];
+                    idx = c;
+                }
+            }
+            return idx;
+        }
+        finally {
+            buffer[idx] = e;
+        }
+    }
+
+    /**
+     * Takes an element to be inserted into the queue, puts it at 'idx' and
+     * percolates it up the heap.
+     */
+    private int percolateUp(int idx, Object e) {
+        try {
+            if (comparator != null) {
+                while (idx > 0) {
+                    int c = (idx-1)>>>1;
+                    if (comparator.compare(e, buffer[c]) >= 0) break;
+                    buffer[idx] = buffer[c];
+                    idx = c;
+                }
+                return idx;
+            }
+            else {
+                Comparable ce = (Comparable)e;
+                while (idx > 0) {
+                    int c = (idx-1)>>>1;
+                    if (ce.compareTo(buffer[c]) >= 0) break;
+                    buffer[idx] = buffer[c];
+                    idx = c;
+                }
+                return idx;
+            }
+        }
+        finally {
+            buffer[idx] = e;
+        }
+    }
+
+    /**
+     * Inserts the specified element into this priority queue.
+     *
+     * @param o the element to add
+     * @return <tt>true</tt> (as per the spec for {@link Collection#add})
+     * @throws ClassCastException if the specified element cannot be compared
+     *         with elements currently in the priority queue according to the
+     *         priority queue's ordering
+     * @throws NullPointerException if the specified element is null
+     */
+    public boolean add(Object o) {
+        return offer(o);
+    }
+
+    /**
+     * Retrieves and removes the head of this queue.
+     *
+     * @return the head of this queue
+     */
+    public Object remove() {
+        if (size == 0) throw new NoSuchElementException();
+        Object head = buffer[0];
+        modCount++;
+        --size;
+        percolateDown(0, buffer[size]);
+        buffer[size] = null;
+        return head;
+    }
+
+    /**
+     * Retrieves, but does not remove, the head of this queue.
+     *
+     * @return the head of this queue
+     * @throws NoSuchElementException of the queue is empty
+     */
+    public Object element() {
+        if (size == 0) throw new NoSuchElementException();
+        return buffer[0];
+    }
+
+    /**
+     * Returns <tt>true</tt> if this queue contains no elements.
+     *
+     * @return <tt>true</tt> if this queue contains no elements
+     */
+    public boolean isEmpty() {
+        return size == 0;
+    }
+
+    /**
+     * Returns <tt>true</tt> if this queue contains the specified element.
+     * More formally, returns <tt>true</tt> if and only if this queue contains
+     * at least one element <tt>e</tt> such that <tt>o.equals(e)</tt>.
+     *
+     * @param o object to be checked for containment in this queue
+     * @return <tt>true</tt> if this queue contains the specified element
+     */
+    public boolean contains(Object o) {
+        for (int i=0; i<size; i++) {
+            if (o.equals(buffer[i])) return true;
+        }
+        return false;
+    }
+
+    /**
+     * Returns an array containing all of the elements in this queue.
+     * The returned array elements are in no particular order.
+     *
+     * <p>The returned array will be "safe" in that no references to it are
+     * maintained by this queue.  (In other words, this method must allocate
+     * a new array).  The caller is thus free to modify the returned array.
+     *
+     * <p>This method acts as bridge between array-based and collection-based
+     * APIs.
+     *
+     * @return an array containing all of the elements in this queue
+     */
+    public Object[] toArray() {
+        return Arrays.copyOf(buffer, size, Object[].class);
+    }
+
+    /**
+     * Returns an array containing all of the elements in this queue; the
+     * runtime type of the returned array is that of the specified array.
+     * The returned array elements are in no particular order.
+     * If the queue fits in the specified array, it is returned therein.
+     * Otherwise, a new array is allocated with the runtime type of the
+     * specified array and the size of this queue.
+     *
+     * <p>If this queue fits in the specified array with room to spare
+     * (i.e., the array has more elements than this queue), the element in
+     * the array immediately following the end of the queue is set to
+     * <tt>null</tt>.
+     *
+     * <p>Like the {@link #toArray()} method, this method acts as bridge between
+     * array-based and collection-based APIs.  Further, this method allows
+     * precise control over the runtime type of the output array, and may,
+     * under certain circumstances, be used to save allocation costs.
+     *
+     * <p>Suppose <tt>x</tt> is a queue known to contain only strings.
+     * The following code can be used to dump the queue into a newly
+     * allocated array of <tt>String</tt>:
+     *
+     * <pre>
+     *     String[] y = x.toArray(new String[0]);</pre>
+     *
+     * Note that <tt>toArray(new Object[0])</tt> is identical in function to
+     * <tt>toArray()</tt>.
+     *
+     * @param a the array into which the elements of the queue are to
+     *          be stored, if it is big enough; otherwise, a new array of the
+     *          same runtime type is allocated for this purpose
+     * @return an array containing all of the elements in this queue
+     * @throws ArrayStoreException if the runtime type of the specified array
+     *         is not a supertype of the runtime type of every element in
+     *         this queue
+     * @throws NullPointerException if the specified array is null
+     */
+    public Object[] toArray(Object[] a) {
+        if (a.length < size) {
+            return Arrays.copyOf(buffer, size, a.getClass());
+        }
+        else {
+            System.arraycopy(buffer, 0, a, 0, size);
+            if (a.length > size) a[size] = null;
+            return a;
+        }
+    }
+
+    /**
+     * Removes a single instance of the specified element from this queue,
+     * if it is present.
+     * Returns <tt>true</tt> if this queue contained the specified element
+     * (or equivalently, if this queue changed as a result of the call).
+     *
+     * @param o element to be removed from this queue, if present
+     * @return <tt>true</tt> if this queue changed as a result of the call
+     */
+    public boolean remove(Object o) {
+        if (o == null) return false;
+        if (comparator != null) {
+            for (int i = 0; i < size; i++) {
+                if (comparator.compare(buffer[i], o) == 0) {
+                    removeAt(i);
+                    return true;
+                }
+            }
+        }
+        else {
+            for (int i = 0; i < size; i++) {
+                if (((Comparable)buffer[i]).compareTo(o) == 0) {
+                    removeAt(i);
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    private Object removeAt(int i) {
+        assert (i < size);
+        modCount++;
+        --size;
+        int newpos;
+        Object e = buffer[size];
+        buffer[size] = null;
+        // first, try percolating down
+        newpos = percolateDown(i, e);
+        if (newpos != i) return null;
+        // not moved; so percolate up
+        newpos = percolateUp(i, e);
+        return (newpos < i ? e : null);
+    }
+
+    /**
+     * Removes all of the elements from this queue.
+     * The queue will be empty after this call returns.
+     */
+    public void clear() {
+        modCount++;
+        Arrays.fill(buffer, 0, size, null);
+        size = 0;
+    }
+
+    private class Itr implements Iterator {
+        int cursor = 0;
+        List percolatedElems;
+        int cursorPercolated = 0;
+        int expectedModCount = modCount;
+        int lastRet;
+        Object lastRetPercolated;
+        Itr() {}
+
+        public boolean hasNext() {
+            return cursor < size || percolatedElems != null;
+        }
+
+        public Object next() {
+            checkForComodification();
+            if (cursor < size) {
+                lastRet = cursor++;
+                return buffer[lastRet];
+            }
+            else if (percolatedElems != null) {
+                lastRet = -1;
+                lastRetPercolated = percolatedElems.remove(percolatedElems.size()-1);
+                if (percolatedElems.isEmpty()) {
+                    percolatedElems = null;
+                }
+                return lastRetPercolated;
+            }
+            else {
+                throw new NoSuchElementException();
+            }
+        }
+
+        public void remove() {
+            if (lastRet >= 0) {
+                Object percolatedElem = removeAt(lastRet);
+                lastRet = -1;
+                if (percolatedElem == null) {
+                    cursor--;
+                }
+                else {
+                    if (percolatedElems == null) percolatedElems = new ArrayList();
+                    percolatedElems.add(percolatedElem);
+                }
+            }
+            else if (lastRetPercolated != null) {
+                PriorityQueue.this.remove(lastRetPercolated);
+                lastRetPercolated = null;
+            }
+            else {
+                throw new IllegalStateException();
+            }
+            expectedModCount = modCount;
+        }
+
+        private void checkForComodification() {
+            if (expectedModCount != modCount) {
+                throw new ConcurrentModificationException();
+            }
+        }
+    }
+
+    /**
+     * @serialData the length of the array (queue capacity) is stored, followed
+     * by all of its elements (as Objects)
+     */
+    private void writeObject(java.io.ObjectOutputStream os) throws java.io.IOException {
+        os.defaultWriteObject();
+        os.writeInt(buffer.length);
+        for (int i=0; i<size; i++) {
+            os.writeObject(buffer[i]);
+        }
+    }
+
+    private void readObject(java.io.ObjectInputStream is)
+        throws java.io.IOException, ClassNotFoundException
+    {
+        is.defaultReadObject();
+        this.buffer = new Object[is.readInt()];
+        for (int i=0; i<size; i++) {
+            buffer[i] = is.readObject();
+        }
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/Queue.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/Queue.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/Queue.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,191 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util;
+
+import java.util.Collection;
+
+/**
+ * A collection designed for holding elements prior to processing.
+ * Besides basic {@link java.util.Collection Collection} operations,
+ * queues provide additional insertion, extraction, and inspection
+ * operations.  Each of these methods exists in two forms: one throws
+ * an exception if the operation fails, the other returns a special
+ * value (either <tt>null</tt> or <tt>false</tt>, depending on the
+ * operation).  The latter form of the insert operation is designed
+ * specifically for use with capacity-restricted <tt>Queue</tt>
+ * implementations; in most implementations, insert operations cannot
+ * fail.
+ *
+ * <p>
+ * <table BORDER CELLPADDING=3 CELLSPACING=1>
+ *  <tr>
+ *    <td></td>
+ *    <td ALIGN=CENTER><em>Throws exception</em></td>
+ *    <td ALIGN=CENTER><em>Returns special value</em></td>
+ *  </tr>
+ *  <tr>
+ *    <td><b>Insert</b></td>
+ *    <td>{@link #add add(e)}</td>
+ *    <td>{@link #offer offer(e)}</td>
+ *  </tr>
+ *  <tr>
+ *    <td><b>Remove</b></td>
+ *    <td>{@link #remove remove()}</td>
+ *    <td>{@link #poll poll()}</td>
+ *  </tr>
+ *  <tr>
+ *    <td><b>Examine</b></td>
+ *    <td>{@link #element element()}</td>
+ *    <td>{@link #peek peek()}</td>
+ *  </tr>
+ * </table>
+ *
+ * <p>Queues typically, but do not necessarily, order elements in a
+ * FIFO (first-in-first-out) manner.  Among the exceptions are
+ * priority queues, which order elements according to a supplied
+ * comparator, or the elements' natural ordering, and LIFO queues (or
+ * stacks) which order the elements LIFO (last-in-first-out).
+ * Whatever the ordering used, the <em>head</em> of the queue is that
+ * element which would be removed by a call to {@link #remove() } or
+ * {@link #poll()}.  In a FIFO queue, all new elements are inserted at
+ * the <em> tail</em> of the queue. Other kinds of queues may use
+ * different placement rules.  Every <tt>Queue</tt> implementation
+ * must specify its ordering properties.
+ *
+ * <p>The {@link #offer offer} method inserts an element if possible,
+ * otherwise returning <tt>false</tt>.  This differs from the {@link
+ * java.util.Collection#add Collection.add} method, which can fail to
+ * add an element only by throwing an unchecked exception.  The
+ * <tt>offer</tt> method is designed for use when failure is a normal,
+ * rather than exceptional occurrence, for example, in fixed-capacity
+ * (or &quot;bounded&quot;) queues.
+ *
+ * <p>The {@link #remove()} and {@link #poll()} methods remove and
+ * return the head of the queue.
+ * Exactly which element is removed from the queue is a
+ * function of the queue's ordering policy, which differs from
+ * implementation to implementation. The <tt>remove()</tt> and
+ * <tt>poll()</tt> methods differ only in their behavior when the
+ * queue is empty: the <tt>remove()</tt> method throws an exception,
+ * while the <tt>poll()</tt> method returns <tt>null</tt>.
+ *
+ * <p>The {@link #element()} and {@link #peek()} methods return, but do
+ * not remove, the head of the queue.
+ *
+ * <p>The <tt>Queue</tt> interface does not define the <i>blocking queue
+ * methods</i>, which are common in concurrent programming.  These methods,
+ * which wait for elements to appear or for space to become available, are
+ * defined in the {@link edu.emory.mathcs.backport.java.util.concurrent.BlockingQueue} interface, which
+ * extends this interface.
+ *
+ * <p><tt>Queue</tt> implementations generally do not allow insertion
+ * of <tt>null</tt> elements, although some implementations, such as
+ * {@link LinkedList}, do not prohibit insertion of <tt>null</tt>.
+ * Even in the implementations that permit it, <tt>null</tt> should
+ * not be inserted into a <tt>Queue</tt>, as <tt>null</tt> is also
+ * used as a special return value by the <tt>poll</tt> method to
+ * indicate that the queue contains no elements.
+ *
+ * <p><tt>Queue</tt> implementations generally do not define
+ * element-based versions of methods <tt>equals</tt> and
+ * <tt>hashCode</tt> but instead inherit the identity based versions
+ * from class <tt>Object</tt>, because element-based equality is not
+ * always well-defined for queues with the same elements but different
+ * ordering properties.
+ *
+ *
+ * <p>This interface is a member of the
+ * <a href="{@docRoot}/../guide/collections/index.html">
+ * Java Collections Framework</a>.
+ *
+ * @see java.util.Collection
+ * @see LinkedList
+ * @see PriorityQueue
+ * @see edu.emory.mathcs.backport.java.util.concurrent.LinkedBlockingQueue
+ * @see edu.emory.mathcs.backport.java.util.concurrent.BlockingQueue
+ * @see edu.emory.mathcs.backport.java.util.concurrent.ArrayBlockingQueue
+ * @see edu.emory.mathcs.backport.java.util.concurrent.LinkedBlockingQueue
+ * @see edu.emory.mathcs.backport.java.util.concurrent.PriorityBlockingQueue
+ * @since 1.5
+ * @author Doug Lea
+ */
+public interface Queue extends Collection {
+    /**
+     * Inserts the specified element into this queue if it is possible to do so
+     * immediately without violating capacity restrictions, returning
+     * <tt>true</tt> upon success and throwing an <tt>IllegalStateException</tt>
+     * if no space is currently available.
+     *
+     * @param e the element to add
+     * @return <tt>true</tt> (as specified by {@link Collection#add})
+     * @throws IllegalStateException if the element cannot be added at this
+     *         time due to capacity restrictions
+     * @throws ClassCastException if the class of the specified element
+     *         prevents it from being added to this queue
+     * @throws NullPointerException if the specified element is null and
+     *         this queue not permit null elements
+     * @throws IllegalArgumentException if some property of this element
+     *         prevents it from being added to this queue
+     */
+    boolean add(Object e);
+
+    /**
+     * Inserts the specified element into this queue if it is possible to do
+     * so immediately without violating capacity restrictions.
+     * When using a capacity-restricted queue, this method is generally
+     * preferable to {@link #add}, which can fail to insert an element only
+     * by throwing an exception.
+     *
+     * @param e the element to add
+     * @return <tt>true</tt> if the element was added to this queue, else
+     *         <tt>false</tt>
+     * @throws ClassCastException if the class of the specified element
+     *         prevents it from being added to this queue
+     * @throws NullPointerException if the specified element is null and
+     *         this queue does not permit null elements
+     * @throws IllegalArgumentException if some property of this element
+     *         prevents it from being added to this queue
+     */
+    boolean offer(Object e);
+
+    /**
+     * Retrieves and removes the head of this queue.  This method differs
+     * from {@link #poll poll} only in that it throws an exception if this
+     * queue is empty.
+     * is empty.
+     *
+     * @return the head of this queue
+     * @throws NoSuchElementException if this queue is empty
+     */
+    Object remove();
+
+    /**
+     * Retrieves and removes the head of this queue,
+     * or returns <tt>null</tt> if this queue is empty.
+     *
+     * @return the head of this queue, or <tt>null</tt> if this queue is empty
+     */
+    Object poll();
+
+    /**
+     * Retrieves, but does not remove, the head of this queue.  This method
+     * differs from {@link #peek peek} only in that it throws an exception
+     * if this queue is empty.
+     *
+     * @return the head of this queue
+     * @throws NoSuchElementException if this queue is empty
+     */
+    Object element();
+
+    /**
+     * Retrieves, but does not remove, the head of this queue,
+     * or returns <tt>null</tt> if this queue is empty.
+     *
+     * @return the head of this queue, or <tt>null</tt> if this queue is empty
+     */
+    Object peek();
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/TreeMap.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/TreeMap.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/TreeMap.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,1793 @@
+/*
+ * Written by Dawid Kurzyniec, on the basis of public specifications and
+ * public domain sources from JSR 166 and the Doug Lea's collections package,
+ * and released to the public domain,
+ * as explained at http://creativecommons.org/licenses/publicdomain.
+ */
+
+package edu.emory.mathcs.backport.java.util;
+
+import java.util.Comparator;
+import java.util.Map;
+import java.util.AbstractSet;
+import java.util.SortedSet;
+import java.util.Set;
+import java.util.Iterator;
+import java.util.SortedMap;
+import java.util.NoSuchElementException;
+import java.util.ConcurrentModificationException;
+import java.io.Serializable;
+import java.io.ObjectInputStream;
+import java.io.IOException;
+import java.io.ObjectOutputStream;
+import edu.emory.mathcs.backport.java.util.TreeMap.AscendingSubMap;
+
+/**
+ * Sorted map implementation based on a red-black tree and implementing
+ * all the methods from the NavigableMap interface.
+ *
+ * @author Dawid Kurzyniec
+ */
+public class TreeMap extends AbstractMap
+                     implements NavigableMap, Serializable {
+
+    private static final long serialVersionUID = 919286545866124006L;
+
+    private final Comparator comparator;
+
+    private transient Entry root;
+
+    private transient int size = 0;
+    private transient int modCount = 0;
+
+    private transient EntrySet entrySet;
+    private transient KeySet navigableKeySet;
+    private transient NavigableMap descendingMap;
+    private transient Comparator reverseComparator;
+
+    public TreeMap() {
+        this.comparator = null;
+    }
+
+    public TreeMap(Comparator comparator) {
+        this.comparator = comparator;
+    }
+
+    public TreeMap(SortedMap map) {
+        this.comparator = map.comparator();
+        this.buildFromSorted(map.entrySet().iterator(), map.size());
+    }
+
+    public TreeMap(Map map) {
+        this.comparator = null;
+        putAll(map);
+    }
+
+    public int size() { return size; }
+
+    public void clear() {
+        root = null;
+        size = 0;
+        modCount++;
+    }
+
+    public Object clone() {
+        TreeMap clone;
+        try { clone = (TreeMap)super.clone(); }
+        catch (CloneNotSupportedException e) { throw new InternalError(); }
+        clone.root = null;
+        clone.size = 0;
+        clone.modCount = 0;
+        if (!isEmpty()) {
+            clone.buildFromSorted(this.entrySet().iterator(), this.size);
+        }
+        return clone;
+    }
+
+    public Object put(Object key, Object value) {
+        if (root == null) {
+            root = new Entry(key, value);
+            size++;
+            modCount++;
+            return null;
+        }
+        else {
+            Entry t = root;
+            for (;;) {
+                int diff = compare(key, t.getKey(), comparator);
+                if (diff == 0) return t.setValue(value);
+                else if (diff <= 0) {
+                    if (t.left != null) t = t.left;
+                    else {
+                        size++;
+                        modCount++;
+                        Entry e = new Entry(key, value);
+                        e.parent = t;
+                        t.left = e;
+                        fixAfterInsertion(e);
+                        return null;
+                    }
+                }
+                else {
+                    if (t.right != null) t = t.right;
+                    else {
+                        size++;
+                        modCount++;
+                        Entry e = new Entry(key, value);
+                        e.parent = t;
+                        t.right = e;
+                        fixAfterInsertion(e);
+                        return null;
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Object get(Object key) {
+        Entry entry = getEntry(key);
+        return (entry == null) ? null : entry.getValue();
+    }
+
+    public boolean containsKey(Object key) {
+        return getEntry(key) != null;
+    }
+
+    public Set entrySet() {
+        if (entrySet == null) {
+            entrySet = new EntrySet();
+        }
+        return entrySet;
+    }
+
+    public static class Entry
+        implements Map.Entry, Cloneable, java.io.Serializable {
+
+        private static final boolean RED = false;
+        private static final boolean BLACK = true;
+
+        private Object key;
+        private Object element;
+
+        /**
+         * The node color (RED, BLACK)
+         */
+        private boolean color;
+
+        /**
+         * Pointer to left child
+         */
+        private Entry left;
+
+        /**
+         * Pointer to right child
+         */
+        private Entry right;
+
+        /**
+         * Pointer to parent (null if root)
+         */
+        private Entry parent;
+
+        /**
+         * Make a new node with given element, null links, and BLACK color.
+         * Normally only called to establish a new root.
+         */
+        public Entry(Object key, Object element) {
+            this.key = key;
+            this.element = element;
+            this.color = BLACK;
+        }
+
+        /**
+         * Return a new Entry with same element and color as self,
+         * but with null links. (Since it is never OK to have
+         * multiple identical links in a RB tree.)
+         */
+        protected Object clone() throws CloneNotSupportedException {
+            Entry t = new Entry(key, element);
+            t.color = color;
+            return t;
+        }
+
+        public final Object getKey() {
+            return key;
+        }
+
+        /**
+         * return the element value
+         */
+        public final Object getValue() {
+            return element;
+        }
+
+        /**
+         * set the element value
+         */
+        public final Object setValue(Object v) {
+            Object old = element;
+            element = v;
+            return old;
+        }
+
+        public boolean equals(Object o) {
+            if (!(o instanceof Map.Entry)) return false;
+            Map.Entry e = (Map.Entry)o;
+            return eq(key, e.getKey()) && eq(element, e.getValue());
+        }
+
+        public int hashCode() {
+            return (key == null ? 0 : key.hashCode()) ^
+                   (element == null ? 0 : element.hashCode());
+        }
+
+        public String toString() {
+            return key + "=" + element;
+        }
+    }
+
+    /**
+     * Return the inorder successor, or null if no such
+     */
+    private static Entry successor(Entry e) {
+        if (e.right != null) {
+            for (e = e.right; e.left != null; e = e.left) {}
+            return e;
+        } else {
+            Entry p = e.parent;
+            while (p != null && e == p.right) {
+                e = p;
+                p = p.parent;
+            }
+            return p;
+        }
+    }
+
+    /**
+     * Return the inorder predecessor, or null if no such
+     */
+    private static Entry predecessor(Entry e) {
+        if (e.left != null) {
+            for (e = e.left; e.right != null; e = e.right) {}
+            return e;
+        }
+        else {
+            Entry p = e.parent;
+            while (p != null && e == p.left) {
+                e = p;
+                p = p.parent;
+            }
+            return p;
+        }
+    }
+
+    private Entry getEntry(Object key) {
+        Entry t = root;
+        if (comparator != null) {
+            for (;;) {
+                if (t == null) return null;
+                int diff = comparator.compare(key, t.key);
+                if (diff == 0) return t;
+                t = (diff < 0) ? t.left : t.right;
+            }
+        }
+        else {
+            Comparable c = (Comparable)key;
+            for (;;) {
+                if (t == null) return null;
+                int diff = c.compareTo(t.key);
+                if (diff == 0) return t;
+                t = (diff < 0) ? t.left : t.right;
+            }
+        }
+    }
+
+    private Entry getHigherEntry(Object key) {
+        Entry t = root;
+        if (t == null) return null;
+        for (;;) {
+            int diff = compare(key, t.key, comparator);
+            if (diff < 0) {
+                if (t.left != null) t = t.left; else return t;
+            }
+            else {
+                if (t.right != null) {
+                    t = t.right;
+                }
+                else {
+                    Entry parent = t.parent;
+                    while (parent != null && t == parent.right) {
+                        t = parent;
+                        parent = parent.parent;
+                    }
+                    return parent;
+                }
+            }
+        }
+    }
+
+    private Entry getFirstEntry() {
+        Entry e = root;
+        if (e == null) return null;
+        while (e.left != null) e = e.left;
+        return e;
+    }
+
+    private Entry getLastEntry() {
+        Entry e = root;
+        if (e == null) return null;
+        while (e.right != null) e = e.right;
+        return e;
+    }
+
+    private Entry getCeilingEntry(Object key) {
+        Entry e = root;
+        if (e == null) return null;
+        for (;;) {
+            int diff = compare(key, e.key, comparator);
+            if (diff < 0) {
+                if (e.left != null) e = e.left; else return e;
+            }
+            else if (diff > 0) {
+                if (e.right != null) {
+                    e = e.right;
+                }
+                else {
+                    Entry p = e.parent;
+                    while (p != null && e == p.right) {
+                        e = p;
+                        p = p.parent;
+                    }
+                    return p;
+                }
+            }
+            else return e;
+        }
+    }
+
+    private Entry getLowerEntry(Object key) {
+        Entry e = root;
+        if (e == null) return null;
+        for (;;) {
+            int diff = compare(key, e.key, comparator);
+            if (diff > 0) {
+                if (e.right != null) e = e.right; else return e;
+            }
+            else {
+                if (e.left != null) {
+                    e = e.left;
+                }
+                else {
+                    Entry p = e.parent;
+                    while (p != null && e == p.left) {
+                        e = p;
+                        p = p.parent;
+                    }
+                    return p;
+                }
+            }
+        }
+    }
+
+    private Entry getFloorEntry(Object key) {
+        Entry e = root;
+        if (e == null) return null;
+        for (;;) {
+            int diff = compare(key, e.key, comparator);
+            if (diff > 0) {
+                if (e.right != null) e = e.right; else return e;
+            }
+            else if (diff < 0) {
+                if (e.left != null) {
+                    e = e.left;
+                }
+                else {
+                    Entry p = e.parent;
+                    while (p != null && e == p.left) {
+                        e = p;
+                        p = p.parent;
+                    }
+                    return p;
+                }
+            }
+            else return e;
+        }
+    }
+
+    void buildFromSorted(Iterator itr, int size) {
+        modCount++;
+        this.size = size;
+        // nodes at the bottom (unbalanced) level must be red
+        int bottom = 0;
+        for (int ssize = 1; ssize-1 < size; ssize <<= 1) bottom++;
+        this.root = createFromSorted(itr, size, 0, bottom);
+    }
+
+    private static Entry createFromSorted(Iterator itr, int size,
+                                          int level, int bottom) {
+        level++;
+        if (size == 0) return null;
+        int leftSize = (size-1) >> 1;
+        int rightSize = size-1-leftSize;
+        Entry left = createFromSorted(itr, leftSize, level, bottom);
+        Map.Entry orig = (Map.Entry)itr.next();
+        Entry right = createFromSorted(itr, rightSize, level, bottom);
+        Entry e = new Entry(orig.getKey(), orig.getValue());
+        if (left != null) {
+            e.left = left;
+            left.parent = e;
+        }
+        if (right != null) {
+            e.right = right;
+            right.parent = e;
+        }
+        if (level == bottom) e.color = Entry.RED;
+        return e;
+    }
+
+    /**
+     * Delete the current node, and then rebalance the tree it is in
+     * @param root the root of the current tree
+     * @return the new root of the current tree. (Rebalancing
+     * can change the root!)
+     */
+    private void delete(Entry e) {
+
+        // handle case where we are only node
+        if (e.left == null && e.right == null && e.parent == null) {
+            root = null;
+            size = 0;
+            modCount++;
+            return;
+        }
+        // if strictly internal, swap places with a successor
+        if (e.left != null && e.right != null) {
+            Entry s = successor(e);
+            e.key = s.key;
+            e.element = s.element;
+            e = s;
+        }
+
+        // Start fixup at replacement node (normally a child).
+        // But if no children, fake it by using self
+
+        if (e.left == null && e.right == null) {
+
+            if (e.color == Entry.BLACK)
+                fixAfterDeletion(e);
+
+            // Unlink  (Couldn't before since fixAfterDeletion needs parent ptr)
+
+            if (e.parent != null) {
+                if (e == e.parent.left)
+                    e.parent.left = null;
+                else if (e == e.parent.right)
+                    e.parent.right = null;
+                e.parent = null;
+            }
+
+        }
+        else {
+            Entry replacement = e.left;
+            if (replacement == null)
+                replacement = e.right;
+
+            // link replacement to parent
+            replacement.parent = e.parent;
+
+            if (e.parent == null)
+                root = replacement;
+            else if (e == e.parent.left)
+                e.parent.left = replacement;
+            else
+                e.parent.right = replacement;
+
+            e.left = null;
+            e.right = null;
+            e.parent = null;
+
+            // fix replacement
+            if (e.color == Entry.BLACK)
+                fixAfterDeletion(replacement);
+
+        }
+
+        size--;
+        modCount++;
+    }
+
+    /**
+     * Return color of node p, or BLACK if p is null
+     * (In the CLR version, they use
+     * a special dummy `nil' node for such purposes, but that doesn't
+     * work well here, since it could lead to creating one such special
+     * node per real node.)
+     *
+     */
+    static boolean colorOf(Entry p) {
+        return (p == null) ? Entry.BLACK : p.color;
+    }
+
+    /**
+     * return parent of node p, or null if p is null
+     */
+    static Entry parentOf(Entry p) {
+        return (p == null) ? null : p.parent;
+    }
+
+    /**
+     * Set the color of node p, or do nothing if p is null
+     */
+    private static void setColor(Entry p, boolean c) {
+        if (p != null) p.color = c;
+    }
+
+    /**
+     * return left child of node p, or null if p is null
+     */
+    private static Entry leftOf(Entry p) {
+        return (p == null) ? null : p.left;
+    }
+
+    /**
+     * return right child of node p, or null if p is null
+     */
+    private static Entry rightOf(Entry p) {
+        return (p == null) ? null : p.right;
+    }
+
+    /** From CLR */
+    private final void rotateLeft(Entry e) {
+        Entry r = e.right;
+        e.right = r.left;
+        if (r.left != null)
+            r.left.parent = e;
+        r.parent = e.parent;
+        if (e.parent == null) root = r;
+        else if (e.parent.left == e)
+            e.parent.left = r;
+        else
+            e.parent.right = r;
+        r.left = e;
+        e.parent = r;
+    }
+
+    /** From CLR */
+    private final void rotateRight(Entry e) {
+        Entry l = e.left;
+        e.left = l.right;
+        if (l.right != null)
+            l.right.parent = e;
+        l.parent = e.parent;
+        if (e.parent == null) root = l;
+        else if (e.parent.right == e)
+            e.parent.right = l;
+        else
+            e.parent.left = l;
+        l.right = e;
+        e.parent = l;
+    }
+
+    /** From CLR */
+    private final void fixAfterInsertion(Entry e) {
+        e.color = Entry.RED;
+        Entry x = e;
+
+        while (x != null && x != root && x.parent.color == Entry.RED) {
+            if (parentOf(x) == leftOf(parentOf(parentOf(x)))) {
+                Entry y = rightOf(parentOf(parentOf(x)));
+                if (colorOf(y) == Entry.RED) {
+                    setColor(parentOf(x), Entry.BLACK);
+                    setColor(y, Entry.BLACK);
+                    setColor(parentOf(parentOf(x)), Entry.RED);
+                    x = parentOf(parentOf(x));
+                }
+                else {
+                    if (x == rightOf(parentOf(x))) {
+                        x = parentOf(x);
+                        rotateLeft(x);
+                    }
+                    setColor(parentOf(x), Entry.BLACK);
+                    setColor(parentOf(parentOf(x)), Entry.RED);
+                    if (parentOf(parentOf(x)) != null)
+                        rotateRight(parentOf(parentOf(x)));
+                }
+            }
+            else {
+                Entry y = leftOf(parentOf(parentOf(x)));
+                if (colorOf(y) == Entry.RED) {
+                    setColor(parentOf(x), Entry.BLACK);
+                    setColor(y, Entry.BLACK);
+                    setColor(parentOf(parentOf(x)), Entry.RED);
+                    x = parentOf(parentOf(x));
+                }
+                else {
+                    if (x == leftOf(parentOf(x))) {
+                        x = parentOf(x);
+                        rotateRight(x);
+                    }
+                    setColor(parentOf(x), Entry.BLACK);
+                    setColor(parentOf(parentOf(x)), Entry.RED);
+                    if (parentOf(parentOf(x)) != null)
+                        rotateLeft(parentOf(parentOf(x)));
+                }
+            }
+        }
+        root.color = Entry.BLACK;
+    }
+
+    /** From CLR */
+    private final Entry fixAfterDeletion(Entry e) {
+        Entry x = e;
+        while (x != root && colorOf(x) == Entry.BLACK) {
+            if (x == leftOf(parentOf(x))) {
+                Entry sib = rightOf(parentOf(x));
+                if (colorOf(sib) == Entry.RED) {
+                    setColor(sib, Entry.BLACK);
+                    setColor(parentOf(x), Entry.RED);
+                    rotateLeft(parentOf(x));
+                    sib = rightOf(parentOf(x));
+                }
+                if (colorOf(leftOf(sib)) == Entry.BLACK &&
+                    colorOf(rightOf(sib)) == Entry.BLACK) {
+                    setColor(sib, Entry.RED);
+                    x = parentOf(x);
+                }
+                else {
+                    if (colorOf(rightOf(sib)) == Entry.BLACK) {
+                        setColor(leftOf(sib), Entry.BLACK);
+                        setColor(sib, Entry.RED);
+                        rotateRight(sib);
+                        sib = rightOf(parentOf(x));
+                    }
+                    setColor(sib, colorOf(parentOf(x)));
+                    setColor(parentOf(x), Entry.BLACK);
+                    setColor(rightOf(sib), Entry.BLACK);
+                    rotateLeft(parentOf(x));
+                    x = root;
+                }
+            }
+            else {
+                Entry sib = leftOf(parentOf(x));
+                if (colorOf(sib) == Entry.RED) {
+                    setColor(sib, Entry.BLACK);
+                    setColor(parentOf(x), Entry.RED);
+                    rotateRight(parentOf(x));
+                    sib = leftOf(parentOf(x));
+                }
+                if (colorOf(rightOf(sib)) == Entry.BLACK &&
+                    colorOf(leftOf(sib)) == Entry.BLACK) {
+                    setColor(sib, Entry.RED);
+                    x = parentOf(x);
+                }
+                else {
+                    if (colorOf(leftOf(sib)) == Entry.BLACK) {
+                        setColor(rightOf(sib), Entry.BLACK);
+                        setColor(sib, Entry.RED);
+                        rotateLeft(sib);
+                        sib = leftOf(parentOf(x));
+                    }
+                    setColor(sib, colorOf(parentOf(x)));
+                    setColor(parentOf(x), Entry.BLACK);
+                    setColor(leftOf(sib), Entry.BLACK);
+                    rotateRight(parentOf(x));
+                    x = root;
+                }
+            }
+        }
+        setColor(x, Entry.BLACK);
+        return root;
+    }
+
+    private class BaseEntryIterator {
+        Entry cursor;
+        Entry lastRet;
+        int expectedModCount;
+        BaseEntryIterator(Entry cursor) {
+            this.cursor = cursor;
+            this.expectedModCount = modCount;
+        }
+        public boolean hasNext() {
+            return (cursor != null);
+        }
+        Entry nextEntry() {
+            Entry curr = cursor;
+            if (curr == null) throw new NoSuchElementException();
+            if (expectedModCount != modCount)
+                throw new ConcurrentModificationException();
+            cursor = successor(curr);
+            lastRet = curr;
+            return curr;
+        }
+        Entry prevEntry() {
+            Entry curr = cursor;
+            if (curr == null) throw new NoSuchElementException();
+            if (expectedModCount != modCount)
+                throw new ConcurrentModificationException();
+            cursor = predecessor(curr);
+            lastRet = curr;
+            return curr;
+        }
+        public void remove() {
+            if (lastRet == null) throw new IllegalStateException();
+            if (expectedModCount != modCount)
+                throw new ConcurrentModificationException();
+            // if removal strictly internal, it swaps places with a successor
+            if (lastRet.left != null && lastRet.right != null && cursor != null) cursor = lastRet;
+            delete(lastRet);
+            lastRet = null;
+            expectedModCount++;
+        }
+    }
+
+    class EntryIterator extends BaseEntryIterator implements Iterator {
+        EntryIterator(Entry cursor) { super(cursor); }
+        public Object next() { return nextEntry(); }
+    }
+
+    class KeyIterator extends BaseEntryIterator implements Iterator {
+        KeyIterator(Entry cursor) { super(cursor); }
+        public Object next() { return nextEntry().key; }
+    }
+
+    class ValueIterator extends BaseEntryIterator implements Iterator {
+        ValueIterator(Entry cursor) { super(cursor); }
+        public Object next() { return nextEntry().element; }
+    }
+
+    class DescendingEntryIterator extends BaseEntryIterator implements Iterator {
+        DescendingEntryIterator(Entry cursor) { super(cursor); }
+        public Object next() { return prevEntry(); }
+    }
+
+    class DescendingKeyIterator extends BaseEntryIterator implements Iterator {
+        DescendingKeyIterator(Entry cursor) { super(cursor); }
+        public Object next() { return prevEntry().key; }
+    }
+
+    class DescendingValueIterator extends BaseEntryIterator implements Iterator {
+        DescendingValueIterator(Entry cursor) { super(cursor); }
+        public Object next() { return prevEntry().element; }
+    }
+
+    private Entry getMatchingEntry(Object o) {
+        if (!(o instanceof Map.Entry)) return null;
+        Map.Entry e = (Map.Entry)o;
+        Entry found = TreeMap.this.getEntry(e.getKey());
+        return (found != null && eq(found.getValue(), e.getValue())) ? found : null;
+    }
+
+    class EntrySet extends AbstractSet {
+        public int size() { return TreeMap.this.size(); }
+        public boolean isEmpty() { return TreeMap.this.isEmpty(); }
+        public void clear() { TreeMap.this.clear(); }
+
+        public Iterator iterator() {
+            return new EntryIterator(getFirstEntry());
+        }
+
+        public boolean contains(Object o) {
+            return getMatchingEntry(o) != null;
+        }
+
+        public boolean remove(Object o) {
+            Entry e = getMatchingEntry(o);
+            if (e == null) return false;
+            delete(e);
+            return true;
+        }
+    }
+
+    class DescendingEntrySet extends EntrySet {
+        public Iterator iterator() {
+            return new DescendingEntryIterator(getLastEntry());
+        }
+    }
+
+    class ValueSet extends AbstractSet {
+        public int size() { return TreeMap.this.size(); }
+        public boolean isEmpty() { return TreeMap.this.isEmpty(); }
+        public void clear() { TreeMap.this.clear(); }
+
+        public boolean contains(Object o) {
+            for (Entry e = getFirstEntry(); e != null; e = successor(e)) {
+                if (eq(o, e.element)) return true;
+            }
+            return false;
+        }
+
+        public Iterator iterator() {
+            return new ValueIterator(getFirstEntry());
+        }
+
+        public boolean remove(Object o) {
+            for (Entry e = getFirstEntry(); e != null; e = successor(e)) {
+                if (eq(o, e.element)) {
+                    delete(e);
+                    return true;
+                }
+            }
+            return false;
+        }
+    }
+
+    abstract class KeySet extends AbstractSet implements NavigableSet {
+        public int size() { return TreeMap.this.size(); }
+        public boolean isEmpty() { return TreeMap.this.isEmpty(); }
+        public void clear() { TreeMap.this.clear(); }
+
+        public boolean contains(Object o) {
+            return getEntry(o) != null;
+        }
+
+        public boolean remove(Object o) {
+            Entry found = getEntry(o);
+            if (found == null) return false;
+            delete(found);
+            return true;
+        }
+        public SortedSet subSet(Object fromElement, Object toElement) {
+            return subSet(fromElement, true, toElement, false);
+        }
+        public SortedSet headSet(Object toElement) {
+            return headSet(toElement, false);
+        }
+        public SortedSet tailSet(Object fromElement) {
+            return tailSet(fromElement, true);
+        }
+    }
+
+    class AscendingKeySet extends KeySet {
+
+        public Iterator iterator() {
+            return new KeyIterator(getFirstEntry());
+        }
+
+        public Iterator descendingIterator() {
+            return new DescendingKeyIterator(getFirstEntry());
+        }
+
+        public Object lower(Object e)   { return lowerKey(e); }
+        public Object floor(Object e)   { return floorKey(e); }
+        public Object ceiling(Object e) { return ceilingKey(e); }
+        public Object higher(Object e)  { return higherKey(e); }
+        public Object first()           { return firstKey(); }
+        public Object last()            { return lastKey(); }
+        public Comparator comparator()  { return TreeMap.this.comparator(); }
+
+        public Object pollFirst() {
+            Map.Entry e = pollFirstEntry();
+            return e == null? null : e.getKey();
+        }
+        public Object pollLast() {
+            Map.Entry e = pollLastEntry();
+            return e == null? null : e.getKey();
+        }
+
+        public NavigableSet subSet(Object fromElement, boolean fromInclusive,
+                                   Object toElement,   boolean toInclusive) {
+            return (NavigableSet)(subMap(fromElement, fromInclusive,
+                                         toElement,   toInclusive)).keySet();
+        }
+        public NavigableSet headSet(Object toElement, boolean inclusive) {
+            return (NavigableSet)(headMap(toElement, inclusive)).keySet();
+        }
+        public NavigableSet tailSet(Object fromElement, boolean inclusive) {
+            return (NavigableSet)(tailMap(fromElement, inclusive)).keySet();
+        }
+        public NavigableSet descendingSet() {
+            return (NavigableSet)descendingMap().keySet();
+        }
+    }
+
+    class DescendingKeySet extends KeySet {
+
+        public Iterator iterator() {
+            return new DescendingKeyIterator(getLastEntry());
+        }
+
+        public Iterator descendingIterator() {
+            return new KeyIterator(getFirstEntry());
+        }
+
+        public Object lower(Object e)   { return higherKey(e); }
+        public Object floor(Object e)   { return ceilingKey(e); }
+        public Object ceiling(Object e) { return floorKey(e); }
+        public Object higher(Object e)  { return lowerKey(e); }
+        public Object first()           { return lastKey(); }
+        public Object last()            { return firstKey(); }
+        public Comparator comparator()  { return descendingMap().comparator(); }
+
+        public Object pollFirst() {
+            Map.Entry e = pollLastEntry();
+            return e == null? null : e.getKey();
+        }
+        public Object pollLast() {
+            Map.Entry e = pollFirstEntry();
+            return e == null? null : e.getKey();
+        }
+
+        public NavigableSet subSet(Object fromElement, boolean fromInclusive,
+                                   Object toElement,   boolean toInclusive) {
+            return (NavigableSet)(descendingMap().subMap(fromElement, fromInclusive,
+                                          toElement,   toInclusive)).keySet();
+        }
+        public NavigableSet headSet(Object toElement, boolean inclusive) {
+            return (NavigableSet)(descendingMap().headMap(toElement, inclusive)).keySet();
+        }
+        public NavigableSet tailSet(Object fromElement, boolean inclusive) {
+            return (NavigableSet)(descendingMap().tailMap(fromElement, inclusive)).keySet();
+        }
+        public NavigableSet descendingSet() {
+            return (NavigableSet)keySet();
+        }
+    }
+
+    private static boolean eq(Object o1, Object o2) {
+        return o1 == null ? o2 == null : o1.equals(o2);
+    }
+
+    private static int compare(Object o1, Object o2, Comparator cmp) {
+        return (cmp == null)
+            ? ((Comparable)o1).compareTo(o2)
+            : cmp.compare(o1, o2);
+    }
+
+    /**
+     * @since 1.6
+     */
+    public Map.Entry lowerEntry(Object key) {
+        Map.Entry e = getLowerEntry(key);
+        return (e == null) ? null : new AbstractMap.SimpleImmutableEntry(e);
+    }
+
+    /**
+     * @since 1.6
+     */
+    public Object lowerKey(Object key) {
+        Map.Entry e = getLowerEntry(key);
+        return (e == null) ? null : e.getKey();
+    }
+
+    /**
+     * @since 1.6
+     */
+    public Map.Entry floorEntry(Object key) {
+        Entry e = getFloorEntry(key);
+        return (e == null) ? null : new AbstractMap.SimpleImmutableEntry(e);
+    }
+
+    /**
+     * @since 1.6
+     */
+    public Object floorKey(Object key) {
+        Entry e = getFloorEntry(key);
+        return (e == null) ? null : e.key;
+    }
+
+    /**
+     * @since 1.6
+     */
+    public Map.Entry ceilingEntry(Object key) {
+        Entry e = getCeilingEntry(key);
+        return (e == null) ? null : new AbstractMap.SimpleImmutableEntry(e);
+    }
+
+    /**
+     * @since 1.6
+     */
+    public Object ceilingKey(Object key) {
+        Entry e = getCeilingEntry(key);
+        return (e == null) ? null : e.key;
+    }
+
+    /**
+     * @since 1.6
+     */
+    public Map.Entry higherEntry(Object key) {
+        Entry e = getHigherEntry(key);
+        return (e == null) ? null : new AbstractMap.SimpleImmutableEntry(e);
+    }
+
+    /**
+     * @since 1.6
+     */
+    public Object higherKey(Object key) {
+        Entry e = getHigherEntry(key);
+        return (e == null) ? null : e.key;
+    }
+
+    /**
+     * @since 1.6
+     */
+    public Map.Entry firstEntry() {
+        Entry e = getFirstEntry();
+        return (e == null) ? null : new AbstractMap.SimpleImmutableEntry(e);
+    }
+
+    /**
+     * @since 1.6
+     */
+    public Map.Entry lastEntry() {
+        Entry e = getLastEntry();
+        return (e == null) ? null : new AbstractMap.SimpleImmutableEntry(e);
+    }
+
+    /**
+     * @since 1.6
+     */
+    public Map.Entry pollFirstEntry() {
+        Entry e = getFirstEntry();
+        if (e == null) return null;
+        Map.Entry res = new AbstractMap.SimpleImmutableEntry(e);
+        delete(e);
+        return res;
+    }
+
+    /**
+     * @since 1.6
+     */
+    public Map.Entry pollLastEntry() {
+        Entry e = getLastEntry();
+        if (e == null) return null;
+        Map.Entry res = new AbstractMap.SimpleImmutableEntry(e);
+        delete(e);
+        return res;
+    }
+
+    /**
+     * @since 1.6
+     */
+    public NavigableMap descendingMap() {
+        NavigableMap map = descendingMap;
+        if (map == null) {
+            descendingMap = map = new DescendingSubMap(true, null, true,
+                                                       true, null, true);
+        }
+        return map;
+    }
+
+    public NavigableSet descendingKeySet() {
+        return descendingMap().navigableKeySet();
+    }
+
+    public SortedMap subMap(Object fromKey, Object toKey) {
+        return subMap(fromKey, true, toKey, false);
+    }
+
+    public SortedMap headMap(Object toKey) {
+        return headMap(toKey, false);
+    }
+
+    public SortedMap tailMap(Object fromKey) {
+        return tailMap(fromKey, true);
+    }
+
+    public NavigableMap subMap(Object fromKey, boolean fromInclusive,
+                               Object toKey,   boolean toInclusive) {
+        return new AscendingSubMap(false, fromKey, fromInclusive,
+                                   false, toKey, toInclusive);
+    }
+
+    public NavigableMap headMap(Object toKey, boolean toInclusive) {
+        return new AscendingSubMap(true,  null,  true,
+                                   false, toKey, toInclusive);
+    }
+
+    public NavigableMap tailMap(Object fromKey, boolean fromInclusive) {
+        return new AscendingSubMap(false, fromKey, fromInclusive,
+                                   true,  null,    true);
+    }
+
+    public Comparator comparator() {
+        return comparator;
+    }
+
+    final Comparator reverseComparator() {
+        if (reverseComparator == null) {
+            reverseComparator = Collections.reverseOrder(comparator);
+        }
+        return reverseComparator;
+    }
+
+    public Object firstKey() {
+        Entry e = getFirstEntry();
+        if (e == null) throw new NoSuchElementException();
+        return e.key;
+    }
+
+    public Object lastKey() {
+        Entry e = getLastEntry();
+        if (e == null) throw new NoSuchElementException();
+        return e.key;
+    }
+
+    public boolean isEmpty() {
+        return size == 0;
+    }
+
+    public boolean containsValue(Object value) {
+        if (root == null) return false;
+        return (value == null) ? containsNull(root) : containsValue(root, value);
+    }
+
+    private static boolean containsNull(Entry e) {
+        if (e.element == null) return true;
+        if (e.left != null && containsNull(e.left)) return true;
+        if (e.right != null && containsNull(e.right)) return true;
+        return false;
+    }
+
+    private static boolean containsValue(Entry e, Object val) {
+        if (val.equals(e.element)) return true;
+        if (e.left != null && containsValue(e.left, val)) return true;
+        if (e.right != null && containsValue(e.right, val)) return true;
+        return false;
+    }
+
+    public Object remove(Object key) {
+        Entry e = getEntry(key);
+        if (e == null) return null;
+        Object old = e.getValue();
+        delete(e);
+        return old;
+    }
+
+    public void putAll(Map map) {
+        if (map instanceof SortedMap) {
+            SortedMap smap = (SortedMap)map;
+            if (eq(this.comparator, smap.comparator())) {
+                this.buildFromSorted(smap.entrySet().iterator(), map.size());
+                return;
+            }
+        }
+        // not a sorted map, or comparator mismatch
+        super.putAll(map);
+    }
+
+    public Set keySet() {
+        return navigableKeySet();
+    }
+
+    public NavigableSet navigableKeySet() {
+        if (navigableKeySet == null) {
+            navigableKeySet = new AscendingKeySet();
+        }
+        return navigableKeySet;
+    }
+
+//    public Collection values() {
+//        if (valueSet == null) {
+//            valueSet = new ValueSet();
+//        }
+//        return valueSet;
+//    }
+//
+    private abstract class NavigableSubMap extends AbstractMap
+                                           implements NavigableMap, Serializable {
+
+        private static final long serialVersionUID = -6520786458950516097L;
+
+        final Object fromKey, toKey;
+        final boolean fromStart, toEnd;
+        final boolean fromInclusive, toInclusive;
+        transient int cachedSize = -1, cacheVersion;
+        transient SubEntrySet entrySet;
+        transient NavigableMap descendingMap;
+        transient NavigableSet navigableKeySet;
+
+        NavigableSubMap(boolean fromStart, Object fromKey, boolean fromInclusive,
+                        boolean toEnd,     Object toKey,   boolean toInclusive) {
+            if (!fromStart && !toEnd) {
+                if (compare(fromKey, toKey, comparator) > 0) {
+                    throw new IllegalArgumentException("fromKey > toKey");
+                }
+            }
+            else {
+                if (!fromStart) compare(fromKey, fromKey, comparator);
+                if (!toEnd) compare(toKey, toKey, comparator);
+            }
+            this.fromStart = fromStart;
+            this.toEnd = toEnd;
+            this.fromKey = fromKey;
+            this.toKey = toKey;
+            this.fromInclusive = fromInclusive;
+            this.toInclusive = toInclusive;
+        }
+
+        final TreeMap.Entry checkLoRange(TreeMap.Entry e) {
+            return (e == null || absTooLow(e.key)) ? null : e;
+        }
+
+        final TreeMap.Entry checkHiRange(TreeMap.Entry e) {
+            return (e == null || absTooHigh(e.key)) ? null : e;
+        }
+
+        final boolean inRange(Object key) {
+            return !absTooLow(key) && !absTooHigh(key);
+        }
+
+        final boolean inRangeExclusive(Object key) {
+            return (fromStart || compare(key, fromKey, comparator) >= 0)
+                && (toEnd     || compare(toKey, key, comparator) >= 0);
+        }
+
+        final boolean inRange(Object key, boolean inclusive) {
+            return inclusive ? inRange(key) : inRangeExclusive(key);
+        }
+
+
+        private boolean absTooHigh(Object key) {
+            if (toEnd) return false;
+            int c = compare(key, toKey, comparator);
+            return (c > 0 || (c == 0 && !toInclusive));
+        }
+
+        private boolean absTooLow(Object key) {
+            if (fromStart) return false;
+            int c = compare(key, fromKey, comparator);
+            return (c < 0 || (c == 0 && !fromInclusive));
+        }
+
+        protected abstract TreeMap.Entry first();
+        protected abstract TreeMap.Entry last();
+        protected abstract TreeMap.Entry lower(Object key);
+        protected abstract TreeMap.Entry floor(Object key);
+        protected abstract TreeMap.Entry ceiling(Object key);
+        protected abstract TreeMap.Entry higher(Object key);
+        protected abstract TreeMap.Entry uncheckedHigher(TreeMap.Entry e);
+
+        // absolute comparisons, for use by subclasses
+
+        final TreeMap.Entry absLowest() {
+            return checkHiRange((fromStart) ? getFirstEntry() :
+                fromInclusive ? getCeilingEntry(fromKey) : getHigherEntry(fromKey));
+        }
+
+        final TreeMap.Entry absHighest() {
+            return checkLoRange((toEnd) ? getLastEntry() :
+                toInclusive ? getFloorEntry(toKey) : getLowerEntry(toKey));
+        }
+
+        final TreeMap.Entry absLower(Object key) {
+            return absTooHigh(key) ? absHighest() : checkLoRange(getLowerEntry(key));
+        }
+
+        final TreeMap.Entry absFloor(Object key) {
+            return absTooHigh(key) ? absHighest() : checkLoRange(getFloorEntry(key));
+        }
+
+        final TreeMap.Entry absCeiling(Object key) {
+            return absTooLow(key) ? absLowest() : checkHiRange(getCeilingEntry(key));
+        }
+
+        final TreeMap.Entry absHigher(Object key) {
+            return absTooLow(key) ? absLowest() : checkHiRange(getHigherEntry(key));
+        }
+
+        // navigable implementations, using subclass-defined comparisons
+
+        public Map.Entry firstEntry() {
+            TreeMap.Entry e = first();
+            return (e == null) ? null : new AbstractMap.SimpleImmutableEntry(e);
+        }
+
+        public Object firstKey() {
+            TreeMap.Entry e = first();
+            if (e == null) throw new NoSuchElementException();
+            return e.key;
+        }
+
+        public Map.Entry lastEntry() {
+            TreeMap.Entry e = last();
+            return (e == null) ? null : new AbstractMap.SimpleImmutableEntry(e);
+        }
+
+        public Object lastKey() {
+            TreeMap.Entry e = last();
+            if (e == null) throw new NoSuchElementException();
+            return e.key;
+        }
+
+        public Map.Entry pollFirstEntry() {
+            TreeMap.Entry e = first();
+            if (e == null) return null;
+            Map.Entry result = new SimpleImmutableEntry(e);
+            delete(e);
+            return result;
+        }
+
+        public java.util.Map.Entry pollLastEntry() {
+            TreeMap.Entry e = last();
+            if (e == null) return null;
+            Map.Entry result = new SimpleImmutableEntry(e);
+            delete(e);
+            return result;
+        }
+
+        public Map.Entry lowerEntry(Object key) {
+            TreeMap.Entry e = lower(key);
+            return (e == null) ? null : new AbstractMap.SimpleImmutableEntry(e);
+        }
+
+        public Object lowerKey(Object key) {
+            TreeMap.Entry e = lower(key);
+            return (e == null) ? null : e.key;
+        }
+
+        public Map.Entry floorEntry(Object key) {
+            TreeMap.Entry e = floor(key);
+            return (e == null) ? null : new AbstractMap.SimpleImmutableEntry(e);
+        }
+
+        public Object floorKey(Object key) {
+            TreeMap.Entry e = floor(key);
+            return (e == null) ? null : e.key;
+        }
+
+        public Map.Entry ceilingEntry(Object key) {
+            TreeMap.Entry e = ceiling(key);
+            return (e == null) ? null : new AbstractMap.SimpleImmutableEntry(e);
+        }
+
+        public Object ceilingKey(Object key) {
+            TreeMap.Entry e = ceiling(key);
+            return (e == null) ? null : e.key;
+        }
+
+        public Map.Entry higherEntry(Object key) {
+            TreeMap.Entry e = higher(key);
+            return (e == null) ? null : new AbstractMap.SimpleImmutableEntry(e);
+        }
+
+        public Object higherKey(Object key) {
+            TreeMap.Entry e = higher(key);
+            return (e == null) ? null : e.key;
+        }
+
+        public NavigableSet descendingKeySet() {
+            return descendingMap().navigableKeySet();
+        }
+
+        public SortedMap subMap(Object fromKey, Object toKey) {
+            return subMap(fromKey, true, toKey, false);
+        }
+
+        public SortedMap headMap(Object toKey) {
+            return headMap(toKey, false);
+        }
+
+        public SortedMap tailMap(Object fromKey) {
+            return tailMap(fromKey, true);
+        }
+
+        public int size() {
+            if (cachedSize < 0 || cacheVersion != modCount) {
+                cachedSize = recalculateSize();
+                cacheVersion = modCount;
+            }
+            return cachedSize;
+        }
+
+        private int recalculateSize() {
+            TreeMap.Entry terminator = absHighest();
+            Object terminalKey = terminator != null ? terminator.key : null;
+
+            int size = 0;
+            for (TreeMap.Entry e = absLowest(); e != null;
+                 e = (e.key == terminalKey) ? null : successor(e)) {
+                size++;
+            }
+            return size;
+        }
+
+        public boolean isEmpty() {
+            return absLowest() == null;
+        }
+
+        public boolean containsKey(Object key) {
+            return (inRange(key) && TreeMap.this.containsKey(key));
+        }
+
+        public Object get(Object key) {
+            if (!inRange(key)) return null;
+            else return TreeMap.this.get(key);
+        }
+
+        public Object put(Object key, Object value) {
+            if (!inRange(key))
+                throw new IllegalArgumentException("Key out of range");
+            return TreeMap.this.put(key, value);
+        }
+
+        public Object remove(Object key) {
+            if (!inRange(key)) return null;
+            return TreeMap.this.remove(key);
+        }
+
+        public Set entrySet() {
+            if (entrySet == null) {
+                entrySet = new SubEntrySet();
+            }
+            return entrySet;
+        }
+
+        public Set keySet() {
+            return navigableKeySet();
+        }
+
+        public NavigableSet navigableKeySet() {
+            if (navigableKeySet == null) {
+                navigableKeySet = new SubKeySet();
+            }
+            return navigableKeySet;
+        }
+
+        private TreeMap.Entry getMatchingSubEntry(Object o) {
+            if (!(o instanceof Map.Entry)) return null;
+            Map.Entry e = (Map.Entry)o;
+            Object key = e.getKey();
+            if (!inRange(key)) return null;
+            TreeMap.Entry found = getEntry(key);
+            return (found != null && eq(found.getValue(), e.getValue())) ? found : null;
+        }
+
+        class SubEntrySet extends AbstractSet {
+            public int size() { return NavigableSubMap.this.size(); }
+            public boolean isEmpty() { return NavigableSubMap.this.isEmpty(); }
+
+            public boolean contains(Object o) {
+                return getMatchingSubEntry(o) != null;
+            }
+
+            public boolean remove(Object o) {
+                TreeMap.Entry e = getMatchingSubEntry(o);
+                if (e == null) return false;
+                delete(e);
+                return true;
+            }
+
+            public Iterator iterator() {
+                return new SubEntryIterator();
+            }
+        }
+
+        class SubKeySet extends AbstractSet implements NavigableSet {
+            public int size() { return NavigableSubMap.this.size(); }
+            public boolean isEmpty() { return NavigableSubMap.this.isEmpty(); }
+            public void clear() { NavigableSubMap.this.clear(); }
+
+            public boolean contains(Object o) {
+                return getEntry(o) != null;
+            }
+
+            public boolean remove(Object o) {
+                if (!inRange(o)) return false;
+                TreeMap.Entry found = getEntry(o);
+                if (found == null) return false;
+                delete(found);
+                return true;
+            }
+            public SortedSet subSet(Object fromElement, Object toElement) {
+                return subSet(fromElement, true, toElement, false);
+            }
+            public SortedSet headSet(Object toElement) {
+                return headSet(toElement, false);
+            }
+            public SortedSet tailSet(Object fromElement) {
+                return tailSet(fromElement, true);
+            }
+
+            public Iterator iterator() {
+                return new SubKeyIterator(NavigableSubMap.this.entrySet().iterator());
+            }
+
+            public Iterator descendingIterator() {
+                return new SubKeyIterator(NavigableSubMap.this.descendingMap().entrySet().iterator());
+            }
+
+            public Object lower(Object e)   { return NavigableSubMap.this.lowerKey(e); }
+            public Object floor(Object e)   { return NavigableSubMap.this.floorKey(e); }
+            public Object ceiling(Object e) { return NavigableSubMap.this.ceilingKey(e); }
+            public Object higher(Object e)  { return NavigableSubMap.this.higherKey(e); }
+            public Object first()           { return NavigableSubMap.this.firstKey(); }
+            public Object last()            { return NavigableSubMap.this.lastKey(); }
+            public Comparator comparator()  { return NavigableSubMap.this.comparator(); }
+
+            public Object pollFirst() {
+                Map.Entry e = NavigableSubMap.this.pollFirstEntry();
+                return e == null? null : e.getKey();
+            }
+            public Object pollLast() {
+                Map.Entry e = NavigableSubMap.this.pollLastEntry();
+                return e == null? null : e.getKey();
+            }
+
+            public NavigableSet subSet(Object fromElement, boolean fromInclusive,
+                                       Object toElement,   boolean toInclusive) {
+                return (NavigableSet)(NavigableSubMap.this.subMap(fromElement, fromInclusive,
+                                             toElement,   toInclusive)).keySet();
+            }
+            public NavigableSet headSet(Object toElement, boolean inclusive) {
+                return (NavigableSet)(NavigableSubMap.this.headMap(toElement, inclusive)).keySet();
+            }
+            public NavigableSet tailSet(Object fromElement, boolean inclusive) {
+                return (NavigableSet)(NavigableSubMap.this.tailMap(fromElement, inclusive)).keySet();
+            }
+            public NavigableSet descendingSet() {
+                return (NavigableSet)NavigableSubMap.this.descendingMap().keySet();
+            }
+        }
+
+        class SubEntryIterator extends BaseEntryIterator implements Iterator {
+            final Object terminalKey;
+            SubEntryIterator() {
+                super(first());
+                TreeMap.Entry terminator = last();
+                this.terminalKey = terminator == null ? null : terminator.key;
+            }
+            public boolean hasNext() {
+                return cursor != null;
+            }
+            public Object next() {
+                TreeMap.Entry curr = cursor;
+                if (curr == null) throw new NoSuchElementException();
+                if (expectedModCount != modCount)
+                    throw new ConcurrentModificationException();
+                cursor = (curr.key == terminalKey) ? null : uncheckedHigher(curr);
+                lastRet = curr;
+                return curr;
+            }
+        }
+
+        class SubKeyIterator implements Iterator {
+            final Iterator itr;
+            SubKeyIterator(Iterator itr) { this.itr = itr; }
+            public boolean hasNext()     { return itr.hasNext(); }
+            public Object next()         { return ((Map.Entry)itr.next()).getKey(); }
+            public void remove()         { itr.remove(); }
+        }
+    }
+
+    class AscendingSubMap extends NavigableSubMap {
+        AscendingSubMap(boolean fromStart, Object fromKey, boolean fromInclusive,
+                        boolean toEnd,     Object toKey,   boolean toInclusive) {
+            super(fromStart, fromKey, fromInclusive, toEnd, toKey, toInclusive);
+        }
+
+        public Comparator comparator() {
+            return comparator;
+        }
+
+        protected TreeMap.Entry first()             { return absLowest(); }
+        protected TreeMap.Entry last()              { return absHighest(); }
+        protected TreeMap.Entry lower(Object key)   { return absLower(key); }
+        protected TreeMap.Entry floor(Object key)   { return absFloor(key); }
+        protected TreeMap.Entry ceiling(Object key) { return absCeiling(key); }
+        protected TreeMap.Entry higher(Object key)  { return absHigher(key); }
+
+        protected TreeMap.Entry uncheckedHigher(TreeMap.Entry e) {
+            return successor(e);
+        }
+
+        public NavigableMap subMap(Object fromKey, boolean fromInclusive,
+                                   Object toKey, boolean toInclusive) {
+            if (!inRange(fromKey, fromInclusive)) {
+                throw new IllegalArgumentException("fromKey out of range");
+            }
+            if (!inRange(toKey, toInclusive)) {
+                throw new IllegalArgumentException("toKey out of range");
+            }
+            return new AscendingSubMap(false, fromKey, fromInclusive,
+                                       false, toKey, toInclusive);
+        }
+
+        public NavigableMap headMap(Object toKey, boolean toInclusive) {
+            if (!inRange(toKey, toInclusive)) {
+                throw new IllegalArgumentException("toKey out of range");
+            }
+            return new AscendingSubMap(fromStart, fromKey, fromInclusive,
+                                       false, toKey, toInclusive);
+        }
+
+        public NavigableMap tailMap(Object fromKey, boolean fromInclusive) {
+            if (!inRange(fromKey, fromInclusive)) {
+                throw new IllegalArgumentException("fromKey out of range");
+            }
+            return new AscendingSubMap(false, fromKey, fromInclusive,
+                                       toEnd, toKey, toInclusive);
+        }
+
+        public NavigableMap descendingMap() {
+            if (descendingMap == null) {
+                descendingMap =
+                    new DescendingSubMap(fromStart, fromKey, fromInclusive,
+                                         toEnd,     toKey,   toInclusive);
+            }
+            return descendingMap;
+        }
+    }
+
+    class DescendingSubMap extends NavigableSubMap {
+        DescendingSubMap(boolean fromStart, Object fromKey, boolean fromInclusive,
+                         boolean toEnd,     Object toKey,   boolean toInclusive) {
+            super(fromStart, fromKey, fromInclusive, toEnd, toKey, toInclusive);
+        }
+
+        public Comparator comparator() { return TreeMap.this.reverseComparator(); }
+
+        protected TreeMap.Entry first()             { return absHighest(); }
+        protected TreeMap.Entry last()              { return absLowest(); }
+        protected TreeMap.Entry lower(Object key)   { return absHigher(key); }
+        protected TreeMap.Entry floor(Object key)   { return absCeiling(key); }
+        protected TreeMap.Entry ceiling(Object key) { return absFloor(key); }
+        protected TreeMap.Entry higher(Object key)  { return absLower(key); }
+
+        protected TreeMap.Entry uncheckedHigher(TreeMap.Entry e) {
+            return predecessor(e);
+        }
+
+        public NavigableMap subMap(Object fromKey, boolean fromInclusive,
+                                   Object toKey,   boolean toInclusive) {
+            if (!inRange(fromKey, fromInclusive)) {
+                throw new IllegalArgumentException("fromKey out of range");
+            }
+            if (!inRange(toKey, toInclusive)) {
+                throw new IllegalArgumentException("toKey out of range");
+            }
+            return new DescendingSubMap(false, toKey, toInclusive,
+                                        false, fromKey, fromInclusive);
+        }
+
+        public NavigableMap headMap(Object toKey, boolean toInclusive) {
+            if (!inRange(toKey, toInclusive)) {
+                throw new IllegalArgumentException("toKey out of range");
+            }
+            return new DescendingSubMap(false, toKey, toInclusive,
+                                        this.toEnd, this.toKey, this.toInclusive);
+        }
+
+        public NavigableMap tailMap(Object fromKey, boolean fromInclusive) {
+            if (!inRange(fromKey, fromInclusive)) {
+                throw new IllegalArgumentException("fromKey out of range");
+            }
+            return new DescendingSubMap(this.fromStart, this.fromKey, this.fromInclusive,
+                                        false, fromKey, fromInclusive);
+        }
+
+        public NavigableMap descendingMap() {
+            if (descendingMap == null) {
+                descendingMap =
+                    new AscendingSubMap(fromStart, fromKey, fromInclusive,
+                                        toEnd,     toKey,   toInclusive);
+
+            }
+            return descendingMap;
+        }
+    }
+
+    // serialization
+
+    static class IteratorIOException extends RuntimeException {
+        IteratorIOException(java.io.IOException e) {
+            super(e);
+        }
+        java.io.IOException getException() {
+            return (java.io.IOException)getCause();
+        }
+    }
+
+    static class IteratorNoClassException extends RuntimeException {
+        IteratorNoClassException(ClassNotFoundException e) {
+            super(e);
+        }
+        ClassNotFoundException getException() {
+            return (ClassNotFoundException)getCause();
+        }
+    }
+
+    static class IOIterator implements Iterator {
+        final java.io.ObjectInputStream ois;
+        int remaining;
+        IOIterator(java.io.ObjectInputStream ois, int remaining) {
+            this.ois = ois;
+            this.remaining = remaining;
+        }
+        public boolean hasNext() {
+            return remaining > 0;
+        }
+        public Object next() {
+            if (remaining <= 0) throw new NoSuchElementException();
+            remaining--;
+            try {
+                return new AbstractMap.SimpleImmutableEntry(ois.readObject(),
+                                                            ois.readObject());
+            }
+            catch (java.io.IOException e) { throw new IteratorIOException(e); }
+            catch (ClassNotFoundException e) { throw new IteratorNoClassException(e); }
+        }
+        public void remove() { throw new UnsupportedOperationException(); }
+    }
+
+    private void writeObject(ObjectOutputStream out) throws IOException {
+        out.defaultWriteObject();
+        out.writeInt(size);
+        for (Entry e = getFirstEntry(); e != null; e = successor(e)) {
+            out.writeObject(e.key);
+            out.writeObject(e.element);
+        }
+    }
+
+    private void readObject(ObjectInputStream in)
+        throws java.io.IOException, ClassNotFoundException
+    {
+        in.defaultReadObject();
+        int size = in.readInt();
+        try {
+            buildFromSorted(new IOIterator(in, size), size);
+        }
+        catch (IteratorIOException e) {
+            throw e.getException();
+        }
+        catch (IteratorNoClassException e) {
+            throw e.getException();
+        }
+    }
+
+    private class SubMap extends AbstractMap implements Serializable, NavigableMap {
+
+        private static final long serialVersionUID = -6520786458950516097L;
+
+        final Object fromKey, toKey;
+
+        SubMap() { fromKey = toKey = null; }
+
+        private Object readResolve() {
+            return new AscendingSubMap(fromKey == null, fromKey, true,
+                                       toKey == null, toKey, false);
+        }
+
+        public Map.Entry lowerEntry(Object key)   { throw new Error(); }
+        public Object lowerKey(Object key)        { throw new Error(); }
+        public Map.Entry floorEntry(Object key)   { throw new Error(); }
+        public Object floorKey(Object key)        { throw new Error(); }
+        public Map.Entry ceilingEntry(Object key) { throw new Error(); }
+        public Object ceilingKey(Object key)      { throw new Error(); }
+        public Map.Entry higherEntry(Object key)  { throw new Error(); }
+        public Object higherKey(Object key)       { throw new Error(); }
+        public Map.Entry firstEntry()             { throw new Error(); }
+        public Map.Entry lastEntry()              { throw new Error(); }
+        public Map.Entry pollFirstEntry()         { throw new Error(); }
+        public Map.Entry pollLastEntry()          { throw new Error(); }
+        public NavigableMap descendingMap()       { throw new Error(); }
+        public NavigableSet navigableKeySet()     { throw new Error(); }
+        public NavigableSet descendingKeySet()    { throw new Error(); }
+        public Set entrySet()                     { throw new Error(); }
+
+        public NavigableMap subMap(Object fromKey, boolean fromInclusive,
+                                   Object toKey, boolean toInclusive) {
+            throw new Error();
+        }
+
+        public NavigableMap headMap(Object toKey, boolean inclusive) {
+            throw new Error();
+        }
+
+        public NavigableMap tailMap(Object fromKey, boolean inclusive) {
+            throw new Error();
+        }
+
+        public SortedMap subMap(Object fromKey, Object toKey) {
+            throw new Error();
+        }
+
+        public SortedMap headMap(Object toKey)     { throw new Error(); }
+        public SortedMap tailMap(Object fromKey)   { throw new Error(); }
+        public Comparator comparator()             { throw new Error(); }
+        public Object firstKey()                   { throw new Error(); }
+        public Object lastKey()                    { throw new Error(); }
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/TreeSet.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/TreeSet.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/TreeSet.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,240 @@
+/*
+ * Written by Dawid Kurzyniec, on the basis of public specifications and
+ * public domain sources from JSR 166 and the Doug Lea's collections package,
+ * and released to the public domain,
+ * as explained at http://creativecommons.org/licenses/publicdomain.
+ */
+
+package edu.emory.mathcs.backport.java.util;
+
+import java.util.AbstractSet;
+import java.util.Iterator;
+import java.util.Comparator;
+import java.util.SortedSet;
+import java.util.Collection;
+import java.io.Serializable;
+import java.util.Map;
+import java.io.ObjectOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.util.NoSuchElementException;
+
+public class TreeSet extends AbstractSet
+                     implements NavigableSet, Cloneable, Serializable {
+
+    private static final long serialVersionUID = -2479143000061671589L;
+    private static final Object PRESENT = new Object();
+
+    private transient NavigableMap map;
+
+    public TreeSet() {
+        map = new TreeMap();
+    }
+
+    public TreeSet(Comparator comparator) {
+        map = new TreeMap(comparator);
+    }
+
+    public TreeSet(Collection c) {
+        map = new TreeMap();
+        addAll(c);
+    }
+
+    public TreeSet(SortedSet s) {
+        map = new TreeMap(s.comparator());
+        addAll(s);
+    }
+
+    private TreeSet(NavigableMap map) {
+        this.map = map;
+    }
+
+    public Object lower(Object e) {
+        return map.lowerKey(e);
+    }
+
+    public Object floor(Object e) {
+        return map.floorKey(e);
+    }
+
+    public Object ceiling(Object e) {
+        return map.ceilingKey(e);
+    }
+
+    public Object higher(Object e) {
+        return map.higherKey(e);
+    }
+
+    public Object pollFirst() {
+        Map.Entry e = map.pollFirstEntry();
+        return (e != null) ? e.getKey() : null;
+    }
+
+    public Object pollLast() {
+        Map.Entry e = map.pollLastEntry();
+        return (e != null) ? e.getKey() : null;
+    }
+
+    public Iterator iterator() {
+        return map.keySet().iterator();
+    }
+
+    public Iterator descendingIterator() {
+        return map.descendingKeySet().iterator();
+    }
+
+    public SortedSet subSet(Object fromElement, Object toElement) {
+        return subSet(fromElement, true, toElement, false);
+    }
+
+    public SortedSet headSet(Object toElement) {
+        return headSet(toElement, false);
+    }
+
+    public SortedSet tailSet(Object fromElement) {
+        return tailSet(fromElement, true);
+    }
+
+    public NavigableSet subSet(Object fromElement, boolean fromInclusive,
+                               Object toElement,   boolean toInclusive) {
+        return new TreeSet(map.subMap(fromElement, fromInclusive,
+                                      toElement,   toInclusive));
+    }
+
+    public NavigableSet headSet(Object toElement, boolean toInclusive) {
+        return new TreeSet(map.headMap(toElement, toInclusive));
+    }
+
+    public NavigableSet tailSet(Object fromElement, boolean fromInclusive) {
+        return new TreeSet(map.tailMap(fromElement, fromInclusive));
+    }
+
+    public NavigableSet descendingSet() {
+        return new TreeSet(map.descendingMap());
+    }
+
+    public Comparator comparator() {
+        return map.comparator();
+    }
+
+    public Object first() {
+        return map.firstKey();
+    }
+
+    public Object last() {
+        return map.lastKey();
+    }
+
+    public int size() {
+        return map.size();
+    }
+
+    public boolean isEmpty() {
+        return map.isEmpty();
+    }
+
+    public boolean contains(Object o) {
+        return map.containsKey(o);
+    }
+
+    public Object[] toArray() {
+        return map.keySet().toArray();
+    }
+
+    public Object[] toArray(Object[] a) {
+        return map.keySet().toArray(a);
+    }
+
+    public boolean add(Object o) {
+        return map.put(o, PRESENT) == null;
+    }
+
+    public boolean remove(Object o) {
+        return map.remove(o) != null;
+    }
+
+    public boolean addAll(Collection c) {
+        if (map.size() == 0 && c.size() > 0 &&
+            c instanceof SortedSet && map instanceof TreeMap &&
+            eq(((SortedSet)c).comparator(), this.comparator()))
+        {
+            ((TreeMap)map).buildFromSorted(new MapIterator(c.iterator()), c.size());
+            return true;
+        }
+        else {
+            return super.addAll(c);
+        }
+    }
+
+    public void clear() {
+        map.clear();
+    }
+
+    private static class MapIterator implements Iterator {
+        final Iterator itr;
+        MapIterator(Iterator itr) { this.itr = itr; }
+        public boolean hasNext() { return itr.hasNext(); }
+        public Object next() {
+            return new AbstractMap.SimpleImmutableEntry(itr.next(), PRESENT);
+        }
+        public void remove() { throw new UnsupportedOperationException(); }
+    }
+
+    public Object clone() {
+        TreeSet clone;
+        try { clone = (TreeSet)super.clone(); }
+        catch (CloneNotSupportedException e) { throw new InternalError(); }
+        // deep-copy
+        clone.map = new TreeMap(map);
+        return clone;
+    }
+
+    private static boolean eq(Object o1, Object o2) {
+        return o1 == null ? o2 == null : o1.equals(o2);
+    }
+
+    static class IOIterator extends TreeMap.IOIterator {
+        IOIterator(ObjectInputStream in, int remaining) {
+            super(in, remaining);
+        }
+        public Object next() {
+            if (remaining <= 0) throw new NoSuchElementException();
+            remaining--;
+            try {
+                return new AbstractMap.SimpleImmutableEntry(ois.readObject(),
+                                                            PRESENT);
+            }
+            catch (IOException e) { throw new TreeMap.IteratorIOException(e); }
+            catch (ClassNotFoundException e) { throw new TreeMap.IteratorNoClassException(e); }
+        }
+        public void remove() { throw new UnsupportedOperationException(); }
+    }
+
+    private void writeObject(ObjectOutputStream out) throws IOException {
+        out.defaultWriteObject();
+        out.writeObject(map.comparator());
+        out.writeInt(map.size());
+        for (Iterator itr = map.keySet().iterator(); itr.hasNext(); ) {
+            out.writeObject(itr.next());
+        }
+    }
+
+    private void readObject(ObjectInputStream in)
+        throws IOException, ClassNotFoundException
+    {
+        in.defaultReadObject();
+        Comparator comparator = (Comparator)in.readObject();
+        TreeMap map = new TreeMap(comparator);
+        int size = in.readInt();
+        try {
+            map.buildFromSorted(new IOIterator(in, size), size);
+            this.map = map;
+        }
+        catch (TreeMap.IteratorIOException e) {
+            throw e.getException();
+        }
+        catch (TreeMap.IteratorNoClassException e) {
+            throw e.getException();
+        }
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/AbstractExecutorService.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/AbstractExecutorService.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/AbstractExecutorService.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,280 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.*;
+import java.util.Collection;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Iterator;
+
+/**
+ * Provides default implementations of {@link ExecutorService}
+ * execution methods. This class implements the <tt>submit</tt>,
+ * <tt>invokeAny</tt> and <tt>invokeAll</tt> methods using a
+ * {@link RunnableFuture} returned by <tt>newTaskFor</tt>, which defaults
+ * to the {@link FutureTask} class provided in this package.  For example,
+ * the implementation of <tt>submit(Runnable)</tt> creates an
+ * associated <tt>RunnableFuture</tt> that is executed and
+ * returned. Subclasses may override the <tt>newTaskFor</tt> methods
+ * to return <tt>RunnableFuture</tt> implementations other than
+ * <tt>FutureTask</tt>.
+ *
+ * <p> <b>Extension example</b>. Here is a sketch of a class
+ * that customizes {@link ThreadPoolExecutor} to use
+ * a <tt>CustomTask</tt> class instead of the default <tt>FutureTask</tt>:
+ * <pre>
+ * public class CustomThreadPoolExecutor extends ThreadPoolExecutor {
+ *
+ *   static class CustomTask&lt;V&gt; implements RunnableFuture&lt;V&gt; {...}
+ *
+ *   protected &lt;V&gt; RunnableFuture&lt;V&gt; newTaskFor(Callable&lt;V&gt; c) {
+ *       return new CustomTask&lt;V&gt;(c);
+ *   }
+ *   protected &lt;V&gt; RunnableFuture&lt;V&gt; newTaskFor(Runnable r, V v) {
+ *       return new CustomTask&lt;V&gt;(r, v);
+ *   }
+ *   // ... add constructors, etc.
+ * }
+ * </pre>
+ * @since 1.5
+ * @author Doug Lea
+ */
+public abstract class AbstractExecutorService implements ExecutorService {
+
+    /**
+     * Returns a <tt>RunnableFuture</tt> for the given runnable and default
+     * value.
+     *
+     * @param runnable the runnable task being wrapped
+     * @param value the default value for the returned future
+     * @return a <tt>RunnableFuture</tt> which when run will run the
+     * underlying runnable and which, as a <tt>Future</tt>, will yield
+     * the given value as its result and provide for cancellation of
+     * the underlying task.
+     * @since 1.6
+     */
+    protected RunnableFuture newTaskFor(Runnable runnable, Object value) {
+        return new FutureTask(runnable, value);
+    }
+
+    /**
+     * Returns a <tt>RunnableFuture</tt> for the given callable task.
+     *
+     * @param callable the callable task being wrapped
+     * @return a <tt>RunnableFuture</tt> which when run will call the
+     * underlying callable and which, as a <tt>Future</tt>, will yield
+     * the callable's result as its result and provide for
+     * cancellation of the underlying task.
+     * @since 1.6
+     */
+    protected RunnableFuture newTaskFor(Callable callable) {
+        return new FutureTask(callable);
+    }
+
+    public Future submit(Runnable task) {
+        if (task == null) throw new NullPointerException();
+        RunnableFuture ftask = newTaskFor(task, null);
+        execute(ftask);
+        return ftask;
+    }
+
+    public Future submit(Runnable task, Object result) {
+        if (task == null) throw new NullPointerException();
+        RunnableFuture ftask = newTaskFor(task, result);
+        execute(ftask);
+        return ftask;
+    }
+
+    public Future submit(Callable task) {
+        if (task == null) throw new NullPointerException();
+        RunnableFuture ftask = newTaskFor(task);
+        execute(ftask);
+        return ftask;
+    }
+
+    /**
+     * the main mechanics of invokeAny.
+     */
+    private Object doInvokeAny(Collection tasks,
+                               boolean timed, long nanos)
+        throws InterruptedException, ExecutionException, TimeoutException {
+        if (tasks == null)
+            throw new NullPointerException();
+        int ntasks = tasks.size();
+        if (ntasks == 0)
+            throw new IllegalArgumentException();
+        List futures= new ArrayList(ntasks);
+        ExecutorCompletionService ecs =
+            new ExecutorCompletionService(this);
+
+        // For efficiency, especially in executors with limited
+        // parallelism, check to see if previously submitted tasks are
+        // done before submitting more of them. This interleaving
+        // plus the exception mechanics account for messiness of main
+        // loop.
+
+        try {
+            // Record exceptions so that if we fail to obtain any
+            // result, we can throw the last exception we got.
+            ExecutionException ee = null;
+            long lastTime = (timed)? Utils.nanoTime() : 0;
+            Iterator it = tasks.iterator();
+
+            // Start one task for sure; the rest incrementally
+            futures.add(ecs.submit((Callable)it.next()));
+            --ntasks;
+            int active = 1;
+
+            for (;;) {
+                Future f = ecs.poll();
+                if (f == null) {
+                    if (ntasks > 0) {
+                        --ntasks;
+                        futures.add(ecs.submit((Callable)it.next()));
+                        ++active;
+                    }
+                    else if (active == 0)
+                        break;
+                    else if (timed) {
+                        f = ecs.poll(nanos, TimeUnit.NANOSECONDS);
+                        if (f == null)
+                            throw new TimeoutException();
+                        long now = Utils.nanoTime();
+                        nanos -= now - lastTime;
+                        lastTime = now;
+                    }
+                    else
+                        f = ecs.take();
+                }
+                if (f != null) {
+                    --active;
+                    try {
+                        return f.get();
+                    } catch (InterruptedException ie) {
+                        throw ie;
+                    } catch (ExecutionException eex) {
+                        ee = eex;
+                    } catch (RuntimeException rex) {
+                        ee = new ExecutionException(rex);
+                    }
+                }
+            }
+
+            if (ee == null)
+                ee = new ExecutionException();
+            throw ee;
+
+        } finally {
+            for (Iterator f = futures.iterator(); f.hasNext();)
+                ((Future)f.next()).cancel(true);
+        }
+    }
+
+    public Object invokeAny(Collection tasks)
+        throws InterruptedException, ExecutionException {
+        try {
+            return doInvokeAny(tasks, false, 0);
+        } catch (TimeoutException cannotHappen) {
+            assert false;
+            return null;
+        }
+    }
+
+    public Object invokeAny(Collection tasks,
+                            long timeout, TimeUnit unit)
+        throws InterruptedException, ExecutionException, TimeoutException {
+        return doInvokeAny(tasks, true, unit.toNanos(timeout));
+    }
+
+    public List invokeAll(Collection tasks) throws InterruptedException {
+        if (tasks == null)
+            throw new NullPointerException();
+        List futures = new ArrayList(tasks.size());
+        boolean done = false;
+        try {
+            for (Iterator t = tasks.iterator(); t.hasNext();) {
+                RunnableFuture f = newTaskFor((Callable)t.next());
+                futures.add(f);
+                execute(f);
+            }
+            for (Iterator i = futures.iterator(); i.hasNext();) {
+                Future f = (Future) i.next();
+                if (!f.isDone()) {
+                    try {
+                        f.get();
+                    } catch (CancellationException ignore) {
+                    } catch (ExecutionException ignore) {
+                    }
+                }
+            }
+            done = true;
+            return futures;
+        } finally {
+            if (!done)
+                for (Iterator i = futures.iterator(); i.hasNext();) {
+                    Future f = (Future) i.next();
+                    f.cancel(true);
+                }
+        }
+    }
+
+    public List invokeAll(Collection tasks,
+                          long timeout, TimeUnit unit)
+        throws InterruptedException {
+        if (tasks == null || unit == null)
+            throw new NullPointerException();
+        long nanos = unit.toNanos(timeout);
+        List futures = new ArrayList(tasks.size());
+        boolean done = false;
+        try {
+            for (Iterator t = tasks.iterator(); t.hasNext();)
+                futures.add(newTaskFor((Callable)t.next()));
+
+            long lastTime = Utils.nanoTime();
+
+            // Interleave time checks and calls to execute in case
+            // executor doesn't have any/much parallelism.
+            Iterator it = futures.iterator();
+            while (it.hasNext()) {
+                execute((Runnable)(it.next()));
+                long now = Utils.nanoTime();
+                nanos -= (now - lastTime);
+                lastTime = now;
+                if (nanos <= 0)
+                    return futures;
+            }
+
+            for (Iterator i = futures.iterator(); i.hasNext();) {
+                Future f = (Future)i.next();
+                if (!f.isDone()) {
+                    if (nanos <= 0)
+                        return futures;
+                    try {
+                        f.get(nanos, TimeUnit.NANOSECONDS);
+                    } catch (CancellationException ignore) {
+                    } catch (ExecutionException ignore) {
+                    } catch (TimeoutException toe) {
+                        return futures;
+                    }
+                    long now = Utils.nanoTime();
+                    nanos -= now - lastTime;
+                    lastTime = now;
+                }
+            }
+            done = true;
+            return futures;
+        } finally {
+            if (!done)
+                for (Iterator i = futures.iterator(); i.hasNext();) {
+                    Future f = (Future) i.next();
+                    f.cancel(true);
+                }
+        }
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ArrayBlockingQueue.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ArrayBlockingQueue.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ArrayBlockingQueue.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,783 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+import edu.emory.mathcs.backport.java.util.AbstractQueue;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.*;
+
+/**
+ * A bounded {@linkplain BlockingQueue blocking queue} backed by an
+ * array.  This queue orders elements FIFO (first-in-first-out).  The
+ * <em>head</em> of the queue is that element that has been on the
+ * queue the longest time.  The <em>tail</em> of the queue is that
+ * element that has been on the queue the shortest time. New elements
+ * are inserted at the tail of the queue, and the queue retrieval
+ * operations obtain elements at the head of the queue.
+ *
+ * <p>This is a classic &quot;bounded buffer&quot;, in which a
+ * fixed-sized array holds elements inserted by producers and
+ * extracted by consumers.  Once created, the capacity cannot be
+ * increased.  Attempts to <tt>put</tt> an element into a full queue
+ * will result in the operation blocking; attempts to <tt>take</tt> an
+ * element from an empty queue will similarly block.
+ *
+ * <p> This class supports an optional fairness policy for ordering
+ * waiting producer and consumer threads.  By default, this ordering
+ * is not guaranteed. However, a queue constructed with fairness set
+ * to <tt>true</tt> grants threads access in FIFO order. Fairness
+ * generally decreases throughput but reduces variability and avoids
+ * starvation.
+ *
+ * <p>This class and its iterator implement all of the
+ * <em>optional</em> methods of the {@link Collection} and {@link
+ * Iterator} interfaces.
+ *
+ * <p>This class is a member of the
+ * <a href="{@docRoot}/../guide/collections/index.html">
+ * Java Collections Framework</a>.
+ *
+ * @since 1.5
+ * @author Doug Lea
+ */
+public class ArrayBlockingQueue extends AbstractQueue
+        implements BlockingQueue, java.io.Serializable {
+
+    /**
+     * Serialization ID. This class relies on default serialization
+     * even for the items array, which is default-serialized, even if
+     * it is empty. Otherwise it could not be declared final, which is
+     * necessary here.
+     */
+    private static final long serialVersionUID = -817911632652898426L;
+
+    /** The queued items  */
+    private final Object[] items;
+    /** items index for next take, poll or remove */
+    private transient int takeIndex;
+    /** items index for next put, offer, or add. */
+    private transient int putIndex;
+    /** Number of items in the queue */
+    private int count;
+
+    /*
+     * Concurrency control uses the classic two-condition algorithm
+     * found in any textbook.
+     */
+
+    /** Main lock guarding all access */
+    private final ReentrantLock lock;
+    /** Condition for waiting takes */
+    private final Condition notEmpty;
+    /** Condition for waiting puts */
+    private final Condition notFull;
+
+    // Internal helper methods
+
+    /**
+     * Circularly increment i.
+     */
+    final int inc(int i) {
+        return (++i == items.length)? 0 : i;
+    }
+
+    /**
+     * Inserts element at current put position, advances, and signals.
+     * Call only when holding lock.
+     */
+    private void insert(Object x) {
+        items[putIndex] = x;
+        putIndex = inc(putIndex);
+        ++count;
+        notEmpty.signal();
+    }
+
+    /**
+     * Extracts element at current take position, advances, and signals.
+     * Call only when holding lock.
+     */
+    private Object extract() {
+        final Object[] items = this.items;
+        Object x = items[takeIndex];
+        items[takeIndex] = null;
+        takeIndex = inc(takeIndex);
+        --count;
+        notFull.signal();
+        return x;
+    }
+
+    /**
+     * Utility for remove and iterator.remove: Delete item at position i.
+     * Call only when holding lock.
+     */
+    void removeAt(int i) {
+        final Object[] items = this.items;
+        // if removing front item, just advance
+        if (i == takeIndex) {
+            items[takeIndex] = null;
+            takeIndex = inc(takeIndex);
+        } else {
+            // slide over all others up through putIndex.
+            for (;;) {
+                int nexti = inc(i);
+                if (nexti != putIndex) {
+                    items[i] = items[nexti];
+                    i = nexti;
+                } else {
+                    items[i] = null;
+                    putIndex = i;
+                    break;
+                }
+            }
+        }
+        --count;
+        notFull.signal();
+    }
+
+    /**
+     * Creates an <tt>ArrayBlockingQueue</tt> with the given (fixed)
+     * capacity and default access policy.
+     * @param capacity the capacity of this queue
+     * @throws IllegalArgumentException if <tt>capacity</tt> is less than 1
+     */
+    public ArrayBlockingQueue(int capacity) {
+        this(capacity, false);
+    }
+
+    /**
+     * Creates an <tt>ArrayBlockingQueue</tt> with the given (fixed)
+     * capacity and the specified access policy.
+     * @param capacity the capacity of this queue
+     * @param fair if <tt>true</tt> then queue accesses for threads blocked
+     *        on insertion or removal, are processed in FIFO order;
+     *        if <tt>false</tt> the access order is unspecified.
+     * @throws IllegalArgumentException if <tt>capacity</tt> is less than 1
+     */
+    public ArrayBlockingQueue(int capacity, boolean fair) {
+        if (capacity <= 0)
+            throw new IllegalArgumentException();
+        this.items = new Object[capacity];
+        lock = new ReentrantLock(fair);
+        notEmpty = lock.newCondition();
+        notFull =  lock.newCondition();
+    }
+
+    /**
+     * Creates an <tt>ArrayBlockingQueue</tt> with the given (fixed)
+     * capacity, the specified access policy and initially containing the
+     * elements of the given collection,
+     * added in traversal order of the collection's iterator.
+     * @param capacity the capacity of this queue
+     * @param fair if <tt>true</tt> then queue accesses for threads blocked
+     *        on insertion or removal, are processed in FIFO order;
+     *        if <tt>false</tt> the access order is unspecified.
+     * @param c the collection of elements to initially contain
+     * @throws IllegalArgumentException if <tt>capacity</tt> is less than
+     *         <tt>c.size()</tt>, or less than 1.
+     * @throws NullPointerException if the specified collection or any
+     *         of its elements are null
+     */
+    public ArrayBlockingQueue(int capacity, boolean fair,
+                              Collection c) {
+        this(capacity, fair);
+        if (capacity < c.size())
+            throw new IllegalArgumentException();
+
+        for (Iterator it = c.iterator(); it.hasNext();)
+            add(it.next());
+    }
+
+    /**
+     * Inserts the specified element at the tail of this queue if it is
+     * possible to do so immediately without exceeding the queue's capacity,
+     * returning <tt>true</tt> upon success and throwing an
+     * <tt>IllegalStateException</tt> if this queue is full.
+     *
+     * @param e the element to add
+     * @return <tt>true</tt> (as specified by {@link Collection#add})
+     * @throws IllegalStateException if this queue is full
+     * @throws NullPointerException if the specified element is null
+     */
+    public boolean add(Object e) {
+        return super.add(e);
+    }
+
+    /**
+     * Inserts the specified element at the tail of this queue if it is
+     * possible to do so immediately without exceeding the queue's capacity,
+     * returning <tt>true</tt> upon success and <tt>false</tt> if this queue
+     * is full.  This method is generally preferable to method {@link #add},
+     * which can fail to insert an element only by throwing an exception.
+     *
+     * @throws NullPointerException if the specified element is null
+     */
+    public boolean offer(Object e) {
+        if (e == null) throw new NullPointerException();
+        final ReentrantLock lock = this.lock;
+        lock.lock();
+        try {
+            if (count == items.length)
+                return false;
+            else {
+                insert(e);
+                return true;
+            }
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * Inserts the specified element at the tail of this queue, waiting
+     * for space to become available if the queue is full.
+     *
+     * @throws InterruptedException {@inheritDoc}
+     * @throws NullPointerException {@inheritDoc}
+     */
+    public void put(Object e) throws InterruptedException {
+        if (e == null) throw new NullPointerException();
+        final Object[] items = this.items;
+        final ReentrantLock lock = this.lock;
+        lock.lockInterruptibly();
+        try {
+            try {
+                while (count == items.length)
+                    notFull.await();
+            } catch (InterruptedException ie) {
+                notFull.signal(); // propagate to non-interrupted thread
+                throw ie;
+            }
+            insert(e);
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * Inserts the specified element at the tail of this queue, waiting
+     * up to the specified wait time for space to become available if
+     * the queue is full.
+     *
+     * @throws InterruptedException {@inheritDoc}
+     * @throws NullPointerException {@inheritDoc}
+     */
+    public boolean offer(Object e, long timeout, TimeUnit unit)
+        throws InterruptedException {
+
+        if (e == null) throw new NullPointerException();
+        long nanos = unit.toNanos(timeout);
+        final ReentrantLock lock = this.lock;
+        lock.lockInterruptibly();
+        try {
+            long deadline = Utils.nanoTime() + nanos;
+            for (;;) {
+                if (count != items.length) {
+                    insert(e);
+                    return true;
+                }
+                if (nanos <= 0)
+                    return false;
+                try {
+                    notFull.await(nanos, TimeUnit.NANOSECONDS);
+                    nanos = deadline - Utils.nanoTime();
+                } catch (InterruptedException ie) {
+                    notFull.signal(); // propagate to non-interrupted thread
+                    throw ie;
+                }
+            }
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    public Object poll() {
+        final ReentrantLock lock = this.lock;
+        lock.lock();
+        try {
+            if (count == 0)
+                return null;
+            Object x = extract();
+            return x;
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    public Object take() throws InterruptedException {
+        final ReentrantLock lock = this.lock;
+        lock.lockInterruptibly();
+        try {
+            try {
+                while (count == 0)
+                    notEmpty.await();
+            } catch (InterruptedException ie) {
+                notEmpty.signal(); // propagate to non-interrupted thread
+                throw ie;
+            }
+            Object x = extract();
+            return x;
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    public Object poll(long timeout, TimeUnit unit) throws InterruptedException {
+        long nanos = unit.toNanos(timeout);
+        final ReentrantLock lock = this.lock;
+        lock.lockInterruptibly();
+        try {
+            long deadline = Utils.nanoTime() + nanos;
+            for (;;) {
+                if (count != 0) {
+                    Object x = extract();
+                    return x;
+                }
+                if (nanos <= 0)
+                    return null;
+                try {
+                    notEmpty.await(nanos, TimeUnit.NANOSECONDS);
+                    nanos = deadline - Utils.nanoTime();
+                } catch (InterruptedException ie) {
+                    notEmpty.signal(); // propagate to non-interrupted thread
+                    throw ie;
+                }
+
+            }
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    public Object peek() {
+        final ReentrantLock lock = this.lock;
+        lock.lock();
+        try {
+            return (count == 0) ? null : items[takeIndex];
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    // this doc comment is overridden to remove the reference to collections
+    // greater in size than Integer.MAX_VALUE
+    /**
+     * Returns the number of elements in this queue.
+     *
+     * @return the number of elements in this queue
+     */
+    public int size() {
+        final ReentrantLock lock = this.lock;
+        lock.lock();
+        try {
+            return count;
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    // this doc comment is a modified copy of the inherited doc comment,
+    // without the reference to unlimited queues.
+    /**
+     * Returns the number of additional elements that this queue can ideally
+     * (in the absence of memory or resource constraints) accept without
+     * blocking. This is always equal to the initial capacity of this queue
+     * less the current <tt>size</tt> of this queue.
+     *
+     * <p>Note that you <em>cannot</em> always tell if an attempt to insert
+     * an element will succeed by inspecting <tt>remainingCapacity</tt>
+     * because it may be the case that another thread is about to
+     * insert or remove an element.
+     */
+    public int remainingCapacity() {
+        final ReentrantLock lock = this.lock;
+        lock.lock();
+        try {
+            return items.length - count;
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * Removes a single instance of the specified element from this queue,
+     * if it is present.  More formally, removes an element <tt>e</tt> such
+     * that <tt>o.equals(e)</tt>, if this queue contains one or more such
+     * elements.
+     * Returns <tt>true</tt> if this queue contained the specified element
+     * (or equivalently, if this queue changed as a result of the call).
+     *
+     * @param o element to be removed from this queue, if present
+     * @return <tt>true</tt> if this queue changed as a result of the call
+     */
+    public boolean remove(Object o) {
+        if (o == null) return false;
+        final Object[] items = this.items;
+        final ReentrantLock lock = this.lock;
+        lock.lock();
+        try {
+            int i = takeIndex;
+            int k = 0;
+            for (;;) {
+                if (k++ >= count)
+                    return false;
+                if (o.equals(items[i])) {
+                    removeAt(i);
+                    return true;
+                }
+                i = inc(i);
+            }
+
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * Returns <tt>true</tt> if this queue contains the specified element.
+     * More formally, returns <tt>true</tt> if and only if this queue contains
+     * at least one element <tt>e</tt> such that <tt>o.equals(e)</tt>.
+     *
+     * @param o object to be checked for containment in this queue
+     * @return <tt>true</tt> if this queue contains the specified element
+     */
+    public boolean contains(Object o) {
+        if (o == null) return false;
+        final Object[] items = this.items;
+        final ReentrantLock lock = this.lock;
+        lock.lock();
+        try {
+            int i = takeIndex;
+            int k = 0;
+            while (k++ < count) {
+                if (o.equals(items[i]))
+                    return true;
+                i = inc(i);
+            }
+            return false;
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * Returns an array containing all of the elements in this queue, in
+     * proper sequence.
+     *
+     * <p>The returned array will be "safe" in that no references to it are
+     * maintained by this queue.  (In other words, this method must allocate
+     * a new array).  The caller is thus free to modify the returned array.
+     *
+     * <p>This method acts as bridge between array-based and collection-based
+     * APIs.
+     *
+     * @return an array containing all of the elements in this queue
+     */
+    public Object[] toArray() {
+        final Object[] items = this.items;
+        final ReentrantLock lock = this.lock;
+        lock.lock();
+        try {
+            Object[] a = new Object[count];
+            int k = 0;
+            int i = takeIndex;
+            while (k < count) {
+                a[k++] = items[i];
+                i = inc(i);
+            }
+            return a;
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * Returns an array containing all of the elements in this queue, in
+     * proper sequence; the runtime type of the returned array is that of
+     * the specified array.  If the queue fits in the specified array, it
+     * is returned therein.  Otherwise, a new array is allocated with the
+     * runtime type of the specified array and the size of this queue.
+     *
+     * <p>If this queue fits in the specified array with room to spare
+     * (i.e., the array has more elements than this queue), the element in
+     * the array immediately following the end of the queue is set to
+     * <tt>null</tt>.
+     *
+     * <p>Like the {@link #toArray()} method, this method acts as bridge between
+     * array-based and collection-based APIs.  Further, this method allows
+     * precise control over the runtime type of the output array, and may,
+     * under certain circumstances, be used to save allocation costs.
+     *
+     * <p>Suppose <tt>x</tt> is a queue known to contain only strings.
+     * The following code can be used to dump the queue into a newly
+     * allocated array of <tt>String</tt>:
+     *
+     * <pre>
+     *     String[] y = x.toArray(new String[0]);</pre>
+     *
+     * Note that <tt>toArray(new Object[0])</tt> is identical in function to
+     * <tt>toArray()</tt>.
+     *
+     * @param a the array into which the elements of the queue are to
+     *          be stored, if it is big enough; otherwise, a new array of the
+     *          same runtime type is allocated for this purpose
+     * @return an array containing all of the elements in this queue
+     * @throws ArrayStoreException if the runtime type of the specified array
+     *         is not a supertype of the runtime type of every element in
+     *         this queue
+     * @throws NullPointerException if the specified array is null
+     */
+    public Object[] toArray(Object[] a) {
+        final Object[] items = this.items;
+        final ReentrantLock lock = this.lock;
+        lock.lock();
+        try {
+            if (a.length < count)
+                a = (Object[])java.lang.reflect.Array.newInstance(
+                    a.getClass().getComponentType(),
+                    count
+                    );
+
+            int k = 0;
+            int i = takeIndex;
+            while (k < count) {
+                a[k++] = (Object)items[i];
+                i = inc(i);
+            }
+            if (a.length > count)
+                a[count] = null;
+            return a;
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    public String toString() {
+        final ReentrantLock lock = this.lock;
+        lock.lock();
+        try {
+            return super.toString();
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * Atomically removes all of the elements from this queue.
+     * The queue will be empty after this call returns.
+     */
+    public void clear() {
+        final Object[] items = this.items;
+        final ReentrantLock lock = this.lock;
+        lock.lock();
+        try {
+            int i = takeIndex;
+            int k = count;
+            while (k-- > 0) {
+                items[i] = null;
+                i = inc(i);
+            }
+            count = 0;
+            putIndex = 0;
+            takeIndex = 0;
+            notFull.signalAll();
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * @throws UnsupportedOperationException {@inheritDoc}
+     * @throws ClassCastException            {@inheritDoc}
+     * @throws NullPointerException          {@inheritDoc}
+     * @throws IllegalArgumentException      {@inheritDoc}
+     */
+    public int drainTo(Collection c) {
+        if (c == null)
+            throw new NullPointerException();
+        if (c == this)
+            throw new IllegalArgumentException();
+        final Object[] items = this.items;
+        final ReentrantLock lock = this.lock;
+        lock.lock();
+        try {
+            int i = takeIndex;
+            int n = 0;
+            int max = count;
+            while (n < max) {
+                c.add(items[i]);
+                items[i] = null;
+                i = inc(i);
+                ++n;
+            }
+            if (n > 0) {
+                count = 0;
+                putIndex = 0;
+                takeIndex = 0;
+                notFull.signalAll();
+            }
+            return n;
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * @throws UnsupportedOperationException {@inheritDoc}
+     * @throws ClassCastException            {@inheritDoc}
+     * @throws NullPointerException          {@inheritDoc}
+     * @throws IllegalArgumentException      {@inheritDoc}
+     */
+    public int drainTo(Collection c, int maxElements) {
+        if (c == null)
+            throw new NullPointerException();
+        if (c == this)
+            throw new IllegalArgumentException();
+        if (maxElements <= 0)
+            return 0;
+        final Object[] items = this.items;
+        final ReentrantLock lock = this.lock;
+        lock.lock();
+        try {
+            int i = takeIndex;
+            int n = 0;
+            int sz = count;
+            int max = (maxElements < count)? maxElements : count;
+            while (n < max) {
+                c.add(items[i]);
+                items[i] = null;
+                i = inc(i);
+                ++n;
+            }
+            if (n > 0) {
+                count -= n;
+                takeIndex = i;
+                notFull.signalAll();
+            }
+            return n;
+        } finally {
+            lock.unlock();
+        }
+    }
+
+
+    /**
+     * Returns an iterator over the elements in this queue in proper sequence.
+     * The returned <tt>Iterator</tt> is a "weakly consistent" iterator that
+     * will never throw {@link java.util.ConcurrentModificationException},
+     * and guarantees to traverse elements as they existed upon
+     * construction of the iterator, and may (but is not guaranteed to)
+     * reflect any modifications subsequent to construction.
+     *
+     * @return an iterator over the elements in this queue in proper sequence
+     */
+    public Iterator iterator() {
+        final ReentrantLock lock = this.lock;
+        lock.lock();
+        try {
+            return new Itr();
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * Iterator for ArrayBlockingQueue
+     */
+    private class Itr implements Iterator {
+        /**
+         * Index of element to be returned by next,
+         * or a negative number if no such.
+         */
+        private int nextIndex;
+
+        /**
+         * nextItem holds on to item fields because once we claim
+         * that an element exists in hasNext(), we must return it in
+         * the following next() call even if it was in the process of
+         * being removed when hasNext() was called.
+         */
+        private Object nextItem;
+
+        /**
+         * Index of element returned by most recent call to next.
+         * Reset to -1 if this element is deleted by a call to remove.
+         */
+        private int lastRet;
+
+        Itr() {
+            lastRet = -1;
+            if (count == 0)
+                nextIndex = -1;
+            else {
+                nextIndex = takeIndex;
+                nextItem = items[takeIndex];
+            }
+        }
+
+        public boolean hasNext() {
+            /*
+             * No sync. We can return true by mistake here
+             * only if this iterator passed across threads,
+             * which we don't support anyway.
+             */
+            return nextIndex >= 0;
+        }
+
+        /**
+         * Checks whether nextIndex is valid; if so setting nextItem.
+         * Stops iterator when either hits putIndex or sees null item.
+         */
+        private void checkNext() {
+            if (nextIndex == putIndex) {
+                nextIndex = -1;
+                nextItem = null;
+            } else {
+                nextItem = items[nextIndex];
+                if (nextItem == null)
+                    nextIndex = -1;
+            }
+        }
+
+        public Object next() {
+            final ReentrantLock lock = ArrayBlockingQueue.this.lock;
+            lock.lock();
+            try {
+                if (nextIndex < 0)
+                    throw new NoSuchElementException();
+                lastRet = nextIndex;
+                Object x = nextItem;
+                nextIndex = inc(nextIndex);
+                checkNext();
+                return x;
+            } finally {
+                lock.unlock();
+            }
+        }
+
+        public void remove() {
+            final ReentrantLock lock = ArrayBlockingQueue.this.lock;
+            lock.lock();
+            try {
+                int i = lastRet;
+                if (i == -1)
+                    throw new IllegalStateException();
+                lastRet = -1;
+
+                int ti = takeIndex;
+                removeAt(i);
+                // back up cursor (reset to front if was first element)
+                nextIndex = (i == ti) ? takeIndex : i;
+                checkNext();
+            } finally {
+                lock.unlock();
+            }
+        }
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/BlockingDeque.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/BlockingDeque.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/BlockingDeque.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,614 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+
+import java.util.Iterator;
+import edu.emory.mathcs.backport.java.util.*;
+
+/**
+ * A {@link Deque} that additionally supports blocking operations that wait
+ * for the deque to become non-empty when retrieving an element, and wait for
+ * space to become available in the deque when storing an element.
+ *
+ * <p><tt>BlockingDeque</tt> methods come in four forms, with different ways
+ * of handling operations that cannot be satisfied immediately, but may be
+ * satisfied at some point in the future:
+ * one throws an exception, the second returns a special value (either
+ * <tt>null</tt> or <tt>false</tt>, depending on the operation), the third
+ * blocks the current thread indefinitely until the operation can succeed,
+ * and the fourth blocks for only a given maximum time limit before giving
+ * up.  These methods are summarized in the following table:
+ *
+ * <p>
+ * <table BORDER CELLPADDING=3 CELLSPACING=1>
+ *  <tr>
+ *    <td ALIGN=CENTER COLSPAN = 5> <b>First Element (Head)</b></td>
+ *  </tr>
+ *  <tr>
+ *    <td></td>
+ *    <td ALIGN=CENTER><em>Throws exception</em></td>
+ *    <td ALIGN=CENTER><em>Special value</em></td>
+ *    <td ALIGN=CENTER><em>Blocks</em></td>
+ *    <td ALIGN=CENTER><em>Times out</em></td>
+ *  </tr>
+ *  <tr>
+ *    <td><b>Insert</b></td>
+ *    <td>{@link #addFirst addFirst(e)}</td>
+ *    <td>{@link #offerFirst(Object) offerFirst(e)}</td>
+ *    <td>{@link #putFirst putFirst(e)}</td>
+ *    <td>{@link #offerFirst(Object, long, TimeUnit) offerFirst(e, time, unit)}</td>
+ *  </tr>
+ *  <tr>
+ *    <td><b>Remove</b></td>
+ *    <td>{@link #removeFirst removeFirst()}</td>
+ *    <td>{@link #pollFirst pollFirst()}</td>
+ *    <td>{@link #takeFirst takeFirst()}</td>
+ *    <td>{@link #pollFirst(long, TimeUnit) pollFirst(time, unit)}</td>
+ *  </tr>
+ *  <tr>
+ *    <td><b>Examine</b></td>
+ *    <td>{@link #getFirst getFirst()}</td>
+ *    <td>{@link #peekFirst peekFirst()}</td>
+ *    <td><em>not applicable</em></td>
+ *    <td><em>not applicable</em></td>
+ *  </tr>
+ *  <tr>
+ *    <td ALIGN=CENTER COLSPAN = 5> <b>Last Element (Tail)</b></td>
+ *  </tr>
+ *  <tr>
+ *    <td></td>
+ *    <td ALIGN=CENTER><em>Throws exception</em></td>
+ *    <td ALIGN=CENTER><em>Special value</em></td>
+ *    <td ALIGN=CENTER><em>Blocks</em></td>
+ *    <td ALIGN=CENTER><em>Times out</em></td>
+ *  </tr>
+ *  <tr>
+ *    <td><b>Insert</b></td>
+ *    <td>{@link #addLast addLast(e)}</td>
+ *    <td>{@link #offerLast(Object) offerLast(e)}</td>
+ *    <td>{@link #putLast putLast(e)}</td>
+ *    <td>{@link #offerLast(Object, long, TimeUnit) offerLast(e, time, unit)}</td>
+ *  </tr>
+ *  <tr>
+ *    <td><b>Remove</b></td>
+ *    <td>{@link #removeLast() removeLast()}</td>
+ *    <td>{@link #pollLast() pollLast()}</td>
+ *    <td>{@link #takeLast takeLast()}</td>
+ *    <td>{@link #pollLast(long, TimeUnit) pollLast(time, unit)}</td>
+ *  </tr>
+ *  <tr>
+ *    <td><b>Examine</b></td>
+ *    <td>{@link #getLast getLast()}</td>
+ *    <td>{@link #peekLast peekLast()}</td>
+ *    <td><em>not applicable</em></td>
+ *    <td><em>not applicable</em></td>
+ *  </tr>
+ * </table>
+ *
+ * <p>Like any {@link BlockingQueue}, a <tt>BlockingDeque</tt> is thread safe,
+ * does not permit null elements, and may (or may not) be
+ * capacity-constrained.
+ *
+ * <p>A <tt>BlockingDeque</tt> implementation may be used directly as a FIFO
+ * <tt>BlockingQueue</tt>. The methods inherited from the
+ * <tt>BlockingQueue</tt> interface are precisely equivalent to
+ * <tt>BlockingDeque</tt> methods as indicated in the following table:
+ *
+ * <p>
+ * <table BORDER CELLPADDING=3 CELLSPACING=1>
+ *  <tr>
+ *    <td ALIGN=CENTER> <b><tt>BlockingQueue</tt> Method</b></td>
+ *    <td ALIGN=CENTER> <b>Equivalent <tt>BlockingDeque</tt> Method</b></td>
+ *  </tr>
+ *  <tr>
+ *    <td ALIGN=CENTER COLSPAN = 2> <b>Insert</b></td>
+ *  </tr>
+ *  <tr>
+ *    <td>{@link #add(Object) add(e)}</td>
+ *    <td>{@link #addLast(Object) addLast(e)}</td>
+ *  </tr>
+ *  <tr>
+ *    <td>{@link #offer(Object) offer(e)}</td>
+ *    <td>{@link #offerLast(Object) offerLast(e)}</td>
+ *  </tr>
+ *  <tr>
+ *    <td>{@link #put(Object) put(e)}</td>
+ *    <td>{@link #putLast(Object) putLast(e)}</td>
+ *  </tr>
+ *  <tr>
+ *    <td>{@link #offer(Object, long, TimeUnit) offer(e, time, unit)}</td>
+ *    <td>{@link #offerLast(Object, long, TimeUnit) offerLast(e, time, unit)}</td>
+ *  </tr>
+ *  <tr>
+ *    <td ALIGN=CENTER COLSPAN = 2> <b>Remove</b></td>
+ *  </tr>
+ *  <tr>
+ *    <td>{@link #remove() remove()}</td>
+ *    <td>{@link #removeFirst() removeFirst()}</td>
+ *  </tr>
+ *  <tr>
+ *    <td>{@link #poll() poll()}</td>
+ *    <td>{@link #pollFirst() pollFirst()}</td>
+ *  </tr>
+ *  <tr>
+ *    <td>{@link #take() take()}</td>
+ *    <td>{@link #takeFirst() takeFirst()}</td>
+ *  </tr>
+ *  <tr>
+ *    <td>{@link #poll(long, TimeUnit) poll(time, unit)}</td>
+ *    <td>{@link #pollFirst(long, TimeUnit) pollFirst(time, unit)}</td>
+ *  </tr>
+ *  <tr>
+ *    <td ALIGN=CENTER COLSPAN = 2> <b>Examine</b></td>
+ *  </tr>
+ *  <tr>
+ *    <td>{@link #element() element()}</td>
+ *    <td>{@link #getFirst() getFirst()}</td>
+ *  </tr>
+ *  <tr>
+ *    <td>{@link #peek() peek()}</td>
+ *    <td>{@link #peekFirst() peekFirst()}</td>
+ *  </tr>
+ * </table>
+ *
+ * <p>Memory consistency effects: As with other concurrent
+ * collections, actions in a thread prior to placing an object into a
+ * {@code BlockingDeque}
+ * <a href="package-summary.html#MemoryVisibility"><i>happen-before</i></a>
+ * actions subsequent to the access or removal of that element from
+ * the {@code BlockingDeque} in another thread.
+ *
+ * <p>This interface is a member of the
+ * <a href="{@docRoot}/../guide/collections/index.html">
+ * Java Collections Framework</a>.
+ *
+ * @since 1.6
+ * @author Doug Lea
+ */
+public interface BlockingDeque extends BlockingQueue, Deque {
+    /*
+     * We have "diamond" multiple interface inheritance here, and that
+     * introduces ambiguities.  Methods might end up with different
+     * specs depending on the branch chosen by javadoc.  Thus a lot of
+     * methods specs here are copied from superinterfaces.
+     */
+
+    /**
+     * Inserts the specified element at the front of this deque if it is
+     * possible to do so immediately without violating capacity restrictions,
+     * throwing an <tt>IllegalStateException</tt> if no space is currently
+     * available.  When using a capacity-restricted deque, it is generally
+     * preferable to use {@link #offerFirst(Object) offerFirst}.
+     *
+     * @param e the element to add
+     * @throws IllegalStateException {@inheritDoc}
+     * @throws ClassCastException {@inheritDoc}
+     * @throws NullPointerException if the specified element is null
+     * @throws IllegalArgumentException {@inheritDoc}
+     */
+    void addFirst(Object e);
+
+    /**
+     * Inserts the specified element at the end of this deque if it is
+     * possible to do so immediately without violating capacity restrictions,
+     * throwing an <tt>IllegalStateException</tt> if no space is currently
+     * available.  When using a capacity-restricted deque, it is generally
+     * preferable to use {@link #offerLast(Object) offerLast}.
+     *
+     * @param e the element to add
+     * @throws IllegalStateException {@inheritDoc}
+     * @throws ClassCastException {@inheritDoc}
+     * @throws NullPointerException if the specified element is null
+     * @throws IllegalArgumentException {@inheritDoc}
+     */
+    void addLast(Object e);
+
+    /**
+     * Inserts the specified element at the front of this deque if it is
+     * possible to do so immediately without violating capacity restrictions,
+     * returning <tt>true</tt> upon success and <tt>false</tt> if no space is
+     * currently available.
+     * When using a capacity-restricted deque, this method is generally
+     * preferable to the {@link #addFirst(Object) addFirst} method, which can
+     * fail to insert an element only by throwing an exception.
+     *
+     * @param e the element to add
+     * @throws ClassCastException {@inheritDoc}
+     * @throws NullPointerException if the specified element is null
+     * @throws IllegalArgumentException {@inheritDoc}
+     */
+    boolean offerFirst(Object e);
+
+    /**
+     * Inserts the specified element at the end of this deque if it is
+     * possible to do so immediately without violating capacity restrictions,
+     * returning <tt>true</tt> upon success and <tt>false</tt> if no space is
+     * currently available.
+     * When using a capacity-restricted deque, this method is generally
+     * preferable to the {@link #addLast(Object) addLast} method, which can
+     * fail to insert an element only by throwing an exception.
+     *
+     * @param e the element to add
+     * @throws ClassCastException {@inheritDoc}
+     * @throws NullPointerException if the specified element is null
+     * @throws IllegalArgumentException {@inheritDoc}
+     */
+    boolean offerLast(Object e);
+
+    /**
+     * Inserts the specified element at the front of this deque,
+     * waiting if necessary for space to become available.
+     *
+     * @param e the element to add
+     * @throws InterruptedException if interrupted while waiting
+     * @throws ClassCastException if the class of the specified element
+     *         prevents it from being added to this deque
+     * @throws NullPointerException if the specified element is null
+     * @throws IllegalArgumentException if some property of the specified
+     *         element prevents it from being added to this deque
+     */
+    void putFirst(Object e) throws InterruptedException;
+
+    /**
+     * Inserts the specified element at the end of this deque,
+     * waiting if necessary for space to become available.
+     *
+     * @param e the element to add
+     * @throws InterruptedException if interrupted while waiting
+     * @throws ClassCastException if the class of the specified element
+     *         prevents it from being added to this deque
+     * @throws NullPointerException if the specified element is null
+     * @throws IllegalArgumentException if some property of the specified
+     *         element prevents it from being added to this deque
+     */
+    void putLast(Object e) throws InterruptedException;
+
+    /**
+     * Inserts the specified element at the front of this deque,
+     * waiting up to the specified wait time if necessary for space to
+     * become available.
+     *
+     * @param e the element to add
+     * @param timeout how long to wait before giving up, in units of
+     *        <tt>unit</tt>
+     * @param unit a <tt>TimeUnit</tt> determining how to interpret the
+     *        <tt>timeout</tt> parameter
+     * @return <tt>true</tt> if successful, or <tt>false</tt> if
+     *         the specified waiting time elapses before space is available
+     * @throws InterruptedException if interrupted while waiting
+     * @throws ClassCastException if the class of the specified element
+     *         prevents it from being added to this deque
+     * @throws NullPointerException if the specified element is null
+     * @throws IllegalArgumentException if some property of the specified
+     *         element prevents it from being added to this deque
+     */
+    boolean offerFirst(Object e, long timeout, TimeUnit unit)
+        throws InterruptedException;
+
+    /**
+     * Inserts the specified element at the end of this deque,
+     * waiting up to the specified wait time if necessary for space to
+     * become available.
+     *
+     * @param e the element to add
+     * @param timeout how long to wait before giving up, in units of
+     *        <tt>unit</tt>
+     * @param unit a <tt>TimeUnit</tt> determining how to interpret the
+     *        <tt>timeout</tt> parameter
+     * @return <tt>true</tt> if successful, or <tt>false</tt> if
+     *         the specified waiting time elapses before space is available
+     * @throws InterruptedException if interrupted while waiting
+     * @throws ClassCastException if the class of the specified element
+     *         prevents it from being added to this deque
+     * @throws NullPointerException if the specified element is null
+     * @throws IllegalArgumentException if some property of the specified
+     *         element prevents it from being added to this deque
+     */
+    boolean offerLast(Object e, long timeout, TimeUnit unit)
+        throws InterruptedException;
+
+    /**
+     * Retrieves and removes the first element of this deque, waiting
+     * if necessary until an element becomes available.
+     *
+     * @return the head of this deque
+     * @throws InterruptedException if interrupted while waiting
+     */
+    Object takeFirst() throws InterruptedException;
+
+    /**
+     * Retrieves and removes the last element of this deque, waiting
+     * if necessary until an element becomes available.
+     *
+     * @return the tail of this deque
+     * @throws InterruptedException if interrupted while waiting
+     */
+    Object takeLast() throws InterruptedException;
+
+    /**
+     * Retrieves and removes the first element of this deque, waiting
+     * up to the specified wait time if necessary for an element to
+     * become available.
+     *
+     * @param timeout how long to wait before giving up, in units of
+     *        <tt>unit</tt>
+     * @param unit a <tt>TimeUnit</tt> determining how to interpret the
+     *        <tt>timeout</tt> parameter
+     * @return the head of this deque, or <tt>null</tt> if the specified
+     *         waiting time elapses before an element is available
+     * @throws InterruptedException if interrupted while waiting
+     */
+    Object pollFirst(long timeout, TimeUnit unit)
+        throws InterruptedException;
+
+    /**
+     * Retrieves and removes the last element of this deque, waiting
+     * up to the specified wait time if necessary for an element to
+     * become available.
+     *
+     * @param timeout how long to wait before giving up, in units of
+     *        <tt>unit</tt>
+     * @param unit a <tt>TimeUnit</tt> determining how to interpret the
+     *        <tt>timeout</tt> parameter
+     * @return the tail of this deque, or <tt>null</tt> if the specified
+     *         waiting time elapses before an element is available
+     * @throws InterruptedException if interrupted while waiting
+     */
+    Object pollLast(long timeout, TimeUnit unit)
+        throws InterruptedException;
+
+    /**
+     * Removes the first occurrence of the specified element from this deque.
+     * If the deque does not contain the element, it is unchanged.
+     * More formally, removes the first element <tt>e</tt> such that
+     * <tt>o.equals(e)</tt> (if such an element exists).
+     * Returns <tt>true</tt> if this deque contained the specified element
+     * (or equivalently, if this deque changed as a result of the call).
+     *
+     * @param o element to be removed from this deque, if present
+     * @return <tt>true</tt> if an element was removed as a result of this call
+     * @throws ClassCastException if the class of the specified element
+     *         is incompatible with this deque (optional)
+     * @throws NullPointerException if the specified element is null (optional)
+     */
+    boolean removeFirstOccurrence(Object o);
+
+    /**
+     * Removes the last occurrence of the specified element from this deque.
+     * If the deque does not contain the element, it is unchanged.
+     * More formally, removes the last element <tt>e</tt> such that
+     * <tt>o.equals(e)</tt> (if such an element exists).
+     * Returns <tt>true</tt> if this deque contained the specified element
+     * (or equivalently, if this deque changed as a result of the call).
+     *
+     * @param o element to be removed from this deque, if present
+     * @return <tt>true</tt> if an element was removed as a result of this call
+     * @throws ClassCastException if the class of the specified element
+     *         is incompatible with this deque (optional)
+     * @throws NullPointerException if the specified element is null (optional)
+     */
+    boolean removeLastOccurrence(Object o);
+
+    // *** BlockingQueue methods ***
+
+    /**
+     * Inserts the specified element into the queue represented by this deque
+     * (in other words, at the tail of this deque) if it is possible to do so
+     * immediately without violating capacity restrictions, returning
+     * <tt>true</tt> upon success and throwing an
+     * <tt>IllegalStateException</tt> if no space is currently available.
+     * When using a capacity-restricted deque, it is generally preferable to
+     * use {@link #offer(Object) offer}.
+     *
+     * <p>This method is equivalent to {@link #addLast(Object) addLast}.
+     *
+     * @param e the element to add
+     * @throws IllegalStateException {@inheritDoc}
+     * @throws ClassCastException if the class of the specified element
+     *         prevents it from being added to this deque
+     * @throws NullPointerException if the specified element is null
+     * @throws IllegalArgumentException if some property of the specified
+     *         element prevents it from being added to this deque
+     */
+    boolean add(Object e);
+
+    /**
+     * Inserts the specified element into the queue represented by this deque
+     * (in other words, at the tail of this deque) if it is possible to do so
+     * immediately without violating capacity restrictions, returning
+     * <tt>true</tt> upon success and <tt>false</tt> if no space is currently
+     * available.  When using a capacity-restricted deque, this method is
+     * generally preferable to the {@link #add} method, which can fail to
+     * insert an element only by throwing an exception.
+     *
+     * <p>This method is equivalent to {@link #offerLast(Object) offerLast}.
+     *
+     * @param e the element to add
+     * @throws ClassCastException if the class of the specified element
+     *         prevents it from being added to this deque
+     * @throws NullPointerException if the specified element is null
+     * @throws IllegalArgumentException if some property of the specified
+     *         element prevents it from being added to this deque
+     */
+    boolean offer(Object e);
+
+    /**
+     * Inserts the specified element into the queue represented by this deque
+     * (in other words, at the tail of this deque), waiting if necessary for
+     * space to become available.
+     *
+     * <p>This method is equivalent to {@link #putLast(Object) putLast}.
+     *
+     * @param e the element to add
+     * @throws InterruptedException {@inheritDoc}
+     * @throws ClassCastException if the class of the specified element
+     *         prevents it from being added to this deque
+     * @throws NullPointerException if the specified element is null
+     * @throws IllegalArgumentException if some property of the specified
+     *         element prevents it from being added to this deque
+     */
+    void put(Object e) throws InterruptedException;
+
+    /**
+     * Inserts the specified element into the queue represented by this deque
+     * (in other words, at the tail of this deque), waiting up to the
+     * specified wait time if necessary for space to become available.
+     *
+     * <p>This method is equivalent to
+     * {@link #offerLast(Object,long,TimeUnit) offerLast}.
+     *
+     * @param e the element to add
+     * @return <tt>true</tt> if the element was added to this deque, else
+     *         <tt>false</tt>
+     * @throws InterruptedException {@inheritDoc}
+     * @throws ClassCastException if the class of the specified element
+     *         prevents it from being added to this deque
+     * @throws NullPointerException if the specified element is null
+     * @throws IllegalArgumentException if some property of the specified
+     *         element prevents it from being added to this deque
+     */
+    boolean offer(Object e, long timeout, TimeUnit unit)
+        throws InterruptedException;
+
+    /**
+     * Retrieves and removes the head of the queue represented by this deque
+     * (in other words, the first element of this deque).
+     * This method differs from {@link #poll poll} only in that it
+     * throws an exception if this deque is empty.
+     *
+     * <p>This method is equivalent to {@link #removeFirst() removeFirst}.
+     *
+     * @return the head of the queue represented by this deque
+     * @throws NoSuchElementException if this deque is empty
+     */
+    Object remove();
+
+    /**
+     * Retrieves and removes the head of the queue represented by this deque
+     * (in other words, the first element of this deque), or returns
+     * <tt>null</tt> if this deque is empty.
+     *
+     * <p>This method is equivalent to {@link #pollFirst()}.
+     *
+     * @return the head of this deque, or <tt>null</tt> if this deque is empty
+     */
+    Object poll();
+
+    /**
+     * Retrieves and removes the head of the queue represented by this deque
+     * (in other words, the first element of this deque), waiting if
+     * necessary until an element becomes available.
+     *
+     * <p>This method is equivalent to {@link #takeFirst() takeFirst}.
+     *
+     * @return the head of this deque
+     * @throws InterruptedException if interrupted while waiting
+     */
+    Object take() throws InterruptedException;
+
+    /**
+     * Retrieves and removes the head of the queue represented by this deque
+     * (in other words, the first element of this deque), waiting up to the
+     * specified wait time if necessary for an element to become available.
+     *
+     * <p>This method is equivalent to
+     * {@link #pollFirst(long,TimeUnit) pollFirst}.
+     *
+     * @return the head of this deque, or <tt>null</tt> if the
+     *         specified waiting time elapses before an element is available
+     * @throws InterruptedException if interrupted while waiting
+     */
+    Object poll(long timeout, TimeUnit unit)
+        throws InterruptedException;
+
+    /**
+     * Retrieves, but does not remove, the head of the queue represented by
+     * this deque (in other words, the first element of this deque).
+     * This method differs from {@link #peek peek} only in that it throws an
+     * exception if this deque is empty.
+     *
+     * <p>This method is equivalent to {@link #getFirst() getFirst}.
+     *
+     * @return the head of this deque
+     * @throws NoSuchElementException if this deque is empty
+     */
+    Object element();
+
+    /**
+     * Retrieves, but does not remove, the head of the queue represented by
+     * this deque (in other words, the first element of this deque), or
+     * returns <tt>null</tt> if this deque is empty.
+     *
+     * <p>This method is equivalent to {@link #peekFirst() peekFirst}.
+     *
+     * @return the head of this deque, or <tt>null</tt> if this deque is empty
+     */
+    Object peek();
+
+    /**
+     * Removes the first occurrence of the specified element from this deque.
+     * If the deque does not contain the element, it is unchanged.
+     * More formally, removes the first element <tt>e</tt> such that
+     * <tt>o.equals(e)</tt> (if such an element exists).
+     * Returns <tt>true</tt> if this deque contained the specified element
+     * (or equivalently, if this deque changed as a result of the call).
+     *
+     * <p>This method is equivalent to
+     * {@link #removeFirstOccurrence(Object) removeFirstOccurrence}.
+     *
+     * @param o element to be removed from this deque, if present
+     * @return <tt>true</tt> if this deque changed as a result of the call
+     * @throws ClassCastException if the class of the specified element
+     *         is incompatible with this deque (optional)
+     * @throws NullPointerException if the specified element is null (optional)
+     */
+    boolean remove(Object o);
+
+    /**
+     * Returns <tt>true</tt> if this deque contains the specified element.
+     * More formally, returns <tt>true</tt> if and only if this deque contains
+     * at least one element <tt>e</tt> such that <tt>o.equals(e)</tt>.
+     *
+     * @param o object to be checked for containment in this deque
+     * @return <tt>true</tt> if this deque contains the specified element
+     * @throws ClassCastException if the class of the specified element
+     *         is incompatible with this deque (optional)
+     * @throws NullPointerException if the specified element is null (optional)
+     */
+    public boolean contains(Object o);
+
+    /**
+     * Returns the number of elements in this deque.
+     *
+     * @return the number of elements in this deque
+     */
+    public int size();
+
+    /**
+     * Returns an iterator over the elements in this deque in proper sequence.
+     * The elements will be returned in order from first (head) to last (tail).
+     *
+     * @return an iterator over the elements in this deque in proper sequence
+     */
+    Iterator iterator();
+
+    // *** Stack methods ***
+
+    /**
+     * Pushes an element onto the stack represented by this deque.  In other
+     * words, inserts the element at the front of this deque unless it would
+     * violate capacity restrictions.
+     *
+     * <p>This method is equivalent to {@link #addFirst(Object) addFirst}.
+     *
+     * @throws IllegalStateException {@inheritDoc}
+     * @throws ClassCastException {@inheritDoc}
+     * @throws NullPointerException if the specified element is null
+     * @throws IllegalArgumentException {@inheritDoc}
+     */
+    void push(Object e);
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/BlockingQueue.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/BlockingQueue.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/BlockingQueue.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,343 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+
+import java.util.Collection;
+import edu.emory.mathcs.backport.java.util.Queue;
+
+/**
+ * A {@link edu.emory.mathcs.backport.java.util.Queue} that additionally supports operations
+ * that wait for the queue to become non-empty when retrieving an
+ * element, and wait for space to become available in the queue when
+ * storing an element.
+ *
+ * <p><tt>BlockingQueue</tt> methods come in four forms, with different ways
+ * of handling operations that cannot be satisfied immediately, but may be
+ * satisfied at some point in the future:
+ * one throws an exception, the second returns a special value (either
+ * <tt>null</tt> or <tt>false</tt>, depending on the operation), the third
+ * blocks the current thread indefinitely until the operation can succeed,
+ * and the fourth blocks for only a given maximum time limit before giving
+ * up.  These methods are summarized in the following table:
+ *
+ * <p>
+ * <table BORDER CELLPADDING=3 CELLSPACING=1>
+ *  <tr>
+ *    <td></td>
+ *    <td ALIGN=CENTER><em>Throws exception</em></td>
+ *    <td ALIGN=CENTER><em>Special value</em></td>
+ *    <td ALIGN=CENTER><em>Blocks</em></td>
+ *    <td ALIGN=CENTER><em>Times out</em></td>
+ *  </tr>
+ *  <tr>
+ *    <td><b>Insert</b></td>
+ *    <td>{@link #add add(e)}</td>
+ *    <td>{@link #offer offer(e)}</td>
+ *    <td>{@link #put put(e)}</td>
+ *    <td>{@link #offer(Object, long, TimeUnit) offer(e, time, unit)}</td>
+ *  </tr>
+ *  <tr>
+ *    <td><b>Remove</b></td>
+ *    <td>{@link #remove remove()}</td>
+ *    <td>{@link #poll poll()}</td>
+ *    <td>{@link #take take()}</td>
+ *    <td>{@link #poll(long, TimeUnit) poll(time, unit)}</td>
+ *  </tr>
+ *  <tr>
+ *    <td><b>Examine</b></td>
+ *    <td>{@link #element element()}</td>
+ *    <td>{@link #peek peek()}</td>
+ *    <td><em>not applicable</em></td>
+ *    <td><em>not applicable</em></td>
+ *  </tr>
+ * </table>
+ *
+ * <p>A <tt>BlockingQueue</tt> does not accept <tt>null</tt> elements.
+ * Implementations throw <tt>NullPointerException</tt> on attempts
+ * to <tt>add</tt>, <tt>put</tt> or <tt>offer</tt> a <tt>null</tt>.  A
+ * <tt>null</tt> is used as a sentinel value to indicate failure of
+ * <tt>poll</tt> operations.
+ *
+ * <p>A <tt>BlockingQueue</tt> may be capacity bounded. At any given
+ * time it may have a <tt>remainingCapacity</tt> beyond which no
+ * additional elements can be <tt>put</tt> without blocking.
+ * A <tt>BlockingQueue</tt> without any intrinsic capacity constraints always
+ * reports a remaining capacity of <tt>Integer.MAX_VALUE</tt>.
+ *
+ * <p> <tt>BlockingQueue</tt> implementations are designed to be used
+ * primarily for producer-consumer queues, but additionally support
+ * the {@link java.util.Collection} interface.  So, for example, it is
+ * possible to remove an arbitrary element from a queue using
+ * <tt>remove(x)</tt>. However, such operations are in general
+ * <em>not</em> performed very efficiently, and are intended for only
+ * occasional use, such as when a queued message is cancelled.
+ *
+ * <p> <tt>BlockingQueue</tt> implementations are thread-safe.  All
+ * queuing methods achieve their effects atomically using internal
+ * locks or other forms of concurrency control. However, the
+ * <em>bulk</em> Collection operations <tt>addAll</tt>,
+ * <tt>containsAll</tt>, <tt>retainAll</tt> and <tt>removeAll</tt> are
+ * <em>not</em> necessarily performed atomically unless specified
+ * otherwise in an implementation. So it is possible, for example, for
+ * <tt>addAll(c)</tt> to fail (throwing an exception) after adding
+ * only some of the elements in <tt>c</tt>.
+ *
+ * <p>A <tt>BlockingQueue</tt> does <em>not</em> intrinsically support
+ * any kind of &quot;close&quot; or &quot;shutdown&quot; operation to
+ * indicate that no more items will be added.  The needs and usage of
+ * such features tend to be implementation-dependent. For example, a
+ * common tactic is for producers to insert special
+ * <em>end-of-stream</em> or <em>poison</em> objects, that are
+ * interpreted accordingly when taken by consumers.
+ *
+ * <p>
+ * Usage example, based on a typical producer-consumer scenario.
+ * Note that a <tt>BlockingQueue</tt> can safely be used with multiple
+ * producers and multiple consumers.
+ * <pre>
+ * class Producer implements Runnable {
+ *   private final BlockingQueue queue;
+ *   Producer(BlockingQueue q) { queue = q; }
+ *   public void run() {
+ *     try {
+ *       while (true) { queue.put(produce()); }
+ *     } catch (InterruptedException ex) { ... handle ...}
+ *   }
+ *   Object produce() { ... }
+ * }
+ *
+ * class Consumer implements Runnable {
+ *   private final BlockingQueue queue;
+ *   Consumer(BlockingQueue q) { queue = q; }
+ *   public void run() {
+ *     try {
+ *       while (true) { consume(queue.take()); }
+ *     } catch (InterruptedException ex) { ... handle ...}
+ *   }
+ *   void consume(Object x) { ... }
+ * }
+ *
+ * class Setup {
+ *   void main() {
+ *     BlockingQueue q = new SomeQueueImplementation();
+ *     Producer p = new Producer(q);
+ *     Consumer c1 = new Consumer(q);
+ *     Consumer c2 = new Consumer(q);
+ *     new Thread(p).start();
+ *     new Thread(c1).start();
+ *     new Thread(c2).start();
+ *   }
+ * }
+ * </pre>
+ *
+ * <p>Memory consistency effects: As with other concurrent
+ * collections, actions in a thread prior to placing an object into a
+ * {@code BlockingQueue}
+ * <a href="package-summary.html#MemoryVisibility"><i>happen-before</i></a>
+ * actions subsequent to the access or removal of that element from
+ * the {@code BlockingQueue} in another thread.
+ *
+ * <p>This interface is a member of the
+ * <a href="{@docRoot}/../guide/collections/index.html">
+ * Java Collections Framework</a>.
+ *
+ * @since 1.5
+ * @author Doug Lea
+ */
+public interface BlockingQueue extends Queue {
+    /**
+     * Inserts the specified element into this queue if it is possible to do
+     * so immediately without violating capacity restrictions, returning
+     * <tt>true</tt> upon success and throwing an
+     * <tt>IllegalStateException</tt> if no space is currently available.
+     * When using a capacity-restricted queue, it is generally preferable to
+     * use {@link #offer(Object) offer}.
+     *
+     * @param e the element to add
+     * @return <tt>true</tt> (as specified by {@link java.util.Collection#add})
+     * @throws IllegalStateException if the element cannot be added at this
+     *         time due to capacity restrictions
+     * @throws ClassCastException if the class of the specified element
+     *         prevents it from being added to this queue
+     * @throws NullPointerException if the specified element is null
+     * @throws IllegalArgumentException if some property of the specified
+     *         element prevents it from being added to this queue
+     */
+    boolean add(Object e);
+
+    /**
+     * Inserts the specified element into this queue if it is possible to do
+     * so immediately without violating capacity restrictions, returning
+     * <tt>true</tt> upon success and <tt>false</tt> if no space is currently
+     * available.  When using a capacity-restricted queue, this method is
+     * generally preferable to {@link #add}, which can fail to insert an
+     * element only by throwing an exception.
+     *
+     * @param e the element to add
+     * @return <tt>true</tt> if the element was added to this queue, else
+     *         <tt>false</tt>
+     * @throws ClassCastException if the class of the specified element
+     *         prevents it from being added to this queue
+     * @throws NullPointerException if the specified element is null
+     * @throws IllegalArgumentException if some property of the specified
+     *         element prevents it from being added to this queue
+     */
+    boolean offer(Object e);
+
+    /**
+     * Inserts the specified element into this queue, waiting if necessary
+     * for space to become available.
+     *
+     * @param e the element to add
+     * @throws InterruptedException if interrupted while waiting
+     * @throws ClassCastException if the class of the specified element
+     *         prevents it from being added to this queue
+     * @throws NullPointerException if the specified element is null
+     * @throws IllegalArgumentException if some property of the specified
+     *         element prevents it from being added to this queue
+     */
+    void put(Object e) throws InterruptedException;
+
+    /**
+     * Inserts the specified element into this queue, waiting up to the
+     * specified wait time if necessary for space to become available.
+     *
+     * @param e the element to add
+     * @param timeout how long to wait before giving up, in units of
+     *        <tt>unit</tt>
+     * @param unit a <tt>TimeUnit</tt> determining how to interpret the
+     *        <tt>timeout</tt> parameter
+     * @return <tt>true</tt> if successful, or <tt>false</tt> if
+     *         the specified waiting time elapses before space is available
+     * @throws InterruptedException if interrupted while waiting
+     * @throws ClassCastException if the class of the specified element
+     *         prevents it from being added to this queue
+     * @throws NullPointerException if the specified element is null
+     * @throws IllegalArgumentException if some property of the specified
+     *         element prevents it from being added to this queue
+     */
+    boolean offer(Object e, long timeout, TimeUnit unit)
+        throws InterruptedException;
+
+    /**
+     * Retrieves and removes the head of this queue, waiting if necessary
+     * until an element becomes available.
+     *
+     * @return the head of this queue
+     * @throws InterruptedException if interrupted while waiting
+     */
+    Object take() throws InterruptedException;
+
+    /**
+     * Retrieves and removes the head of this queue, waiting up to the
+     * specified wait time if necessary for an element to become available.
+     *
+     * @param timeout how long to wait before giving up, in units of
+     *        <tt>unit</tt>
+     * @param unit a <tt>TimeUnit</tt> determining how to interpret the
+     *        <tt>timeout</tt> parameter
+     * @return the head of this queue, or <tt>null</tt> if the
+     *         specified waiting time elapses before an element is available
+     * @throws InterruptedException if interrupted while waiting
+     */
+    Object poll(long timeout, TimeUnit unit)
+        throws InterruptedException;
+
+    /**
+     * Returns the number of additional elements that this queue can ideally
+     * (in the absence of memory or resource constraints) accept without
+     * blocking, or <tt>Integer.MAX_VALUE</tt> if there is no intrinsic
+     * limit.
+     *
+     * <p>Note that you <em>cannot</em> always tell if an attempt to insert
+     * an element will succeed by inspecting <tt>remainingCapacity</tt>
+     * because it may be the case that another thread is about to
+     * insert or remove an element.
+     *
+     * @return the remaining capacity
+     */
+    int remainingCapacity();
+
+    /**
+     * Removes a single instance of the specified element from this queue,
+     * if it is present.  More formally, removes an element <tt>e</tt> such
+     * that <tt>o.equals(e)</tt>, if this queue contains one or more such
+     * elements.
+     * Returns <tt>true</tt> if this queue contained the specified element
+     * (or equivalently, if this queue changed as a result of the call).
+     *
+     * @param o element to be removed from this queue, if present
+     * @return <tt>true</tt> if this queue changed as a result of the call
+     * @throws ClassCastException if the class of the specified element
+     *         is incompatible with this queue (optional)
+     * @throws NullPointerException if the specified element is null (optional)
+     */
+    boolean remove(Object o);
+
+    /**
+     * Returns <tt>true</tt> if this queue contains the specified element.
+     * More formally, returns <tt>true</tt> if and only if this queue contains
+     * at least one element <tt>e</tt> such that <tt>o.equals(e)</tt>.
+     *
+     * @param o object to be checked for containment in this queue
+     * @return <tt>true</tt> if this queue contains the specified element
+     * @throws ClassCastException if the class of the specified element
+     *         is incompatible with this queue (optional)
+     * @throws NullPointerException if the specified element is null (optional)
+     */
+    public boolean contains(Object o);
+
+    /**
+     * Removes all available elements from this queue and adds them
+     * to the given collection.  This operation may be more
+     * efficient than repeatedly polling this queue.  A failure
+     * encountered while attempting to add elements to
+     * collection <tt>c</tt> may result in elements being in neither,
+     * either or both collections when the associated exception is
+     * thrown.  Attempts to drain a queue to itself result in
+     * <tt>IllegalArgumentException</tt>. Further, the behavior of
+     * this operation is undefined if the specified collection is
+     * modified while the operation is in progress.
+     *
+     * @param c the collection to transfer elements into
+     * @return the number of elements transferred
+     * @throws UnsupportedOperationException if addition of elements
+     *         is not supported by the specified collection
+     * @throws ClassCastException if the class of an element of this queue
+     *         prevents it from being added to the specified collection
+     * @throws NullPointerException if the specified collection is null
+     * @throws IllegalArgumentException if the specified collection is this
+     *         queue, or some property of an element of this queue prevents
+     *         it from being added to the specified collection
+     */
+    int drainTo(Collection c);
+
+    /**
+     * Removes at most the given number of available elements from
+     * this queue and adds them to the given collection.  A failure
+     * encountered while attempting to add elements to
+     * collection <tt>c</tt> may result in elements being in neither,
+     * either or both collections when the associated exception is
+     * thrown.  Attempts to drain a queue to itself result in
+     * <tt>IllegalArgumentException</tt>. Further, the behavior of
+     * this operation is undefined if the specified collection is
+     * modified while the operation is in progress.
+     *
+     * @param c the collection to transfer elements into
+     * @param maxElements the maximum number of elements to transfer
+     * @return the number of elements transferred
+     * @throws UnsupportedOperationException if addition of elements
+     *         is not supported by the specified collection
+     * @throws ClassCastException if the class of an element of this queue
+     *         prevents it from being added to the specified collection
+     * @throws NullPointerException if the specified collection is null
+     * @throws IllegalArgumentException if the specified collection is this
+     *         queue, or some property of an element of this queue prevents
+     *         it from being added to the specified collection
+     */
+    int drainTo(Collection c, int maxElements);
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/BrokenBarrierException.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/BrokenBarrierException.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/BrokenBarrierException.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,38 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+
+/**
+ * Exception thrown when a thread tries to wait upon a barrier that is
+ * in a broken state, or which enters the broken state while the thread
+ * is waiting.
+ *
+ * @see CyclicBarrier
+ *
+ * @since 1.5
+ * @author Doug Lea
+ *
+ */
+public class BrokenBarrierException extends Exception {
+    private static final long serialVersionUID = 7117394618823254244L;
+
+    /**
+     * Constructs a <tt>BrokenBarrierException</tt> with no specified detail
+     * message.
+     */
+    public BrokenBarrierException() {}
+
+    /**
+     * Constructs a <tt>BrokenBarrierException</tt> with the specified
+     * detail message.
+     *
+     * @param message the detail message
+     */
+    public BrokenBarrierException(String message) {
+        super(message);
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/Callable.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/Callable.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/Callable.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,35 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+
+/**
+ * A task that returns a result and may throw an exception.
+ * Implementors define a single method with no arguments called
+ * <tt>call</tt>.
+ *
+ * <p>The <tt>Callable</tt> interface is similar to {@link
+ * java.lang.Runnable}, in that both are designed for classes whose
+ * instances are potentially executed by another thread.  A
+ * <tt>Runnable</tt>, however, does not return a result and cannot
+ * throw a checked exception.
+ *
+ * <p> The {@link Executors} class contains utility methods to
+ * convert from other common forms to <tt>Callable</tt> classes.
+ *
+ * @see Executor
+ * @since 1.5
+ * @author Doug Lea
+ */
+public interface Callable {
+    /**
+     * Computes a result, or throws an exception if unable to do so.
+     *
+     * @return computed result
+     * @throws Exception if unable to compute a result
+     */
+    Object call() throws Exception;
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/CancellationException.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/CancellationException.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/CancellationException.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,34 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+
+/**
+ * Exception indicating that the result of a value-producing task,
+ * such as a {@link FutureTask}, cannot be retrieved because the task
+ * was cancelled.
+ *
+ * @since 1.5
+ * @author Doug Lea
+ */
+public class CancellationException extends IllegalStateException {
+    private static final long serialVersionUID = -9202173006928992231L;
+
+    /**
+     * Constructs a <tt>CancellationException</tt> with no detail message.
+     */
+    public CancellationException() {}
+
+    /**
+     * Constructs a <tt>CancellationException</tt> with the specified detail
+     * message.
+     *
+     * @param message the detail message
+     */
+    public CancellationException(String message) {
+        super(message);
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/CompletionService.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/CompletionService.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/CompletionService.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,97 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+
+/**
+ * A service that decouples the production of new asynchronous tasks
+ * from the consumption of the results of completed tasks.  Producers
+ * <tt>submit</tt> tasks for execution. Consumers <tt>take</tt>
+ * completed tasks and process their results in the order they
+ * complete.  A <tt>CompletionService</tt> can for example be used to
+ * manage asynchronous IO, in which tasks that perform reads are
+ * submitted in one part of a program or system, and then acted upon
+ * in a different part of the program when the reads complete,
+ * possibly in a different order than they were requested.
+ *
+ * <p>Typically, a <tt>CompletionService</tt> relies on a separate
+ * {@link Executor} to actually execute the tasks, in which case the
+ * <tt>CompletionService</tt> only manages an internal completion
+ * queue. The {@link ExecutorCompletionService} class provides an
+ * implementation of this approach.
+ *
+ * <p>Memory consistency effects: Actions in a thread prior to
+ * submitting a task to a {@code CompletionService}
+ * <a href="package-summary.html#MemoryVisibility"><i>happen-before</i></a>
+ * actions taken by that task, which in turn <i>happen-before</i>
+ * actions following a successful return from the corresponding {@code take()}.
+ *
+ */
+public interface CompletionService {
+    /**
+     * Submits a value-returning task for execution and returns a Future
+     * representing the pending results of the task.  Upon completion,
+     * this task may be taken or polled.
+     *
+     * @param task the task to submit
+     * @return a Future representing pending completion of the task
+     * @throws RejectedExecutionException if the task cannot be
+     *         scheduled for execution
+     * @throws NullPointerException if the task is null
+     */
+    Future submit(Callable task);
+
+    /**
+     * Submits a Runnable task for execution and returns a Future
+     * representing that task.  Upon completion, this task may be
+     * taken or polled.
+     *
+     * @param task the task to submit
+     * @param result the result to return upon successful completion
+     * @return a Future representing pending completion of the task,
+     *         and whose <tt>get()</tt> method will return the given
+     *         result value upon completion
+     * @throws RejectedExecutionException if the task cannot be
+     *         scheduled for execution
+     * @throws NullPointerException if the task is null
+     */
+    Future submit(Runnable task, Object result);
+
+    /**
+     * Retrieves and removes the Future representing the next
+     * completed task, waiting if none are yet present.
+     *
+     * @return the Future representing the next completed task
+     * @throws InterruptedException if interrupted while waiting
+     */
+    Future take() throws InterruptedException;
+
+
+    /**
+     * Retrieves and removes the Future representing the next
+     * completed task or <tt>null</tt> if none are present.
+     *
+     * @return the Future representing the next completed task, or
+     *         <tt>null</tt> if none are present
+     */
+    Future poll();
+
+    /**
+     * Retrieves and removes the Future representing the next
+     * completed task, waiting if necessary up to the specified wait
+     * time if none are yet present.
+     *
+     * @param timeout how long to wait before giving up, in units of
+     *        <tt>unit</tt>
+     * @param unit a <tt>TimeUnit</tt> determining how to interpret the
+     *        <tt>timeout</tt> parameter
+     * @return the Future representing the next completed task or
+     *         <tt>null</tt> if the specified waiting time elapses
+     *         before one is present
+     * @throws InterruptedException if interrupted while waiting
+     */
+    Future poll(long timeout, TimeUnit unit) throws InterruptedException;
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ConcurrentHashMap.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ConcurrentHashMap.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ConcurrentHashMap.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,1273 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import edu.emory.mathcs.backport.java.util.*;
+import java.io.Serializable;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.util.Collection;
+import java.util.Set;
+import java.util.Map;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.Utils;
+
+/**
+ * A hash table supporting full concurrency of retrievals and
+ * adjustable expected concurrency for updates. This class obeys the
+ * same functional specification as {@link java.util.Hashtable}, and
+ * includes versions of methods corresponding to each method of
+ * <tt>Hashtable</tt>. However, even though all operations are
+ * thread-safe, retrieval operations do <em>not</em> entail locking,
+ * and there is <em>not</em> any support for locking the entire table
+ * in a way that prevents all access.  This class is fully
+ * interoperable with <tt>Hashtable</tt> in programs that rely on its
+ * thread safety but not on its synchronization details.
+ *
+ * <p> Retrieval operations (including <tt>get</tt>) generally do not
+ * block, so may overlap with update operations (including
+ * <tt>put</tt> and <tt>remove</tt>). Retrievals reflect the results
+ * of the most recently <em>completed</em> update operations holding
+ * upon their onset.  For aggregate operations such as <tt>putAll</tt>
+ * and <tt>clear</tt>, concurrent retrievals may reflect insertion or
+ * removal of only some entries.  Similarly, Iterators and
+ * Enumerations return elements reflecting the state of the hash table
+ * at some point at or since the creation of the iterator/enumeration.
+ * They do <em>not</em> throw {@link java.util.ConcurrentModificationException}.
+ * However, iterators are designed to be used by only one thread at a time.
+ *
+ * <p> The allowed concurrency among update operations is guided by
+ * the optional <tt>concurrencyLevel</tt> constructor argument
+ * (default <tt>16</tt>), which is used as a hint for internal sizing.  The
+ * table is internally partitioned to try to permit the indicated
+ * number of concurrent updates without contention. Because placement
+ * in hash tables is essentially random, the actual concurrency will
+ * vary.  Ideally, you should choose a value to accommodate as many
+ * threads as will ever concurrently modify the table. Using a
+ * significantly higher value than you need can waste space and time,
+ * and a significantly lower value can lead to thread contention. But
+ * overestimates and underestimates within an order of magnitude do
+ * not usually have much noticeable impact. A value of one is
+ * appropriate when it is known that only one thread will modify and
+ * all others will only read. Also, resizing this or any other kind of
+ * hash table is a relatively slow operation, so, when possible, it is
+ * a good idea to provide estimates of expected table sizes in
+ * constructors.
+ *
+ * <p>This class and its views and iterators implement all of the
+ * <em>optional</em> methods of the {@link Map} and {@link Iterator}
+ * interfaces.
+ *
+ * <p> Like {@link java.util.Hashtable} but unlike {@link java.util.HashMap}, this class
+ * does <em>not</em> allow <tt>null</tt> to be used as a key or value.
+ *
+ * <p>This class is a member of the
+ * <a href="{@docRoot}/../guide/collections/index.html">
+ * Java Collections Framework</a>.
+ *
+ * @since 1.5
+ * @author Doug Lea
+ */
+public class ConcurrentHashMap extends AbstractMap
+        implements ConcurrentMap, Serializable {
+    private static final long serialVersionUID = 7249069246763182397L;
+
+    /*
+     * The basic strategy is to subdivide the table among Segments,
+     * each of which itself is a concurrently readable hash table.
+     */
+
+    /* ---------------- Constants -------------- */
+
+    /**
+     * The default initial capacity for this table,
+     * used when not otherwise specified in a constructor.
+     */
+    static final int DEFAULT_INITIAL_CAPACITY = 16;
+
+    /**
+     * The default load factor for this table, used when not
+     * otherwise specified in a constructor.
+     */
+    static final float DEFAULT_LOAD_FACTOR = 0.75f;
+
+    /**
+     * The default concurrency level for this table, used when not
+     * otherwise specified in a constructor.
+     */
+    static final int DEFAULT_CONCURRENCY_LEVEL = 16;
+
+    /**
+     * The maximum capacity, used if a higher value is implicitly
+     * specified by either of the constructors with arguments.  MUST
+     * be a power of two <= 1<<30 to ensure that entries are indexable
+     * using ints.
+     */
+    static final int MAXIMUM_CAPACITY = 1 << 30;
+
+    /**
+     * The maximum number of segments to allow; used to bound
+     * constructor arguments.
+     */
+    static final int MAX_SEGMENTS = 1 << 16; // slightly conservative
+
+    /**
+     * Number of unsynchronized retries in size and containsValue
+     * methods before resorting to locking. This is used to avoid
+     * unbounded retries if tables undergo continuous modification
+     * which would make it impossible to obtain an accurate result.
+     */
+    static final int RETRIES_BEFORE_LOCK = 2;
+
+    /* ---------------- Fields -------------- */
+
+    /**
+     * Mask value for indexing into segments. The upper bits of a
+     * key's hash code are used to choose the segment.
+     */
+    final int segmentMask;
+
+    /**
+     * Shift value for indexing within segments.
+     */
+    final int segmentShift;
+
+    /**
+     * The segments, each of which is a specialized hash table
+     */
+    final Segment[] segments;
+
+    transient Set keySet;
+    transient Set entrySet;
+    transient Collection values;
+
+    /* ---------------- Small Utilities -------------- */
+
+    /**
+     * Returns a hash code for non-null Object x.
+     * Uses the same hash code spreader as most other java.util hash tables.
+     * @param x the object serving as a key
+     * @return the hash code
+     */
+    static int hash(Object x) {
+        int h = x.hashCode();
+        h += ~(h << 9);
+        h ^=  (h >>> 14);
+        h +=  (h << 4);
+        h ^=  (h >>> 10);
+        return h;
+    }
+
+    /**
+     * Returns the segment that should be used for key with given hash
+     * @param hash the hash code for the key
+     * @return the segment
+     */
+    final Segment segmentFor(int hash) {
+        return segments[(hash >>> segmentShift) & segmentMask];
+    }
+
+    /* ---------------- Inner Classes -------------- */
+
+    /**
+     * ConcurrentHashMap list entry. Note that this is never exported
+     * out as a user-visible Map.Entry.
+     *
+     * Because the value field is volatile, not final, it is legal wrt
+     * the Java Memory Model for an unsynchronized reader to see null
+     * instead of initial value when read via a data race.  Although a
+     * reordering leading to this is not likely to ever actually
+     * occur, the Segment.readValueUnderLock method is used as a
+     * backup in case a null (pre-initialized) value is ever seen in
+     * an unsynchronized access method.
+     */
+    static final class HashEntry {
+        final Object key;
+        final int hash;
+        volatile Object value;
+        final HashEntry next;
+
+        HashEntry(Object key, int hash, HashEntry next, Object value) {
+            this.key = key;
+            this.hash = hash;
+            this.next = next;
+            this.value = value;
+        }
+
+        static final HashEntry[] newArray(int i) {
+            return new HashEntry[i];
+        }
+    }
+
+    /**
+     * Segments are specialized versions of hash tables.  This
+     * subclasses from ReentrantLock opportunistically, just to
+     * simplify some locking and avoid separate construction.
+     */
+    static final class Segment extends ReentrantLock implements Serializable {
+        /*
+         * Segments maintain a table of entry lists that are ALWAYS
+         * kept in a consistent state, so can be read without locking.
+         * Next fields of nodes are immutable (final).  All list
+         * additions are performed at the front of each bin. This
+         * makes it easy to check changes, and also fast to traverse.
+         * When nodes would otherwise be changed, new nodes are
+         * created to replace them. This works well for hash tables
+         * since the bin lists tend to be short. (The average length
+         * is less than two for the default load factor threshold.)
+         *
+         * Read operations can thus proceed without locking, but rely
+         * on selected uses of volatiles to ensure that completed
+         * write operations performed by other threads are
+         * noticed. For most purposes, the "count" field, tracking the
+         * number of elements, serves as that volatile variable
+         * ensuring visibility.  This is convenient because this field
+         * needs to be read in many read operations anyway:
+         *
+         *   - All (unsynchronized) read operations must first read the
+         *     "count" field, and should not look at table entries if
+         *     it is 0.
+         *
+         *   - All (synchronized) write operations should write to
+         *     the "count" field after structurally changing any bin.
+         *     The operations must not take any action that could even
+         *     momentarily cause a concurrent read operation to see
+         *     inconsistent data. This is made easier by the nature of
+         *     the read operations in Map. For example, no operation
+         *     can reveal that the table has grown but the threshold
+         *     has not yet been updated, so there are no atomicity
+         *     requirements for this with respect to reads.
+         *
+         * As a guide, all critical volatile reads and writes to the
+         * count field are marked in code comments.
+         */
+
+        private static final long serialVersionUID = 2249069246763182397L;
+
+        /**
+         * The number of elements in this segment's region.
+         */
+        transient volatile int count;
+
+        /**
+         * Number of updates that alter the size of the table. This is
+         * used during bulk-read methods to make sure they see a
+         * consistent snapshot: If modCounts change during a traversal
+         * of segments computing size or checking containsValue, then
+         * we might have an inconsistent view of state so (usually)
+         * must retry.
+         */
+        transient int modCount;
+
+        /**
+         * The table is rehashed when its size exceeds this threshold.
+         * (The value of this field is always <tt>(int)(capacity *
+         * loadFactor)</tt>.)
+         */
+        transient int threshold;
+
+        /**
+         * The per-segment table.
+         */
+        transient volatile HashEntry[] table;
+
+        /**
+         * The load factor for the hash table.  Even though this value
+         * is same for all segments, it is replicated to avoid needing
+         * links to outer object.
+         * @serial
+         */
+        final float loadFactor;
+
+        Segment(int initialCapacity, float lf) {
+            loadFactor = lf;
+            setTable(HashEntry.newArray(initialCapacity));
+        }
+
+        static final Segment[] newArray(int i) {
+            return new Segment[i];
+        }
+
+        /**
+         * Sets table to new HashEntry array.
+         * Call only while holding lock or in constructor.
+         */
+        void setTable(HashEntry[] newTable) {
+            threshold = (int)(newTable.length * loadFactor);
+            table = newTable;
+        }
+
+        /**
+         * Returns properly casted first entry of bin for given hash.
+         */
+        HashEntry getFirst(int hash) {
+            HashEntry[] tab = table;
+            return tab[hash & (tab.length - 1)];
+        }
+
+        /**
+         * Reads value field of an entry under lock. Called if value
+         * field ever appears to be null. This is possible only if a
+         * compiler happens to reorder a HashEntry initialization with
+         * its table assignment, which is legal under memory model
+         * but is not known to ever occur.
+         */
+        Object readValueUnderLock(HashEntry e) {
+            lock();
+            try {
+                return e.value;
+            } finally {
+                unlock();
+            }
+        }
+
+        /* Specialized implementations of map methods */
+
+        Object get(Object key, int hash) {
+            if (count != 0) { // read-volatile
+                HashEntry e = getFirst(hash);
+                while (e != null) {
+                    if (e.hash == hash && key.equals(e.key)) {
+                        Object v = e.value;
+                        if (v != null)
+                            return v;
+                        return readValueUnderLock(e); // recheck
+                    }
+                    e = e.next;
+                }
+            }
+            return null;
+        }
+
+        boolean containsKey(Object key, int hash) {
+            if (count != 0) { // read-volatile
+                HashEntry e = getFirst(hash);
+                while (e != null) {
+                    if (e.hash == hash && key.equals(e.key))
+                        return true;
+                    e = e.next;
+                }
+            }
+            return false;
+        }
+
+        boolean containsValue(Object value) {
+            if (count != 0) { // read-volatile
+                HashEntry[] tab = table;
+                int len = tab.length;
+                for (int i = 0 ; i < len; i++) {
+                    for (HashEntry e = tab[i]; e != null; e = e.next) {
+                        Object v = e.value;
+                        if (v == null) // recheck
+                            v = readValueUnderLock(e);
+                        if (value.equals(v))
+                            return true;
+                    }
+                }
+            }
+            return false;
+        }
+
+        boolean replace(Object key, int hash, Object oldValue, Object newValue) {
+            lock();
+            try {
+                HashEntry e = getFirst(hash);
+                while (e != null && (e.hash != hash || !key.equals(e.key)))
+                    e = e.next;
+
+                boolean replaced = false;
+                if (e != null && oldValue.equals(e.value)) {
+                    replaced = true;
+                    e.value = newValue;
+                }
+                return replaced;
+            } finally {
+                unlock();
+            }
+        }
+
+        Object replace(Object key, int hash, Object newValue) {
+            lock();
+            try {
+                HashEntry e = getFirst(hash);
+                while (e != null && (e.hash != hash || !key.equals(e.key)))
+                    e = e.next;
+
+                Object oldValue = null;
+                if (e != null) {
+                    oldValue = e.value;
+                    e.value = newValue;
+                }
+                return oldValue;
+            } finally {
+                unlock();
+            }
+        }
+
+
+        Object put(Object key, int hash, Object value, boolean onlyIfAbsent) {
+            lock();
+            try {
+                int c = count;
+                if (c++ > threshold) // ensure capacity
+                    rehash();
+                HashEntry[] tab = table;
+                int index = hash & (tab.length - 1);
+                HashEntry first = tab[index];
+                HashEntry e = first;
+                while (e != null && (e.hash != hash || !key.equals(e.key)))
+                    e = e.next;
+
+                Object oldValue;
+                if (e != null) {
+                    oldValue = e.value;
+                    if (!onlyIfAbsent)
+                        e.value = value;
+                }
+                else {
+                    oldValue = null;
+                    ++modCount;
+                    tab[index] = new HashEntry(key, hash, first, value);
+                    count = c; // write-volatile
+                }
+                return oldValue;
+            } finally {
+                unlock();
+            }
+        }
+
+        void rehash() {
+            HashEntry[] oldTable = table;
+            int oldCapacity = oldTable.length;
+            if (oldCapacity >= MAXIMUM_CAPACITY)
+                return;
+
+            /*
+             * Reclassify nodes in each list to new Map.  Because we are
+             * using power-of-two expansion, the elements from each bin
+             * must either stay at same index, or move with a power of two
+             * offset. We eliminate unnecessary node creation by catching
+             * cases where old nodes can be reused because their next
+             * fields won't change. Statistically, at the default
+             * threshold, only about one-sixth of them need cloning when
+             * a table doubles. The nodes they replace will be garbage
+             * collectable as soon as they are no longer referenced by any
+             * reader thread that may be in the midst of traversing table
+             * right now.
+             */
+
+            HashEntry[] newTable = HashEntry.newArray(oldCapacity<<1);
+            threshold = (int)(newTable.length * loadFactor);
+            int sizeMask = newTable.length - 1;
+            for (int i = 0; i < oldCapacity ; i++) {
+                // We need to guarantee that any existing reads of old Map can
+                //  proceed. So we cannot yet null out each bin.
+                HashEntry e = oldTable[i];
+
+                if (e != null) {
+                    HashEntry next = e.next;
+                    int idx = e.hash & sizeMask;
+
+                    //  Single node on list
+                    if (next == null)
+                        newTable[idx] = e;
+
+                    else {
+                        // Reuse trailing consecutive sequence at same slot
+                        HashEntry lastRun = e;
+                        int lastIdx = idx;
+                        for (HashEntry last = next;
+                             last != null;
+                             last = last.next) {
+                            int k = last.hash & sizeMask;
+                            if (k != lastIdx) {
+                                lastIdx = k;
+                                lastRun = last;
+                            }
+                        }
+                        newTable[lastIdx] = lastRun;
+
+                        // Clone all remaining nodes
+                        for (HashEntry p = e; p != lastRun; p = p.next) {
+                            int k = p.hash & sizeMask;
+                            HashEntry n = newTable[k];
+                            newTable[k] = new HashEntry(p.key, p.hash,
+                                                             n, p.value);
+                        }
+                    }
+                }
+            }
+            table = newTable;
+        }
+
+        /**
+         * Remove; match on key only if value null, else match both.
+         */
+        Object remove(Object key, int hash, Object value) {
+            lock();
+            try {
+                int c = count - 1;
+                HashEntry[] tab = table;
+                int index = hash & (tab.length - 1);
+                HashEntry first = tab[index];
+                HashEntry e = first;
+                while (e != null && (e.hash != hash || !key.equals(e.key)))
+                    e = e.next;
+
+                Object oldValue = null;
+                if (e != null) {
+                    Object v = e.value;
+                    if (value == null || value.equals(v)) {
+                        oldValue = v;
+                        // All entries following removed node can stay
+                        // in list, but all preceding ones need to be
+                        // cloned.
+                        ++modCount;
+                        HashEntry newFirst = e.next;
+                        for (HashEntry p = first; p != e; p = p.next)
+                            newFirst = new HashEntry(p.key, p.hash,
+                                                          newFirst, p.value);
+                        tab[index] = newFirst;
+                        count = c; // write-volatile
+                    }
+                }
+                return oldValue;
+            } finally {
+                unlock();
+            }
+        }
+
+        void clear() {
+            if (count != 0) {
+                lock();
+                try {
+                    HashEntry[] tab = table;
+                    for (int i = 0; i < tab.length ; i++)
+                        tab[i] = null;
+                    ++modCount;
+                    count = 0; // write-volatile
+                } finally {
+                    unlock();
+                }
+            }
+        }
+    }
+
+
+
+    /* ---------------- Public operations -------------- */
+
+    /**
+     * Creates a new, empty map with the specified initial
+     * capacity, load factor and concurrency level.
+     *
+     * @param initialCapacity the initial capacity. The implementation
+     * performs internal sizing to accommodate this many elements.
+     * @param loadFactor  the load factor threshold, used to control resizing.
+     * Resizing may be performed when the average number of elements per
+     * bin exceeds this threshold.
+     * @param concurrencyLevel the estimated number of concurrently
+     * updating threads. The implementation performs internal sizing
+     * to try to accommodate this many threads.
+     * @throws IllegalArgumentException if the initial capacity is
+     * negative or the load factor or concurrencyLevel are
+     * nonpositive.
+     */
+    public ConcurrentHashMap(int initialCapacity,
+                             float loadFactor, int concurrencyLevel) {
+        if (!(loadFactor > 0) || initialCapacity < 0 || concurrencyLevel <= 0)
+            throw new IllegalArgumentException();
+
+        if (concurrencyLevel > MAX_SEGMENTS)
+            concurrencyLevel = MAX_SEGMENTS;
+
+        // Find power-of-two sizes best matching arguments
+        int sshift = 0;
+        int ssize = 1;
+        while (ssize < concurrencyLevel) {
+            ++sshift;
+            ssize <<= 1;
+        }
+        segmentShift = 32 - sshift;
+        segmentMask = ssize - 1;
+        this.segments = Segment.newArray(ssize);
+
+        if (initialCapacity > MAXIMUM_CAPACITY)
+            initialCapacity = MAXIMUM_CAPACITY;
+        int c = initialCapacity / ssize;
+        if (c * ssize < initialCapacity)
+            ++c;
+        int cap = 1;
+        while (cap < c)
+            cap <<= 1;
+
+        for (int i = 0; i < this.segments.length; ++i)
+            this.segments[i] = new Segment(cap, loadFactor);
+    }
+
+    /**
+     * Creates a new, empty map with the specified initial capacity
+     * and load factor and with the default concurrencyLevel (16).
+     *
+     * @param initialCapacity The implementation performs internal
+     * sizing to accommodate this many elements.
+     * @param loadFactor  the load factor threshold, used to control resizing.
+     * Resizing may be performed when the average number of elements per
+     * bin exceeds this threshold.
+     * @throws IllegalArgumentException if the initial capacity of
+     * elements is negative or the load factor is nonpositive
+     *
+     * @since 1.6
+     */
+    public ConcurrentHashMap(int initialCapacity, float loadFactor) {
+        this(initialCapacity, loadFactor, DEFAULT_CONCURRENCY_LEVEL);
+    }
+
+    /**
+     * Creates a new, empty map with the specified initial capacity,
+     * and with default load factor (0.75) and concurrencyLevel (16).
+     *
+     * @param initialCapacity the initial capacity. The implementation
+     * performs internal sizing to accommodate this many elements.
+     * @throws IllegalArgumentException if the initial capacity of
+     * elements is negative.
+     */
+    public ConcurrentHashMap(int initialCapacity) {
+        this(initialCapacity, DEFAULT_LOAD_FACTOR, DEFAULT_CONCURRENCY_LEVEL);
+    }
+
+    /**
+     * Creates a new, empty map with a default initial capacity (16),
+     * load factor (0.75) and concurrencyLevel (16).
+     */
+    public ConcurrentHashMap() {
+        this(DEFAULT_INITIAL_CAPACITY, DEFAULT_LOAD_FACTOR, DEFAULT_CONCURRENCY_LEVEL);
+    }
+
+    /**
+     * Creates a new map with the same mappings as the given map.
+     * The map is created with a capacity of 1.5 times the number
+     * of mappings in the given map or 16 (whichever is greater),
+     * and a default load factor (0.75) and concurrencyLevel (16).
+     *
+     * @param m the map
+     */
+    public ConcurrentHashMap(Map m) {
+        this(Math.max((int) (m.size() / DEFAULT_LOAD_FACTOR) + 1,
+                      DEFAULT_INITIAL_CAPACITY),
+             DEFAULT_LOAD_FACTOR, DEFAULT_CONCURRENCY_LEVEL);
+        putAll(m);
+    }
+
+    /**
+     * Returns <tt>true</tt> if this map contains no key-value mappings.
+     *
+     * @return <tt>true</tt> if this map contains no key-value mappings
+     */
+    public boolean isEmpty() {
+        final Segment[] segments = this.segments;
+        /*
+         * We keep track of per-segment modCounts to avoid ABA
+         * problems in which an element in one segment was added and
+         * in another removed during traversal, in which case the
+         * table was never actually empty at any point. Note the
+         * similar use of modCounts in the size() and containsValue()
+         * methods, which are the only other methods also susceptible
+         * to ABA problems.
+         */
+        int[] mc = new int[segments.length];
+        int mcsum = 0;
+        for (int i = 0; i < segments.length; ++i) {
+            if (segments[i].count != 0)
+                return false;
+            else
+                mcsum += mc[i] = segments[i].modCount;
+        }
+        // If mcsum happens to be zero, then we know we got a snapshot
+        // before any modifications at all were made.  This is
+        // probably common enough to bother tracking.
+        if (mcsum != 0) {
+            for (int i = 0; i < segments.length; ++i) {
+                if (segments[i].count != 0 ||
+                    mc[i] != segments[i].modCount)
+                    return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * Returns the number of key-value mappings in this map.  If the
+     * map contains more than <tt>Integer.MAX_VALUE</tt> elements, returns
+     * <tt>Integer.MAX_VALUE</tt>.
+     *
+     * @return the number of key-value mappings in this map
+     */
+    public int size() {
+        final Segment[] segments = this.segments;
+        long sum = 0;
+        long check = 0;
+        int[] mc = new int[segments.length];
+        // Try a few times to get accurate count. On failure due to
+        // continuous async changes in table, resort to locking.
+        for (int k = 0; k < RETRIES_BEFORE_LOCK; ++k) {
+            check = 0;
+            sum = 0;
+            int mcsum = 0;
+            for (int i = 0; i < segments.length; ++i) {
+                sum += segments[i].count;
+                mcsum += mc[i] = segments[i].modCount;
+            }
+            if (mcsum != 0) {
+                for (int i = 0; i < segments.length; ++i) {
+                    check += segments[i].count;
+                    if (mc[i] != segments[i].modCount) {
+                        check = -1; // force retry
+                        break;
+                    }
+                }
+            }
+            if (check == sum)
+                break;
+        }
+        if (check != sum) { // Resort to locking all segments
+            sum = 0;
+            for (int i = 0; i < segments.length; ++i)
+                segments[i].lock();
+            for (int i = 0; i < segments.length; ++i)
+                sum += segments[i].count;
+            for (int i = 0; i < segments.length; ++i)
+                segments[i].unlock();
+        }
+        if (sum > Integer.MAX_VALUE)
+            return Integer.MAX_VALUE;
+        else
+            return (int)sum;
+    }
+
+    /**
+     * Returns the value to which the specified key is mapped,
+     * or {@code null} if this map contains no mapping for the key.
+     *
+     * <p>More formally, if this map contains a mapping from a key
+     * {@code k} to a value {@code v} such that {@code key.equals(k)},
+     * then this method returns {@code v}; otherwise it returns
+     * {@code null}.  (There can be at most one such mapping.)
+     *
+     * @throws NullPointerException if the specified key is null
+     */
+    public Object get(Object key) {
+        int hash = hash(key); // throws NullPointerException if key null
+        return segmentFor(hash).get(key, hash);
+    }
+
+    /**
+     * Tests if the specified object is a key in this table.
+     *
+     * @param  key   possible key
+     * @return <tt>true</tt> if and only if the specified object
+     *         is a key in this table, as determined by the
+     *         <tt>equals</tt> method; <tt>false</tt> otherwise.
+     * @throws NullPointerException if the specified key is null
+     */
+    public boolean containsKey(Object key) {
+        int hash = hash(key); // throws NullPointerException if key null
+        return segmentFor(hash).containsKey(key, hash);
+    }
+
+    /**
+     * Returns <tt>true</tt> if this map maps one or more keys to the
+     * specified value. Note: This method requires a full internal
+     * traversal of the hash table, and so is much slower than
+     * method <tt>containsKey</tt>.
+     *
+     * @param value value whose presence in this map is to be tested
+     * @return <tt>true</tt> if this map maps one or more keys to the
+     *         specified value
+     * @throws NullPointerException if the specified value is null
+     */
+    public boolean containsValue(Object value) {
+        if (value == null)
+            throw new NullPointerException();
+
+        // See explanation of modCount use above
+
+        final Segment[] segments = this.segments;
+        int[] mc = new int[segments.length];
+
+        // Try a few times without locking
+        for (int k = 0; k < RETRIES_BEFORE_LOCK; ++k) {
+            int sum = 0;
+            int mcsum = 0;
+            for (int i = 0; i < segments.length; ++i) {
+                int c = segments[i].count;
+                mcsum += mc[i] = segments[i].modCount;
+                if (segments[i].containsValue(value))
+                    return true;
+            }
+            boolean cleanSweep = true;
+            if (mcsum != 0) {
+                for (int i = 0; i < segments.length; ++i) {
+                    int c = segments[i].count;
+                    if (mc[i] != segments[i].modCount) {
+                        cleanSweep = false;
+                        break;
+                    }
+                }
+            }
+            if (cleanSweep)
+                return false;
+        }
+        // Resort to locking all segments
+        for (int i = 0; i < segments.length; ++i)
+            segments[i].lock();
+        boolean found = false;
+        try {
+            for (int i = 0; i < segments.length; ++i) {
+                if (segments[i].containsValue(value)) {
+                    found = true;
+                    break;
+                }
+            }
+        } finally {
+            for (int i = 0; i < segments.length; ++i)
+                segments[i].unlock();
+        }
+        return found;
+    }
+
+    /**
+     * Legacy method testing if some key maps into the specified value
+     * in this table.  This method is identical in functionality to
+     * {@link #containsValue}, and exists solely to ensure
+     * full compatibility with class {@link java.util.Hashtable},
+     * which supported this method prior to introduction of the
+     * Java Collections framework.
+
+     * @param  value a value to search for
+     * @return <tt>true</tt> if and only if some key maps to the
+     *         <tt>value</tt> argument in this table as
+     *         determined by the <tt>equals</tt> method;
+     *         <tt>false</tt> otherwise
+     * @throws NullPointerException if the specified value is null
+     */
+    public boolean contains(Object value) {
+        return containsValue(value);
+    }
+
+    /**
+     * Maps the specified key to the specified value in this table.
+     * Neither the key nor the value can be null.
+     *
+     * <p> The value can be retrieved by calling the <tt>get</tt> method
+     * with a key that is equal to the original key.
+     *
+     * @param key key with which the specified value is to be associated
+     * @param value value to be associated with the specified key
+     * @return the previous value associated with <tt>key</tt>, or
+     *         <tt>null</tt> if there was no mapping for <tt>key</tt>
+     * @throws NullPointerException if the specified key or value is null
+     */
+    public Object put(Object key, Object value) {
+        if (value == null)
+            throw new NullPointerException();
+        int hash = hash(key); // throws NullPointerException if key null
+        return segmentFor(hash).put(key, hash, value, false);
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @return the previous value associated with the specified key,
+     *         or <tt>null</tt> if there was no mapping for the key
+     * @throws NullPointerException if the specified key or value is null
+     */
+    public Object putIfAbsent(Object key, Object value) {
+        if (value == null)
+            throw new NullPointerException();
+        int hash = hash(key); // throws NullPointerException if key null
+        return segmentFor(hash).put(key, hash, value, true);
+    }
+
+    /**
+     * Copies all of the mappings from the specified map to this one.
+     * These mappings replace any mappings that this map had for any of the
+     * keys currently in the specified map.
+     *
+     * @param m mappings to be stored in this map
+     */
+    public void putAll(Map m) {
+        for (Iterator it = m.entrySet().iterator(); it.hasNext(); ) {
+            Entry e = (Entry)it.next();
+            put(e.getKey(), e.getValue());
+        }
+    }
+
+    /**
+     * Removes the key (and its corresponding value) from this map.
+     * This method does nothing if the key is not in the map.
+     *
+     * @param  key the key that needs to be removed
+     * @return the previous value associated with <tt>key</tt>, or
+     *         <tt>null</tt> if there was no mapping for <tt>key</tt>
+     * @throws NullPointerException if the specified key is null
+     */
+    public Object remove(Object key) {
+        int hash = hash(key); // throws NullPointerException if key null
+        return segmentFor(hash).remove(key, hash, null);
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @throws NullPointerException if the specified key is null
+     */
+    public boolean remove(Object key, Object value) {
+        if (value == null)
+            return false;
+        int hash = hash(key); // throws NullPointerException if key null
+        return segmentFor(hash).remove(key, hash, value) != null;
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @throws NullPointerException if any of the arguments are null
+     */
+    public boolean replace(Object key, Object oldValue, Object newValue) {
+        if (oldValue == null || newValue == null)
+            throw new NullPointerException();
+        int hash = hash(key); // throws NullPointerException if key null
+        return segmentFor(hash).replace(key, hash, oldValue, newValue);
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @return the previous value associated with the specified key,
+     *         or <tt>null</tt> if there was no mapping for the key
+     * @throws NullPointerException if the specified key or value is null
+     */
+    public Object replace(Object key, Object value) {
+        if (value == null)
+            throw new NullPointerException();
+        int hash = hash(key); // throws NullPointerException if key null
+        return segmentFor(hash).replace(key, hash, value);
+    }
+
+    /**
+     * Removes all of the mappings from this map.
+     */
+    public void clear() {
+        for (int i = 0; i < segments.length; ++i)
+            segments[i].clear();
+    }
+
+    /**
+     * Returns a {@link Set} view of the keys contained in this map.
+     * The set is backed by the map, so changes to the map are
+     * reflected in the set, and vice-versa.  The set supports element
+     * removal, which removes the corresponding mapping from this map,
+     * via the <tt>Iterator.remove</tt>, <tt>Set.remove</tt>,
+     * <tt>removeAll</tt>, <tt>retainAll</tt>, and <tt>clear</tt>
+     * operations.  It does not support the <tt>add</tt> or
+     * <tt>addAll</tt> operations.
+     *
+     * <p>The view's <tt>iterator</tt> is a "weakly consistent" iterator
+     * that will never throw {@link java.util.ConcurrentModificationException},
+     * and guarantees to traverse elements as they existed upon
+     * construction of the iterator, and may (but is not guaranteed to)
+     * reflect any modifications subsequent to construction.
+     */
+    public Set keySet() {
+        Set ks = keySet;
+        return (ks != null) ? ks : (keySet = new KeySet());
+    }
+
+    /**
+     * Returns a {@link Collection} view of the values contained in this map.
+     * The collection is backed by the map, so changes to the map are
+     * reflected in the collection, and vice-versa.  The collection
+     * supports element removal, which removes the corresponding
+     * mapping from this map, via the <tt>Iterator.remove</tt>,
+     * <tt>Collection.remove</tt>, <tt>removeAll</tt>,
+     * <tt>retainAll</tt>, and <tt>clear</tt> operations.  It does not
+     * support the <tt>add</tt> or <tt>addAll</tt> operations.
+     *
+     * <p>The view's <tt>iterator</tt> is a "weakly consistent" iterator
+     * that will never throw {@link java.util.ConcurrentModificationException},
+     * and guarantees to traverse elements as they existed upon
+     * construction of the iterator, and may (but is not guaranteed to)
+     * reflect any modifications subsequent to construction.
+     */
+    public Collection values() {
+        Collection vs = values;
+        return (vs != null) ? vs : (values = new Values());
+    }
+
+    /**
+     * Returns a {@link Set} view of the mappings contained in this map.
+     * The set is backed by the map, so changes to the map are
+     * reflected in the set, and vice-versa.  The set supports element
+     * removal, which removes the corresponding mapping from the map,
+     * via the <tt>Iterator.remove</tt>, <tt>Set.remove</tt>,
+     * <tt>removeAll</tt>, <tt>retainAll</tt>, and <tt>clear</tt>
+     * operations.  It does not support the <tt>add</tt> or
+     * <tt>addAll</tt> operations.
+     *
+     * <p>The view's <tt>iterator</tt> is a "weakly consistent" iterator
+     * that will never throw {@link java.util.ConcurrentModificationException},
+     * and guarantees to traverse elements as they existed upon
+     * construction of the iterator, and may (but is not guaranteed to)
+     * reflect any modifications subsequent to construction.
+     */
+    public Set entrySet() {
+        Set es = entrySet;
+        return (es != null) ? es : (entrySet = new EntrySet());
+    }
+
+    /**
+     * Returns an enumeration of the keys in this table.
+     *
+     * @return an enumeration of the keys in this table
+     * @see #keySet
+     */
+    public Enumeration keys() {
+        return new KeyIterator();
+    }
+
+    /**
+     * Returns an enumeration of the values in this table.
+     *
+     * @return an enumeration of the values in this table
+     * @see #values
+     */
+    public Enumeration elements() {
+        return new ValueIterator();
+    }
+
+    /* ---------------- Iterator Support -------------- */
+
+    abstract class HashIterator {
+        int nextSegmentIndex;
+        int nextTableIndex;
+        HashEntry[] currentTable;
+        HashEntry nextEntry;
+        HashEntry lastReturned;
+
+        HashIterator() {
+            nextSegmentIndex = segments.length - 1;
+            nextTableIndex = -1;
+            advance();
+        }
+
+        public boolean hasMoreElements() { return hasNext(); }
+
+        final void advance() {
+            if (nextEntry != null && (nextEntry = nextEntry.next) != null)
+                return;
+
+            while (nextTableIndex >= 0) {
+                if ( (nextEntry = currentTable[nextTableIndex--]) != null)
+                    return;
+            }
+
+            while (nextSegmentIndex >= 0) {
+                Segment seg = segments[nextSegmentIndex--];
+                if (seg.count != 0) {
+                    currentTable = seg.table;
+                    for (int j = currentTable.length - 1; j >= 0; --j) {
+                        if ( (nextEntry = currentTable[j]) != null) {
+                            nextTableIndex = j - 1;
+                            return;
+                        }
+                    }
+                }
+            }
+        }
+
+        public boolean hasNext() { return nextEntry != null; }
+
+        HashEntry nextEntry() {
+            if (nextEntry == null)
+                throw new NoSuchElementException();
+            lastReturned = nextEntry;
+            advance();
+            return lastReturned;
+        }
+
+        public void remove() {
+            if (lastReturned == null)
+                throw new IllegalStateException();
+            ConcurrentHashMap.this.remove(lastReturned.key);
+            lastReturned = null;
+        }
+    }
+
+    final class KeyIterator extends HashIterator implements Iterator, Enumeration {
+        public Object next()        { return super.nextEntry().key; }
+        public Object nextElement() { return super.nextEntry().key; }
+    }
+
+    final class ValueIterator extends HashIterator implements Iterator, Enumeration {
+        public Object next()        { return super.nextEntry().value; }
+        public Object nextElement() { return super.nextEntry().value; }
+    }
+
+    /**
+     * Custom Entry class used by EntryIterator.next(), that relays
+     * setValue changes to the underlying map.
+     */
+    final class WriteThroughEntry
+        extends AbstractMap.SimpleEntry
+    {
+        WriteThroughEntry(Object k, Object v) {
+            super(k,v);
+        }
+
+        /**
+         * Set our entry's value and write through to the map. The
+         * value to return is somewhat arbitrary here. Since a
+         * WriteThroughEntry does not necessarily track asynchronous
+         * changes, the most recent "previous" value could be
+         * different from what we return (or could even have been
+         * removed in which case the put will re-establish). We do not
+         * and cannot guarantee more.
+         */
+        public Object setValue(Object value) {
+            if (value == null) throw new NullPointerException();
+            Object v = super.setValue(value);
+            ConcurrentHashMap.this.put(getKey(), value);
+            return v;
+        }
+    }
+
+    final class EntryIterator extends HashIterator implements Iterator {
+        public Object next() {
+            HashEntry e = super.nextEntry();
+            return new WriteThroughEntry(e.key, e.value);
+        }
+    }
+
+    final class KeySet extends AbstractSet {
+        public Iterator iterator() {
+            return new KeyIterator();
+        }
+        public int size() {
+            return ConcurrentHashMap.this.size();
+        }
+        public boolean contains(Object o) {
+            return ConcurrentHashMap.this.containsKey(o);
+        }
+        public boolean remove(Object o) {
+            return ConcurrentHashMap.this.remove(o) != null;
+        }
+        public void clear() {
+            ConcurrentHashMap.this.clear();
+        }
+    }
+
+    final class Values extends AbstractCollection {
+        public Iterator iterator() {
+            return new ValueIterator();
+        }
+        public int size() {
+            return ConcurrentHashMap.this.size();
+        }
+        public boolean contains(Object o) {
+            return ConcurrentHashMap.this.containsValue(o);
+        }
+        public void clear() {
+            ConcurrentHashMap.this.clear();
+        }
+    }
+
+    final class EntrySet extends AbstractSet {
+        public Iterator iterator() {
+            return new EntryIterator();
+        }
+        public boolean contains(Object o) {
+            if (!(o instanceof Map.Entry))
+                return false;
+            Map.Entry e = (Map.Entry)o;
+            Object v = ConcurrentHashMap.this.get(e.getKey());
+            return v != null && v.equals(e.getValue());
+        }
+        public boolean remove(Object o) {
+            if (!(o instanceof Map.Entry))
+                return false;
+            Map.Entry e = (Map.Entry)o;
+            return ConcurrentHashMap.this.remove(e.getKey(), e.getValue());
+        }
+        public int size() {
+            return ConcurrentHashMap.this.size();
+        }
+        public void clear() {
+            ConcurrentHashMap.this.clear();
+        }
+    }
+
+    /* ---------------- Serialization Support -------------- */
+
+    /**
+     * Save the state of the <tt>ConcurrentHashMap</tt> instance to a
+     * stream (i.e., serialize it).
+     * @param s the stream
+     * @serialData
+     * the key (Object) and value (Object)
+     * for each key-value mapping, followed by a null pair.
+     * The key-value mappings are emitted in no particular order.
+     */
+    private void writeObject(java.io.ObjectOutputStream s) throws IOException  {
+        s.defaultWriteObject();
+
+        for (int k = 0; k < segments.length; ++k) {
+            Segment seg = segments[k];
+            seg.lock();
+            try {
+                HashEntry[] tab = seg.table;
+                for (int i = 0; i < tab.length; ++i) {
+                    for (HashEntry e = tab[i]; e != null; e = e.next) {
+                        s.writeObject(e.key);
+                        s.writeObject(e.value);
+                    }
+                }
+            } finally {
+                seg.unlock();
+            }
+        }
+        s.writeObject(null);
+        s.writeObject(null);
+    }
+
+    /**
+     * Reconstitute the <tt>ConcurrentHashMap</tt> instance from a
+     * stream (i.e., deserialize it).
+     * @param s the stream
+     */
+    private void readObject(java.io.ObjectInputStream s)
+        throws IOException, ClassNotFoundException  {
+        s.defaultReadObject();
+
+        // Initialize each segment to be minimally sized, and let grow.
+        for (int i = 0; i < segments.length; ++i) {
+            segments[i].setTable(new HashEntry[1]);
+        }
+
+        // Read the keys and values, and put the mappings in the table
+        for (;;) {
+            Object key =  s.readObject();
+            Object value =  s.readObject();
+            if (key == null)
+                break;
+            put(key, value);
+        }
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ConcurrentLinkedQueue.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ConcurrentLinkedQueue.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ConcurrentLinkedQueue.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,494 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.Utils;
+import java.io.*;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+
+/**
+ * An unbounded thread-safe {@linkplain Queue queue} based on linked nodes.
+ * This queue orders elements FIFO (first-in-first-out).
+ * The <em>head</em> of the queue is that element that has been on the
+ * queue the longest time.
+ * The <em>tail</em> of the queue is that element that has been on the
+ * queue the shortest time. New elements
+ * are inserted at the tail of the queue, and the queue retrieval
+ * operations obtain elements at the head of the queue.
+ * A <tt>ConcurrentLinkedQueue</tt> is an appropriate choice when
+ * many threads will share access to a common collection.
+ * This queue does not permit <tt>null</tt> elements.
+ *
+ * <p>This implementation employs an efficient &quot;wait-free&quot;
+ * algorithm based on one described in <a
+ * href="http://www.cs.rochester.edu/u/michael/PODC96.html"> Simple,
+ * Fast, and Practical Non-Blocking and Blocking Concurrent Queue
+ * Algorithms</a> by Maged M. Michael and Michael L. Scott.
+ *
+ * <p>Beware that, unlike in most collections, the <tt>size</tt> method
+ * is <em>NOT</em> a constant-time operation. Because of the
+ * asynchronous nature of these queues, determining the current number
+ * of elements requires a traversal of the elements.
+ *
+ * <p>This class and its iterator implement all of the
+ * <em>optional</em> methods of the {@link Collection} and {@link
+ * Iterator} interfaces.
+ *
+ * <p>Memory consistency effects: As with other concurrent
+ * collections, actions in a thread prior to placing an object into a
+ * {@code ConcurrentLinkedQueue}
+ * <a href="package-summary.html#MemoryVisibility"><i>happen-before</i></a>
+ * actions subsequent to the access or removal of that element from
+ * the {@code ConcurrentLinkedQueue} in another thread.
+ *
+ * <p>This class is a member of the
+ * <a href="{@docRoot}/../guide/collections/index.html">
+ * Java Collections Framework</a>.
+ *
+ * @since 1.5
+ * @author Doug Lea
+ *
+ */
+public class ConcurrentLinkedQueue extends AbstractQueue
+        implements Queue, java.io.Serializable {
+    private static final long serialVersionUID = 196745693267521676L;
+
+    private final Object headLock = new SerializableLock();
+    private final Object tailLock = new SerializableLock();
+
+    /*
+     * This is a straight adaptation of Michael & Scott algorithm.
+     * For explanation, read the paper.  The only (minor) algorithmic
+     * difference is that this version supports lazy deletion of
+     * internal nodes (method remove(Object)) -- remove CAS'es item
+     * fields to null. The normal queue operations unlink but then
+     * pass over nodes with null item fields. Similarly, iteration
+     * methods ignore those with nulls.
+     *
+     * Also note that like most non-blocking algorithms in this
+     * package, this implementation relies on the fact that in garbage
+     * collected systems, there is no possibility of ABA problems due
+     * to recycled nodes, so there is no need to use "counted
+     * pointers" or related techniques seen in versions used in
+     * non-GC'ed settings.
+     */
+
+    private static class Node {
+        private volatile Object item;
+        private volatile Node next;
+
+        Node(Object x) { item = x; }
+
+        Node(Object x, Node n) { item = x; next = n; }
+
+        Object getItem() {
+            return item;
+        }
+
+        synchronized boolean casItem(Object cmp, Object val) {
+            if (item == cmp) {
+                item = val;
+                return true;
+            }
+            else {
+                return false;
+            }
+        }
+
+        synchronized void setItem(Object val) {
+            item = val;
+        }
+
+        Node getNext() {
+            return next;
+        }
+
+        synchronized boolean casNext(Node cmp, Node val) {
+            if (next == cmp) {
+                next = val;
+                return true;
+            }
+            else {
+                return false;
+            }
+        }
+
+        synchronized void setNext(Node val) {
+            next = val;
+        }
+
+    }
+
+    private boolean casTail(Node cmp, Node val) {
+        synchronized (tailLock) {
+            if (tail == cmp) {
+                tail = val;
+                return true;
+            }
+            else {
+                return false;
+            }
+        }
+    }
+
+    private boolean casHead(Node cmp, Node val) {
+        synchronized (headLock) {
+            if (head == cmp) {
+                head = val;
+                return true;
+            }
+            else {
+                return false;
+            }
+        }
+    }
+
+
+    /**
+     * Pointer to header node, initialized to a dummy node.  The first
+     * actual node is at head.getNext().
+     */
+    private transient volatile Node head = new Node(null, null);
+
+    /** Pointer to last node on list **/
+    private transient volatile Node tail = head;
+
+
+    /**
+     * Creates a <tt>ConcurrentLinkedQueue</tt> that is initially empty.
+     */
+    public ConcurrentLinkedQueue() {}
+
+    /**
+     * Creates a <tt>ConcurrentLinkedQueue</tt>
+     * initially containing the elements of the given collection,
+     * added in traversal order of the collection's iterator.
+     * @param c the collection of elements to initially contain
+     * @throws NullPointerException if the specified collection or any
+     *         of its elements are null
+     */
+    public ConcurrentLinkedQueue(Collection c) {
+        for (Iterator it = c.iterator(); it.hasNext();)
+            add(it.next());
+    }
+
+    // Have to override just to update the javadoc
+
+    /**
+     * Inserts the specified element at the tail of this queue.
+     *
+     * @return <tt>true</tt> (as specified by {@link Collection#add})
+     * @throws NullPointerException if the specified element is null
+     */
+    public boolean add(Object e) {
+        return offer(e);
+    }
+
+    /**
+     * Inserts the specified element at the tail of this queue.
+     *
+     * @return <tt>true</tt> (as specified by {@link Queue#offer})
+     * @throws NullPointerException if the specified element is null
+     */
+    public boolean offer(Object e) {
+        if (e == null) throw new NullPointerException();
+        Node n = new Node(e, null);
+        for(;;) {
+            Node t = tail;
+            Node s = t.getNext();
+            if (t == tail) {
+                if (s == null) {
+                    if (t.casNext(s, n)) {
+                        casTail(t, n);
+                        return true;
+                    }
+                } else {
+                    casTail(t, s);
+                }
+            }
+        }
+    }
+
+    public Object poll() {
+        for (;;) {
+            Node h = head;
+            Node t = tail;
+            Node first = h.getNext();
+            if (h == head) {
+                if (h == t) {
+                    if (first == null)
+                        return null;
+                    else
+                        casTail(t, first);
+                } else if (casHead(h, first)) {
+                    Object item = first.getItem();
+                    if (item != null) {
+                        first.setItem(null);
+                        return item;
+                    }
+                    // else skip over deleted item, continue loop,
+                }
+            }
+        }
+    }
+
+    public Object peek() { // same as poll except don't remove item
+        for (;;) {
+            Node h = head;
+            Node t = tail;
+            Node first = h.getNext();
+            if (h == head) {
+                if (h == t) {
+                    if (first == null)
+                        return null;
+                    else
+                        casTail(t, first);
+                } else {
+                    Object item = first.getItem();
+                    if (item != null)
+                        return item;
+                    else // remove deleted node and continue
+                        casHead(h, first);
+                }
+            }
+        }
+    }
+
+    /**
+     * Returns the first actual (non-header) node on list.  This is yet
+     * another variant of poll/peek; here returning out the first
+     * node, not element (so we cannot collapse with peek() without
+     * introducing race.)
+     */
+    Node first() {
+        for (;;) {
+            Node h = head;
+            Node t = tail;
+            Node first = h.getNext();
+            if (h == head) {
+                if (h == t) {
+                    if (first == null)
+                        return null;
+                    else
+                        casTail(t, first);
+                } else {
+                    if (first.getItem() != null)
+                        return first;
+                    else // remove deleted node and continue
+                        casHead(h, first);
+                }
+            }
+        }
+    }
+
+
+    /**
+     * Returns <tt>true</tt> if this queue contains no elements.
+     *
+     * @return <tt>true</tt> if this queue contains no elements
+     */
+    public boolean isEmpty() {
+        return first() == null;
+    }
+
+    /**
+     * Returns the number of elements in this queue.  If this queue
+     * contains more than <tt>Integer.MAX_VALUE</tt> elements, returns
+     * <tt>Integer.MAX_VALUE</tt>.
+     *
+     * <p>Beware that, unlike in most collections, this method is
+     * <em>NOT</em> a constant-time operation. Because of the
+     * asynchronous nature of these queues, determining the current
+     * number of elements requires an O(n) traversal.
+     *
+     * @return the number of elements in this queue
+     */
+    public int size() {
+        int count = 0;
+        for (Node p = first(); p != null; p = p.getNext()) {
+            if (p.getItem() != null) {
+                // Collections.size() spec says to max out
+                if (++count == Integer.MAX_VALUE)
+                    break;
+            }
+        }
+        return count;
+    }
+
+    /**
+     * Returns <tt>true</tt> if this queue contains the specified element.
+     * More formally, returns <tt>true</tt> if and only if this queue contains
+     * at least one element <tt>e</tt> such that <tt>o.equals(e)</tt>.
+     *
+     * @param o object to be checked for containment in this queue
+     * @return <tt>true</tt> if this queue contains the specified element
+     */
+    public boolean contains(Object o) {
+        if (o == null) return false;
+        for (Node p = first(); p != null; p = p.getNext()) {
+            Object item = p.getItem();
+            if (item != null &&
+                o.equals(item))
+                return true;
+        }
+        return false;
+    }
+
+    /**
+     * Removes a single instance of the specified element from this queue,
+     * if it is present.  More formally, removes an element <tt>e</tt> such
+     * that <tt>o.equals(e)</tt>, if this queue contains one or more such
+     * elements.
+     * Returns <tt>true</tt> if this queue contained the specified element
+     * (or equivalently, if this queue changed as a result of the call).
+     *
+     * @param o element to be removed from this queue, if present
+     * @return <tt>true</tt> if this queue changed as a result of the call
+     */
+    public boolean remove(Object o) {
+        if (o == null) return false;
+        for (Node p = first(); p != null; p = p.getNext()) {
+            Object item = p.getItem();
+            if (item != null &&
+                o.equals(item) &&
+                p.casItem(item, null))
+                return true;
+        }
+        return false;
+    }
+
+    /**
+     * Returns an iterator over the elements in this queue in proper sequence.
+     * The returned iterator is a "weakly consistent" iterator that
+     * will never throw {@link java.util.ConcurrentModificationException},
+     * and guarantees to traverse elements as they existed upon
+     * construction of the iterator, and may (but is not guaranteed to)
+     * reflect any modifications subsequent to construction.
+     *
+     * @return an iterator over the elements in this queue in proper sequence
+     */
+    public Iterator iterator() {
+        return new Itr();
+    }
+
+    private class Itr implements Iterator {
+        /**
+         * Next node to return item for.
+         */
+        private Node nextNode;
+
+        /**
+         * nextItem holds on to item fields because once we claim
+         * that an element exists in hasNext(), we must return it in
+         * the following next() call even if it was in the process of
+         * being removed when hasNext() was called.
+         */
+        private Object nextItem;
+
+        /**
+         * Node of the last returned item, to support remove.
+         */
+        private Node lastRet;
+
+        Itr() {
+            advance();
+        }
+
+        /**
+         * Moves to next valid node and returns item to return for
+         * next(), or null if no such.
+         */
+        private Object advance() {
+            lastRet = nextNode;
+            Object x = nextItem;
+
+            Node p = (nextNode == null) ? first() : nextNode.getNext();
+            for (;;) {
+                if (p == null) {
+                    nextNode = null;
+                    nextItem = null;
+                    return x;
+                }
+                Object item = p.getItem();
+                if (item != null) {
+                    nextNode = p;
+                    nextItem = item;
+                    return x;
+                } else // skip over nulls
+                    p = p.getNext();
+            }
+        }
+
+        public boolean hasNext() {
+            return nextNode != null;
+        }
+
+        public Object next() {
+            if (nextNode == null) throw new NoSuchElementException();
+            return advance();
+        }
+
+        public void remove() {
+            Node l = lastRet;
+            if (l == null) throw new IllegalStateException();
+            // rely on a future traversal to relink.
+            l.setItem(null);
+            lastRet = null;
+        }
+    }
+
+    /**
+     * Save the state to a stream (that is, serialize it).
+     *
+     * @serialData All of the elements (each an <tt>E</tt>) in
+     * the proper order, followed by a null
+     * @param s the stream
+     */
+    private void writeObject(java.io.ObjectOutputStream s)
+        throws java.io.IOException {
+
+        // Write out any hidden stuff
+        s.defaultWriteObject();
+
+        // Write out all elements in the proper order.
+        for (Node p = first(); p != null; p = p.getNext()) {
+            Object item = p.getItem();
+            if (item != null)
+                s.writeObject(item);
+        }
+
+        // Use trailing null as sentinel
+        s.writeObject(null);
+    }
+
+    /**
+     * Reconstitute the Queue instance from a stream (that is,
+     * deserialize it).
+     * @param s the stream
+     */
+    private void readObject(java.io.ObjectInputStream s)
+        throws java.io.IOException, ClassNotFoundException {
+        // Read in capacity, and any hidden stuff
+        s.defaultReadObject();
+
+        head = new Node(null, null);
+        tail = head;
+        // Read in all elements and place in queue
+        for (;;) {
+            Object item = s.readObject();
+            if (item == null)
+                break;
+            else
+                offer(item);
+        }
+    }
+
+    private static class SerializableLock implements Serializable {}
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ConcurrentMap.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ConcurrentMap.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ConcurrentMap.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,132 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+import java.util.Map;
+
+/**
+ * A {@link java.util.Map} providing additional atomic
+ * <tt>putIfAbsent</tt>, <tt>remove</tt>, and <tt>replace</tt> methods.
+ *
+ * <p>Memory consistency effects: As with other concurrent
+ * collections, actions in a thread prior to placing an object into a
+ * {@code ConcurrentMap} as a key or value
+ * <a href="package-summary.html#MemoryVisibility"><i>happen-before</i></a>
+ * actions subsequent to the access or removal of that object from
+ * the {@code ConcurrentMap} in another thread.
+ *
+ * <p>This interface is a member of the
+ * <a href="{@docRoot}/../guide/collections/index.html">
+ * Java Collections Framework</a>.
+ *
+ * @since 1.5
+ * @author Doug Lea
+ */
+public interface ConcurrentMap extends Map {
+    /**
+     * If the specified key is not already associated
+     * with a value, associate it with the given value.
+     * This is equivalent to
+     * <pre>
+     *   if (!map.containsKey(key))
+     *       return map.put(key, value);
+     *   else
+     *       return map.get(key);</pre>
+     * except that the action is performed atomically.
+     *
+     * @param key key with which the specified value is to be associated
+     * @param value value to be associated with the specified key
+     * @return the previous value associated with the specified key, or
+     *         <tt>null</tt> if there was no mapping for the key.
+     *         (A <tt>null</tt> return can also indicate that the map
+     *         previously associated <tt>null</tt> with the key,
+     *         if the implementation supports null values.)
+     * @throws UnsupportedOperationException if the <tt>put</tt> operation
+     *         is not supported by this map
+     * @throws ClassCastException if the class of the specified key or value
+     *         prevents it from being stored in this map
+     * @throws NullPointerException if the specified key or value is null,
+     *         and this map does not permit null keys or values
+     * @throws IllegalArgumentException if some property of the specified key
+     *         or value prevents it from being stored in this map
+     *
+     */
+    Object putIfAbsent(Object key, Object value);
+
+    /**
+     * Removes the entry for a key only if currently mapped to a given value.
+     * This is equivalent to
+     * <pre>
+     *   if (map.containsKey(key) &amp;&amp; map.get(key).equals(value)) {
+     *       map.remove(key);
+     *       return true;
+     *   } else return false;</pre>
+     * except that the action is performed atomically.
+     *
+     * @param key key with which the specified value is associated
+     * @param value value expected to be associated with the specified key
+     * @return <tt>true</tt> if the value was removed
+     * @throws UnsupportedOperationException if the <tt>remove</tt> operation
+     *         is not supported by this map
+     * @throws ClassCastException if the key or value is of an inappropriate
+     *         type for this map (optional)
+     * @throws NullPointerException if the specified key or value is null,
+     *         and this map does not permit null keys or values (optional)
+     */
+    boolean remove(Object key, Object value);
+
+    /**
+     * Replaces the entry for a key only if currently mapped to a given value.
+     * This is equivalent to
+     * <pre>
+     *   if (map.containsKey(key) &amp;&amp; map.get(key).equals(oldValue)) {
+     *       map.put(key, newValue);
+     *       return true;
+     *   } else return false;</pre>
+     * except that the action is performed atomically.
+     *
+     * @param key key with which the specified value is associated
+     * @param oldValue value expected to be associated with the specified key
+     * @param newValue value to be associated with the specified key
+     * @return <tt>true</tt> if the value was replaced
+     * @throws UnsupportedOperationException if the <tt>put</tt> operation
+     *         is not supported by this map
+     * @throws ClassCastException if the class of a specified key or value
+     *         prevents it from being stored in this map
+     * @throws NullPointerException if a specified key or value is null,
+     *         and this map does not permit null keys or values
+     * @throws IllegalArgumentException if some property of a specified key
+     *         or value prevents it from being stored in this map
+     */
+    boolean replace(Object key, Object oldValue, Object newValue);
+
+    /**
+     * Replaces the entry for a key only if currently mapped to some value.
+     * This is equivalent to
+     * <pre>
+     *   if (map.containsKey(key)) {
+     *       return map.put(key, value);
+     *   } else return null;</pre>
+     * except that the action is performed atomically.
+     *
+     * @param key key with which the specified value is associated
+     * @param value value to be associated with the specified key
+     * @return the previous value associated with the specified key, or
+     *         <tt>null</tt> if there was no mapping for the key.
+     *         (A <tt>null</tt> return can also indicate that the map
+     *         previously associated <tt>null</tt> with the key,
+     *         if the implementation supports null values.)
+     * @throws UnsupportedOperationException if the <tt>put</tt> operation
+     *         is not supported by this map
+     * @throws ClassCastException if the class of the specified key or value
+     *         prevents it from being stored in this map
+     * @throws NullPointerException if the specified key or value is null,
+     *         and this map does not permit null keys or values
+     * @throws IllegalArgumentException if some property of the specified key
+     *         or value prevents it from being stored in this map
+     */
+    Object replace(Object key, Object value);
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ConcurrentNavigableMap.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ConcurrentNavigableMap.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ConcurrentNavigableMap.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,149 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+
+import edu.emory.mathcs.backport.java.util.*;
+import java.util.Set;
+import java.util.SortedMap;
+
+/**
+ * A {@link ConcurrentMap} supporting {@link NavigableMap} operations,
+ * and recursively so for its navigable sub-maps.
+ *
+ * <p>This interface is a member of the
+ * <a href="{@docRoot}/../technotes/guides/collections/index.html">
+ * Java Collections Framework</a>.
+ *
+ * @author Doug Lea
+ * @since 1.6
+ */
+public interface ConcurrentNavigableMap
+    extends ConcurrentMap, NavigableMap
+{
+    /**
+     * @throws ClassCastException       {@inheritDoc}
+     * @throws NullPointerException     {@inheritDoc}
+     * @throws IllegalArgumentException {@inheritDoc}
+     */
+    NavigableMap subMap(Object fromKey, boolean fromInclusive,
+                        Object toKey,   boolean toInclusive);
+
+    /**
+     * @throws ClassCastException       {@inheritDoc}
+     * @throws NullPointerException     {@inheritDoc}
+     * @throws IllegalArgumentException {@inheritDoc}
+     */
+    NavigableMap headMap(Object toKey, boolean inclusive);
+
+
+    /**
+     * @throws ClassCastException       {@inheritDoc}
+     * @throws NullPointerException     {@inheritDoc}
+     * @throws IllegalArgumentException {@inheritDoc}
+     */
+    NavigableMap tailMap(Object fromKey, boolean inclusive);
+
+    /**
+     * @throws ClassCastException       {@inheritDoc}
+     * @throws NullPointerException     {@inheritDoc}
+     * @throws IllegalArgumentException {@inheritDoc}
+     */
+    SortedMap subMap(Object fromKey, Object toKey);
+
+    /**
+     * @throws ClassCastException       {@inheritDoc}
+     * @throws NullPointerException     {@inheritDoc}
+     * @throws IllegalArgumentException {@inheritDoc}
+     */
+    SortedMap headMap(Object toKey);
+
+    /**
+     * @throws ClassCastException       {@inheritDoc}
+     * @throws NullPointerException     {@inheritDoc}
+     * @throws IllegalArgumentException {@inheritDoc}
+     */
+    SortedMap tailMap(Object fromKey);
+
+    /**
+     * Returns a reverse order view of the mappings contained in this map.
+     * The descending map is backed by this map, so changes to the map are
+     * reflected in the descending map, and vice-versa.
+     *
+     * <p>The returned map has an ordering equivalent to
+     * <tt>{@link Collections#reverseOrder(Comparator) Collections.reverseOrder}(comparator())</tt>.
+     * The expression {@code m.descendingMap().descendingMap()} returns a
+     * view of {@code m} essentially equivalent to {@code m}.
+     *
+     * @return a reverse order view of this map
+     */
+    NavigableMap descendingMap();
+
+    /**
+     * Returns a {@link NavigableSet} view of the keys contained in this map.
+     * The set's iterator returns the keys in ascending order.
+     * The set is backed by the map, so changes to the map are
+     * reflected in the set, and vice-versa.  The set supports element
+     * removal, which removes the corresponding mapping from the map,
+     * via the {@code Iterator.remove}, {@code Set.remove},
+     * {@code removeAll}, {@code retainAll}, and {@code clear}
+     * operations.  It does not support the {@code add} or {@code addAll}
+     * operations.
+     *
+     * <p>The view's {@code iterator} is a "weakly consistent" iterator
+     * that will never throw {@link java.util.ConcurrentModificationException},
+     * and guarantees to traverse elements as they existed upon
+     * construction of the iterator, and may (but is not guaranteed to)
+     * reflect any modifications subsequent to construction.
+     *
+     * @return a navigable set view of the keys in this map
+     */
+    public NavigableSet navigableKeySet();
+
+    /**
+     * Returns a {@link NavigableSet} view of the keys contained in this map.
+     * The set's iterator returns the keys in ascending order.
+     * The set is backed by the map, so changes to the map are
+     * reflected in the set, and vice-versa.  The set supports element
+     * removal, which removes the corresponding mapping from the map,
+     * via the {@code Iterator.remove}, {@code Set.remove},
+     * {@code removeAll}, {@code retainAll}, and {@code clear}
+     * operations.  It does not support the {@code add} or {@code addAll}
+     * operations.
+     *
+     * <p>The view's {@code iterator} is a "weakly consistent" iterator
+     * that will never throw {@link java.util.ConcurrentModificationException},
+     * and guarantees to traverse elements as they existed upon
+     * construction of the iterator, and may (but is not guaranteed to)
+     * reflect any modifications subsequent to construction.
+     *
+     * <p>This method is equivalent to method {@code navigableKeySet}.
+     *
+     * @return a navigable set view of the keys in this map
+     */
+    public Set keySet();
+
+    /**
+     * Returns a reverse order {@link NavigableSet} view of the keys contained in this map.
+     * The set's iterator returns the keys in descending order.
+     * The set is backed by the map, so changes to the map are
+     * reflected in the set, and vice-versa.  The set supports element
+     * removal, which removes the corresponding mapping from the map,
+     * via the {@code Iterator.remove}, {@code Set.remove},
+     * {@code removeAll}, {@code retainAll}, and {@code clear}
+     * operations.  It does not support the {@code add} or {@code addAll}
+     * operations.
+     *
+     * <p>The view's {@code iterator} is a "weakly consistent" iterator
+     * that will never throw {@link java.util.ConcurrentModificationException},
+     * and guarantees to traverse elements as they existed upon
+     * construction of the iterator, and may (but is not guaranteed to)
+     * reflect any modifications subsequent to construction.
+     *
+     * @return a reverse order navigable set view of the keys in this map
+     */
+    public NavigableSet descendingKeySet();
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ConcurrentSkipListMap.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ConcurrentSkipListMap.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ConcurrentSkipListMap.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,3115 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.atomic.*;
+import java.util.Random;
+import java.util.Comparator;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.Collection;
+import java.util.Set;
+import java.util.Iterator;
+import java.util.ArrayList;
+import java.util.NoSuchElementException;
+import java.util.SortedSet;
+
+/**
+ * A scalable concurrent {@link ConcurrentNavigableMap} implementation.
+ * The map is sorted according to the {@linkplain Comparable natural
+ * ordering} of its keys, or by a {@link Comparator} provided at map
+ * creation time, depending on which constructor is used.
+ *
+ * <p>This class implements a concurrent variant of <a
+ * href="http://www.cs.umd.edu/~pugh/">SkipLists</a> providing
+ * expected average <i>log(n)</i> time cost for the
+ * <tt>containsKey</tt>, <tt>get</tt>, <tt>put</tt> and
+ * <tt>remove</tt> operations and their variants.  Insertion, removal,
+ * update, and access operations safely execute concurrently by
+ * multiple threads.  Iterators are <i>weakly consistent</i>, returning
+ * elements reflecting the state of the map at some point at or since
+ * the creation of the iterator.  They do <em>not</em> throw {@link
+ * java.util.ConcurrentModificationException}, and may proceed concurrently with
+ * other operations. Ascending key ordered views and their iterators
+ * are faster than descending ones.
+ *
+ * <p>All <tt>Map.Entry</tt> pairs returned by methods in this class
+ * and its views represent snapshots of mappings at the time they were
+ * produced. They do <em>not</em> support the <tt>Entry.setValue</tt>
+ * method. (Note however that it is possible to change mappings in the
+ * associated map using <tt>put</tt>, <tt>putIfAbsent</tt>, or
+ * <tt>replace</tt>, depending on exactly which effect you need.)
+ *
+ * <p>Beware that, unlike in most collections, the <tt>size</tt>
+ * method is <em>not</em> a constant-time operation. Because of the
+ * asynchronous nature of these maps, determining the current number
+ * of elements requires a traversal of the elements.  Additionally,
+ * the bulk operations <tt>putAll</tt>, <tt>equals</tt>, and
+ * <tt>clear</tt> are <em>not</em> guaranteed to be performed
+ * atomically. For example, an iterator operating concurrently with a
+ * <tt>putAll</tt> operation might view only some of the added
+ * elements.
+ *
+ * <p>This class and its views and iterators implement all of the
+ * <em>optional</em> methods of the {@link Map} and {@link Iterator}
+ * interfaces. Like most other concurrent collections, this class does
+ * <em>not</em> permit the use of <tt>null</tt> keys or values because some
+ * null return values cannot be reliably distinguished from the absence of
+ * elements.
+ *
+ * <p>This class is a member of the
+ * <a href="{@docRoot}/../technotes/guides/collections/index.html">
+ * Java Collections Framework</a>.
+ *
+ * @author Doug Lea
+ * @since 1.6
+ */
+public class ConcurrentSkipListMap extends AbstractMap
+    implements ConcurrentNavigableMap,
+               Cloneable,
+               java.io.Serializable {
+    /*
+     * This class implements a tree-like two-dimensionally linked skip
+     * list in which the index levels are represented in separate
+     * nodes from the base nodes holding data.  There are two reasons
+     * for taking this approach instead of the usual array-based
+     * structure: 1) Array based implementations seem to encounter
+     * more complexity and overhead 2) We can use cheaper algorithms
+     * for the heavily-traversed index lists than can be used for the
+     * base lists.  Here's a picture of some of the basics for a
+     * possible list with 2 levels of index:
+     *
+     * Head nodes          Index nodes
+     * +-+    right        +-+                      +-+
+     * |2|---------------->| |--------------------->| |->null
+     * +-+                 +-+                      +-+
+     *  | down              |                        |
+     *  v                   v                        v
+     * +-+            +-+  +-+       +-+            +-+       +-+
+     * |1|----------->| |->| |------>| |----------->| |------>| |->null
+     * +-+            +-+  +-+       +-+            +-+       +-+
+     *  v              |    |         |              |         |
+     * Nodes  next     v    v         v              v         v
+     * +-+  +-+  +-+  +-+  +-+  +-+  +-+  +-+  +-+  +-+  +-+  +-+
+     * | |->|A|->|B|->|C|->|D|->|E|->|F|->|G|->|H|->|I|->|J|->|K|->null
+     * +-+  +-+  +-+  +-+  +-+  +-+  +-+  +-+  +-+  +-+  +-+  +-+
+     *
+     * The base lists use a variant of the HM linked ordered set
+     * algorithm. See Tim Harris, "A pragmatic implementation of
+     * non-blocking linked lists"
+     * http://www.cl.cam.ac.uk/~tlh20/publications.html and Maged
+     * Michael "High Performance Dynamic Lock-Free Hash Tables and
+     * List-Based Sets"
+     * http://www.research.ibm.com/people/m/michael/pubs.htm.  The
+     * basic idea in these lists is to mark the "next" pointers of
+     * deleted nodes when deleting to avoid conflicts with concurrent
+     * insertions, and when traversing to keep track of triples
+     * (predecessor, node, successor) in order to detect when and how
+     * to unlink these deleted nodes.
+     *
+     * Rather than using mark-bits to mark list deletions (which can
+     * be slow and space-intensive using AtomicMarkedReference), nodes
+     * use direct CAS'able next pointers.  On deletion, instead of
+     * marking a pointer, they splice in another node that can be
+     * thought of as standing for a marked pointer (indicating this by
+     * using otherwise impossible field values).  Using plain nodes
+     * acts roughly like "boxed" implementations of marked pointers,
+     * but uses new nodes only when nodes are deleted, not for every
+     * link.  This requires less space and supports faster
+     * traversal. Even if marked references were better supported by
+     * JVMs, traversal using this technique might still be faster
+     * because any search need only read ahead one more node than
+     * otherwise required (to check for trailing marker) rather than
+     * unmasking mark bits or whatever on each read.
+     *
+     * This approach maintains the essential property needed in the HM
+     * algorithm of changing the next-pointer of a deleted node so
+     * that any other CAS of it will fail, but implements the idea by
+     * changing the pointer to point to a different node, not by
+     * marking it.  While it would be possible to further squeeze
+     * space by defining marker nodes not to have key/value fields, it
+     * isn't worth the extra type-testing overhead.  The deletion
+     * markers are rarely encountered during traversal and are
+     * normally quickly garbage collected. (Note that this technique
+     * would not work well in systems without garbage collection.)
+     *
+     * In addition to using deletion markers, the lists also use
+     * nullness of value fields to indicate deletion, in a style
+     * similar to typical lazy-deletion schemes.  If a node's value is
+     * null, then it is considered logically deleted and ignored even
+     * though it is still reachable. This maintains proper control of
+     * concurrent replace vs delete operations -- an attempted replace
+     * must fail if a delete beat it by nulling field, and a delete
+     * must return the last non-null value held in the field. (Note:
+     * Null, rather than some special marker, is used for value fields
+     * here because it just so happens to mesh with the Map API
+     * requirement that method get returns null if there is no
+     * mapping, which allows nodes to remain concurrently readable
+     * even when deleted. Using any other marker value here would be
+     * messy at best.)
+     *
+     * Here's the sequence of events for a deletion of node n with
+     * predecessor b and successor f, initially:
+     *
+     *        +------+       +------+      +------+
+     *   ...  |   b  |------>|   n  |----->|   f  | ...
+     *        +------+       +------+      +------+
+     *
+     * 1. CAS n's value field from non-null to null.
+     *    From this point on, no public operations encountering
+     *    the node consider this mapping to exist. However, other
+     *    ongoing insertions and deletions might still modify
+     *    n's next pointer.
+     *
+     * 2. CAS n's next pointer to point to a new marker node.
+     *    From this point on, no other nodes can be appended to n.
+     *    which avoids deletion errors in CAS-based linked lists.
+     *
+     *        +------+       +------+      +------+       +------+
+     *   ...  |   b  |------>|   n  |----->|marker|------>|   f  | ...
+     *        +------+       +------+      +------+       +------+
+     *
+     * 3. CAS b's next pointer over both n and its marker.
+     *    From this point on, no new traversals will encounter n,
+     *    and it can eventually be GCed.
+     *        +------+                                    +------+
+     *   ...  |   b  |----------------------------------->|   f  | ...
+     *        +------+                                    +------+
+     *
+     * A failure at step 1 leads to simple retry due to a lost race
+     * with another operation. Steps 2-3 can fail because some other
+     * thread noticed during a traversal a node with null value and
+     * helped out by marking and/or unlinking.  This helping-out
+     * ensures that no thread can become stuck waiting for progress of
+     * the deleting thread.  The use of marker nodes slightly
+     * complicates helping-out code because traversals must track
+     * consistent reads of up to four nodes (b, n, marker, f), not
+     * just (b, n, f), although the next field of a marker is
+     * immutable, and once a next field is CAS'ed to point to a
+     * marker, it never again changes, so this requires less care.
+     *
+     * Skip lists add indexing to this scheme, so that the base-level
+     * traversals start close to the locations being found, inserted
+     * or deleted -- usually base level traversals only traverse a few
+     * nodes. This doesn't change the basic algorithm except for the
+     * need to make sure base traversals start at predecessors (here,
+     * b) that are not (structurally) deleted, otherwise retrying
+     * after processing the deletion.
+     *
+     * Index levels are maintained as lists with volatile next fields,
+     * using CAS to link and unlink.  Races are allowed in index-list
+     * operations that can (rarely) fail to link in a new index node
+     * or delete one. (We can't do this of course for data nodes.)
+     * However, even when this happens, the index lists remain sorted,
+     * so correctly serve as indices.  This can impact performance,
+     * but since skip lists are probabilistic anyway, the net result
+     * is that under contention, the effective "p" value may be lower
+     * than its nominal value. And race windows are kept small enough
+     * that in practice these failures are rare, even under a lot of
+     * contention.
+     *
+     * The fact that retries (for both base and index lists) are
+     * relatively cheap due to indexing allows some minor
+     * simplifications of retry logic. Traversal restarts are
+     * performed after most "helping-out" CASes. This isn't always
+     * strictly necessary, but the implicit backoffs tend to help
+     * reduce other downstream failed CAS's enough to outweigh restart
+     * cost.  This worsens the worst case, but seems to improve even
+     * highly contended cases.
+     *
+     * Unlike most skip-list implementations, index insertion and
+     * deletion here require a separate traversal pass occuring after
+     * the base-level action, to add or remove index nodes.  This adds
+     * to single-threaded overhead, but improves contended
+     * multithreaded performance by narrowing interference windows,
+     * and allows deletion to ensure that all index nodes will be made
+     * unreachable upon return from a public remove operation, thus
+     * avoiding unwanted garbage retention. This is more important
+     * here than in some other data structures because we cannot null
+     * out node fields referencing user keys since they might still be
+     * read by other ongoing traversals.
+     *
+     * Indexing uses skip list parameters that maintain good search
+     * performance while using sparser-than-usual indices: The
+     * hardwired parameters k=1, p=0.5 (see method randomLevel) mean
+     * that about one-quarter of the nodes have indices. Of those that
+     * do, half have one level, a quarter have two, and so on (see
+     * Pugh's Skip List Cookbook, sec 3.4).  The expected total space
+     * requirement for a map is slightly less than for the current
+     * implementation of edu.emory.mathcs.backport.java.util.TreeMap.
+     *
+     * Changing the level of the index (i.e, the height of the
+     * tree-like structure) also uses CAS. The head index has initial
+     * level/height of one. Creation of an index with height greater
+     * than the current level adds a level to the head index by
+     * CAS'ing on a new top-most head. To maintain good performance
+     * after a lot of removals, deletion methods heuristically try to
+     * reduce the height if the topmost levels appear to be empty.
+     * This may encounter races in which it possible (but rare) to
+     * reduce and "lose" a level just as it is about to contain an
+     * index (that will then never be encountered). This does no
+     * structural harm, and in practice appears to be a better option
+     * than allowing unrestrained growth of levels.
+     *
+     * The code for all this is more verbose than you'd like. Most
+     * operations entail locating an element (or position to insert an
+     * element). The code to do this can't be nicely factored out
+     * because subsequent uses require a snapshot of predecessor
+     * and/or successor and/or value fields which can't be returned
+     * all at once, at least not without creating yet another object
+     * to hold them -- creating such little objects is an especially
+     * bad idea for basic internal search operations because it adds
+     * to GC overhead.  (This is one of the few times I've wished Java
+     * had macros.) Instead, some traversal code is interleaved within
+     * insertion and removal operations.  The control logic to handle
+     * all the retry conditions is sometimes twisty. Most search is
+     * broken into 2 parts. findPredecessor() searches index nodes
+     * only, returning a base-level predecessor of the key. findNode()
+     * finishes out the base-level search. Even with this factoring,
+     * there is a fair amount of near-duplication of code to handle
+     * variants.
+     *
+     * For explanation of algorithms sharing at least a couple of
+     * features with this one, see Mikhail Fomitchev's thesis
+     * (http://www.cs.yorku.ca/~mikhail/), Keir Fraser's thesis
+     * (http://www.cl.cam.ac.uk/users/kaf24/), and Hakan Sundell's
+     * thesis (http://www.cs.chalmers.se/~phs/).
+     *
+     * Given the use of tree-like index nodes, you might wonder why
+     * this doesn't use some kind of search tree instead, which would
+     * support somewhat faster search operations. The reason is that
+     * there are no known efficient lock-free insertion and deletion
+     * algorithms for search trees. The immutability of the "down"
+     * links of index nodes (as opposed to mutable "left" fields in
+     * true trees) makes this tractable using only CAS operations.
+     *
+     * Notation guide for local variables
+     * Node:         b, n, f    for  predecessor, node, successor
+     * Index:        q, r, d    for index node, right, down.
+     *               t          for another index node
+     * Head:         h
+     * Levels:       j
+     * Keys:         k, key
+     * Values:       v, value
+     * Comparisons:  c
+     */
+
+    private static final long serialVersionUID = -8627078645895051609L;
+
+    /**
+     * Generates the initial random seed for the cheaper per-instance
+     * random number generators used in randomLevel.
+     */
+    private static final Random seedGenerator = new Random();
+
+    /**
+     * Special value used to identify base-level header
+     */
+    private static final Object BASE_HEADER = new Object();
+
+    /**
+     * The topmost head index of the skiplist.
+     */
+    private transient volatile HeadIndex head;
+
+    /**
+     * The comparator used to maintain order in this map, or null
+     * if using natural ordering.
+     * @serial
+     */
+    private final Comparator comparator;
+
+    /**
+     * Seed for simple random number generator.  Not volatile since it
+     * doesn't matter too much if different threads don't see updates.
+     */
+    private transient int randomSeed;
+
+    /** Lazily initialized key set */
+    private transient KeySet keySet;
+    /** Lazily initialized entry set */
+    private transient EntrySet entrySet;
+    /** Lazily initialized values collection */
+    private transient Values values;
+    /** Lazily initialized descending key set */
+    private transient ConcurrentNavigableMap descendingMap;
+
+    /**
+     * Initializes or resets state. Needed by constructors, clone,
+     * clear, readObject. and ConcurrentSkipListSet.clone.
+     * (Note that comparator must be separately initialized.)
+     */
+    final void initialize() {
+        keySet = null;
+        entrySet = null;
+        values = null;
+        descendingMap = null;
+        randomSeed = seedGenerator.nextInt() | 0x0100; // ensure nonzero
+        head = new HeadIndex(new Node(null, BASE_HEADER, null),
+                                  null, null, 1);
+    }
+
+    /**
+     * compareAndSet head node
+     */
+    private synchronized boolean casHead(HeadIndex cmp, HeadIndex val) {
+        if (head == cmp) {
+            head = val;
+            return true;
+        }
+        else {
+            return false;
+        }
+    }
+
+    /* ---------------- Nodes -------------- */
+
+    /**
+     * Nodes hold keys and values, and are singly linked in sorted
+     * order, possibly with some intervening marker nodes. The list is
+     * headed by a dummy node accessible as head.node. The value field
+     * is declared only as Object because it takes special non-V
+     * values for marker and header nodes.
+     */
+    static final class Node {
+        final Object key;
+        volatile Object value;
+        volatile Node next;
+
+        /**
+         * Creates a new regular node.
+         */
+        Node(Object key, Object value, Node next) {
+            this.key = key;
+            this.value = value;
+            this.next = next;
+        }
+
+        /**
+         * Creates a new marker node. A marker is distinguished by
+         * having its value field point to itself.  Marker nodes also
+         * have null keys, a fact that is exploited in a few places,
+         * but this doesn't distinguish markers from the base-level
+         * header node (head.node), which also has a null key.
+         */
+        Node(Node next) {
+            this.key = null;
+            this.value = this;
+            this.next = next;
+        }
+
+        /**
+         * compareAndSet value field
+         */
+        synchronized boolean casValue(Object cmp, Object val) {
+            if (value == cmp) {
+                value = val;
+                return true;
+            }
+            else {
+                return false;
+            }
+        }
+
+        /**
+         * compareAndSet next field
+         */
+        synchronized boolean casNext(Node cmp, Node val) {
+            if (next == cmp) {
+                next = val;
+                return true;
+            }
+            else {
+                return false;
+            }
+        }
+
+        /**
+         * Returns true if this node is a marker. This method isn't
+         * actually called in any current code checking for markers
+         * because callers will have already read value field and need
+         * to use that read (not another done here) and so directly
+         * test if value points to node.
+         * @param n a possibly null reference to a node
+         * @return true if this node is a marker node
+         */
+        boolean isMarker() {
+            return value == this;
+        }
+
+        /**
+         * Returns true if this node is the header of base-level list.
+         * @return true if this node is header node
+         */
+        boolean isBaseHeader() {
+            return value == BASE_HEADER;
+        }
+
+        /**
+         * Tries to append a deletion marker to this node.
+         * @param f the assumed current successor of this node
+         * @return true if successful
+         */
+        boolean appendMarker(Node f) {
+            return casNext(f, new Node(f));
+        }
+
+        /**
+         * Helps out a deletion by appending marker or unlinking from
+         * predecessor. This is called during traversals when value
+         * field seen to be null.
+         * @param b predecessor
+         * @param f successor
+         */
+        void helpDelete(Node b, Node f) {
+            /*
+             * Rechecking links and then doing only one of the
+             * help-out stages per call tends to minimize CAS
+             * interference among helping threads.
+             */
+            if (f == next && this == b.next) {
+                if (f == null || f.value != f) // not already marked
+                    appendMarker(f);
+                else
+                    b.casNext(this, f.next);
+            }
+        }
+
+        /**
+         * Returns value if this node contains a valid key-value pair,
+         * else null.
+         * @return this node's value if it isn't a marker or header or
+         * is deleted, else null.
+         */
+        Object getValidValue() {
+            Object v = value;
+            if (v == this || v == BASE_HEADER)
+                return null;
+            return v;
+        }
+
+        /**
+         * Creates and returns a new SimpleImmutableEntry holding current
+         * mapping if this node holds a valid value, else null.
+         * @return new entry or null
+         */
+        AbstractMap.SimpleImmutableEntry createSnapshot() {
+            Object v = getValidValue();
+            if (v == null)
+                return null;
+            return new AbstractMap.SimpleImmutableEntry(key, v);
+        }
+    }
+
+    /* ---------------- Indexing -------------- */
+
+    /**
+     * Index nodes represent the levels of the skip list.  Note that
+     * even though both Nodes and Indexes have forward-pointing
+     * fields, they have different types and are handled in different
+     * ways, that can't nicely be captured by placing field in a
+     * shared abstract class.
+     */
+    static class Index {
+        final Node node;
+        final Index down;
+        volatile Index right;
+
+        /**
+         * Creates index node with given values.
+         */
+        Index(Node node, Index down, Index right) {
+            this.node = node;
+            this.down = down;
+            this.right = right;
+        }
+
+        /**
+         * compareAndSet right field
+         */
+        final synchronized boolean casRight(Index cmp, Index val) {
+            if (right == cmp) {
+                right = val;
+                return true;
+            }
+            return false;
+        }
+        /**
+         * Returns true if the node this indexes has been deleted.
+         * @return true if indexed node is known to be deleted
+         */
+        final boolean indexesDeletedNode() {
+            return node.value == null;
+        }
+
+        /**
+         * Tries to CAS newSucc as successor.  To minimize races with
+         * unlink that may lose this index node, if the node being
+         * indexed is known to be deleted, it doesn't try to link in.
+         * @param succ the expected current successor
+         * @param newSucc the new successor
+         * @return true if successful
+         */
+        final boolean link(Index succ, Index newSucc) {
+            Node n = node;
+            newSucc.right = succ;
+            return n.value != null && casRight(succ, newSucc);
+        }
+
+        /**
+         * Tries to CAS right field to skip over apparent successor
+         * succ.  Fails (forcing a retraversal by caller) if this node
+         * is known to be deleted.
+         * @param succ the expected current successor
+         * @return true if successful
+         */
+        final boolean unlink(Index succ) {
+            return !indexesDeletedNode() && casRight(succ, succ.right);
+        }
+    }
+
+    /* ---------------- Head nodes -------------- */
+
+    /**
+     * Nodes heading each level keep track of their level.
+     */
+    static final class HeadIndex extends Index {
+        final int level;
+        HeadIndex(Node node, Index down, Index right, int level) {
+            super(node, down, right);
+            this.level = level;
+        }
+    }
+
+    /* ---------------- Comparison utilities -------------- */
+
+    /**
+     * Represents a key with a comparator as a Comparable.
+     *
+     * Because most sorted collections seem to use natural ordering on
+     * Comparables (Strings, Integers, etc), most internal methods are
+     * geared to use them. This is generally faster than checking
+     * per-comparison whether to use comparator or comparable because
+     * it doesn't require a (Comparable) cast for each comparison.
+     * (Optimizers can only sometimes remove such redundant checks
+     * themselves.) When Comparators are used,
+     * ComparableUsingComparators are created so that they act in the
+     * same way as natural orderings. This penalizes use of
+     * Comparators vs Comparables, which seems like the right
+     * tradeoff.
+     */
+    static final class ComparableUsingComparator implements Comparable {
+        final Object actualKey;
+        final Comparator cmp;
+        ComparableUsingComparator(Object key, Comparator cmp) {
+            this.actualKey = key;
+            this.cmp = cmp;
+        }
+        public int compareTo(Object k2) {
+            return cmp.compare(actualKey, k2);
+        }
+    }
+
+    /**
+     * If using comparator, return a ComparableUsingComparator, else
+     * cast key as Comparable, which may cause ClassCastException,
+     * which is propagated back to caller.
+     */
+    private Comparable comparable(Object key) throws ClassCastException {
+        if (key == null)
+            throw new NullPointerException();
+        if (comparator != null)
+            return new ComparableUsingComparator(key, comparator);
+        else
+            return (Comparable)key;
+    }
+
+    /**
+     * Compares using comparator or natural ordering. Used when the
+     * ComparableUsingComparator approach doesn't apply.
+     */
+    int compare(Object k1, Object k2) throws ClassCastException {
+        Comparator cmp = comparator;
+        if (cmp != null)
+            return cmp.compare(k1, k2);
+        else
+            return ((Comparable)k1).compareTo(k2);
+    }
+
+    /**
+     * Returns true if given key greater than or equal to least and
+     * strictly less than fence, bypassing either test if least or
+     * fence are null. Needed mainly in submap operations.
+     */
+    boolean inHalfOpenRange(Object key, Object least, Object fence) {
+        if (key == null)
+            throw new NullPointerException();
+        return ((least == null || compare(key, least) >= 0) &&
+                (fence == null || compare(key, fence) <  0));
+    }
+
+    /**
+     * Returns true if given key greater than or equal to least and less
+     * or equal to fence. Needed mainly in submap operations.
+     */
+    boolean inOpenRange(Object key, Object least, Object fence) {
+        if (key == null)
+            throw new NullPointerException();
+        return ((least == null || compare(key, least) >= 0) &&
+                (fence == null || compare(key, fence) <= 0));
+    }
+
+    /* ---------------- Traversal -------------- */
+
+    /**
+     * Returns a base-level node with key strictly less than given key,
+     * or the base-level header if there is no such node.  Also
+     * unlinks indexes to deleted nodes found along the way.  Callers
+     * rely on this side-effect of clearing indices to deleted nodes.
+     * @param key the key
+     * @return a predecessor of key
+     */
+    private Node findPredecessor(Comparable key) {
+        if (key == null)
+            throw new NullPointerException(); // don't postpone errors
+        for (;;) {
+            Index q = head;
+            Index r = q.right;
+            for (;;) {
+                if (r != null) {
+                    Node n = r.node;
+                    Object k = n.key;
+                    if (n.value == null) {
+                        if (!q.unlink(r))
+                            break;           // restart
+                        r = q.right;         // reread r
+                        continue;
+                    }
+                    if (key.compareTo(k) > 0) {
+                        q = r;
+                        r = r.right;
+                        continue;
+                    }
+                }
+                Index d = q.down;
+                if (d != null) {
+                    q = d;
+                    r = d.right;
+                } else
+                    return q.node;
+            }
+        }
+    }
+
+    /**
+     * Returns node holding key or null if no such, clearing out any
+     * deleted nodes seen along the way.  Repeatedly traverses at
+     * base-level looking for key starting at predecessor returned
+     * from findPredecessor, processing base-level deletions as
+     * encountered. Some callers rely on this side-effect of clearing
+     * deleted nodes.
+     *
+     * Restarts occur, at traversal step centered on node n, if:
+     *
+     *   (1) After reading n's next field, n is no longer assumed
+     *       predecessor b's current successor, which means that
+     *       we don't have a consistent 3-node snapshot and so cannot
+     *       unlink any subsequent deleted nodes encountered.
+     *
+     *   (2) n's value field is null, indicating n is deleted, in
+     *       which case we help out an ongoing structural deletion
+     *       before retrying.  Even though there are cases where such
+     *       unlinking doesn't require restart, they aren't sorted out
+     *       here because doing so would not usually outweigh cost of
+     *       restarting.
+     *
+     *   (3) n is a marker or n's predecessor's value field is null,
+     *       indicating (among other possibilities) that
+     *       findPredecessor returned a deleted node. We can't unlink
+     *       the node because we don't know its predecessor, so rely
+     *       on another call to findPredecessor to notice and return
+     *       some earlier predecessor, which it will do. This check is
+     *       only strictly needed at beginning of loop, (and the
+     *       b.value check isn't strictly needed at all) but is done
+     *       each iteration to help avoid contention with other
+     *       threads by callers that will fail to be able to change
+     *       links, and so will retry anyway.
+     *
+     * The traversal loops in doPut, doRemove, and findNear all
+     * include the same three kinds of checks. And specialized
+     * versions appear in findFirst, and findLast and their
+     * variants. They can't easily share code because each uses the
+     * reads of fields held in locals occurring in the orders they
+     * were performed.
+     *
+     * @param key the key
+     * @return node holding key, or null if no such
+     */
+    private Node findNode(Comparable key) {
+        for (;;) {
+            Node b = findPredecessor(key);
+            Node n = b.next;
+            for (;;) {
+                if (n == null)
+                    return null;
+                Node f = n.next;
+                if (n != b.next)                // inconsistent read
+                    break;
+                Object v = n.value;
+                if (v == null) {                // n is deleted
+                    n.helpDelete(b, f);
+                    break;
+                }
+                if (v == n || b.value == null)  // b is deleted
+                    break;
+                int c = key.compareTo(n.key);
+                if (c == 0)
+                    return n;
+                if (c < 0)
+                    return null;
+                b = n;
+                n = f;
+            }
+        }
+    }
+
+    /**
+     * Specialized variant of findNode to perform Map.get. Does a weak
+     * traversal, not bothering to fix any deleted index nodes,
+     * returning early if it happens to see key in index, and passing
+     * over any deleted base nodes, falling back to getUsingFindNode
+     * only if it would otherwise return value from an ongoing
+     * deletion. Also uses "bound" to eliminate need for some
+     * comparisons (see Pugh Cookbook). Also folds uses of null checks
+     * and node-skipping because markers have null keys.
+     * @param okey the key
+     * @return the value, or null if absent
+     */
+    private Object doGet(Object okey) {
+        Comparable key = comparable(okey);
+        Node bound = null;
+        Index q = head;
+        Index r = q.right;
+        Node n;
+        Object k;
+        int c;
+        for (;;) {
+            Index d;
+            // Traverse rights
+            if (r != null && (n = r.node) != bound && (k = n.key) != null) {
+                if ((c = key.compareTo(k)) > 0) {
+                    q = r;
+                    r = r.right;
+                    continue;
+                } else if (c == 0) {
+                    Object v = n.value;
+                    return (v != null)? v : getUsingFindNode(key);
+                } else
+                    bound = n;
+            }
+
+            // Traverse down
+            if ((d = q.down) != null) {
+                q = d;
+                r = d.right;
+            } else
+                break;
+        }
+
+        // Traverse nexts
+        for (n = q.node.next;  n != null; n = n.next) {
+            if ((k = n.key) != null) {
+                if ((c = key.compareTo(k)) == 0) {
+                    Object v = n.value;
+                    return (v != null)? v : getUsingFindNode(key);
+                } else if (c < 0)
+                    break;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Performs map.get via findNode.  Used as a backup if doGet
+     * encounters an in-progress deletion.
+     * @param key the key
+     * @return the value, or null if absent
+     */
+    private Object getUsingFindNode(Comparable key) {
+        /*
+         * Loop needed here and elsewhere in case value field goes
+         * null just as it is about to be returned, in which case we
+         * lost a race with a deletion, so must retry.
+         */
+        for (;;) {
+            Node n = findNode(key);
+            if (n == null)
+                return null;
+            Object v = n.value;
+            if (v != null)
+                return v;
+        }
+    }
+
+    /* ---------------- Insertion -------------- */
+
+    /**
+     * Main insertion method.  Adds element if not present, or
+     * replaces value if present and onlyIfAbsent is false.
+     * @param kkey the key
+     * @param value  the value that must be associated with key
+     * @param onlyIfAbsent if should not insert if already present
+     * @return the old value, or null if newly inserted
+     */
+    private Object doPut(Object kkey, Object value, boolean onlyIfAbsent) {
+        Comparable key = comparable(kkey);
+        for (;;) {
+            Node b = findPredecessor(key);
+            Node n = b.next;
+            for (;;) {
+                if (n != null) {
+                    Node f = n.next;
+                    if (n != b.next)               // inconsistent read
+                        break;;
+                    Object v = n.value;
+                    if (v == null) {               // n is deleted
+                        n.helpDelete(b, f);
+                        break;
+                    }
+                    if (v == n || b.value == null) // b is deleted
+                        break;
+                    int c = key.compareTo(n.key);
+                    if (c > 0) {
+                        b = n;
+                        n = f;
+                        continue;
+                    }
+                    if (c == 0) {
+                        if (onlyIfAbsent || n.casValue(v, value))
+                            return v;
+                        else
+                            break; // restart if lost race to replace value
+                    }
+                    // else c < 0; fall through
+                }
+
+                Node z = new Node(kkey, value, n);
+                if (!b.casNext(n, z))
+                    break;         // restart if lost race to append to b
+                int level = randomLevel();
+                if (level > 0)
+                    insertIndex(z, level);
+                return null;
+            }
+        }
+    }
+
+    /**
+     * Returns a random level for inserting a new node.
+     * Hardwired to k=1, p=0.5, max 31 (see above and
+     * Pugh's "Skip List Cookbook", sec 3.4).
+     *
+     * This uses the simplest of the generators described in George
+     * Marsaglia's "Xorshift RNGs" paper.  This is not a high-quality
+     * generator but is acceptable here.
+     */
+    private int randomLevel() {
+        int x = randomSeed;
+        x ^= x << 13;
+        x ^= x >>> 17;
+        randomSeed = x ^= x << 5;
+        if ((x & 0x8001) != 0) // test highest and lowest bits
+            return 0;
+        int level = 1;
+        while (((x >>>= 1) & 1) != 0) ++level;
+        return level;
+    }
+
+    /**
+     * Creates and adds index nodes for the given node.
+     * @param z the node
+     * @param level the level of the index
+     */
+    private void insertIndex(Node z, int level) {
+        HeadIndex h = head;
+        int max = h.level;
+
+        if (level <= max) {
+            Index idx = null;
+            for (int i = 1; i <= level; ++i)
+                idx = new Index(z, idx, null);
+            addIndex(idx, h, level);
+
+        } else { // Add a new level
+            /*
+             * To reduce interference by other threads checking for
+             * empty levels in tryReduceLevel, new levels are added
+             * with initialized right pointers. Which in turn requires
+             * keeping levels in an array to access them while
+             * creating new head index nodes from the opposite
+             * direction.
+             */
+            level = max + 1;
+            Index[] idxs = (Index[])new Index[level+1];
+            Index idx = null;
+            for (int i = 1; i <= level; ++i)
+                idxs[i] = idx = new Index(z, idx, null);
+
+            HeadIndex oldh;
+            int k;
+            for (;;) {
+                oldh = head;
+                int oldLevel = oldh.level;
+                if (level <= oldLevel) { // lost race to add level
+                    k = level;
+                    break;
+                }
+                HeadIndex newh = oldh;
+                Node oldbase = oldh.node;
+                for (int j = oldLevel+1; j <= level; ++j)
+                    newh = new HeadIndex(oldbase, newh, idxs[j], j);
+                if (casHead(oldh, newh)) {
+                    k = oldLevel;
+                    break;
+                }
+            }
+            addIndex(idxs[k], oldh, k);
+        }
+    }
+
+    /**
+     * Adds given index nodes from given level down to 1.
+     * @param idx the topmost index node being inserted
+     * @param h the value of head to use to insert. This must be
+     * snapshotted by callers to provide correct insertion level
+     * @param indexLevel the level of the index
+     */
+    private void addIndex(Index idx, HeadIndex h, int indexLevel) {
+        // Track next level to insert in case of retries
+        int insertionLevel = indexLevel;
+        Comparable key = comparable(idx.node.key);
+        if (key == null) throw new NullPointerException();
+
+        // Similar to findPredecessor, but adding index nodes along
+        // path to key.
+        for (;;) {
+            int j = h.level;
+            Index q = h;
+            Index r = q.right;
+            Index t = idx;
+            for (;;) {
+                if (r != null) {
+                    Node n = r.node;
+                    // compare before deletion check avoids needing recheck
+                    int c = key.compareTo(n.key);
+                    if (n.value == null) {
+                        if (!q.unlink(r))
+                            break;
+                        r = q.right;
+                        continue;
+                    }
+                    if (c > 0) {
+                        q = r;
+                        r = r.right;
+                        continue;
+                    }
+                }
+
+                if (j == insertionLevel) {
+                    // Don't insert index if node already deleted
+                    if (t.indexesDeletedNode()) {
+                        findNode(key); // cleans up
+                        return;
+                    }
+                    if (!q.link(r, t))
+                        break; // restart
+                    if (--insertionLevel == 0) {
+                        // need final deletion check before return
+                        if (t.indexesDeletedNode())
+                            findNode(key);
+                        return;
+                    }
+                }
+
+                if (--j >= insertionLevel && j < indexLevel)
+                    t = t.down;
+                q = q.down;
+                r = q.right;
+            }
+        }
+    }
+
+    /* ---------------- Deletion -------------- */
+
+    /**
+     * Main deletion method. Locates node, nulls value, appends a
+     * deletion marker, unlinks predecessor, removes associated index
+     * nodes, and possibly reduces head index level.
+     *
+     * Index nodes are cleared out simply by calling findPredecessor.
+     * which unlinks indexes to deleted nodes found along path to key,
+     * which will include the indexes to this node.  This is done
+     * unconditionally. We can't check beforehand whether there are
+     * index nodes because it might be the case that some or all
+     * indexes hadn't been inserted yet for this node during initial
+     * search for it, and we'd like to ensure lack of garbage
+     * retention, so must call to be sure.
+     *
+     * @param okey the key
+     * @param value if non-null, the value that must be
+     * associated with key
+     * @return the node, or null if not found
+     */
+    final Object doRemove(Object okey, Object value) {
+        Comparable key = comparable(okey);
+        for (;;) {
+            Node b = findPredecessor(key);
+            Node n = b.next;
+            for (;;) {
+                if (n == null)
+                    return null;
+                Node f = n.next;
+                if (n != b.next)                    // inconsistent read
+                    break;
+                Object v = n.value;
+                if (v == null) {                    // n is deleted
+                    n.helpDelete(b, f);
+                    break;
+                }
+                if (v == n || b.value == null)      // b is deleted
+                    break;
+                int c = key.compareTo(n.key);
+                if (c < 0)
+                    return null;
+                if (c > 0) {
+                    b = n;
+                    n = f;
+                    continue;
+                }
+                if (value != null && !value.equals(v))
+                    return null;
+                if (!n.casValue(v, null))
+                    break;
+                if (!n.appendMarker(f) || !b.casNext(n, f))
+                    findNode(key);                  // Retry via findNode
+                else {
+                    findPredecessor(key);           // Clean index
+                    if (head.right == null)
+                        tryReduceLevel();
+                }
+                return v;
+            }
+        }
+    }
+
+    /**
+     * Possibly reduce head level if it has no nodes.  This method can
+     * (rarely) make mistakes, in which case levels can disappear even
+     * though they are about to contain index nodes. This impacts
+     * performance, not correctness.  To minimize mistakes as well as
+     * to reduce hysteresis, the level is reduced by one only if the
+     * topmost three levels look empty. Also, if the removed level
+     * looks non-empty after CAS, we try to change it back quick
+     * before anyone notices our mistake! (This trick works pretty
+     * well because this method will practically never make mistakes
+     * unless current thread stalls immediately before first CAS, in
+     * which case it is very unlikely to stall again immediately
+     * afterwards, so will recover.)
+     *
+     * We put up with all this rather than just let levels grow
+     * because otherwise, even a small map that has undergone a large
+     * number of insertions and removals will have a lot of levels,
+     * slowing down access more than would an occasional unwanted
+     * reduction.
+     */
+    private void tryReduceLevel() {
+        HeadIndex h = head;
+        HeadIndex d;
+        HeadIndex e;
+        if (h.level > 3 &&
+            (d = (HeadIndex)h.down) != null &&
+            (e = (HeadIndex)d.down) != null &&
+            e.right == null &&
+            d.right == null &&
+            h.right == null &&
+            casHead(h, d) && // try to set
+            h.right != null) // recheck
+            casHead(d, h);   // try to backout
+    }
+
+    /* ---------------- Finding and removing first element -------------- */
+
+    /**
+     * Specialized variant of findNode to get first valid node.
+     * @return first node or null if empty
+     */
+    Node findFirst() {
+        for (;;) {
+            Node b = head.node;
+            Node n = b.next;
+            if (n == null)
+                return null;
+            if (n.value != null)
+                return n;
+            n.helpDelete(b, n.next);
+        }
+    }
+
+    /**
+     * Removes first entry; returns its snapshot.
+     * @return null if empty, else snapshot of first entry
+     */
+    Map.Entry doRemoveFirstEntry() {
+        for (;;) {
+            Node b = head.node;
+            Node n = b.next;
+            if (n == null)
+                return null;
+            Node f = n.next;
+            if (n != b.next)
+                continue;
+            Object v = n.value;
+            if (v == null) {
+                n.helpDelete(b, f);
+                continue;
+            }
+            if (!n.casValue(v, null))
+                continue;
+            if (!n.appendMarker(f) || !b.casNext(n, f))
+                findFirst(); // retry
+            clearIndexToFirst();
+            return new AbstractMap.SimpleImmutableEntry(n.key, v);
+	}
+    }
+
+    /**
+     * Clears out index nodes associated with deleted first entry.
+     */
+    private void clearIndexToFirst() {
+        for (;;) {
+            Index q = head;
+            for (;;) {
+                Index r = q.right;
+                if (r != null && r.indexesDeletedNode() && !q.unlink(r))
+                    break;
+                if ((q = q.down) == null) {
+                    if (head.right == null)
+                        tryReduceLevel();
+                    return;
+                }
+            }
+        }
+    }
+
+
+    /* ---------------- Finding and removing last element -------------- */
+
+    /**
+     * Specialized version of find to get last valid node.
+     * @return last node or null if empty
+     */
+    Node findLast() {
+        /*
+         * findPredecessor can't be used to traverse index level
+         * because this doesn't use comparisons.  So traversals of
+         * both levels are folded together.
+         */
+        Index q = head;
+        for (;;) {
+            Index d, r;
+            if ((r = q.right) != null) {
+                if (r.indexesDeletedNode()) {
+                    q.unlink(r);
+                    q = head; // restart
+                }
+                else
+                    q = r;
+            } else if ((d = q.down) != null) {
+                q = d;
+            } else {
+                Node b = q.node;
+                Node n = b.next;
+                for (;;) {
+                    if (n == null)
+                        return (b.isBaseHeader())? null : b;
+                    Node f = n.next;            // inconsistent read
+                    if (n != b.next)
+                        break;
+                    Object v = n.value;
+                    if (v == null) {                 // n is deleted
+                        n.helpDelete(b, f);
+                        break;
+                    }
+                    if (v == n || b.value == null)   // b is deleted
+                        break;
+                    b = n;
+                    n = f;
+                }
+                q = head; // restart
+            }
+        }
+    }
+
+    /**
+     * Specialized variant of findPredecessor to get predecessor of last
+     * valid node.  Needed when removing the last entry.  It is possible
+     * that all successors of returned node will have been deleted upon
+     * return, in which case this method can be retried.
+     * @return likely predecessor of last node
+     */
+    private Node findPredecessorOfLast() {
+        for (;;) {
+            Index q = head;
+            for (;;) {
+                Index d, r;
+                if ((r = q.right) != null) {
+                    if (r.indexesDeletedNode()) {
+                        q.unlink(r);
+                        break;    // must restart
+                    }
+                    // proceed as far across as possible without overshooting
+                    if (r.node.next != null) {
+                        q = r;
+                        continue;
+                    }
+                }
+                if ((d = q.down) != null)
+                    q = d;
+                else
+                    return q.node;
+            }
+        }
+    }
+
+    /**
+     * Removes last entry; returns its snapshot.
+     * Specialized variant of doRemove.
+     * @return null if empty, else snapshot of last entry
+     */
+    Map.Entry doRemoveLastEntry() {
+        for (;;) {
+            Node b = findPredecessorOfLast();
+            Node n = b.next;
+            if (n == null) {
+                if (b.isBaseHeader())               // empty
+                    return null;
+                else
+                    continue; // all b's successors are deleted; retry
+            }
+            for (;;) {
+                Node f = n.next;
+                if (n != b.next)                    // inconsistent read
+                    break;
+                Object v = n.value;
+                if (v == null) {                    // n is deleted
+                    n.helpDelete(b, f);
+                    break;
+                }
+                if (v == n || b.value == null)      // b is deleted
+                    break;
+                if (f != null) {
+                    b = n;
+                    n = f;
+                    continue;
+                }
+                if (!n.casValue(v, null))
+                    break;
+                Object key = n.key;
+                Comparable ck = comparable(key);
+                if (!n.appendMarker(f) || !b.casNext(n, f))
+                    findNode(ck);                  // Retry via findNode
+                else {
+                    findPredecessor(ck);           // Clean index
+                    if (head.right == null)
+                        tryReduceLevel();
+                }
+                return new AbstractMap.SimpleImmutableEntry(key, v);
+            }
+        }
+    }
+
+    /* ---------------- Relational operations -------------- */
+
+    // Control values OR'ed as arguments to findNear
+
+    private static final int EQ = 1;
+    private static final int LT = 2;
+    private static final int GT = 0; // Actually checked as !LT
+
+    /**
+     * Utility for ceiling, floor, lower, higher methods.
+     * @param kkey the key
+     * @param rel the relation -- OR'ed combination of EQ, LT, GT
+     * @return nearest node fitting relation, or null if no such
+     */
+    Node findNear(Object kkey, int rel) {
+        Comparable key = comparable(kkey);
+        for (;;) {
+            Node b = findPredecessor(key);
+            Node n = b.next;
+            for (;;) {
+                if (n == null)
+                    return ((rel & LT) == 0 || b.isBaseHeader())? null : b;
+                Node f = n.next;
+                if (n != b.next)                  // inconsistent read
+                    break;
+                Object v = n.value;
+                if (v == null) {                  // n is deleted
+                    n.helpDelete(b, f);
+                    break;
+                }
+                if (v == n || b.value == null)    // b is deleted
+                    break;
+                int c = key.compareTo(n.key);
+                if ((c == 0 && (rel & EQ) != 0) ||
+                    (c <  0 && (rel & LT) == 0))
+                    return n;
+                if ( c <= 0 && (rel & LT) != 0)
+                    return (b.isBaseHeader())? null : b;
+                b = n;
+                n = f;
+            }
+        }
+    }
+
+    /**
+     * Returns SimpleImmutableEntry for results of findNear.
+     * @param key the key
+     * @param rel the relation -- OR'ed combination of EQ, LT, GT
+     * @return Entry fitting relation, or null if no such
+     */
+    AbstractMap.SimpleImmutableEntry getNear(Object key, int rel) {
+        for (;;) {
+            Node n = findNear(key, rel);
+            if (n == null)
+                return null;
+            AbstractMap.SimpleImmutableEntry e = n.createSnapshot();
+            if (e != null)
+                return e;
+        }
+    }
+
+    /* ---------------- Constructors -------------- */
+
+    /**
+     * Constructs a new, empty map, sorted according to the
+     * {@linkplain Comparable natural ordering} of the keys.
+     */
+    public ConcurrentSkipListMap() {
+        this.comparator = null;
+        initialize();
+    }
+
+    /**
+     * Constructs a new, empty map, sorted according to the specified
+     * comparator.
+     *
+     * @param comparator the comparator that will be used to order this map.
+     *        If <tt>null</tt>, the {@linkplain Comparable natural
+     *        ordering} of the keys will be used.
+     */
+    public ConcurrentSkipListMap(Comparator comparator) {
+        this.comparator = comparator;
+        initialize();
+    }
+
+    /**
+     * Constructs a new map containing the same mappings as the given map,
+     * sorted according to the {@linkplain Comparable natural ordering} of
+     * the keys.
+     *
+     * @param  m the map whose mappings are to be placed in this map
+     * @throws ClassCastException if the keys in <tt>m</tt> are not
+     *         {@link Comparable}, or are not mutually comparable
+     * @throws NullPointerException if the specified map or any of its keys
+     *         or values are null
+     */
+    public ConcurrentSkipListMap(Map m) {
+        this.comparator = null;
+        initialize();
+        putAll(m);
+    }
+
+    /**
+     * Constructs a new map containing the same mappings and using the
+     * same ordering as the specified sorted map.
+     *
+     * @param m the sorted map whose mappings are to be placed in this
+     *        map, and whose comparator is to be used to sort this map
+     * @throws NullPointerException if the specified sorted map or any of
+     *         its keys or values are null
+     */
+    public ConcurrentSkipListMap(SortedMap m) {
+        this.comparator = m.comparator();
+        initialize();
+        buildFromSorted(m);
+    }
+
+    /**
+     * Returns a shallow copy of this <tt>ConcurrentSkipListMap</tt>
+     * instance. (The keys and values themselves are not cloned.)
+     *
+     * @return a shallow copy of this map
+     */
+    public Object clone() {
+        ConcurrentSkipListMap clone = null;
+        try {
+            clone = (ConcurrentSkipListMap) super.clone();
+        } catch (CloneNotSupportedException e) {
+            throw new InternalError();
+        }
+
+        clone.initialize();
+        clone.buildFromSorted(this);
+        return clone;
+    }
+
+    /**
+     * Streamlined bulk insertion to initialize from elements of
+     * given sorted map.  Call only from constructor or clone
+     * method.
+     */
+    private void buildFromSorted(SortedMap map) {
+        if (map == null)
+            throw new NullPointerException();
+
+        HeadIndex h = head;
+        Node basepred = h.node;
+
+        // Track the current rightmost node at each level. Uses an
+        // ArrayList to avoid committing to initial or maximum level.
+        ArrayList preds = new ArrayList();
+
+        // initialize
+        for (int i = 0; i <= h.level; ++i)
+            preds.add(null);
+        Index q = h;
+        for (int i = h.level; i > 0; --i) {
+            preds.set(i, q);
+            q = q.down;
+        }
+
+        Iterator it =
+            map.entrySet().iterator();
+        while (it.hasNext()) {
+            Map.Entry e = (Map.Entry)it.next();
+            int j = randomLevel();
+            if (j > h.level) j = h.level + 1;
+            Object k = e.getKey();
+            Object v = e.getValue();
+            if (k == null || v == null)
+                throw new NullPointerException();
+            Node z = new Node(k, v, null);
+            basepred.next = z;
+            basepred = z;
+            if (j > 0) {
+                Index idx = null;
+                for (int i = 1; i <= j; ++i) {
+                    idx = new Index(z, idx, null);
+                    if (i > h.level)
+                        h = new HeadIndex(h.node, h, idx, i);
+
+                    if (i < preds.size()) {
+                        ((Index)preds.get(i)).right = idx;
+                        preds.set(i, idx);
+                    } else
+                        preds.add(idx);
+                }
+            }
+        }
+        head = h;
+    }
+
+    /* ---------------- Serialization -------------- */
+
+    /**
+     * Save the state of this map to a stream.
+     *
+     * @serialData The key (Object) and value (Object) for each
+     * key-value mapping represented by the map, followed by
+     * <tt>null</tt>. The key-value mappings are emitted in key-order
+     * (as determined by the Comparator, or by the keys' natural
+     * ordering if no Comparator).
+     */
+    private void writeObject(java.io.ObjectOutputStream s)
+        throws java.io.IOException {
+        // Write out the Comparator and any hidden stuff
+        s.defaultWriteObject();
+
+        // Write out keys and values (alternating)
+        for (Node n = findFirst(); n != null; n = n.next) {
+            Object v = n.getValidValue();
+            if (v != null) {
+                s.writeObject(n.key);
+                s.writeObject(v);
+            }
+        }
+        s.writeObject(null);
+    }
+
+    /**
+     * Reconstitute the map from a stream.
+     */
+    private void readObject(final java.io.ObjectInputStream s)
+        throws java.io.IOException, ClassNotFoundException {
+        // Read in the Comparator and any hidden stuff
+        s.defaultReadObject();
+        // Reset transients
+        initialize();
+
+        /*
+         * This is nearly identical to buildFromSorted, but is
+         * distinct because readObject calls can't be nicely adapted
+         * as the kind of iterator needed by buildFromSorted. (They
+         * can be, but doing so requires type cheats and/or creation
+         * of adaptor classes.) It is simpler to just adapt the code.
+         */
+
+        HeadIndex h = head;
+        Node basepred = h.node;
+        ArrayList preds = new ArrayList();
+        for (int i = 0; i <= h.level; ++i)
+            preds.add(null);
+        Index q = h;
+        for (int i = h.level; i > 0; --i) {
+            preds.set(i, q);
+            q = q.down;
+        }
+
+        for (;;) {
+            Object k = s.readObject();
+            if (k == null)
+                break;
+            Object v = s.readObject();
+            if (v == null)
+                throw new NullPointerException();
+            Object key =  k;
+            Object val =  v;
+            int j = randomLevel();
+            if (j > h.level) j = h.level + 1;
+            Node z = new Node(key, val, null);
+            basepred.next = z;
+            basepred = z;
+            if (j > 0) {
+                Index idx = null;
+                for (int i = 1; i <= j; ++i) {
+                    idx = new Index(z, idx, null);
+                    if (i > h.level)
+                        h = new HeadIndex(h.node, h, idx, i);
+
+                    if (i < preds.size()) {
+                        ((Index)preds.get(i)).right = idx;
+                        preds.set(i, idx);
+                    } else
+                        preds.add(idx);
+                }
+            }
+        }
+        head = h;
+    }
+
+    /* ------ Map API methods ------ */
+
+    /**
+     * Returns <tt>true</tt> if this map contains a mapping for the specified
+     * key.
+     *
+     * @param key key whose presence in this map is to be tested
+     * @return <tt>true</tt> if this map contains a mapping for the specified key
+     * @throws ClassCastException if the specified key cannot be compared
+     *         with the keys currently in the map
+     * @throws NullPointerException if the specified key is null
+     */
+    public boolean containsKey(Object key) {
+        return doGet(key) != null;
+    }
+
+    /**
+     * Returns the value to which the specified key is mapped,
+     * or {@code null} if this map contains no mapping for the key.
+     *
+     * <p>More formally, if this map contains a mapping from a key
+     * {@code k} to a value {@code v} such that {@code key} compares
+     * equal to {@code k} according to the map's ordering, then this
+     * method returns {@code v}; otherwise it returns {@code null}.
+     * (There can be at most one such mapping.)
+     *
+     * @throws ClassCastException if the specified key cannot be compared
+     *         with the keys currently in the map
+     * @throws NullPointerException if the specified key is null
+     */
+    public Object get(Object key) {
+        return doGet(key);
+    }
+
+    /**
+     * Associates the specified value with the specified key in this map.
+     * If the map previously contained a mapping for the key, the old
+     * value is replaced.
+     *
+     * @param key key with which the specified value is to be associated
+     * @param value value to be associated with the specified key
+     * @return the previous value associated with the specified key, or
+     *         <tt>null</tt> if there was no mapping for the key
+     * @throws ClassCastException if the specified key cannot be compared
+     *         with the keys currently in the map
+     * @throws NullPointerException if the specified key or value is null
+     */
+    public Object put(Object key, Object value) {
+        if (value == null)
+            throw new NullPointerException();
+        return doPut(key, value, false);
+    }
+
+    /**
+     * Removes the mapping for the specified key from this map if present.
+     *
+     * @param  key key for which mapping should be removed
+     * @return the previous value associated with the specified key, or
+     *         <tt>null</tt> if there was no mapping for the key
+     * @throws ClassCastException if the specified key cannot be compared
+     *         with the keys currently in the map
+     * @throws NullPointerException if the specified key is null
+     */
+    public Object remove(Object key) {
+        return doRemove(key, null);
+    }
+
+    /**
+     * Returns <tt>true</tt> if this map maps one or more keys to the
+     * specified value.  This operation requires time linear in the
+     * map size.
+     *
+     * @param value value whose presence in this map is to be tested
+     * @return <tt>true</tt> if a mapping to <tt>value</tt> exists;
+     *         <tt>false</tt> otherwise
+     * @throws NullPointerException if the specified value is null
+     */
+    public boolean containsValue(Object value) {
+        if (value == null)
+            throw new NullPointerException();
+        for (Node n = findFirst(); n != null; n = n.next) {
+            Object v = n.getValidValue();
+            if (v != null && value.equals(v))
+                return true;
+        }
+        return false;
+    }
+
+    /**
+     * Returns the number of key-value mappings in this map.  If this map
+     * contains more than <tt>Integer.MAX_VALUE</tt> elements, it
+     * returns <tt>Integer.MAX_VALUE</tt>.
+     *
+     * <p>Beware that, unlike in most collections, this method is
+     * <em>NOT</em> a constant-time operation. Because of the
+     * asynchronous nature of these maps, determining the current
+     * number of elements requires traversing them all to count them.
+     * Additionally, it is possible for the size to change during
+     * execution of this method, in which case the returned result
+     * will be inaccurate. Thus, this method is typically not very
+     * useful in concurrent applications.
+     *
+     * @return the number of elements in this map
+     */
+    public int size() {
+        long count = 0;
+        for (Node n = findFirst(); n != null; n = n.next) {
+            if (n.getValidValue() != null)
+                ++count;
+        }
+        return (count >= Integer.MAX_VALUE)? Integer.MAX_VALUE : (int)count;
+    }
+
+    /**
+     * Returns <tt>true</tt> if this map contains no key-value mappings.
+     * @return <tt>true</tt> if this map contains no key-value mappings
+     */
+    public boolean isEmpty() {
+        return findFirst() == null;
+    }
+
+    /**
+     * Removes all of the mappings from this map.
+     */
+    public void clear() {
+        initialize();
+    }
+
+    /* ---------------- View methods -------------- */
+
+    /*
+     * Note: Lazy initialization works for views because view classes
+     * are stateless/immutable so it doesn't matter wrt correctness if
+     * more than one is created (which will only rarely happen).  Even
+     * so, the following idiom conservatively ensures that the method
+     * returns the one it created if it does so, not one created by
+     * another racing thread.
+     */
+
+    /**
+     * Returns a {@link NavigableSet} view of the keys contained in this map.
+     * The set's iterator returns the keys in ascending order.
+     * The set is backed by the map, so changes to the map are
+     * reflected in the set, and vice-versa.  The set supports element
+     * removal, which removes the corresponding mapping from the map,
+     * via the {@code Iterator.remove}, {@code Set.remove},
+     * {@code removeAll}, {@code retainAll}, and {@code clear}
+     * operations.  It does not support the {@code add} or {@code addAll}
+     * operations.
+     *
+     * <p>The view's {@code iterator} is a "weakly consistent" iterator
+     * that will never throw {@link java.util.ConcurrentModificationException},
+     * and guarantees to traverse elements as they existed upon
+     * construction of the iterator, and may (but is not guaranteed to)
+     * reflect any modifications subsequent to construction.
+     *
+     * <p>This method is equivalent to method {@code navigableKeySet}.
+     *
+     * @return a navigable set view of the keys in this map
+     */
+     public Set keySet() {
+        KeySet ks = keySet;
+        return (ks != null) ? ks : (keySet = new KeySet(this));
+    }
+
+    public NavigableSet navigableKeySet() {
+        KeySet ks = keySet;
+        return (ks != null) ? ks : (keySet = new KeySet(this));
+    }
+
+    /**
+     * Returns a {@link Collection} view of the values contained in this map.
+     * The collection's iterator returns the values in ascending order
+     * of the corresponding keys.
+     * The collection is backed by the map, so changes to the map are
+     * reflected in the collection, and vice-versa.  The collection
+     * supports element removal, which removes the corresponding
+     * mapping from the map, via the <tt>Iterator.remove</tt>,
+     * <tt>Collection.remove</tt>, <tt>removeAll</tt>,
+     * <tt>retainAll</tt> and <tt>clear</tt> operations.  It does not
+     * support the <tt>add</tt> or <tt>addAll</tt> operations.
+     *
+     * <p>The view's <tt>iterator</tt> is a "weakly consistent" iterator
+     * that will never throw {@link java.util.ConcurrentModificationException},
+     * and guarantees to traverse elements as they existed upon
+     * construction of the iterator, and may (but is not guaranteed to)
+     * reflect any modifications subsequent to construction.
+     */
+    public Collection values() {
+        Values vs = values;
+        return (vs != null) ? vs : (values = new Values(this));
+    }
+
+    /**
+     * Returns a {@link Set} view of the mappings contained in this map.
+     * The set's iterator returns the entries in ascending key order.
+     * The set is backed by the map, so changes to the map are
+     * reflected in the set, and vice-versa.  The set supports element
+     * removal, which removes the corresponding mapping from the map,
+     * via the <tt>Iterator.remove</tt>, <tt>Set.remove</tt>,
+     * <tt>removeAll</tt>, <tt>retainAll</tt> and <tt>clear</tt>
+     * operations.  It does not support the <tt>add</tt> or
+     * <tt>addAll</tt> operations.
+     *
+     * <p>The view's <tt>iterator</tt> is a "weakly consistent" iterator
+     * that will never throw {@link java.util.ConcurrentModificationException},
+     * and guarantees to traverse elements as they existed upon
+     * construction of the iterator, and may (but is not guaranteed to)
+     * reflect any modifications subsequent to construction.
+     *
+     * <p>The <tt>Map.Entry</tt> elements returned by
+     * <tt>iterator.next()</tt> do <em>not</em> support the
+     * <tt>setValue</tt> operation.
+     *
+     * @return a set view of the mappings contained in this map,
+     *         sorted in ascending key order
+     */
+    public Set entrySet() {
+        EntrySet es = entrySet;
+        return (es != null) ? es : (entrySet = new EntrySet(this));
+    }
+
+    public NavigableMap descendingMap() {
+        ConcurrentNavigableMap dm = descendingMap;
+        return (dm != null) ? dm : (descendingMap = new SubMap
+                                    (this, null, false, null, false, true));
+    }
+
+    public NavigableSet descendingKeySet() {
+        return descendingMap().navigableKeySet();
+    }
+
+    /* ---------------- AbstractMap Overrides -------------- */
+
+    /**
+     * Compares the specified object with this map for equality.
+     * Returns <tt>true</tt> if the given object is also a map and the
+     * two maps represent the same mappings.  More formally, two maps
+     * <tt>m1</tt> and <tt>m2</tt> represent the same mappings if
+     * <tt>m1.entrySet().equals(m2.entrySet())</tt>.  This
+     * operation may return misleading results if either map is
+     * concurrently modified during execution of this method.
+     *
+     * @param o object to be compared for equality with this map
+     * @return <tt>true</tt> if the specified object is equal to this map
+     */
+    public boolean equals(Object o) {
+	if (o == this)
+	    return true;
+	if (!(o instanceof Map))
+	    return false;
+	Map m = (Map) o;
+        try {
+	    for (Iterator itr = this.entrySet().iterator(); itr.hasNext();) {
+                Map.Entry e = (Map.Entry)itr.next();
+		if (! e.getValue().equals(m.get(e.getKey())))
+                    return false;
+	    }
+            for (Iterator itr = m.entrySet().iterator(); itr.hasNext();) {
+                Map.Entry e = (Map.Entry)itr.next();
+                Object k = e.getKey();
+                Object v = e.getValue();
+		if (k == null || v == null || !v.equals(get(k)))
+                    return false;
+            }
+            return true;
+        } catch (ClassCastException unused) {
+            return false;
+        } catch (NullPointerException unused) {
+            return false;
+        }
+    }
+
+    /* ------ ConcurrentMap API methods ------ */
+
+    /**
+     * {@inheritDoc}
+     *
+     * @return the previous value associated with the specified key,
+     *         or <tt>null</tt> if there was no mapping for the key
+     * @throws ClassCastException if the specified key cannot be compared
+     *         with the keys currently in the map
+     * @throws NullPointerException if the specified key or value is null
+     */
+    public Object putIfAbsent(Object key, Object value) {
+        if (value == null)
+            throw new NullPointerException();
+        return doPut(key, value, true);
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @throws ClassCastException if the specified key cannot be compared
+     *         with the keys currently in the map
+     * @throws NullPointerException if the specified key is null
+     */
+    public boolean remove(Object key, Object value) {
+        if (key == null)
+            throw new NullPointerException();
+        if (value == null)
+            return false;
+        return doRemove(key, value) != null;
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @throws ClassCastException if the specified key cannot be compared
+     *         with the keys currently in the map
+     * @throws NullPointerException if any of the arguments are null
+     */
+    public boolean replace(Object key, Object oldValue, Object newValue) {
+        if (oldValue == null || newValue == null)
+            throw new NullPointerException();
+        Comparable k = comparable(key);
+        for (;;) {
+            Node n = findNode(k);
+            if (n == null)
+                return false;
+            Object v = n.value;
+            if (v != null) {
+                if (!oldValue.equals(v))
+                    return false;
+                if (n.casValue(v, newValue))
+                    return true;
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @return the previous value associated with the specified key,
+     *         or <tt>null</tt> if there was no mapping for the key
+     * @throws ClassCastException if the specified key cannot be compared
+     *         with the keys currently in the map
+     * @throws NullPointerException if the specified key or value is null
+     */
+    public Object replace(Object key, Object value) {
+        if (value == null)
+            throw new NullPointerException();
+        Comparable k = comparable(key);
+        for (;;) {
+            Node n = findNode(k);
+            if (n == null)
+                return null;
+            Object v = n.value;
+            if (v != null && n.casValue(v, value))
+                return v;
+        }
+    }
+
+    /* ------ SortedMap API methods ------ */
+
+    public Comparator comparator() {
+        return comparator;
+    }
+
+    /**
+     * @throws NoSuchElementException {@inheritDoc}
+     */
+    public Object firstKey() {
+        Node n = findFirst();
+        if (n == null)
+            throw new NoSuchElementException();
+        return n.key;
+    }
+
+    /**
+     * @throws NoSuchElementException {@inheritDoc}
+     */
+    public Object lastKey() {
+        Node n = findLast();
+        if (n == null)
+            throw new NoSuchElementException();
+        return n.key;
+    }
+
+    /**
+     * @throws ClassCastException {@inheritDoc}
+     * @throws NullPointerException if {@code fromKey} or {@code toKey} is null
+     * @throws IllegalArgumentException {@inheritDoc}
+     */
+    public NavigableMap subMap(Object fromKey,
+                               boolean fromInclusive,
+                               Object toKey,
+                               boolean toInclusive) {
+        if (fromKey == null || toKey == null)
+            throw new NullPointerException();
+        return new SubMap
+            (this, fromKey, fromInclusive, toKey, toInclusive, false);
+    }
+
+    /**
+     * @throws ClassCastException {@inheritDoc}
+     * @throws NullPointerException if {@code toKey} is null
+     * @throws IllegalArgumentException {@inheritDoc}
+     */
+    public NavigableMap headMap(Object toKey,
+                                boolean inclusive) {
+        if (toKey == null)
+            throw new NullPointerException();
+        return new SubMap
+            (this, null, false, toKey, inclusive, false);
+    }
+
+    /**
+     * @throws ClassCastException {@inheritDoc}
+     * @throws NullPointerException if {@code fromKey} is null
+     * @throws IllegalArgumentException {@inheritDoc}
+     */
+    public NavigableMap tailMap(Object fromKey,
+                                boolean inclusive) {
+        if (fromKey == null)
+            throw new NullPointerException();
+        return new SubMap
+            (this, fromKey, inclusive, null, false, false);
+    }
+
+    /**
+     * @throws ClassCastException {@inheritDoc}
+     * @throws NullPointerException if {@code fromKey} or {@code toKey} is null
+     * @throws IllegalArgumentException {@inheritDoc}
+     */
+    public SortedMap subMap(Object fromKey, Object toKey) {
+        return subMap(fromKey, true, toKey, false);
+    }
+
+    /**
+     * @throws ClassCastException {@inheritDoc}
+     * @throws NullPointerException if {@code toKey} is null
+     * @throws IllegalArgumentException {@inheritDoc}
+     */
+    public SortedMap headMap(Object toKey) {
+        return headMap(toKey, false);
+    }
+
+    /**
+     * @throws ClassCastException {@inheritDoc}
+     * @throws NullPointerException if {@code fromKey} is null
+     * @throws IllegalArgumentException {@inheritDoc}
+     */
+    public SortedMap tailMap(Object fromKey) {
+        return tailMap(fromKey, true);
+    }
+
+    /* ---------------- Relational operations -------------- */
+
+    /**
+     * Returns a key-value mapping associated with the greatest key
+     * strictly less than the given key, or <tt>null</tt> if there is
+     * no such key. The returned entry does <em>not</em> support the
+     * <tt>Entry.setValue</tt> method.
+     *
+     * @throws ClassCastException {@inheritDoc}
+     * @throws NullPointerException if the specified key is null
+     */
+    public Map.Entry lowerEntry(Object key) {
+        return getNear(key, LT);
+    }
+
+    /**
+     * @throws ClassCastException {@inheritDoc}
+     * @throws NullPointerException if the specified key is null
+     */
+    public Object lowerKey(Object key) {
+        Node n = findNear(key, LT);
+        return (n == null)? null : n.key;
+    }
+
+    /**
+     * Returns a key-value mapping associated with the greatest key
+     * less than or equal to the given key, or <tt>null</tt> if there
+     * is no such key. The returned entry does <em>not</em> support
+     * the <tt>Entry.setValue</tt> method.
+     *
+     * @param key the key
+     * @throws ClassCastException {@inheritDoc}
+     * @throws NullPointerException if the specified key is null
+     */
+    public Map.Entry floorEntry(Object key) {
+        return getNear(key, LT|EQ);
+    }
+
+    /**
+     * @param key the key
+     * @throws ClassCastException {@inheritDoc}
+     * @throws NullPointerException if the specified key is null
+     */
+    public Object floorKey(Object key) {
+        Node n = findNear(key, LT|EQ);
+        return (n == null)? null : n.key;
+    }
+
+    /**
+     * Returns a key-value mapping associated with the least key
+     * greater than or equal to the given key, or <tt>null</tt> if
+     * there is no such entry. The returned entry does <em>not</em>
+     * support the <tt>Entry.setValue</tt> method.
+     *
+     * @throws ClassCastException {@inheritDoc}
+     * @throws NullPointerException if the specified key is null
+     */
+    public Map.Entry ceilingEntry(Object key) {
+        return getNear(key, GT|EQ);
+    }
+
+    /**
+     * @throws ClassCastException {@inheritDoc}
+     * @throws NullPointerException if the specified key is null
+     */
+    public Object ceilingKey(Object key) {
+        Node n = findNear(key, GT|EQ);
+        return (n == null)? null : n.key;
+    }
+
+    /**
+     * Returns a key-value mapping associated with the least key
+     * strictly greater than the given key, or <tt>null</tt> if there
+     * is no such key. The returned entry does <em>not</em> support
+     * the <tt>Entry.setValue</tt> method.
+     *
+     * @param key the key
+     * @throws ClassCastException {@inheritDoc}
+     * @throws NullPointerException if the specified key is null
+     */
+    public Map.Entry higherEntry(Object key) {
+        return getNear(key, GT);
+    }
+
+    /**
+     * @param key the key
+     * @throws ClassCastException {@inheritDoc}
+     * @throws NullPointerException if the specified key is null
+     */
+    public Object higherKey(Object key) {
+        Node n = findNear(key, GT);
+        return (n == null)? null : n.key;
+    }
+
+    /**
+     * Returns a key-value mapping associated with the least
+     * key in this map, or <tt>null</tt> if the map is empty.
+     * The returned entry does <em>not</em> support
+     * the <tt>Entry.setValue</tt> method.
+     */
+    public Map.Entry firstEntry() {
+        for (;;) {
+            Node n = findFirst();
+            if (n == null)
+                return null;
+            AbstractMap.SimpleImmutableEntry e = n.createSnapshot();
+            if (e != null)
+                return e;
+        }
+    }
+
+    /**
+     * Returns a key-value mapping associated with the greatest
+     * key in this map, or <tt>null</tt> if the map is empty.
+     * The returned entry does <em>not</em> support
+     * the <tt>Entry.setValue</tt> method.
+     */
+    public Map.Entry lastEntry() {
+        for (;;) {
+            Node n = findLast();
+            if (n == null)
+                return null;
+            AbstractMap.SimpleImmutableEntry e = n.createSnapshot();
+            if (e != null)
+                return e;
+        }
+    }
+
+    /**
+     * Removes and returns a key-value mapping associated with
+     * the least key in this map, or <tt>null</tt> if the map is empty.
+     * The returned entry does <em>not</em> support
+     * the <tt>Entry.setValue</tt> method.
+     */
+    public Map.Entry pollFirstEntry() {
+        return doRemoveFirstEntry();
+    }
+
+    /**
+     * Removes and returns a key-value mapping associated with
+     * the greatest key in this map, or <tt>null</tt> if the map is empty.
+     * The returned entry does <em>not</em> support
+     * the <tt>Entry.setValue</tt> method.
+     */
+    public Map.Entry pollLastEntry() {
+        return doRemoveLastEntry();
+    }
+
+
+    /* ---------------- Iterators -------------- */
+
+    /**
+     * Base of iterator classes:
+     */
+    abstract class Iter implements Iterator {
+        /** the last node returned by next() */
+        Node lastReturned;
+        /** the next node to return from next(); */
+        Node next;
+	/** Cache of next value field to maintain weak consistency */
+	Object nextValue;
+
+        /** Initializes ascending iterator for entire range. */
+        Iter() {
+            for (;;) {
+		next = findFirst();
+                if (next == null)
+                    break;
+                Object x = next.value;
+                if (x != null && x != next) {
+		    nextValue =  x;
+                    break;
+		}
+            }
+        }
+
+        public final boolean hasNext() {
+            return next != null;
+        }
+
+        /** Advances next to higher entry. */
+        final void advance() {
+            if ((lastReturned = next) == null)
+                throw new NoSuchElementException();
+            for (;;) {
+		next = next.next;
+                if (next == null)
+                    break;
+                Object x = next.value;
+                if (x != null && x != next) {
+		    nextValue =  x;
+                    break;
+		}
+            }
+        }
+
+        public void remove() {
+            Node l = lastReturned;
+            if (l == null)
+                throw new IllegalStateException();
+            // It would not be worth all of the overhead to directly
+            // unlink from here. Using remove is fast enough.
+            ConcurrentSkipListMap.this.remove(l.key);
+	    lastReturned = null;
+        }
+
+    }
+
+    final class ValueIterator extends Iter {
+        public Object next() {
+            Object v = nextValue;
+            advance();
+            return v;
+        }
+    }
+
+    final class KeyIterator extends Iter {
+        public Object next() {
+            Node n = next;
+            advance();
+            return n.key;
+        }
+    }
+
+    final class EntryIterator extends Iter {
+        public Object next() {
+            Node n = next;
+            Object v = nextValue;
+            advance();
+            return new AbstractMap.SimpleImmutableEntry(n.key, v);
+        }
+    }
+
+    // Factory methods for iterators needed by ConcurrentSkipListSet etc
+
+    Iterator keyIterator() {
+        return new KeyIterator();
+    }
+
+    Iterator valueIterator() {
+        return new ValueIterator();
+    }
+
+    Iterator entryIterator() {
+        return new EntryIterator();
+    }
+
+    /* ---------------- View Classes -------------- */
+
+    /*
+     * View classes are static, delegating to a ConcurrentNavigableMap
+     * to allow use by SubMaps, which outweighs the ugliness of
+     * needing type-tests for Iterator methods.
+     */
+
+    static final class KeySet extends AbstractSet implements NavigableSet {
+        private final ConcurrentNavigableMap m;
+        KeySet(ConcurrentNavigableMap map) { m = map; }
+        public int size() { return m.size(); }
+        public boolean isEmpty() { return m.isEmpty(); }
+        public boolean contains(Object o) { return m.containsKey(o); }
+        public boolean remove(Object o) { return m.remove(o) != null; }
+        public void clear() { m.clear(); }
+        public Object lower(Object e) { return m.lowerKey(e); }
+        public Object floor(Object e) { return m.floorKey(e); }
+        public Object ceiling(Object e) { return m.ceilingKey(e); }
+        public Object higher(Object e) { return m.higherKey(e); }
+        public Comparator comparator() { return m.comparator(); }
+        public Object first() { return m.firstKey(); }
+        public Object last() { return m.lastKey(); }
+        public Object pollFirst() {
+            Map.Entry e = m.pollFirstEntry();
+            return e == null? null : e.getKey();
+        }
+        public Object pollLast() {
+            Map.Entry e = m.pollLastEntry();
+            return e == null? null : e.getKey();
+        }
+        public Iterator iterator() {
+            if (m instanceof ConcurrentSkipListMap)
+                return ((ConcurrentSkipListMap)m).keyIterator();
+            else
+                return ((ConcurrentSkipListMap.SubMap)m).keyIterator();
+        }
+        public boolean equals(Object o) {
+            if (o == this)
+                return true;
+            if (!(o instanceof Set))
+                return false;
+            Collection c = (Collection) o;
+            try {
+                return containsAll(c) && c.containsAll(this);
+            } catch (ClassCastException unused)   {
+                return false;
+            } catch (NullPointerException unused) {
+                return false;
+            }
+        }
+        public Iterator descendingIterator() {
+            return descendingSet().iterator();
+        }
+        public NavigableSet subSet(Object fromElement,
+                                      boolean fromInclusive,
+                                      Object toElement,
+                                      boolean toInclusive) {
+            return new ConcurrentSkipListSet
+                ((ConcurrentNavigableMap)
+                 m.subMap(fromElement, fromInclusive,
+                          toElement,   toInclusive));
+        }
+        public NavigableSet headSet(Object toElement, boolean inclusive) {
+            return new ConcurrentSkipListSet(
+                (ConcurrentNavigableMap)m.headMap(toElement, inclusive));
+        }
+        public NavigableSet tailSet(Object fromElement, boolean inclusive) {
+            return new ConcurrentSkipListSet(
+                (ConcurrentNavigableMap)m.tailMap(fromElement, inclusive));
+        }
+        public SortedSet subSet(Object fromElement, Object toElement) {
+            return subSet(fromElement, true, toElement, false);
+        }
+        public SortedSet headSet(Object toElement) {
+            return headSet(toElement, false);
+        }
+        public SortedSet tailSet(Object fromElement) {
+            return tailSet(fromElement, true);
+        }
+        public NavigableSet descendingSet() {
+            return new ConcurrentSkipListSet(
+                (ConcurrentNavigableMap)m.descendingMap());
+        }
+    }
+
+    static final class Values extends AbstractCollection {
+        private final ConcurrentNavigableMap m;
+        Values(ConcurrentNavigableMap map) {
+            m = map;
+        }
+        public Iterator iterator() {
+            if (m instanceof ConcurrentSkipListMap)
+                return ((ConcurrentSkipListMap)m).valueIterator();
+            else
+                return ((SubMap)m).valueIterator();
+        }
+        public boolean isEmpty() {
+            return m.isEmpty();
+        }
+        public int size() {
+            return m.size();
+        }
+        public boolean contains(Object o) {
+            return m.containsValue(o);
+        }
+        public void clear() {
+            m.clear();
+        }
+    }
+
+    static final class EntrySet extends AbstractSet {
+        private final ConcurrentNavigableMap m;
+        EntrySet(ConcurrentNavigableMap map) {
+            m = map;
+        }
+
+        public Iterator iterator() {
+            if (m instanceof ConcurrentSkipListMap)
+                return ((ConcurrentSkipListMap)m).entryIterator();
+            else
+                return ((SubMap)m).entryIterator();
+        }
+
+        public boolean contains(Object o) {
+            if (!(o instanceof Map.Entry))
+                return false;
+            Map.Entry e = (Map.Entry)o;
+            Object v = m.get(e.getKey());
+            return v != null && v.equals(e.getValue());
+        }
+        public boolean remove(Object o) {
+            if (!(o instanceof Map.Entry))
+                return false;
+            Map.Entry e = (Map.Entry)o;
+            return m.remove(e.getKey(),
+                            e.getValue());
+        }
+        public boolean isEmpty() {
+            return m.isEmpty();
+        }
+        public int size() {
+            return m.size();
+        }
+        public void clear() {
+            m.clear();
+        }
+        public boolean equals(Object o) {
+            if (o == this)
+                return true;
+            if (!(o instanceof Set))
+                return false;
+            Collection c = (Collection) o;
+            try {
+                return containsAll(c) && c.containsAll(this);
+            } catch (ClassCastException unused)   {
+                return false;
+            } catch (NullPointerException unused) {
+                return false;
+            }
+        }
+    }
+
+    /**
+     * Submaps returned by {@link ConcurrentSkipListMap} submap operations
+     * represent a subrange of mappings of their underlying
+     * maps. Instances of this class support all methods of their
+     * underlying maps, differing in that mappings outside their range are
+     * ignored, and attempts to add mappings outside their ranges result
+     * in {@link IllegalArgumentException}.  Instances of this class are
+     * constructed only using the <tt>subMap</tt>, <tt>headMap</tt>, and
+     * <tt>tailMap</tt> methods of their underlying maps.
+     *
+     * @serial include
+     */
+    static final class SubMap extends AbstractMap
+        implements ConcurrentNavigableMap, Cloneable,
+                   java.io.Serializable {
+        private static final long serialVersionUID = -7647078645895051609L;
+
+        /** Underlying map */
+        private final ConcurrentSkipListMap m;
+        /** lower bound key, or null if from start */
+        private final Object lo;
+        /** upper bound key, or null if to end */
+        private final Object hi;
+        /** inclusion flag for lo */
+        private final boolean loInclusive;
+        /** inclusion flag for hi */
+        private final boolean hiInclusive;
+        /** direction */
+        private final boolean isDescending;
+
+        // Lazily initialized view holders
+        private transient KeySet keySetView;
+        private transient Set entrySetView;
+        private transient Collection valuesView;
+
+        /**
+         * Creates a new submap, initializing all fields
+         */
+        SubMap(ConcurrentSkipListMap map,
+               Object fromKey, boolean fromInclusive,
+               Object toKey, boolean toInclusive,
+               boolean isDescending) {
+            if (fromKey != null && toKey != null &&
+                map.compare(fromKey, toKey) > 0)
+                throw new IllegalArgumentException("inconsistent range");
+            this.m = map;
+            this.lo = fromKey;
+            this.hi = toKey;
+            this.loInclusive = fromInclusive;
+            this.hiInclusive = toInclusive;
+            this.isDescending = isDescending;
+        }
+
+        /* ----------------  Utilities -------------- */
+
+        private boolean tooLow(Object key) {
+            if (lo != null) {
+                int c = m.compare(key, lo);
+                if (c < 0 || (c == 0 && !loInclusive))
+                    return true;
+            }
+            return false;
+        }
+
+        private boolean tooHigh(Object key) {
+            if (hi != null) {
+                int c = m.compare(key, hi);
+                if (c > 0 || (c == 0 && !hiInclusive))
+                    return true;
+            }
+            return false;
+        }
+
+        private boolean inBounds(Object key) {
+            return !tooLow(key) && !tooHigh(key);
+        }
+
+        private void checkKeyBounds(Object key) throws IllegalArgumentException {
+            if (key == null)
+                throw new NullPointerException();
+            if (!inBounds(key))
+                throw new IllegalArgumentException("key out of range");
+        }
+
+        /**
+         * Returns true if node key is less than upper bound of range
+         */
+        private boolean isBeforeEnd(ConcurrentSkipListMap.Node n) {
+            if (n == null)
+                return false;
+            if (hi == null)
+                return true;
+            Object k = n.key;
+            if (k == null) // pass by markers and headers
+                return true;
+            int c = m.compare(k, hi);
+            if (c > 0 || (c == 0 && !hiInclusive))
+                return false;
+            return true;
+        }
+
+        /**
+         * Returns lowest node. This node might not be in range, so
+         * most usages need to check bounds
+         */
+        private ConcurrentSkipListMap.Node loNode() {
+            if (lo == null)
+                return m.findFirst();
+            else if (loInclusive)
+                return m.findNear(lo, m.GT|m.EQ);
+            else
+                return m.findNear(lo, m.GT);
+        }
+
+        /**
+         * Returns highest node. This node might not be in range, so
+         * most usages need to check bounds
+         */
+        private ConcurrentSkipListMap.Node hiNode() {
+            if (hi == null)
+                return m.findLast();
+            else if (hiInclusive)
+                return m.findNear(hi, m.LT|m.EQ);
+            else
+                return m.findNear(hi, m.LT);
+        }
+
+        /**
+         * Returns lowest absolute key (ignoring directonality)
+         */
+        private Object lowestKey() {
+            ConcurrentSkipListMap.Node n = loNode();
+            if (isBeforeEnd(n))
+                return n.key;
+            else
+                throw new NoSuchElementException();
+        }
+
+        /**
+         * Returns highest absolute key (ignoring directonality)
+         */
+        private Object highestKey() {
+            ConcurrentSkipListMap.Node n = hiNode();
+            if (n != null) {
+                Object last = n.key;
+                if (inBounds(last))
+                    return last;
+            }
+            throw new NoSuchElementException();
+        }
+
+        private Map.Entry lowestEntry() {
+            for (;;) {
+                ConcurrentSkipListMap.Node n = loNode();
+                if (!isBeforeEnd(n))
+                    return null;
+                Map.Entry e = n.createSnapshot();
+                if (e != null)
+                    return e;
+            }
+        }
+
+        private Map.Entry highestEntry() {
+            for (;;) {
+                ConcurrentSkipListMap.Node n = hiNode();
+                if (n == null || !inBounds(n.key))
+                    return null;
+                Map.Entry e = n.createSnapshot();
+                if (e != null)
+                    return e;
+            }
+        }
+
+        private Map.Entry removeLowest() {
+            for (;;) {
+                Node n = loNode();
+                if (n == null)
+                    return null;
+                Object k = n.key;
+                if (!inBounds(k))
+                    return null;
+                Object v = m.doRemove(k, null);
+                if (v != null)
+                    return new AbstractMap.SimpleImmutableEntry(k, v);
+            }
+        }
+
+        private Map.Entry removeHighest() {
+            for (;;) {
+                Node n = hiNode();
+                if (n == null)
+                    return null;
+                Object k = n.key;
+                if (!inBounds(k))
+                    return null;
+                Object v = m.doRemove(k, null);
+                if (v != null)
+                    return new AbstractMap.SimpleImmutableEntry(k, v);
+            }
+        }
+
+        /**
+         * Submap version of ConcurrentSkipListMap.getNearEntry
+         */
+        private Map.Entry getNearEntry(Object key, int rel) {
+            if (isDescending) { // adjust relation for direction
+                if ((rel & m.LT) == 0)
+                    rel |= m.LT;
+                else
+                    rel &= ~m.LT;
+            }
+            if (tooLow(key))
+                return ((rel & m.LT) != 0)? null : lowestEntry();
+            if (tooHigh(key))
+                return ((rel & m.LT) != 0)? highestEntry() : null;
+            for (;;) {
+                Node n = m.findNear(key, rel);
+                if (n == null || !inBounds(n.key))
+                    return null;
+                Object k = n.key;
+                Object v = n.getValidValue();
+                if (v != null)
+                    return new AbstractMap.SimpleImmutableEntry(k, v);
+            }
+        }
+
+        // Almost the same as getNearEntry, except for keys
+        private Object getNearKey(Object key, int rel) {
+            if (isDescending) { // adjust relation for direction
+                if ((rel & m.LT) == 0)
+                    rel |= m.LT;
+                else
+                    rel &= ~m.LT;
+            }
+            if (tooLow(key)) {
+                if ((rel & m.LT) == 0) {
+                    ConcurrentSkipListMap.Node n = loNode();
+                    if (isBeforeEnd(n))
+                        return n.key;
+                }
+                return null;
+            }
+            if (tooHigh(key)) {
+                if ((rel & m.LT) != 0) {
+                    ConcurrentSkipListMap.Node n = hiNode();
+                    if (n != null) {
+                        Object last = n.key;
+                        if (inBounds(last))
+                            return last;
+                    }
+                }
+                return null;
+            }
+            for (;;) {
+                Node n = m.findNear(key, rel);
+                if (n == null || !inBounds(n.key))
+                    return null;
+                Object k = n.key;
+                Object v = n.getValidValue();
+                if (v != null)
+                    return k;
+            }
+        }
+
+        /* ----------------  Map API methods -------------- */
+
+        public boolean containsKey(Object key) {
+            if (key == null) throw new NullPointerException();
+            Object k = key;
+            return inBounds(k) && m.containsKey(k);
+        }
+
+        public Object get(Object key) {
+            if (key == null) throw new NullPointerException();
+            Object k = key;
+            return ((!inBounds(k)) ? null : m.get(k));
+        }
+
+        public Object put(Object key, Object value) {
+            checkKeyBounds(key);
+            return m.put(key, value);
+        }
+
+        public Object remove(Object key) {
+            Object k = key;
+            return (!inBounds(k))? null : m.remove(k);
+        }
+
+        public int size() {
+            long count = 0;
+            for (ConcurrentSkipListMap.Node n = loNode();
+                 isBeforeEnd(n);
+                 n = n.next) {
+                if (n.getValidValue() != null)
+                    ++count;
+            }
+            return count >= Integer.MAX_VALUE? Integer.MAX_VALUE : (int)count;
+        }
+
+        public boolean isEmpty() {
+            return !isBeforeEnd(loNode());
+        }
+
+        public boolean containsValue(Object value) {
+            if (value == null)
+                throw new NullPointerException();
+            for (ConcurrentSkipListMap.Node n = loNode();
+                 isBeforeEnd(n);
+                 n = n.next) {
+                Object v = n.getValidValue();
+                if (v != null && value.equals(v))
+                    return true;
+            }
+            return false;
+        }
+
+        public void clear() {
+            for (ConcurrentSkipListMap.Node n = loNode();
+                 isBeforeEnd(n);
+                 n = n.next) {
+                if (n.getValidValue() != null)
+                    m.remove(n.key);
+            }
+        }
+
+        /* ----------------  ConcurrentMap API methods -------------- */
+
+        public Object putIfAbsent(Object key, Object value) {
+            checkKeyBounds(key);
+            return m.putIfAbsent(key, value);
+        }
+
+        public boolean remove(Object key, Object value) {
+            Object k = key;
+            return inBounds(k) && m.remove(k, value);
+        }
+
+        public boolean replace(Object key, Object oldValue, Object newValue) {
+            checkKeyBounds(key);
+            return m.replace(key, oldValue, newValue);
+        }
+
+        public Object replace(Object key, Object value) {
+            checkKeyBounds(key);
+            return m.replace(key, value);
+        }
+
+        /* ----------------  SortedMap API methods -------------- */
+
+        public Comparator comparator() {
+            Comparator cmp = m.comparator();
+	    if (isDescending)
+		return Collections.reverseOrder(cmp);
+	    else
+		return cmp;
+        }
+
+        /**
+         * Utility to create submaps, where given bounds override
+         * unbounded(null) ones and/or are checked against bounded ones.
+         */
+        private SubMap newSubMap(Object fromKey,
+                                      boolean fromInclusive,
+                                      Object toKey,
+                                      boolean toInclusive) {
+            if (isDescending) { // flip senses
+                Object tk = fromKey;
+                fromKey = toKey;
+                toKey = tk;
+                boolean ti = fromInclusive;
+                fromInclusive = toInclusive;
+                toInclusive = ti;
+            }
+            if (lo != null) {
+                if (fromKey == null) {
+                    fromKey = lo;
+                    fromInclusive = loInclusive;
+                }
+                else {
+                    int c = m.compare(fromKey, lo);
+                    if (c < 0 || (c == 0 && !loInclusive && fromInclusive))
+                        throw new IllegalArgumentException("key out of range");
+                }
+            }
+            if (hi != null) {
+                if (toKey == null) {
+                    toKey = hi;
+                    toInclusive = hiInclusive;
+                }
+                else {
+                    int c = m.compare(toKey, hi);
+                    if (c > 0 || (c == 0 && !hiInclusive && toInclusive))
+                        throw new IllegalArgumentException("key out of range");
+                }
+            }
+            return new SubMap(m, fromKey, fromInclusive,
+                                   toKey, toInclusive, isDescending);
+        }
+
+        public NavigableMap subMap(Object fromKey,
+                                   boolean fromInclusive,
+                                   Object toKey,
+                                   boolean toInclusive) {
+            if (fromKey == null || toKey == null)
+                throw new NullPointerException();
+            return newSubMap(fromKey, fromInclusive, toKey, toInclusive);
+        }
+
+        public NavigableMap headMap(Object toKey,
+                                    boolean inclusive) {
+            if (toKey == null)
+                throw new NullPointerException();
+            return newSubMap(null, false, toKey, inclusive);
+        }
+
+        public NavigableMap tailMap(Object fromKey,
+                                    boolean inclusive) {
+            if (fromKey == null)
+                throw new NullPointerException();
+            return newSubMap(fromKey, inclusive, null, false);
+        }
+
+        public SortedMap subMap(Object fromKey, Object toKey) {
+            return subMap(fromKey, true, toKey, false);
+        }
+
+        public SortedMap headMap(Object toKey) {
+            return headMap(toKey, false);
+        }
+
+        public SortedMap tailMap(Object fromKey) {
+            return tailMap(fromKey, true);
+        }
+
+        public NavigableMap descendingMap() {
+            return new SubMap(m, lo, loInclusive,
+                                   hi, hiInclusive, !isDescending);
+        }
+
+        /* ----------------  Relational methods -------------- */
+
+        public Map.Entry ceilingEntry(Object key) {
+            return getNearEntry(key, (m.GT|m.EQ));
+        }
+
+        public Object ceilingKey(Object key) {
+            return getNearKey(key, (m.GT|m.EQ));
+        }
+
+        public Map.Entry lowerEntry(Object key) {
+            return getNearEntry(key, (m.LT));
+        }
+
+        public Object lowerKey(Object key) {
+            return getNearKey(key, (m.LT));
+        }
+
+        public Map.Entry floorEntry(Object key) {
+            return getNearEntry(key, (m.LT|m.EQ));
+        }
+
+        public Object floorKey(Object key) {
+            return getNearKey(key, (m.LT|m.EQ));
+        }
+
+        public Map.Entry higherEntry(Object key) {
+            return getNearEntry(key, (m.GT));
+        }
+
+        public Object higherKey(Object key) {
+            return getNearKey(key, (m.GT));
+        }
+
+        public Object firstKey() {
+            return isDescending? highestKey() : lowestKey();
+        }
+
+        public Object lastKey() {
+            return isDescending? lowestKey() : highestKey();
+        }
+
+        public Map.Entry firstEntry() {
+            return isDescending? highestEntry() : lowestEntry();
+        }
+
+        public Map.Entry lastEntry() {
+            return isDescending? lowestEntry() : highestEntry();
+        }
+
+        public Map.Entry pollFirstEntry() {
+            return isDescending? removeHighest() : removeLowest();
+        }
+
+        public Map.Entry pollLastEntry() {
+            return isDescending? removeLowest() : removeHighest();
+        }
+
+        /* ---------------- Submap Views -------------- */
+
+        public Set keySet() {
+            KeySet ks = keySetView;
+            return (ks != null) ? ks : (keySetView = new KeySet(this));
+        }
+
+        public NavigableSet navigableKeySet() {
+            KeySet ks = keySetView;
+            return (ks != null) ? ks : (keySetView = new KeySet(this));
+        }
+
+        public Collection values() {
+            Collection vs = valuesView;
+            return (vs != null) ? vs : (valuesView = new Values(this));
+        }
+
+        public Set entrySet() {
+            Set es = entrySetView;
+            return (es != null) ? es : (entrySetView = new EntrySet(this));
+        }
+
+        public NavigableSet descendingKeySet() {
+            return descendingMap().navigableKeySet();
+        }
+
+        Iterator keyIterator() {
+            return new SubMapKeyIterator();
+        }
+
+        Iterator valueIterator() {
+            return new SubMapValueIterator();
+        }
+
+        Iterator entryIterator() {
+            return new SubMapEntryIterator();
+        }
+
+        /**
+         * Variant of main Iter class to traverse through submaps.
+         */
+        abstract class SubMapIter implements Iterator {
+            /** the last node returned by next() */
+            Node lastReturned;
+            /** the next node to return from next(); */
+            Node next;
+            /** Cache of next value field to maintain weak consistency */
+            Object nextValue;
+
+            SubMapIter() {
+                for (;;) {
+                    next = isDescending ? hiNode() : loNode();
+                    if (next == null)
+                        break;
+		    Object x = next.value;
+                    if (x != null && x != next) {
+			if (! inBounds(next.key))
+                            next = null;
+			else
+			    nextValue =  x;
+                        break;
+                    }
+                }
+            }
+
+            public final boolean hasNext() {
+                return next != null;
+            }
+
+            final void advance() {
+                if ((lastReturned = next) == null)
+                    throw new NoSuchElementException();
+                if (isDescending)
+                    descend();
+                else
+                    ascend();
+            }
+
+            private void ascend() {
+                for (;;) {
+                    next = next.next;
+                    if (next == null)
+                        break;
+		    Object x = next.value;
+                    if (x != null && x != next) {
+                        if (tooHigh(next.key))
+                            next = null;
+                        else
+			    nextValue =  x;
+                        break;
+                    }
+                }
+            }
+
+            private void descend() {
+                for (;;) {
+                    next = m.findNear(lastReturned.key, LT);
+                    if (next == null)
+                        break;
+		    Object x = next.value;
+                    if (x != null && x != next) {
+                        if (tooLow(next.key))
+                            next = null;
+			else
+                            nextValue =  x;
+                        break;
+                    }
+                }
+            }
+
+            public void remove() {
+                Node l = lastReturned;
+                if (l == null)
+                    throw new IllegalStateException();
+                m.remove(l.key);
+		lastReturned = null;
+            }
+
+        }
+
+        final class SubMapValueIterator extends SubMapIter {
+            public Object next() {
+                Object v = nextValue;
+                advance();
+                return v;
+            }
+        }
+
+        final class SubMapKeyIterator extends SubMapIter {
+            public Object next() {
+                Node n = next;
+                advance();
+                return n.key;
+            }
+        }
+
+        final class SubMapEntryIterator extends SubMapIter {
+            public Object next() {
+                Node n = next;
+                Object v = nextValue;
+                advance();
+                return new AbstractMap.SimpleImmutableEntry(n.key, v);
+            }
+        }
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ConcurrentSkipListSet.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ConcurrentSkipListSet.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ConcurrentSkipListSet.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,447 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+import edu.emory.mathcs.backport.java.util.*;
+import java.util.Iterator;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedSet;
+
+/**
+ * A scalable concurrent {@link NavigableSet} implementation based on
+ * a {@link ConcurrentSkipListMap}.  The elements of the set are kept
+ * sorted according to their {@linkplain Comparable natural ordering},
+ * or by a {@link Comparator} provided at set creation time, depending
+ * on which constructor is used.
+ *
+ * <p>This implementation provides expected average <i>log(n)</i> time
+ * cost for the <tt>contains</tt>, <tt>add</tt>, and <tt>remove</tt>
+ * operations and their variants.  Insertion, removal, and access
+ * operations safely execute concurrently by multiple threads.
+ * Iterators are <i>weakly consistent</i>, returning elements
+ * reflecting the state of the set at some point at or since the
+ * creation of the iterator.  They do <em>not</em> throw {@link
+ * java.util.ConcurrentModificationException}, and may proceed concurrently with
+ * other operations.  Ascending ordered views and their iterators are
+ * faster than descending ones.
+ *
+ * <p>Beware that, unlike in most collections, the <tt>size</tt>
+ * method is <em>not</em> a constant-time operation. Because of the
+ * asynchronous nature of these sets, determining the current number
+ * of elements requires a traversal of the elements. Additionally, the
+ * bulk operations <tt>addAll</tt>, <tt>removeAll</tt>,
+ * <tt>retainAll</tt>, and <tt>containsAll</tt> are <em>not</em>
+ * guaranteed to be performed atomically. For example, an iterator
+ * operating concurrently with an <tt>addAll</tt> operation might view
+ * only some of the added elements.
+ *
+ * <p>This class and its iterators implement all of the
+ * <em>optional</em> methods of the {@link Set} and {@link Iterator}
+ * interfaces. Like most other concurrent collection implementations,
+ * this class does not permit the use of <tt>null</tt> elements,
+ * because <tt>null</tt> arguments and return values cannot be reliably
+ * distinguished from the absence of elements.
+ *
+ * <p>This class is a member of the
+ * <a href="{@docRoot}/../technotes/guides/collections/index.html">
+ * Java Collections Framework</a>.
+ *
+ * @author Doug Lea
+ * @since 1.6
+ */
+public class ConcurrentSkipListSet
+    extends AbstractSet
+    implements NavigableSet, Cloneable, java.io.Serializable {
+
+    private static final long serialVersionUID = -2479143111061671589L;
+
+    /**
+     * The underlying map. Uses Boolean.TRUE as value for each
+     * element.  This field is declared final for the sake of thread
+     * safety, which entails some ugliness in clone()
+     */
+    private final ConcurrentNavigableMap m;
+
+    /**
+     * Constructs a new, empty set that orders its elements according to
+     * their {@linkplain Comparable natural ordering}.
+     */
+    public ConcurrentSkipListSet() {
+        m = new ConcurrentSkipListMap();
+    }
+
+    /**
+     * Constructs a new, empty set that orders its elements according to
+     * the specified comparator.
+     *
+     * @param comparator the comparator that will be used to order this set.
+     *        If <tt>null</tt>, the {@linkplain Comparable natural
+     *        ordering} of the elements will be used.
+     */
+    public ConcurrentSkipListSet(Comparator comparator) {
+        m = new ConcurrentSkipListMap(comparator);
+    }
+
+    /**
+     * Constructs a new set containing the elements in the specified
+     * collection, that orders its elements according to their
+     * {@linkplain Comparable natural ordering}.
+     *
+     * @param c The elements that will comprise the new set
+     * @throws ClassCastException if the elements in <tt>c</tt> are
+     *         not {@link Comparable}, or are not mutually comparable
+     * @throws NullPointerException if the specified collection or any
+     *         of its elements are null
+     */
+    public ConcurrentSkipListSet(Collection c) {
+        m = new ConcurrentSkipListMap();
+        addAll(c);
+    }
+
+    /**
+     * Constructs a new set containing the same elements and using the
+     * same ordering as the specified sorted set.
+     *
+     * @param s sorted set whose elements will comprise the new set
+     * @throws NullPointerException if the specified sorted set or any
+     *         of its elements are null
+     */
+    public ConcurrentSkipListSet(SortedSet s) {
+        m = new ConcurrentSkipListMap(s.comparator());
+        addAll(s);
+    }
+
+    /**
+     * For use by submaps
+     */
+    ConcurrentSkipListSet(ConcurrentNavigableMap m) {
+        this.m = m;
+    }
+
+    /**
+     * Returns a shallow copy of this <tt>ConcurrentSkipListSet</tt>
+     * instance. (The elements themselves are not cloned.)
+     *
+     * @return a shallow copy of this set
+     */
+    public Object clone() {
+        if (this.getClass() != ConcurrentSkipListSet.class) {
+            // can't change m, since it is final
+            throw new UnsupportedOperationException("Can't clone subclasses");
+        }
+        return new ConcurrentSkipListSet(new ConcurrentSkipListMap(this.m));
+    }
+
+    /* ---------------- Set operations -------------- */
+
+    /**
+     * Returns the number of elements in this set.  If this set
+     * contains more than <tt>Integer.MAX_VALUE</tt> elements, it
+     * returns <tt>Integer.MAX_VALUE</tt>.
+     *
+     * <p>Beware that, unlike in most collections, this method is
+     * <em>NOT</em> a constant-time operation. Because of the
+     * asynchronous nature of these sets, determining the current
+     * number of elements requires traversing them all to count them.
+     * Additionally, it is possible for the size to change during
+     * execution of this method, in which case the returned result
+     * will be inaccurate. Thus, this method is typically not very
+     * useful in concurrent applications.
+     *
+     * @return the number of elements in this set
+     */
+    public int size() {
+	return m.size();
+    }
+
+    /**
+     * Returns <tt>true</tt> if this set contains no elements.
+     * @return <tt>true</tt> if this set contains no elements
+     */
+    public boolean isEmpty() {
+	return m.isEmpty();
+    }
+
+    /**
+     * Returns <tt>true</tt> if this set contains the specified element.
+     * More formally, returns <tt>true</tt> if and only if this set
+     * contains an element <tt>e</tt> such that <tt>o.equals(e)</tt>.
+     *
+     * @param o object to be checked for containment in this set
+     * @return <tt>true</tt> if this set contains the specified element
+     * @throws ClassCastException if the specified element cannot be
+     *         compared with the elements currently in this set
+     * @throws NullPointerException if the specified element is null
+     */
+    public boolean contains(Object o) {
+	return m.containsKey(o);
+    }
+
+    /**
+     * Adds the specified element to this set if it is not already present.
+     * More formally, adds the specified element <tt>e</tt> to this set if
+     * the set contains no element <tt>e2</tt> such that <tt>e.equals(e2)</tt>.
+     * If this set already contains the element, the call leaves the set
+     * unchanged and returns <tt>false</tt>.
+     *
+     * @param e element to be added to this set
+     * @return <tt>true</tt> if this set did not already contain the
+     *         specified element
+     * @throws ClassCastException if <tt>e</tt> cannot be compared
+     *         with the elements currently in this set
+     * @throws NullPointerException if the specified element is null
+     */
+    public boolean add(Object e) {
+	return m.putIfAbsent(e, Boolean.TRUE) == null;
+    }
+
+    /**
+     * Removes the specified element from this set if it is present.
+     * More formally, removes an element <tt>e</tt> such that
+     * <tt>o.equals(e)</tt>, if this set contains such an element.
+     * Returns <tt>true</tt> if this set contained the element (or
+     * equivalently, if this set changed as a result of the call).
+     * (This set will not contain the element once the call returns.)
+     *
+     * @param o object to be removed from this set, if present
+     * @return <tt>true</tt> if this set contained the specified element
+     * @throws ClassCastException if <tt>o</tt> cannot be compared
+     *         with the elements currently in this set
+     * @throws NullPointerException if the specified element is null
+     */
+    public boolean remove(Object o) {
+	return m.remove(o, Boolean.TRUE);
+    }
+
+    /**
+     * Removes all of the elements from this set.
+     */
+    public void clear() {
+	m.clear();
+    }
+
+    /**
+     * Returns an iterator over the elements in this set in ascending order.
+     *
+     * @return an iterator over the elements in this set in ascending order
+     */
+    public Iterator iterator() {
+        return m.navigableKeySet().iterator();
+    }
+
+    /**
+     * Returns an iterator over the elements in this set in descending order.
+     *
+     * @return an iterator over the elements in this set in descending order
+     */
+    public Iterator descendingIterator() {
+	return m.descendingKeySet().iterator();
+    }
+
+
+    /* ---------------- AbstractSet Overrides -------------- */
+
+    /**
+     * Compares the specified object with this set for equality.  Returns
+     * <tt>true</tt> if the specified object is also a set, the two sets
+     * have the same size, and every member of the specified set is
+     * contained in this set (or equivalently, every member of this set is
+     * contained in the specified set).  This definition ensures that the
+     * equals method works properly across different implementations of the
+     * set interface.
+     *
+     * @param o the object to be compared for equality with this set
+     * @return <tt>true</tt> if the specified object is equal to this set
+     */
+    public boolean equals(Object o) {
+        // Override AbstractSet version to avoid calling size()
+	if (o == this)
+	    return true;
+	if (!(o instanceof Set))
+	    return false;
+	Collection c = (Collection) o;
+        try {
+            return containsAll(c) && c.containsAll(this);
+        } catch (ClassCastException unused)   {
+            return false;
+        } catch (NullPointerException unused) {
+            return false;
+        }
+    }
+
+    /**
+     * Removes from this set all of its elements that are contained in
+     * the specified collection.  If the specified collection is also
+     * a set, this operation effectively modifies this set so that its
+     * value is the <i>asymmetric set difference</i> of the two sets.
+     *
+     * @param  c collection containing elements to be removed from this set
+     * @return <tt>true</tt> if this set changed as a result of the call
+     * @throws ClassCastException if the types of one or more elements in this
+     *         set are incompatible with the specified collection
+     * @throws NullPointerException if the specified collection or any
+     *         of its elements are null
+     */
+    public boolean removeAll(Collection c) {
+        // Override AbstractSet version to avoid unnecessary call to size()
+        boolean modified = false;
+        for (Iterator i = c.iterator(); i.hasNext(); )
+            if (remove(i.next()))
+                modified = true;
+        return modified;
+    }
+
+    /* ---------------- Relational operations -------------- */
+
+    /**
+     * @throws ClassCastException {@inheritDoc}
+     * @throws NullPointerException if the specified element is null
+     */
+    public Object lower(Object e) {
+        return m.lowerKey(e);
+    }
+
+    /**
+     * @throws ClassCastException {@inheritDoc}
+     * @throws NullPointerException if the specified element is null
+     */
+    public Object floor(Object e) {
+        return m.floorKey(e);
+    }
+
+    /**
+     * @throws ClassCastException {@inheritDoc}
+     * @throws NullPointerException if the specified element is null
+     */
+    public Object ceiling(Object e) {
+        return m.ceilingKey(e);
+    }
+
+    /**
+     * @throws ClassCastException {@inheritDoc}
+     * @throws NullPointerException if the specified element is null
+     */
+    public Object higher(Object e) {
+        return m.higherKey(e);
+    }
+
+    public Object pollFirst() {
+        Map.Entry e = m.pollFirstEntry();
+        return e == null? null : e.getKey();
+    }
+
+    public Object pollLast() {
+        Map.Entry e = m.pollLastEntry();
+        return e == null? null : e.getKey();
+    }
+
+
+    /* ---------------- SortedSet operations -------------- */
+
+
+    public Comparator comparator() {
+        return m.comparator();
+    }
+
+    /**
+     * @throws NoSuchElementException {@inheritDoc}
+     */
+    public Object first() {
+        return m.firstKey();
+    }
+
+    /**
+     * @throws NoSuchElementException {@inheritDoc}
+     */
+    public Object last() {
+        return m.lastKey();
+    }
+
+    /**
+     * @throws ClassCastException {@inheritDoc}
+     * @throws NullPointerException if {@code fromElement} or
+     *         {@code toElement} is null
+     * @throws IllegalArgumentException {@inheritDoc}
+     */
+    public NavigableSet subSet(Object fromElement,
+                                  boolean fromInclusive,
+                                  Object toElement,
+                                  boolean toInclusive) {
+	return new ConcurrentSkipListSet
+            ((ConcurrentNavigableMap)
+             m.subMap(fromElement, fromInclusive,
+                      toElement,   toInclusive));
+    }
+
+    /**
+     * @throws ClassCastException {@inheritDoc}
+     * @throws NullPointerException if {@code toElement} is null
+     * @throws IllegalArgumentException {@inheritDoc}
+     */
+    public NavigableSet headSet(Object toElement, boolean inclusive) {
+	return new ConcurrentSkipListSet(
+               (ConcurrentNavigableMap)m.headMap(toElement, inclusive));
+    }
+
+    /**
+     * @throws ClassCastException {@inheritDoc}
+     * @throws NullPointerException if {@code fromElement} is null
+     * @throws IllegalArgumentException {@inheritDoc}
+     */
+    public NavigableSet tailSet(Object fromElement, boolean inclusive) {
+	return new ConcurrentSkipListSet(
+               (ConcurrentNavigableMap)m.tailMap(fromElement, inclusive));
+    }
+
+    /**
+     * @throws ClassCastException {@inheritDoc}
+     * @throws NullPointerException if {@code fromElement} or
+     *         {@code toElement} is null
+     * @throws IllegalArgumentException {@inheritDoc}
+     */
+    public SortedSet subSet(Object fromElement, Object toElement) {
+	return subSet(fromElement, true, toElement, false);
+    }
+
+    /**
+     * @throws ClassCastException {@inheritDoc}
+     * @throws NullPointerException if {@code toElement} is null
+     * @throws IllegalArgumentException {@inheritDoc}
+     */
+    public SortedSet headSet(Object toElement) {
+	return headSet(toElement, false);
+    }
+
+    /**
+     * @throws ClassCastException {@inheritDoc}
+     * @throws NullPointerException if {@code fromElement} is null
+     * @throws IllegalArgumentException {@inheritDoc}
+     */
+    public SortedSet tailSet(Object fromElement) {
+	return tailSet(fromElement, true);
+    }
+
+    /**
+     * Returns a reverse order view of the elements contained in this set.
+     * The descending set is backed by this set, so changes to the set are
+     * reflected in the descending set, and vice-versa.
+     *
+     * <p>The returned set has an ordering equivalent to
+     * <tt>{@link Collections#reverseOrder(Comparator) Collections.reverseOrder}(comparator())</tt>.
+     * The expression {@code s.descendingSet().descendingSet()} returns a
+     * view of {@code s} essentially equivalent to {@code s}.
+     *
+     * @return a reverse order view of this set
+     */
+    public NavigableSet descendingSet() {
+	return new ConcurrentSkipListSet(
+               (ConcurrentNavigableMap)m.descendingMap());
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/CopyOnWriteArrayList.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/CopyOnWriteArrayList.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/CopyOnWriteArrayList.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,876 @@
+/*
+ * Written by Dawid Kurzyniec, on the basis of public specifications and
+ * public domain sources from JSR 166, and released to the public domain,
+ * as explained at http://creativecommons.org/licenses/publicdomain.
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+
+import edu.emory.mathcs.backport.java.util.Arrays;
+import java.util.List;
+import java.util.Iterator;
+import java.util.Collection;
+import java.util.ListIterator;
+import java.util.RandomAccess;
+import java.io.Serializable;
+import java.lang.reflect.Array;
+import java.util.ConcurrentModificationException;
+import java.util.NoSuchElementException;
+import java.io.ObjectOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+
+public class CopyOnWriteArrayList implements List, RandomAccess, Cloneable, Serializable {
+
+    private static final long serialVersionUID = 8673264195747942595L;
+
+    private volatile transient Object[] array;
+
+    public CopyOnWriteArrayList() {
+        setArray(new Object[0]);
+    }
+
+    public CopyOnWriteArrayList(Collection c) {
+        // must deal with concurrent collections
+        Object[] array = c.toArray();
+        // make sure the array is Object[] type
+        if (array.getClass() != Object[].class) {
+            array = Arrays.copyOf(array, array.length, Object[].class);
+        }
+        // assume that c.toArray() has returned a new array instance, as
+        // required by the spec
+        setArray(array);
+    }
+
+    public CopyOnWriteArrayList(Object[] array) {
+        setArray(Arrays.copyOf(array, array.length, Object[].class));
+    }
+
+    final Object[] getArray()           { return array; }
+    final void setArray(Object[] array) { this.array = array; }
+
+    public int size() {
+        return getArray().length;
+    }
+
+    public boolean isEmpty() {
+        return getArray().length == 0;
+    }
+
+    private static int search(Object[] array, Object subject, int pos, int end) {
+        if (subject == null) {
+            for (;pos < end; pos++) {
+                if (array[pos] == null) return pos;
+            }
+        }
+        else {
+            for (;pos < end; pos++) {
+                if (subject.equals(array[pos])) return pos;
+            }
+        }
+        return -1;
+    }
+
+    private static int reverseSearch(Object[] array, Object subject, int start, int pos) {
+        if (subject == null) {
+            for (pos--; pos >= start; pos--) {
+                if (array[pos] == null) return pos;
+            }
+        }
+        else {
+            for (pos--; pos >= start; pos--) {
+                if (subject.equals(array[pos])) return pos;
+            }
+        }
+        return -1;
+    }
+
+    public boolean contains(Object o) {
+        Object[] array = getArray();
+        return search(array, o, 0, array.length) >= 0;
+    }
+
+    public Iterator iterator() {
+        return new COWIterator(getArray(), 0);
+    }
+
+    public Object[] toArray() {
+        Object[] array = getArray();
+        return Arrays.copyOf(array, array.length, Object[].class);
+    }
+
+    public Object[] toArray(Object[] a) {
+        Object[] array = getArray();
+        int length = array.length;
+        if (a.length < length) {
+            return Arrays.copyOf(array, length, a.getClass());
+        }
+        else {
+            System.arraycopy(array, 0, a, 0, length);
+            if (a.length > length) a[length] = null;
+            return a;
+        }
+    }
+
+    public boolean add(Object o) {
+        synchronized (this) {
+            Object[] oldarr = getArray();
+            int length = oldarr.length;
+            Object[] newarr = new Object[length+1];
+            System.arraycopy(oldarr, 0, newarr, 0, length);
+            newarr[length] = o;
+            setArray(newarr);
+            return true;
+        }
+    }
+
+    public boolean addIfAbsent(Object o) {
+        synchronized (this) {
+            Object[] oldarr = getArray();
+            int length = oldarr.length;
+            if (search(array, o, 0, length) >= 0) return false;
+            Object[] newarr = new Object[length+1];
+            System.arraycopy(oldarr, 0, newarr, 0, length);
+            newarr[length] = o;
+            setArray(newarr);
+            return true;
+        }
+    }
+
+    public int addAllAbsent(Collection c) {
+        Object[] arr = c.toArray();
+        if (arr.length == 0) return 0;
+        synchronized (this) {
+            Object[] oldarr = getArray();
+            int oldlength = oldarr.length;
+            Object[] tmp = new Object[arr.length];
+            int added = 0;
+            for (int i=0; i<arr.length; i++) {
+                Object o = arr[i];
+                if (search(oldarr, o, 0, oldlength) < 0 && search(tmp, o, 0, added) < 0) {
+                    tmp[added++] = o;
+                }
+            }
+            if (added == 0) return 0;
+            Object[] newarr = new Object[oldlength+added];
+            System.arraycopy(oldarr, 0, newarr, 0, oldlength);
+            System.arraycopy(tmp, 0, newarr, oldlength, added);
+            setArray(newarr);
+            return added;
+        }
+    }
+
+    public boolean remove(Object o) {
+        synchronized (this) {
+            Object[] array = getArray();
+            int length = array.length;
+            int pos = search(array, o, 0, length);
+            if (pos < 0) return false;
+            Object[] newarr = new Object[length-1];
+            int moved = length-pos-1;
+            if (pos > 0) System.arraycopy(array, 0, newarr, 0, pos);
+            if (moved > 0) System.arraycopy(array, pos+1, newarr, pos, moved);
+            setArray(newarr);
+            return true;
+        }
+    }
+
+    public boolean containsAll(Collection c) {
+        Object[] array = getArray();
+        for (Iterator itr = c.iterator(); itr.hasNext();) {
+            if (search(array, itr.next(), 0, array.length) < 0) return false;
+        }
+        return true;
+    }
+
+    public boolean addAll(Collection c) {
+        // must deal with concurrent collections
+        Object[] ca = c.toArray();
+        if (ca.length == 0) return false;
+        synchronized (this) {
+            Object[] oldarr = getArray();
+            int length = oldarr.length;
+            Object[] newarr = new Object[length + ca.length];
+            System.arraycopy(oldarr, 0, newarr, 0, length);
+            int pos = length;
+            System.arraycopy(ca, 0, newarr, pos, ca.length);
+            setArray(newarr);
+            return true;
+        }
+    }
+
+    public boolean addAll(int index, Collection c) {
+        // must deal with concurrent collections
+        Object[] ca = c.toArray();
+        synchronized (this) {
+            Object[] oldarr = getArray();
+            int length = oldarr.length;
+            if (index < 0 || index > length) {
+                throw new IndexOutOfBoundsException("Index: " + index +
+                                                    ", Size: " + length);
+            }
+            if (ca.length == 0) return false;
+            Object[] newarr = new Object[length+ca.length];
+            int moved = length-index;
+            System.arraycopy(oldarr, 0, newarr, 0, index);
+            int pos = length;
+            System.arraycopy(ca, 0, newarr, index, ca.length);
+            if (moved > 0) {
+                System.arraycopy(oldarr, index, newarr, index+ca.length, moved);
+            }
+            setArray(newarr);
+            return true;
+        }
+    }
+
+    public boolean removeAll(Collection c) {
+        if (c.isEmpty()) return false;
+        synchronized (this) {
+            Object[] array = getArray();
+            int length = array.length;
+            Object[] tmp = new Object[length];
+            int newlen=0;
+            for (int i=0; i<length; i++) {
+                Object o = array[i];
+                if (!c.contains(o)) tmp[newlen++] = o;
+            }
+            if (newlen == length) return false;
+            Object[] newarr = new Object[newlen];
+            System.arraycopy(tmp, 0, newarr, 0, newlen);
+            setArray(newarr);
+            return true;
+        }
+    }
+
+    public boolean retainAll(Collection c) {
+        synchronized (this) {
+            Object[] array = getArray();
+            int length = array.length;
+            Object[] tmp = new Object[length];
+            int newlen=0;
+            for (int i=0; i<length; i++) {
+                Object o = array[i];
+                if (c.contains(o)) tmp[newlen++] = o;
+            }
+            if (newlen == length) return false;
+            Object[] newarr = new Object[newlen];
+            System.arraycopy(tmp, 0, newarr, 0, newlen);
+            setArray(newarr);
+            return true;
+        }
+    }
+
+    public void clear() {
+        setArray(new Object[0]);
+    }
+
+    public Object clone() {
+        try { return super.clone(); }
+        catch (CloneNotSupportedException e) { throw new InternalError(); }
+    }
+
+    public boolean equals(Object o) {
+        if (o == this) return true;
+        if (!(o instanceof List)) return false;
+
+        ListIterator itr = ((List)o).listIterator();
+        Object[] array = getArray();
+        int length = array.length;
+        int idx=0;
+        while(idx < length && itr.hasNext()) {
+            Object o1 = array[idx++];
+            Object o2 = itr.next();
+            if (!eq(o1, o2)) return false;
+        }
+        return (idx == length && !itr.hasNext());
+    }
+
+    public int hashCode() {
+        int hashCode = 1;
+        Object[] array = getArray();
+        int length = array.length;
+        for (int i=0; i<length; i++) {
+            Object o = array[i];
+            hashCode = 31*hashCode + (o == null ? 0 : o.hashCode());
+        }
+        return hashCode;
+    }
+
+    public Object get(int index) {
+        return getArray()[index];
+    }
+
+    public Object set(int index, Object element) {
+        synchronized (this) {
+            Object[] oldarr = getArray();
+            int length = oldarr.length;
+            // piggyback the array bounds check
+            Object oldVal = oldarr[index];
+            if (oldVal == element) {
+                setArray(oldarr);
+            }
+            else {
+                Object[] newarr = new Object[length];
+                System.arraycopy(oldarr, 0, newarr, 0, length);
+                newarr[index] = element;
+                setArray(newarr);
+            }
+            return oldVal;
+        }
+    }
+
+    public void add(int index, Object element) {
+        synchronized (this) {
+            Object[] oldarr = getArray();
+            int length = oldarr.length;
+            if (index < 0 || index > length) {
+                throw new IndexOutOfBoundsException("Index: " + index +
+                                                    ", Size: " + length);
+            }
+            Object[] newarr = new Object[length+1];
+            int moved = length-index;
+            System.arraycopy(oldarr, 0, newarr, 0, index);
+            newarr[index] = element;
+            if (moved > 0) {
+                System.arraycopy(oldarr, index, newarr, index+1, moved);
+            }
+            setArray(newarr);
+        }
+    }
+
+    public Object remove(int index) {
+        synchronized (this) {
+            Object[] array = getArray();
+            int length = array.length;
+            if (index < 0 || index >= length) {
+                throw new IndexOutOfBoundsException("Index: " + index +
+                                                    ", Size: " + length);
+            }
+            Object result = array[index];
+            Object[] newarr = new Object[length-1];
+            int moved = length-index-1;
+            if (index > 0) System.arraycopy(array, 0, newarr, 0, index);
+            if (moved > 0) System.arraycopy(array, index+1, newarr, index, moved);
+            setArray(newarr);
+            return result;
+        }
+    }
+
+    public int indexOf(Object o) {
+        Object[] array = getArray();
+        return search(array, o, 0, array.length);
+    }
+
+    public int indexOf(Object o, int index) {
+        Object[] array = getArray();
+        return search(array, o, index, array.length);
+    }
+
+    public int lastIndexOf(Object o) {
+        Object[] array = getArray();
+        return reverseSearch(array, o, 0, array.length);
+    }
+
+    public int lastIndexOf(Object o, int index) {
+        Object[] array = getArray();
+        return reverseSearch(array, o, 0, index);
+    }
+
+    public ListIterator listIterator() {
+        return new COWIterator(getArray(), 0);
+    }
+
+    public ListIterator listIterator(int index) {
+        Object[] array = getArray();
+        if (index < 0 || index > array.length) {
+            throw new IndexOutOfBoundsException("Index: " + index +
+                                                ", Size: " + array.length);
+        }
+        return new COWIterator(array, index);
+    }
+
+    public List subList(int fromIndex, int toIndex) {
+        Object[] array = getArray();
+        if (fromIndex < 0 || toIndex > array.length  || fromIndex > toIndex) {
+            throw new IndexOutOfBoundsException();
+        }
+        return new COWSubList(fromIndex, toIndex-fromIndex);
+    }
+
+    private void writeObject(ObjectOutputStream out) throws IOException {
+        out.defaultWriteObject();
+        Object[] array = getArray();
+        int length = array.length;
+        out.writeInt(length);
+        for (int i = 0; i < length; i++)
+            out.writeObject(array[i]);
+    }
+
+    private void readObject(ObjectInputStream in)
+        throws IOException, ClassNotFoundException
+    {
+        in.defaultReadObject();
+        int length = in.readInt();
+        Object[] array = new Object[length];
+        for (int i = 0; i < length; i++) {
+            array[i] = in.readObject();
+        }
+        setArray(array);
+    }
+
+    public String toString() {
+        Object[] array = getArray();
+        int length = array.length;
+        StringBuffer buf = new StringBuffer();
+        buf.append('[');
+        for (int i=0; i<length; i++) {
+            if (i>0) buf.append(", ");
+            buf.append(array[i]);
+        }
+        buf.append(']');
+        return buf.toString();
+    }
+
+    static class COWIterator implements ListIterator {
+        final Object[] array;
+        int cursor;
+        COWIterator(Object[] array, int cursor) {
+            this.array = array;
+            this.cursor = cursor;
+        }
+        public boolean hasNext() { return cursor < array.length; }
+        public boolean hasPrevious() { return cursor > 0; }
+        public int nextIndex() { return cursor; }
+        public Object next() {
+            try { return array[cursor++]; }
+            catch (IndexOutOfBoundsException e) { throw new NoSuchElementException(); }
+            // todo: should decrement cursor on failure?...
+        }
+        public int previousIndex() { return cursor-1; }
+        public Object previous() {
+            try { return array[--cursor]; }
+            catch (IndexOutOfBoundsException e) { throw new NoSuchElementException(); }
+            // todo: should decrement cursor on failure?...
+        }
+        public void add(Object val) {
+            throw new UnsupportedOperationException();
+        }
+        public void set(Object val) {
+            throw new UnsupportedOperationException();
+        }
+        public void remove() {
+            throw new UnsupportedOperationException();
+        }
+    }
+
+    /** Note: the original j.u.c. class is NOT serializable */
+    class COWSubList implements Serializable, List {
+
+        private static final long serialVersionUID = -8660955369431018984L;
+
+        final int offset;
+        int length;
+        transient Object[] expectedArray;
+
+        COWSubList(int offset, int length) {
+            this.offset = offset;
+            this.length = length;
+            this.expectedArray = getArray();
+        }
+
+        public int size() {
+            return length;
+        }
+
+        public boolean isEmpty() {
+            return length == 0;
+        }
+
+        public boolean contains(Object o) {
+            return search(getArray(), o, offset, offset+length) >= 0;
+        }
+
+        public Iterator iterator() {
+            return listIterator();
+        }
+
+        public Object[] toArray() {
+            Object[] array = getArray();
+            Object[] newarr = new Object[length];
+            System.arraycopy(array, offset, newarr, 0, length);
+            return newarr;
+        }
+
+        public Object[] toArray(Object[] a) {
+            Object[] array = getArray();
+            if (a.length < length) {
+                a = (Object[])Array.newInstance(a.getClass().getComponentType(), length);
+                System.arraycopy(array, offset, a, 0, length);
+            }
+            else {
+                System.arraycopy(array, offset, a, 0, length);
+                if (a.length > length) a[length] = null;
+            }
+            return a;
+        }
+
+        public boolean add(Object o) {
+            add(length, o);
+            return true;
+        }
+
+        public boolean remove(Object o) {
+            synchronized (CopyOnWriteArrayList.this) {
+                Object[] array = getArray();
+                if (array != expectedArray) throw new ConcurrentModificationException();
+                int fullLength = array.length;
+                int pos = search(array, o, offset, length);
+                if (pos < 0) return false;
+                Object[] newarr = new Object[fullLength-1];
+                int moved = length-pos-1;
+                if (pos > 0) System.arraycopy(array, 0, newarr, 0, pos);
+                if (moved > 0) System.arraycopy(array, pos+1, newarr, pos, moved);
+                setArray(newarr);
+                expectedArray = newarr;
+                length--;
+                return true;
+            }
+        }
+
+        public boolean containsAll(Collection c) {
+            Object[] array = getArray();
+            for (Iterator itr = c.iterator(); itr.hasNext();) {
+                if (search(array, itr.next(), offset, length) < 0) return false;
+            }
+            return true;
+        }
+
+        public boolean addAll(Collection c) {
+            return addAll(length, c);
+        }
+
+        public boolean addAll(int index, Collection c) {
+            int added = c.size();
+            synchronized (CopyOnWriteArrayList.this) {
+                if (index < 0 || index >= length) {
+                    throw new IndexOutOfBoundsException("Index: " + index +
+                                                        ", Size: " + length);
+                }
+                Object[] oldarr = getArray();
+                if (oldarr != expectedArray) throw new ConcurrentModificationException();
+                if (added == 0) return false;
+                int fullLength = oldarr.length;
+                Object[] newarr = new Object[fullLength + added];
+                int pos = offset+index;
+                int newpos = pos;
+                System.arraycopy(oldarr, 0, newarr, 0, pos);
+                int rem = fullLength-pos;
+                for (Iterator itr = c.iterator(); itr.hasNext(); ) {
+                    newarr[newpos++] = itr.next();
+                }
+                if (rem > 0) System.arraycopy(oldarr, pos, newarr, newpos, rem);
+                setArray(newarr);
+                expectedArray = newarr;
+                length += added;
+                return true;
+            }
+        }
+
+        public boolean removeAll(Collection c) {
+            if (c.isEmpty()) return false;
+            synchronized (CopyOnWriteArrayList.this) {
+                Object[] array = getArray();
+                if (array != expectedArray) throw new ConcurrentModificationException();
+                int fullLength = array.length;
+                Object[] tmp = new Object[length];
+                int retained=0;
+                for (int i=offset; i<offset+length; i++) {
+                    Object o = array[i];
+                    if (!c.contains(o)) tmp[retained++] = o;
+                }
+                if (retained == length) return false;
+                Object[] newarr = new Object[fullLength + retained-length];
+                int moved = fullLength - offset - length;
+                if (offset > 0) System.arraycopy(array, 0, newarr, 0, offset);
+                if (retained > 0) System.arraycopy(tmp, 0, newarr, offset, retained);
+                if (moved > 0) System.arraycopy(array, offset+length, newarr, offset+retained, moved);
+                setArray(newarr);
+                expectedArray = newarr;
+                length = retained;
+                return true;
+            }
+        }
+
+        public boolean retainAll(Collection c) {
+            synchronized (CopyOnWriteArrayList.this) {
+                Object[] array = getArray();
+                if (array != expectedArray) throw new ConcurrentModificationException();
+                int fullLength = array.length;
+                Object[] tmp = new Object[length];
+                int retained=0;
+                for (int i=offset; i<offset+length; i++) {
+                    Object o = array[i];
+                    if (c.contains(o)) tmp[retained++] = o;
+                }
+                if (retained == length) return false;
+                Object[] newarr = new Object[fullLength + retained-length];
+                int moved = fullLength - offset - length;
+                if (offset > 0) System.arraycopy(array, 0, newarr, 0, offset);
+                if (retained > 0) System.arraycopy(tmp, 0, newarr, offset, retained);
+                if (moved > 0) System.arraycopy(array, offset+length, newarr, offset+retained, moved);
+                setArray(newarr);
+                expectedArray = newarr;
+                length = retained;
+                return true;
+            }
+        }
+
+        public void clear() {
+            synchronized (CopyOnWriteArrayList.this) {
+                Object[] array = getArray();
+                if (array != expectedArray) throw new ConcurrentModificationException();
+                int fullLength = array.length;
+                Object[] newarr = new Object[fullLength-length];
+                int moved = fullLength - offset - length;
+                if (offset > 0) System.arraycopy(array, 0, newarr, 0, offset);
+                if (moved > 0) System.arraycopy(array, offset+length, newarr, offset, moved);
+                setArray(newarr);
+                expectedArray = newarr;
+                length = 0;
+            }
+        }
+
+        public boolean equals(Object o) {
+            if (o == this) return true;
+            if (!(o instanceof List)) return false;
+            Object[] array;
+            int last;
+            synchronized (CopyOnWriteArrayList.this) {
+                array = getArray();
+                if (array != expectedArray) throw new ConcurrentModificationException();
+                last = offset+length;
+            }
+            ListIterator itr = ((List)o).listIterator();
+            int idx=offset;
+            while(idx < last && itr.hasNext()) {
+                Object o1 = array[idx];
+                Object o2 = itr.next();
+                if (!eq(o1, o2)) return false;
+            }
+            return (idx == last && !itr.hasNext());
+        }
+
+        public int hashCode() {
+            int hashCode = 1;
+            Object[] array;
+            int last;
+            synchronized (CopyOnWriteArrayList.this) {
+                array = getArray();
+                if (array != expectedArray) throw new ConcurrentModificationException();
+                last = offset+length;
+            }
+            for (int i=offset; i<last; i++) {
+                Object o = array[i];
+                hashCode = 31*hashCode + (o == null ? 0 : o.hashCode());
+            }
+            return hashCode;
+        }
+
+        public Object get(int index) {
+            return getArray()[offset+index];
+        }
+
+        public Object set(int index, Object element) {
+            synchronized (CopyOnWriteArrayList.this) {
+                if (index < 0 || index >= length) {
+                    throw new IndexOutOfBoundsException("Index: " + index +
+                                                        ", Size: " + length);
+                }
+                Object[] oldarr = getArray();
+                if (oldarr != expectedArray) throw new ConcurrentModificationException();
+                int fullLength = oldarr.length;
+                // piggyback the array bounds check
+                Object oldVal = oldarr[offset+index];
+                if (oldVal == element) {
+                    setArray(oldarr);
+                }
+                else {
+                    Object[] newarr = new Object[fullLength];
+                    System.arraycopy(oldarr, 0, newarr, 0, fullLength);
+                    newarr[offset+index] = element;
+                    setArray(newarr);
+                    expectedArray = newarr;
+                }
+                return oldVal;
+            }
+        }
+
+        public void add(int index, Object element) {
+            synchronized (CopyOnWriteArrayList.this) {
+                if (index < 0 || index > length) {
+                    throw new IndexOutOfBoundsException("Index: " + index +
+                                                        ", Size: " + length);
+                }
+                Object[] oldarr = getArray();
+                if (oldarr != expectedArray) throw new ConcurrentModificationException();
+                int fullLength = oldarr.length;
+                Object[] newarr = new Object[fullLength+1];
+                int pos = offset+index;
+                int moved = fullLength-pos;
+                System.arraycopy(oldarr, 0, newarr, 0, pos);
+                newarr[pos] = element;
+                if (moved > 0) {
+                    System.arraycopy(oldarr, pos, newarr, pos+1, moved);
+                }
+                setArray(newarr);
+                expectedArray = newarr;
+                length++;
+            }
+        }
+
+        public Object remove(int index) {
+            synchronized (CopyOnWriteArrayList.this) {
+                if (index < 0 || index >= length) {
+                    throw new IndexOutOfBoundsException("Index: " + index +
+                                                        ", Size: " + length);
+                }
+                Object[] array = getArray();
+                if (array != expectedArray) throw new ConcurrentModificationException();
+                int fullLength = array.length;
+                int pos = offset+index;
+                Object result = array[pos];
+                Object[] newarr = new Object[fullLength-1];
+                int moved = fullLength-pos-1;
+                if (index > 0) System.arraycopy(array, 0, newarr, 0, pos);
+                if (moved > 0) System.arraycopy(array, pos+1, newarr, pos, moved);
+                setArray(newarr);
+                expectedArray = newarr;
+                length--;
+                return result;
+            }
+        }
+
+        public int indexOf(Object o) {
+            int pos = search(getArray(), o, offset, offset+length);
+            return pos >= 0 ? pos-offset : -1;
+        }
+
+        public int indexOf(Object o, int index) {
+            int pos = search(getArray(), o, offset+index, offset+length)-offset;
+            return pos >= 0 ? pos-offset : -1;
+        }
+
+        public int lastIndexOf(Object o) {
+            int pos = reverseSearch(getArray(), o, offset, offset+length)-offset;
+            return pos >= 0 ? pos-offset : -1;
+        }
+
+        public int lastIndexOf(Object o, int index) {
+            int pos = reverseSearch(getArray(), o, offset, offset+index)-offset;
+            return pos >= 0 ? pos-offset : -1;
+        }
+
+        public ListIterator listIterator() {
+            // must synchronize to atomically obtain the array and length
+            synchronized (CopyOnWriteArrayList.this) {
+                Object[] array = getArray();
+                if (array != expectedArray) throw new ConcurrentModificationException();
+                return new COWSubIterator(array, offset, offset+length, offset);
+            }
+        }
+
+        public ListIterator listIterator(int index) {
+            // must synchronize to atomically obtain the array and length
+            synchronized (CopyOnWriteArrayList.this) {
+                if (index < 0 || index >= length) {
+                    throw new IndexOutOfBoundsException("Index: " + index +
+                                                        ", Size: " + length);
+                }
+                Object[] array = getArray();
+                if (array != expectedArray) throw new ConcurrentModificationException();
+                return new COWSubIterator(array, offset, offset+length, offset+index);
+            }
+        }
+
+        public List subList(int fromIndex, int toIndex) {
+            if (fromIndex < 0 || toIndex > length  || fromIndex > toIndex) {
+                throw new IndexOutOfBoundsException();
+            }
+            return new COWSubList(offset+fromIndex, toIndex-fromIndex);
+        }
+
+        public String toString() {
+            Object[] array;
+            int last;
+            synchronized (CopyOnWriteArrayList.this) {
+                array = getArray();
+                if (array != expectedArray) throw new ConcurrentModificationException();
+                last = offset+length;
+            }
+            StringBuffer buf = new StringBuffer();
+            buf.append('[');
+            for (int i=offset; i<last; i++) {
+                if (i>offset) buf.append(", ");
+                buf.append(array[i]);
+            }
+            buf.append(']');
+            return buf.toString();
+        }
+
+        private void writeObject(ObjectOutputStream out) throws IOException {
+            synchronized (CopyOnWriteArrayList.this) {
+                if (getArray() != expectedArray) throw new ConcurrentModificationException();
+            }
+            out.defaultWriteObject();
+            synchronized (CopyOnWriteArrayList.this) {
+                if (getArray() != expectedArray) throw new ConcurrentModificationException();
+            }
+        }
+
+        private void readObject(ObjectInputStream in)
+            throws IOException, ClassNotFoundException
+        {
+            in.defaultReadObject();
+            synchronized (CopyOnWriteArrayList.this) {
+                expectedArray = getArray();
+            }
+        }
+    }
+
+    static class COWSubIterator implements ListIterator {
+        final Object[] array;
+        int cursor;
+        int first, last;
+        COWSubIterator(Object[] array, int first, int last, int cursor) {
+            this.array = array;
+            this.first = first;
+            this.last = last;
+            this.cursor = cursor;
+        }
+        public boolean hasNext() { return cursor < last; }
+        public boolean hasPrevious() { return cursor > first; }
+        public int nextIndex() { return cursor-first; }
+        public Object next() {
+            if (cursor == last) throw new NoSuchElementException();
+            return array[cursor++];
+        }
+        public int previousIndex() { return cursor-first-1; }
+        public Object previous() {
+            if (cursor == first) throw new NoSuchElementException();
+            return array[--cursor];
+        }
+        public void add(Object val) {
+            throw new UnsupportedOperationException();
+        }
+        public void set(Object val) {
+            throw new UnsupportedOperationException();
+        }
+        public void remove() {
+            throw new UnsupportedOperationException();
+        }
+    }
+
+    private static boolean eq(Object o1, Object o2) {
+        return (o1 == null ? o2 == null : o1.equals(o2));
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/CopyOnWriteArraySet.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/CopyOnWriteArraySet.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/CopyOnWriteArraySet.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,367 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain. Use, modify, and
+ * redistribute this code in any way without acknowledgement.
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+
+import java.util.AbstractSet;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Set;
+
+/**
+ * A {@link java.util.Set} that uses an internal {@link CopyOnWriteArrayList}
+ * for all of its operations.  Thus, it shares the same basic properties:
+ * <ul>
+ *  <li>It is best suited for applications in which set sizes generally
+ *       stay small, read-only operations
+ *       vastly outnumber mutative operations, and you need
+ *       to prevent interference among threads during traversal.
+ *  <li>It is thread-safe.
+ *  <li>Mutative operations (<tt>add</tt>, <tt>set</tt>, <tt>remove</tt>, etc.)
+ *      are expensive since they usually entail copying the entire underlying
+ *      array.
+ *  <li>Iterators do not support the mutative <tt>remove</tt> operation.
+ *  <li>Traversal via iterators is fast and cannot encounter
+ *      interference from other threads. Iterators rely on
+ *      unchanging snapshots of the array at the time the iterators were
+ *      constructed.
+ * </ul>
+ *
+ * <p> <b>Sample Usage.</b> The following code sketch uses a
+ * copy-on-write set to maintain a set of Handler objects that
+ * perform some action upon state updates.
+ *
+ * <pre>
+ * class Handler { void handle(); ... }
+ *
+ * class X {
+ *    private final CopyOnWriteArraySet&lt;Handler&gt; handlers
+ *       = new CopyOnWriteArraySet&lt;Handler&gt;();
+ *    public void addHandler(Handler h) { handlers.add(h); }
+ *
+ *    private long internalState;
+ *    private synchronized void changeState() { internalState = ...; }
+ *
+ *    public void update() {
+ *       changeState();
+ *       for (Handler handler : handlers)
+ *          handler.handle();
+ *    }
+ * }
+ * </pre>
+ *
+ * <p>This class is a member of the
+ * <a href="{@docRoot}/../guide/collections/index.html">
+ * Java Collections Framework</a>.
+ *
+ * @see CopyOnWriteArrayList
+ * @since 1.5
+ * @author Doug Lea
+ */
+public class CopyOnWriteArraySet extends AbstractSet
+        implements java.io.Serializable {
+    private static final long serialVersionUID = 5457747651344034263L;
+
+    private final CopyOnWriteArrayList al;
+
+    /**
+     * Creates an empty set.
+     */
+    public CopyOnWriteArraySet() {
+        al = new CopyOnWriteArrayList();
+    }
+
+    /**
+     * Creates a set containing all of the elements of the specified
+     * collection.
+     *
+     * @param c the collection of elements to initially contain
+     * @throws NullPointerException if the specified collection is null
+     */
+    public CopyOnWriteArraySet(Collection c) {
+        al = new CopyOnWriteArrayList();
+        al.addAllAbsent(c);
+    }
+
+    /**
+     * Returns the number of elements in this set.
+     *
+     * @return the number of elements in this set
+     */
+    public int size() {
+        return al.size();
+    }
+
+    /**
+     * Returns <tt>true</tt> if this set contains no elements.
+     *
+     * @return <tt>true</tt> if this set contains no elements
+     */
+    public boolean isEmpty() {
+        return al.isEmpty();
+    }
+
+    /**
+     * Returns <tt>true</tt> if this set contains the specified element.
+     * More formally, returns <tt>true</tt> if and only if this set
+     * contains an element <tt>e</tt> such that
+     * <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>.
+     *
+     * @param o element whose presence in this set is to be tested
+     * @return <tt>true</tt> if this set contains the specified element
+     */
+    public boolean contains(Object o) {
+        return al.contains(o);
+    }
+
+    /**
+     * Returns an array containing all of the elements in this set.
+     * If this set makes any guarantees as to what order its elements
+     * are returned by its iterator, this method must return the
+     * elements in the same order.
+     *
+     * <p>The returned array will be "safe" in that no references to it
+     * are maintained by this set.  (In other words, this method must
+     * allocate a new array even if this set is backed by an array).
+     * The caller is thus free to modify the returned array.
+     *
+     * <p>This method acts as bridge between array-based and collection-based
+     * APIs.
+     *
+     * @return an array containing all the elements in this set
+     */
+    public Object[] toArray() {
+        return al.toArray();
+    }
+
+    /**
+     * Returns an array containing all of the elements in this set; the
+     * runtime type of the returned array is that of the specified array.
+     * If the set fits in the specified array, it is returned therein.
+     * Otherwise, a new array is allocated with the runtime type of the
+     * specified array and the size of this set.
+     *
+     * <p>If this set fits in the specified array with room to spare
+     * (i.e., the array has more elements than this set), the element in
+     * the array immediately following the end of the set is set to
+     * <tt>null</tt>.  (This is useful in determining the length of this
+     * set <i>only</i> if the caller knows that this set does not contain
+     * any null elements.)
+     *
+     * <p>If this set makes any guarantees as to what order its elements
+     * are returned by its iterator, this method must return the elements
+     * in the same order.
+     *
+     * <p>Like the {@link #toArray()} method, this method acts as bridge between
+     * array-based and collection-based APIs.  Further, this method allows
+     * precise control over the runtime type of the output array, and may,
+     * under certain circumstances, be used to save allocation costs.
+     *
+     * <p>Suppose <tt>x</tt> is a set known to contain only strings.
+     * The following code can be used to dump the set into a newly allocated
+     * array of <tt>String</tt>:
+     *
+     * <pre>
+     *     String[] y = x.toArray(new String[0]);</pre>
+     *
+     * Note that <tt>toArray(new Object[0])</tt> is identical in function to
+     * <tt>toArray()</tt>.
+     *
+     * @param a the array into which the elements of this set are to be
+     *        stored, if it is big enough; otherwise, a new array of the same
+     *        runtime type is allocated for this purpose.
+     * @return an array containing all the elements in this set
+     * @throws ArrayStoreException if the runtime type of the specified array
+     *         is not a supertype of the runtime type of every element in this
+     *         set
+     * @throws NullPointerException if the specified array is null
+     */
+    public Object[] toArray(Object[] a) {
+        return al.toArray(a);
+    }
+
+    /**
+     * Removes all of the elements from this set.
+     * The set will be empty after this call returns.
+     */
+    public void clear() {
+        al.clear();
+    }
+
+    /**
+     * Removes the specified element from this set if it is present.
+     * More formally, removes an element <tt>e</tt> such that
+     * <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>,
+     * if this set contains such an element.  Returns <tt>true</tt> if
+     * this set contained the element (or equivalently, if this set
+     * changed as a result of the call).  (This set will not contain the
+     * element once the call returns.)
+     *
+     * @param o object to be removed from this set, if present
+     * @return <tt>true</tt> if this set contained the specified element
+     */
+    public boolean remove(Object o) {
+        return al.remove(o);
+    }
+
+    /**
+     * Adds the specified element to this set if it is not already present.
+     * More formally, adds the specified element <tt>e</tt> to this set if
+     * the set contains no element <tt>e2</tt> such that
+     * <tt>(e==null&nbsp;?&nbsp;e2==null&nbsp;:&nbsp;e.equals(e2))</tt>.
+     * If this set already contains the element, the call leaves the set
+     * unchanged and returns <tt>false</tt>.
+     *
+     * @param e element to be added to this set
+     * @return <tt>true</tt> if this set did not already contain the specified
+     *         element
+     */
+    public boolean add(Object e) {
+        return al.addIfAbsent(e);
+    }
+
+    /**
+     * Returns <tt>true</tt> if this set contains all of the elements of the
+     * specified collection.  If the specified collection is also a set, this
+     * method returns <tt>true</tt> if it is a <i>subset</i> of this set.
+     *
+     * @param  c collection to be checked for containment in this set
+     * @return <tt>true</tt> if this set contains all of the elements of the
+     * 	       specified collection
+     * @throws NullPointerException if the specified collection is null
+     * @see #contains(Object)
+     */
+    public boolean containsAll(Collection c) {
+        return al.containsAll(c);
+    }
+
+    /**
+     * Adds all of the elements in the specified collection to this set if
+     * they're not already present.  If the specified collection is also a
+     * set, the <tt>addAll</tt> operation effectively modifies this set so
+     * that its value is the <i>union</i> of the two sets.  The behavior of
+     * this operation is undefined if the specified collection is modified
+     * while the operation is in progress.
+     *
+     * @param  c collection containing elements to be added to this set
+     * @return <tt>true</tt> if this set changed as a result of the call
+     * @throws NullPointerException if the specified collection is null
+     * @see #add(Object)
+     */
+    public boolean addAll(Collection c) {
+        return al.addAllAbsent(c) > 0;
+    }
+
+    /**
+     * Removes from this set all of its elements that are contained in the
+     * specified collection.  If the specified collection is also a set,
+     * this operation effectively modifies this set so that its value is the
+     * <i>asymmetric set difference</i> of the two sets.
+     *
+     * @param  c collection containing elements to be removed from this set
+     * @return <tt>true</tt> if this set changed as a result of the call
+     * @throws ClassCastException if the class of an element of this set
+     *         is incompatible with the specified collection (optional)
+     * @throws NullPointerException if this set contains a null element and the
+     *         specified collection does not permit null elements (optional),
+     *         or if the specified collection is null
+     * @see #remove(Object)
+     */
+    public boolean removeAll(Collection c) {
+        return al.removeAll(c);
+    }
+
+    /**
+     * Retains only the elements in this set that are contained in the
+     * specified collection.  In other words, removes from this set all of
+     * its elements that are not contained in the specified collection.  If
+     * the specified collection is also a set, this operation effectively
+     * modifies this set so that its value is the <i>intersection</i> of the
+     * two sets.
+     *
+     * @param  c collection containing elements to be retained in this set
+     * @return <tt>true</tt> if this set changed as a result of the call
+     * @throws ClassCastException if the class of an element of this set
+     *         is incompatible with the specified collection (optional)
+     * @throws NullPointerException if this set contains a null element and the
+     *         specified collection does not permit null elements (optional),
+     *         or if the specified collection is null
+     * @see #remove(Object)
+     */
+    public boolean retainAll(Collection c) {
+        return al.retainAll(c);
+    }
+
+    /**
+     * Returns an iterator over the elements contained in this set
+     * in the order in which these elements were added.
+     *
+     * <p>The returned iterator provides a snapshot of the state of the set
+     * when the iterator was constructed. No synchronization is needed while
+     * traversing the iterator. The iterator does <em>NOT</em> support the
+     * <tt>remove</tt> method.
+     *
+     * @return an iterator over the elements in this set
+     */
+    public Iterator iterator() {
+        return al.iterator();
+    }
+
+    /**
+     * Compares the specified object with this set for equality.
+     * Returns {@code true} if the specified object is the same object
+     * as this object, or if it is also a {@link Set} and the elements
+     * returned by an {@linkplain java.util.List#iterator() iterator} over the
+     * specified set are the same as the elements returned by an
+     * iterator over this set.  More formally, the two iterators are
+     * considered to return the same elements if they return the same
+     * number of elements and for every element {@code e1} returned by
+     * the iterator over the specified set, there is an element
+     * {@code e2} returned by the iterator over this set such that
+     * {@code (e1==null ? e2==null : e1.equals(e2))}.
+     *
+     * @param o object to be compared for equality with this set
+     * @return {@code true} if the specified object is equal to this set
+     */
+    public boolean equals(Object o) {
+        if (o == this)
+            return true;
+        if (!(o instanceof Set))
+            return false;
+        Set set = (Set)(o);
+	Iterator it = set.iterator();
+
+        // Uses O(n^2) algorithm that is only appropriate
+        // for small sets, which CopyOnWriteArraySets should be.
+
+        //  Use a single snapshot of underlying array
+	Object[] elements = al.getArray();
+	int len = elements.length;
+        // Mark matched elements to avoid re-checking
+        boolean[] matched = new boolean[len];
+        int k = 0;
+        outer: while (it.hasNext()) {
+            if (++k > len)
+                return false;
+            Object x = it.next();
+            for (int i = 0; i < len; ++i) {
+                if (!matched[i] && eq(x, elements[i])) {
+                    matched[i] = true;
+		    continue outer;
+                }
+            }
+	    return false;
+        }
+        return k == len;
+    }
+
+    /**
+     * Test for equality, coping with nulls.
+     */
+    private static boolean eq(Object o1, Object o2) {
+        return (o1 == null ? o2 == null : o1.equals(o2));
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/CountDownLatch.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/CountDownLatch.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/CountDownLatch.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,284 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain. Use, modify, and
+ * redistribute this code in any way without acknowledgement.
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.*;
+
+/**
+ * A synchronization aid that allows one or more threads to wait until
+ * a set of operations being performed in other threads completes.
+ *
+ * <p>A {@code CountDownLatch} is initialized with a given <em>count</em>.
+ * The {@link #await await} methods block until the current count reaches
+ * zero due to invocations of the {@link #countDown} method, after which
+ * all waiting threads are released and any subsequent invocations of
+ * {@link #await await} return immediately.  This is a one-shot phenomenon
+ * -- the count cannot be reset.  If you need a version that resets the
+ * count, consider using a {@link CyclicBarrier}.
+ *
+ * <p>A {@code CountDownLatch} is a versatile synchronization tool
+ * and can be used for a number of purposes.  A
+ * {@code CountDownLatch} initialized with a count of one serves as a
+ * simple on/off latch, or gate: all threads invoking {@link #await await}
+ * wait at the gate until it is opened by a thread invoking {@link
+ * #countDown}.  A {@code CountDownLatch} initialized to <em>N</em>
+ * can be used to make one thread wait until <em>N</em> threads have
+ * completed some action, or some action has been completed N times.
+ *
+ * <p>A useful property of a {@code CountDownLatch} is that it
+ * doesn't require that threads calling {@code countDown} wait for
+ * the count to reach zero before proceeding, it simply prevents any
+ * thread from proceeding past an {@link #await await} until all
+ * threads could pass.
+ *
+ * <p><b>Sample usage:</b> Here is a pair of classes in which a group
+ * of worker threads use two countdown latches:
+ * <ul>
+ * <li>The first is a start signal that prevents any worker from proceeding
+ * until the driver is ready for them to proceed;
+ * <li>The second is a completion signal that allows the driver to wait
+ * until all workers have completed.
+ * </ul>
+ *
+ * <pre>
+ * class Driver { // ...
+ *   void main() throws InterruptedException {
+ *     CountDownLatch startSignal = new CountDownLatch(1);
+ *     CountDownLatch doneSignal = new CountDownLatch(N);
+ *
+ *     for (int i = 0; i < N; ++i) // create and start threads
+ *       new Thread(new Worker(startSignal, doneSignal)).start();
+ *
+ *     doSomethingElse();            // don't let run yet
+ *     startSignal.countDown();      // let all threads proceed
+ *     doSomethingElse();
+ *     doneSignal.await();           // wait for all to finish
+ *   }
+ * }
+ *
+ * class Worker implements Runnable {
+ *   private final CountDownLatch startSignal;
+ *   private final CountDownLatch doneSignal;
+ *   Worker(CountDownLatch startSignal, CountDownLatch doneSignal) {
+ *      this.startSignal = startSignal;
+ *      this.doneSignal = doneSignal;
+ *   }
+ *   public void run() {
+ *      try {
+ *        startSignal.await();
+ *        doWork();
+ *        doneSignal.countDown();
+ *      } catch (InterruptedException ex) {} // return;
+ *   }
+ *
+ *   void doWork() { ... }
+ * }
+ *
+ * </pre>
+ *
+ * <p>Another typical usage would be to divide a problem into N parts,
+ * describe each part with a Runnable that executes that portion and
+ * counts down on the latch, and queue all the Runnables to an
+ * Executor.  When all sub-parts are complete, the coordinating thread
+ * will be able to pass through await. (When threads must repeatedly
+ * count down in this way, instead use a {@link CyclicBarrier}.)
+ *
+ * <pre>
+ * class Driver2 { // ...
+ *   void main() throws InterruptedException {
+ *     CountDownLatch doneSignal = new CountDownLatch(N);
+ *     Executor e = ...
+ *
+ *     for (int i = 0; i < N; ++i) // create and start threads
+ *       e.execute(new WorkerRunnable(doneSignal, i));
+ *
+ *     doneSignal.await();           // wait for all to finish
+ *   }
+ * }
+ *
+ * class WorkerRunnable implements Runnable {
+ *   private final CountDownLatch doneSignal;
+ *   private final int i;
+ *   WorkerRunnable(CountDownLatch doneSignal, int i) {
+ *      this.doneSignal = doneSignal;
+ *      this.i = i;
+ *   }
+ *   public void run() {
+ *      try {
+ *        doWork(i);
+ *        doneSignal.countDown();
+ *      } catch (InterruptedException ex) {} // return;
+ *   }
+ *
+ *   void doWork() { ... }
+ * }
+ *
+ * </pre>
+ *
+ * <p>Memory consistency effects: Actions in a thread prior to calling
+ * {@code countDown()}
+ * <a href="package-summary.html#MemoryVisibility"><i>happen-before</i></a>
+ * actions following a successful return from a corresponding
+ * {@code await()} in another thread.
+ *
+ * @since 1.5
+ * @author Doug Lea
+ */
+public class CountDownLatch {
+
+    private int count_;
+
+    /**
+     * Constructs a {@code CountDownLatch} initialized with the given count.
+     *
+     * @param count the number of times {@link #countDown} must be invoked
+     *        before threads can pass through {@link #await}
+     * @throws IllegalArgumentException if {@code count} is negative
+     */
+    public CountDownLatch(int count) {
+        if (count < 0) throw new IllegalArgumentException("count < 0");
+        this.count_ = count;
+    }
+
+    /**
+     * Causes the current thread to wait until the latch has counted down to
+     * zero, unless the thread is {@linkplain Thread#interrupt interrupted}.
+     *
+     * <p>If the current count is zero then this method returns immediately.
+     *
+     * <p>If the current count is greater than zero then the current
+     * thread becomes disabled for thread scheduling purposes and lies
+     * dormant until one of two things happen:
+     * <ul>
+     * <li>The count reaches zero due to invocations of the
+     * {@link #countDown} method; or
+     * <li>Some other thread {@linkplain Thread#interrupt interrupts}
+     * the current thread.
+     * </ul>
+     *
+     * <p>If the current thread:
+     * <ul>
+     * <li>has its interrupted status set on entry to this method; or
+     * <li>is {@linkplain Thread#interrupt interrupted} while waiting,
+     * </ul>
+     * then {@link InterruptedException} is thrown and the current thread's
+     * interrupted status is cleared.
+     *
+     * @throws InterruptedException if the current thread is interrupted
+     *         while waiting
+     */
+    public void await() throws InterruptedException {
+        if (Thread.interrupted()) throw new InterruptedException();
+        synchronized(this) {
+            while (count_ > 0)
+                wait();
+        }
+    }
+
+    /**
+     * Causes the current thread to wait until the latch has counted down to
+     * zero, unless the thread is {@linkplain Thread#interrupt interrupted},
+     * or the specified waiting time elapses.
+     *
+     * <p>If the current count is zero then this method returns immediately
+     * with the value {@code true}.
+     *
+     * <p>If the current count is greater than zero then the current
+     * thread becomes disabled for thread scheduling purposes and lies
+     * dormant until one of three things happen:
+     * <ul>
+     * <li>The count reaches zero due to invocations of the
+     * {@link #countDown} method; or
+     * <li>Some other thread {@linkplain Thread#interrupt interrupts}
+     * the current thread; or
+     * <li>The specified waiting time elapses.
+     * </ul>
+     *
+     * <p>If the count reaches zero then the method returns with the
+     * value {@code true}.
+     *
+     * <p>If the current thread:
+     * <ul>
+     * <li>has its interrupted status set on entry to this method; or
+     * <li>is {@linkplain Thread#interrupt interrupted} while waiting,
+     * </ul>
+     * then {@link InterruptedException} is thrown and the current thread's
+     * interrupted status is cleared.
+     *
+     * <p>If the specified waiting time elapses then the value {@code false}
+     * is returned.  If the time is less than or equal to zero, the method
+     * will not wait at all.
+     *
+     * @param timeout the maximum time to wait
+     * @param unit the time unit of the {@code timeout} argument
+     * @return {@code true} if the count reached zero and {@code false}
+     *         if the waiting time elapsed before the count reached zero
+     * @throws InterruptedException if the current thread is interrupted
+     *         while waiting
+     */
+    public boolean await(long timeout, TimeUnit unit) throws InterruptedException {
+        if (Thread.interrupted()) throw new InterruptedException();
+        long nanos = unit.toNanos(timeout);
+        synchronized (this) {
+            if (count_ <= 0)
+                return true;
+            else if (nanos <= 0)
+                return false;
+            else {
+                long deadline = Utils.nanoTime() + nanos;
+                for (; ; ) {
+                    TimeUnit.NANOSECONDS.timedWait(this, nanos);
+                    if (count_ <= 0)
+                        return true;
+                    else {
+                        nanos = deadline - Utils.nanoTime();
+                        if (nanos <= 0)
+                            return false;
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * Decrements the count of the latch, releasing all waiting threads if
+     * the count reaches zero.
+     *
+     * <p>If the current count is greater than zero then it is decremented.
+     * If the new count is zero then all waiting threads are re-enabled for
+     * thread scheduling purposes.
+     *
+     * <p>If the current count equals zero then nothing happens.
+     */
+    public synchronized void countDown() {
+        if (count_ == 0) return;
+        if (--count_ == 0)
+            notifyAll();
+    }
+
+    /**
+     * Returns the current count.
+     *
+     * <p>This method is typically used for debugging and testing purposes.
+     *
+     * @return the current count
+     */
+    public long getCount() {
+        return count_;
+    }
+
+    /**
+     * Returns a string identifying this latch, as well as its state.
+     * The state, in brackets, includes the String {@code "Count ="}
+     * followed by the current count.
+     *
+     * @return a string identifying this latch, as well as its state
+     */
+    public String toString() {
+        return super.toString() + "[Count = " + getCount() + "]";
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/CyclicBarrier.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/CyclicBarrier.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/CyclicBarrier.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,439 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.*;
+
+/**
+ * A synchronization aid that allows a set of threads to all wait for
+ * each other to reach a common barrier point.  CyclicBarriers are
+ * useful in programs involving a fixed sized party of threads that
+ * must occasionally wait for each other. The barrier is called
+ * <em>cyclic</em> because it can be re-used after the waiting threads
+ * are released.
+ *
+ * <p>A <tt>CyclicBarrier</tt> supports an optional {@link Runnable} command
+ * that is run once per barrier point, after the last thread in the party
+ * arrives, but before any threads are released.
+ * This <em>barrier action</em> is useful
+ * for updating shared-state before any of the parties continue.
+ *
+ * <p><b>Sample usage:</b> Here is an example of
+ *  using a barrier in a parallel decomposition design:
+ * <pre>
+ * class Solver {
+ *   final int N;
+ *   final float[][] data;
+ *   final CyclicBarrier barrier;
+ *
+ *   class Worker implements Runnable {
+ *     int myRow;
+ *     Worker(int row) { myRow = row; }
+ *     public void run() {
+ *       while (!done()) {
+ *         processRow(myRow);
+ *
+ *         try {
+ *           barrier.await();
+ *         } catch (InterruptedException ex) {
+ *           return;
+ *         } catch (BrokenBarrierException ex) {
+ *           return;
+ *         }
+ *       }
+ *     }
+ *   }
+ *
+ *   public Solver(float[][] matrix) {
+ *     data = matrix;
+ *     N = matrix.length;
+ *     barrier = new CyclicBarrier(N,
+ *                                 new Runnable() {
+ *                                   public void run() {
+ *                                     mergeRows(...);
+ *                                   }
+ *                                 });
+ *     for (int i = 0; i < N; ++i)
+ *       new Thread(new Worker(i)).start();
+ *
+ *     waitUntilDone();
+ *   }
+ * }
+ * </pre>
+ * Here, each worker thread processes a row of the matrix then waits at the
+ * barrier until all rows have been processed. When all rows are processed
+ * the supplied {@link Runnable} barrier action is executed and merges the
+ * rows. If the merger
+ * determines that a solution has been found then <tt>done()</tt> will return
+ * <tt>true</tt> and each worker will terminate.
+ *
+ * <p>If the barrier action does not rely on the parties being suspended when
+ * it is executed, then any of the threads in the party could execute that
+ * action when it is released. To facilitate this, each invocation of
+ * {@link #await} returns the arrival index of that thread at the barrier.
+ * You can then choose which thread should execute the barrier action, for
+ * example:
+ * <pre>  if (barrier.await() == 0) {
+ *     // log the completion of this iteration
+ *   }</pre>
+ *
+ * <p>The <tt>CyclicBarrier</tt> uses an all-or-none breakage model
+ * for failed synchronization attempts: If a thread leaves a barrier
+ * point prematurely because of interruption, failure, or timeout, all
+ * other threads waiting at that barrier point will also leave
+ * abnormally via {@link BrokenBarrierException} (or
+ * {@link InterruptedException} if they too were interrupted at about
+ * the same time).
+ *
+ * <p>Memory consistency effects: Actions in a thread prior to calling
+ * {@code await()}
+ * <a href="package-summary.html#MemoryVisibility"><i>happen-before</i></a>
+ * actions that are part of the barrier action, which in turn
+ * <i>happen-before</i> actions following a successful return from the
+ * corresponding {@code await()} in other threads.
+ *
+ * @since 1.5
+ * @see CountDownLatch
+ *
+ * @author Doug Lea
+ */
+public class CyclicBarrier {
+    /**
+     * Each use of the barrier is represented as a generation instance.
+     * The generation changes whenever the barrier is tripped, or
+     * is reset. There can be many generations associated with threads
+     * using the barrier - due to the non-deterministic way the lock
+     * may be allocated to waiting threads - but only one of these
+     * can be active at a time (the one to which <tt>count</tt> applies)
+     * and all the rest are either broken or tripped.
+     * There need not be an active generation if there has been a break
+     * but no subsequent reset.
+     */
+    private static class Generation {
+        boolean broken = false;
+    }
+
+    /** The lock for guarding barrier entry */
+    private final Object lock = new Object();
+    /** The number of parties */
+    private final int parties;
+    /* The command to run when tripped */
+    private final Runnable barrierCommand;
+    /** The current generation */
+    private Generation generation = new Generation();
+
+    /**
+     * Number of parties still waiting. Counts down from parties to 0
+     * on each generation.  It is reset to parties on each new
+     * generation or when broken.
+     */
+    private int count;
+
+    /**
+     * Updates state on barrier trip and wakes up everyone.
+     * Called only while holding lock.
+     */
+    private void nextGeneration() {
+        // signal completion of last generation
+        lock.notifyAll();
+        // set up next generation
+        count = parties;
+        generation = new Generation();
+    }
+
+    /**
+     * Sets current barrier generation as broken and wakes up everyone.
+     * Called only while holding lock.
+     */
+    private void breakBarrier() {
+        generation.broken = true;
+        count = parties;
+        lock.notifyAll();
+    }
+
+    /**
+     * Main barrier code, covering the various policies.
+     */
+    private int dowait(boolean timed, long nanos)
+        throws InterruptedException, BrokenBarrierException,
+               TimeoutException {
+        synchronized (lock) {
+            final Generation g = generation;
+
+            if (g.broken)
+                throw new BrokenBarrierException();
+
+            if (Thread.interrupted()) {
+                breakBarrier();
+                throw new InterruptedException();
+            }
+
+            int index = --count;
+            if (index == 0) {  // tripped
+                boolean ranAction = false;
+                try {
+                    final Runnable command = barrierCommand;
+                    if (command != null)
+                        command.run();
+                    ranAction = true;
+                    nextGeneration();
+                    return 0;
+                } finally {
+                    if (!ranAction)
+                        breakBarrier();
+                }
+            }
+
+            // loop until tripped, broken, interrupted, or timed out
+            long deadline = timed ? Utils.nanoTime() + nanos : 0;
+            for (;;) {
+                try {
+                    if (!timed)
+                        lock.wait();
+                    else if (nanos > 0L)
+                        TimeUnit.NANOSECONDS.timedWait(lock, nanos);
+                } catch (InterruptedException ie) {
+                    if (g == generation && ! g.broken) {
+                        breakBarrier();
+                        throw ie;
+                    } else {
+                        // We're about to finish waiting even if we had not
+                        // been interrupted, so this interrupt is deemed to
+                        // "belong" to subsequent execution.
+                        Thread.currentThread().interrupt();
+                    }
+                }
+
+                if (g.broken)
+                    throw new BrokenBarrierException();
+
+                if (g != generation)
+                    return index;
+
+                if (timed && nanos <= 0L) {
+                    breakBarrier();
+                    throw new TimeoutException();
+                }
+                nanos = deadline - Utils.nanoTime();
+            }
+        }
+    }
+
+    /**
+     * Creates a new <tt>CyclicBarrier</tt> that will trip when the
+     * given number of parties (threads) are waiting upon it, and which
+     * will execute the given barrier action when the barrier is tripped,
+     * performed by the last thread entering the barrier.
+     *
+     * @param parties the number of threads that must invoke {@link #await}
+     *        before the barrier is tripped
+     * @param barrierAction the command to execute when the barrier is
+     *        tripped, or {@code null} if there is no action
+     * @throws IllegalArgumentException if {@code parties} is less than 1
+     */
+    public CyclicBarrier(int parties, Runnable barrierAction) {
+        if (parties <= 0) throw new IllegalArgumentException();
+        this.parties = parties;
+        this.count = parties;
+        this.barrierCommand = barrierAction;
+    }
+
+    /**
+     * Creates a new <tt>CyclicBarrier</tt> that will trip when the
+     * given number of parties (threads) are waiting upon it, and
+     * does not perform a predefined action when the barrier is tripped.
+     *
+     * @param parties the number of threads that must invoke {@link #await}
+     *        before the barrier is tripped
+     * @throws IllegalArgumentException if {@code parties} is less than 1
+     */
+    public CyclicBarrier(int parties) {
+        this(parties, null);
+    }
+
+    /**
+     * Returns the number of parties required to trip this barrier.
+     *
+     * @return the number of parties required to trip this barrier
+     */
+    public int getParties() {
+        return parties;
+    }
+
+    /**
+     * Waits until all {@linkplain #getParties parties} have invoked
+     * <tt>await</tt> on this barrier.
+     *
+     * <p>If the current thread is not the last to arrive then it is
+     * disabled for thread scheduling purposes and lies dormant until
+     * one of the following things happens:
+     * <ul>
+     * <li>The last thread arrives; or
+     * <li>Some other thread {@linkplain Thread#interrupt interrupts}
+     * the current thread; or
+     * <li>Some other thread {@linkplain Thread#interrupt interrupts}
+     * one of the other waiting threads; or
+     * <li>Some other thread times out while waiting for barrier; or
+     * <li>Some other thread invokes {@link #reset} on this barrier.
+     * </ul>
+     *
+     * <p>If the current thread:
+     * <ul>
+     * <li>has its interrupted status set on entry to this method; or
+     * <li>is {@linkplain Thread#interrupt interrupted} while waiting
+     * </ul>
+     * then {@link InterruptedException} is thrown and the current thread's
+     * interrupted status is cleared.
+     *
+     * <p>If the barrier is {@link #reset} while any thread is waiting,
+     * or if the barrier {@linkplain #isBroken is broken} when
+     * <tt>await</tt> is invoked, or while any thread is waiting, then
+     * {@link BrokenBarrierException} is thrown.
+     *
+     * <p>If any thread is {@linkplain Thread#interrupt interrupted} while waiting,
+     * then all other waiting threads will throw
+     * {@link BrokenBarrierException} and the barrier is placed in the broken
+     * state.
+     *
+     * <p>If the current thread is the last thread to arrive, and a
+     * non-null barrier action was supplied in the constructor, then the
+     * current thread runs the action before allowing the other threads to
+     * continue.
+     * If an exception occurs during the barrier action then that exception
+     * will be propagated in the current thread and the barrier is placed in
+     * the broken state.
+     *
+     * @return the arrival index of the current thread, where index
+     *         <tt>{@link #getParties()} - 1</tt> indicates the first
+     *         to arrive and zero indicates the last to arrive
+     * @throws InterruptedException if the current thread was interrupted
+     *         while waiting
+     * @throws BrokenBarrierException if <em>another</em> thread was
+     *         interrupted or timed out while the current thread was
+     *         waiting, or the barrier was reset, or the barrier was
+     *         broken when {@code await} was called, or the barrier
+     *         action (if present) failed due an exception.
+     */
+    public int await() throws InterruptedException, BrokenBarrierException {
+        try {
+            return dowait(false, 0L);
+        } catch (TimeoutException toe) {
+            throw new Error(toe); // cannot happen;
+        }
+    }
+
+    /**
+     * Waits until all {@linkplain #getParties parties} have invoked
+     * <tt>await</tt> on this barrier, or the specified waiting time elapses.
+     *
+     * <p>If the current thread is not the last to arrive then it is
+     * disabled for thread scheduling purposes and lies dormant until
+     * one of the following things happens:
+     * <ul>
+     * <li>The last thread arrives; or
+     * <li>The specified timeout elapses; or
+     * <li>Some other thread {@linkplain Thread#interrupt interrupts}
+     * the current thread; or
+     * <li>Some other thread {@linkplain Thread#interrupt interrupts}
+     * one of the other waiting threads; or
+     * <li>Some other thread times out while waiting for barrier; or
+     * <li>Some other thread invokes {@link #reset} on this barrier.
+     * </ul>
+     *
+     * <p>If the current thread:
+     * <ul>
+     * <li>has its interrupted status set on entry to this method; or
+     * <li>is {@linkplain Thread#interrupt interrupted} while waiting
+     * </ul>
+     * then {@link InterruptedException} is thrown and the current thread's
+     * interrupted status is cleared.
+     *
+     * <p>If the specified waiting time elapses then {@link TimeoutException}
+     * is thrown. If the time is less than or equal to zero, the
+     * method will not wait at all.
+     *
+     * <p>If the barrier is {@link #reset} while any thread is waiting,
+     * or if the barrier {@linkplain #isBroken is broken} when
+     * <tt>await</tt> is invoked, or while any thread is waiting, then
+     * {@link BrokenBarrierException} is thrown.
+     *
+     * <p>If any thread is {@linkplain Thread#interrupt interrupted} while
+     * waiting, then all other waiting threads will throw {@link
+     * BrokenBarrierException} and the barrier is placed in the broken
+     * state.
+     *
+     * <p>If the current thread is the last thread to arrive, and a
+     * non-null barrier action was supplied in the constructor, then the
+     * current thread runs the action before allowing the other threads to
+     * continue.
+     * If an exception occurs during the barrier action then that exception
+     * will be propagated in the current thread and the barrier is placed in
+     * the broken state.
+     *
+     * @param timeout the time to wait for the barrier
+     * @param unit the time unit of the timeout parameter
+     * @return the arrival index of the current thread, where index
+     *         <tt>{@link #getParties()} - 1</tt> indicates the first
+     *         to arrive and zero indicates the last to arrive
+     * @throws InterruptedException if the current thread was interrupted
+     *         while waiting
+     * @throws TimeoutException if the specified timeout elapses
+     * @throws BrokenBarrierException if <em>another</em> thread was
+     *         interrupted or timed out while the current thread was
+     *         waiting, or the barrier was reset, or the barrier was broken
+     *         when {@code await} was called, or the barrier action (if
+     *         present) failed due an exception
+     */
+    public int await(long timeout, TimeUnit unit)
+        throws InterruptedException,
+               BrokenBarrierException,
+               TimeoutException {
+        return dowait(true, unit.toNanos(timeout));
+    }
+
+    /**
+     * Queries if this barrier is in a broken state.
+     *
+     * @return {@code true} if one or more parties broke out of this
+     *         barrier due to interruption or timeout since
+     *         construction or the last reset, or a barrier action
+     *         failed due to an exception; {@code false} otherwise.
+     */
+    public boolean isBroken() {
+        synchronized (lock) {
+            return generation.broken;
+        }
+    }
+
+    /**
+     * Resets the barrier to its initial state.  If any parties are
+     * currently waiting at the barrier, they will return with a
+     * {@link BrokenBarrierException}. Note that resets <em>after</em>
+     * a breakage has occurred for other reasons can be complicated to
+     * carry out; threads need to re-synchronize in some other way,
+     * and choose one to perform the reset.  It may be preferable to
+     * instead create a new barrier for subsequent use.
+     */
+    public void reset() {
+        synchronized (lock) {
+            breakBarrier();   // break the current generation
+            nextGeneration(); // start a new generation
+        }
+    }
+
+    /**
+     * Returns the number of parties currently waiting at the barrier.
+     * This method is primarily useful for debugging and assertions.
+     *
+     * @return the number of parties currently blocked in {@link #await}
+     */
+    public int getNumberWaiting() {
+        synchronized (lock) {
+            return parties - count;
+        }
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/DelayQueue.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/DelayQueue.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/DelayQueue.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,440 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import edu.emory.mathcs.backport.java.util.*;
+import java.util.Collection;
+import java.util.Iterator;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.Utils;
+import java.util.NoSuchElementException;
+
+/**
+ * An unbounded {@linkplain BlockingQueue blocking queue} of
+ * <tt>Delayed</tt> elements, in which an element can only be taken
+ * when its delay has expired.  The <em>head</em> of the queue is that
+ * <tt>Delayed</tt> element whose delay expired furthest in the
+ * past.  If no delay has expired there is no head and <tt>poll</tt>
+ * will return <tt>null</tt>. Expiration occurs when an element's
+ * <tt>getDelay(TimeUnit.NANOSECONDS)</tt> method returns a value less
+ * than or equal to zero.  Even though unexpired elements cannot be
+ * removed using <tt>take</tt> or <tt>poll</tt>, they are otherwise
+ * treated as normal elements. For example, the <tt>size</tt> method
+ * returns the count of both expired and unexpired elements.
+ * This queue does not permit null elements.
+ *
+ * <p>This class and its iterator implement all of the
+ * <em>optional</em> methods of the {@link Collection} and {@link
+ * Iterator} interfaces.
+ *
+ * <p>This class is a member of the
+ * <a href="{@docRoot}/../guide/collections/index.html">
+ * Java Collections Framework</a>.
+ *
+ * @since 1.5
+ * @author Doug Lea
+ */
+
+public class DelayQueue extends AbstractQueue
+    implements BlockingQueue {
+
+    private transient final Object lock = new Object();
+    private final PriorityQueue q = new PriorityQueue();
+
+    /**
+     * Creates a new <tt>DelayQueue</tt> that is initially empty.
+     */
+    public DelayQueue() {}
+
+    /**
+     * Creates a <tt>DelayQueue</tt> initially containing the elements of the
+     * given collection of {@link Delayed} instances.
+     *
+     * @param c the collection of elements to initially contain
+     * @throws NullPointerException if the specified collection or any
+     *         of its elements are null
+     */
+    public DelayQueue(Collection c) {
+        this.addAll(c);
+    }
+
+    /**
+     * Inserts the specified element into this delay queue.
+     *
+     * @param e the element to add
+     * @return <tt>true</tt> (as specified by {@link Collection#add})
+     * @throws NullPointerException if the specified element is null
+     */
+    public boolean add(Object e) {
+        return offer(e);
+    }
+
+    /**
+     * Inserts the specified element into this delay queue.
+     *
+     * @param e the element to add
+     * @return <tt>true</tt>
+     * @throws NullPointerException if the specified element is null
+     */
+    public boolean offer(Object e) {
+        synchronized (lock) {
+            Object first = q.peek();
+            q.offer(e);
+            if (first == null || ((Delayed)e).compareTo(first) < 0)
+                lock.notifyAll();
+            return true;
+        }
+    }
+
+    /**
+     * Inserts the specified element into this delay queue. As the queue is
+     * unbounded this method will never block.
+     *
+     * @param e the element to add
+     * @throws NullPointerException {@inheritDoc}
+     */
+    public void put(Object e) {
+        offer(e);
+    }
+
+    /**
+     * Inserts the specified element into this delay queue. As the queue is
+     * unbounded this method will never block.
+     *
+     * @param e the element to add
+     * @param timeout This parameter is ignored as the method never blocks
+     * @param unit This parameter is ignored as the method never blocks
+     * @return <tt>true</tt>
+     * @throws NullPointerException {@inheritDoc}
+     */
+    public boolean offer(Object e, long timeout, TimeUnit unit) {
+        return offer(e);
+    }
+
+    /**
+     * Retrieves and removes the head of this queue, or returns <tt>null</tt>
+     * if this queue has no elements with an expired delay.
+     *
+     * @return the head of this queue, or <tt>null</tt> if this
+     *         queue has no elements with an expired delay
+     */
+    public Object poll() {
+        synchronized (lock) {
+            Object first = q.peek();
+            if (first == null || ((Delayed)first).getDelay(TimeUnit.NANOSECONDS) > 0)
+                return null;
+            else {
+                Object x = q.poll();
+                assert x != null;
+                if (q.size() != 0)
+                    lock.notifyAll();
+                return x;
+            }
+        }
+    }
+
+    /**
+     * Retrieves and removes the head of this queue, waiting if necessary
+     * until an element with an expired delay is available on this queue.
+     *
+     * @return the head of this queue
+     * @throws InterruptedException {@inheritDoc}
+     */
+    public Object take() throws InterruptedException {
+        synchronized (lock) {
+            for (;;) {
+                Object first = q.peek();
+                if (first == null) {
+                    lock.wait();
+                } else {
+                    long delay =  ((Delayed)first).getDelay(TimeUnit.NANOSECONDS);
+                    if (delay > 0) {
+                        TimeUnit.NANOSECONDS.timedWait(lock, delay);
+                    } else {
+                        Object x = q.poll();
+                        assert x != null;
+                        if (q.size() != 0)
+                            lock.notifyAll(); // wake up other takers
+                        return x;
+
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * Retrieves and removes the head of this queue, waiting if necessary
+     * until an element with an expired delay is available on this queue,
+     * or the specified wait time expires.
+     *
+     * @return the head of this queue, or <tt>null</tt> if the
+     *         specified waiting time elapses before an element with
+     *         an expired delay becomes available
+     * @throws InterruptedException {@inheritDoc}
+     */
+    public Object poll(long timeout, TimeUnit unit) throws InterruptedException {
+        long nanos = unit.toNanos(timeout);
+        long deadline = Utils.nanoTime() + nanos;
+        synchronized (lock) {
+            for (;;) {
+                Object first = q.peek();
+                if (first == null) {
+                    if (nanos <= 0)
+                        return null;
+                    else {
+                        TimeUnit.NANOSECONDS.timedWait(lock, nanos);
+                        nanos = deadline - Utils.nanoTime();
+                    }
+                } else {
+                    long delay = ((Delayed)first).getDelay(TimeUnit.NANOSECONDS);
+                    if (delay > 0) {
+                        if (nanos <= 0)
+                            return null;
+                        if (delay > nanos)
+                            delay = nanos;
+                        TimeUnit.NANOSECONDS.timedWait(lock, delay);
+                        nanos = deadline - Utils.nanoTime();
+                    } else {
+                        Object x = q.poll();
+                        assert x != null;
+                        if (q.size() != 0)
+                            lock.notifyAll();
+                        return x;
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * Retrieves, but does not remove, the head of this queue, or
+     * returns <tt>null</tt> if this queue is empty.  Unlike
+     * <tt>poll</tt>, if no expired elements are available in the queue,
+     * this method returns the element that will expire next,
+     * if one exists.
+     *
+     * @return the head of this queue, or <tt>null</tt> if this
+     *         queue is empty.
+     */
+    public Object peek() {
+        synchronized (lock) {
+            return q.peek();
+        }
+    }
+
+    public int size() {
+        synchronized (lock) {
+            return q.size();
+        }
+    }
+
+    /**
+     * @throws UnsupportedOperationException {@inheritDoc}
+     * @throws ClassCastException            {@inheritDoc}
+     * @throws NullPointerException          {@inheritDoc}
+     * @throws IllegalArgumentException      {@inheritDoc}
+     */
+    public int drainTo(Collection c) {
+        if (c == null)
+            throw new NullPointerException();
+        if (c == this)
+            throw new IllegalArgumentException();
+        synchronized (lock) {
+            int n = 0;
+            for (;;) {
+                Object first = q.peek();
+                if (first == null || ((Delayed)first).getDelay(TimeUnit.NANOSECONDS) > 0)
+                    break;
+                c.add(q.poll());
+                ++n;
+            }
+            if (n > 0)
+                lock.notifyAll();
+            return n;
+        }
+    }
+
+    /**
+     * @throws UnsupportedOperationException {@inheritDoc}
+     * @throws ClassCastException            {@inheritDoc}
+     * @throws NullPointerException          {@inheritDoc}
+     * @throws IllegalArgumentException      {@inheritDoc}
+     */
+    public int drainTo(Collection c, int maxElements) {
+        if (c == null)
+            throw new NullPointerException();
+        if (c == this)
+            throw new IllegalArgumentException();
+        if (maxElements <= 0)
+            return 0;
+        synchronized (lock) {
+            int n = 0;
+            while (n < maxElements) {
+                Object first = q.peek();
+                if (first == null || ((Delayed)first).getDelay(TimeUnit.NANOSECONDS) > 0)
+                    break;
+                c.add(q.poll());
+                ++n;
+            }
+            if (n > 0)
+                lock.notifyAll();
+            return n;
+        }
+    }
+
+    /**
+     * Atomically removes all of the elements from this delay queue.
+     * The queue will be empty after this call returns.
+     * Elements with an unexpired delay are not waited for; they are
+     * simply discarded from the queue.
+     */
+    public void clear() {
+        synchronized (lock) {
+            q.clear();
+        }
+    }
+
+    /**
+     * Always returns <tt>Integer.MAX_VALUE</tt> because
+     * a <tt>DelayQueue</tt> is not capacity constrained.
+     *
+     * @return <tt>Integer.MAX_VALUE</tt>
+     */
+    public int remainingCapacity() {
+        return Integer.MAX_VALUE;
+    }
+
+    /**
+     * Returns an array containing all of the elements in this queue.
+     * The returned array elements are in no particular order.
+     *
+     * <p>The returned array will be "safe" in that no references to it are
+     * maintained by this queue.  (In other words, this method must allocate
+     * a new array).  The caller is thus free to modify the returned array.
+     *
+     * <p>This method acts as bridge between array-based and collection-based
+     * APIs.
+     *
+     * @return an array containing all of the elements in this queue
+     */
+    public Object[] toArray() {
+        synchronized (lock) {
+            return q.toArray();
+        }
+    }
+
+    /**
+     * Returns an array containing all of the elements in this queue; the
+     * runtime type of the returned array is that of the specified array.
+     * The returned array elements are in no particular order.
+     * If the queue fits in the specified array, it is returned therein.
+     * Otherwise, a new array is allocated with the runtime type of the
+     * specified array and the size of this queue.
+     *
+     * <p>If this queue fits in the specified array with room to spare
+     * (i.e., the array has more elements than this queue), the element in
+     * the array immediately following the end of the queue is set to
+     * <tt>null</tt>.
+     *
+     * <p>Like the {@link #toArray()} method, this method acts as bridge between
+     * array-based and collection-based APIs.  Further, this method allows
+     * precise control over the runtime type of the output array, and may,
+     * under certain circumstances, be used to save allocation costs.
+     *
+     * <p>The following code can be used to dump a delay queue into a newly
+     * allocated array of <tt>Delayed</tt>:
+     *
+     * <pre>
+     *     Delayed[] a = q.toArray(new Delayed[0]);</pre>
+     *
+     * Note that <tt>toArray(new Object[0])</tt> is identical in function to
+     * <tt>toArray()</tt>.
+     *
+     * @param a the array into which the elements of the queue are to
+     *          be stored, if it is big enough; otherwise, a new array of the
+     *          same runtime type is allocated for this purpose
+     * @return an array containing all of the elements in this queue
+     * @throws ArrayStoreException if the runtime type of the specified array
+     *         is not a supertype of the runtime type of every element in
+     *         this queue
+     * @throws NullPointerException if the specified array is null
+     */
+    public Object[] toArray(Object[] a) {
+        synchronized (lock) {
+            return q.toArray(a);
+        }
+    }
+
+    /**
+     * Removes a single instance of the specified element from this
+     * queue, if it is present, whether or not it has expired.
+     */
+    public boolean remove(Object o) {
+        synchronized (lock) {
+            return q.remove(o);
+        }
+    }
+
+    /**
+     * Returns an iterator over all the elements (both expired and
+     * unexpired) in this queue. The iterator does not return the
+     * elements in any particular order.  The returned
+     * <tt>Iterator</tt> is a "weakly consistent" iterator that will
+     * never throw {@link java.util.ConcurrentModificationException}, and
+     * guarantees to traverse elements as they existed upon
+     * construction of the iterator, and may (but is not guaranteed
+     * to) reflect any modifications subsequent to construction.
+     *
+     * @return an iterator over the elements in this queue
+     */
+    public Iterator iterator() {
+        return new Itr(toArray());
+    }
+
+    /**
+     * Snapshot iterator that works off copy of underlying q array.
+     */
+    private class Itr implements Iterator {
+        final Object[] array; // Array of all elements
+        int cursor;           // index of next element to return;
+        int lastRet;          // index of last element, or -1 if no such
+
+        Itr(Object[] array) {
+            lastRet = -1;
+            this.array = array;
+        }
+
+        public boolean hasNext() {
+            return cursor < array.length;
+        }
+
+        public Object next() {
+            if (cursor >= array.length)
+                throw new NoSuchElementException();
+            lastRet = cursor;
+            return array[cursor++];
+        }
+
+        public void remove() {
+            if (lastRet < 0)
+                throw new IllegalStateException();
+            Object x = array[lastRet];
+            lastRet = -1;
+            // Traverse underlying queue to find == element,
+            // not just a .equals element.
+            synchronized (lock) {
+                for (Iterator it = q.iterator(); it.hasNext(); ) {
+                    if (it.next() == x) {
+                        it.remove();
+                        return;
+                    }
+                }
+            }
+        }
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/Delayed.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/Delayed.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/Delayed.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,31 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+
+/**
+ * A mix-in style interface for marking objects that should be
+ * acted upon after a given delay.
+ *
+ * <p>An implementation of this interface must define a
+ * <tt>compareTo</tt> method that provides an ordering consistent with
+ * its <tt>getDelay</tt> method.
+ *
+ * @since 1.5
+ * @author Doug Lea
+ */
+public interface Delayed extends Comparable {
+
+    /**
+     * Returns the remaining delay associated with this object, in the
+     * given time unit.
+     *
+     * @param unit the time unit
+     * @return the remaining delay; zero or negative values indicate
+     * that the delay has already elapsed
+     */
+    long getDelay(TimeUnit unit);
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/Exchanger.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/Exchanger.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/Exchanger.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,254 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+import edu.emory.mathcs.backport.java.util.concurrent.*; // for javadoc (till 6280605 is fixed)
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.*;
+
+/**
+ * A synchronization point at which threads can pair and swap elements
+ * within pairs.  Each thread presents some object on entry to the
+ * {@link #exchange exchange} method, matches with a partner thread,
+ * and receives its partner's object on return.
+ *
+ * <p><b>Sample Usage:</b>
+ * Here are the highlights of a class that uses an {@code Exchanger}
+ * to swap buffers between threads so that the thread filling the
+ * buffer gets a freshly emptied one when it needs it, handing off the
+ * filled one to the thread emptying the buffer.
+ * <pre>{@code
+ * class FillAndEmpty {
+ *   Exchanger<DataBuffer> exchanger = new Exchanger<DataBuffer>();
+ *   DataBuffer initialEmptyBuffer = ... a made-up type
+ *   DataBuffer initialFullBuffer = ...
+ *
+ *   class FillingLoop implements Runnable {
+ *     public void run() {
+ *       DataBuffer currentBuffer = initialEmptyBuffer;
+ *       try {
+ *         while (currentBuffer != null) {
+ *           addToBuffer(currentBuffer);
+ *           if (currentBuffer.isFull())
+ *             currentBuffer = exchanger.exchange(currentBuffer);
+ *         }
+ *       } catch (InterruptedException ex) { ... handle ... }
+ *     }
+ *   }
+ *
+ *   class EmptyingLoop implements Runnable {
+ *     public void run() {
+ *       DataBuffer currentBuffer = initialFullBuffer;
+ *       try {
+ *         while (currentBuffer != null) {
+ *           takeFromBuffer(currentBuffer);
+ *           if (currentBuffer.isEmpty())
+ *             currentBuffer = exchanger.exchange(currentBuffer);
+ *         }
+ *       } catch (InterruptedException ex) { ... handle ...}
+ *     }
+ *   }
+ *
+ *   void start() {
+ *     new Thread(new FillingLoop()).start();
+ *     new Thread(new EmptyingLoop()).start();
+ *   }
+ * }
+ * }</pre>
+ *
+ * <p>Memory consistency effects: For each pair of threads that
+ * successfully exchange objects via an {@code Exchanger}, actions
+ * prior to the {@code exchange()} in each thread
+ * <a href="package-summary.html#MemoryVisibility"><i>happen-before</i></a>
+ * those subsequent to a return from the corresponding {@code exchange()}
+ * in the other thread.
+ *
+ * @since 1.5
+ * @author Doug Lea and Bill Scherer and Michael Scott
+ */
+public class Exchanger {
+    private final Object lock = new Object();
+
+    /** Holder for the item being exchanged */
+    private Object item;
+
+    /**
+     * Arrival count transitions from 0 to 1 to 2 then back to 0
+     * during an exchange.
+     */
+    private int arrivalCount;
+
+    /**
+     * Main exchange function, handling the different policy variants.
+     */
+    private Object doExchange(Object x, boolean timed, long nanos) throws InterruptedException, TimeoutException {
+        synchronized (lock) {
+            Object other;
+            long deadline = timed ? Utils.nanoTime() + nanos : 0;
+            // If arrival count already at two, we must wait for
+            // a previous pair to finish and reset the count;
+            while (arrivalCount == 2) {
+                if (!timed)
+                    lock.wait();
+                else if (nanos > 0) {
+                    TimeUnit.NANOSECONDS.timedWait(lock, nanos);
+                    nanos = deadline - Utils.nanoTime();
+                }
+                else
+                    throw new TimeoutException();
+            }
+
+            int count = ++arrivalCount;
+
+            // If item is already waiting, replace it and signal other thread
+            if (count == 2) {
+                other = item;
+                item = x;
+                lock.notifyAll();
+                return other;
+            }
+
+            // Otherwise, set item and wait for another thread to
+            // replace it and signal us.
+
+            item = x;
+            InterruptedException interrupted = null;
+            try {
+                while (arrivalCount != 2) {
+                    if (!timed)
+                        lock.wait();
+                    else if (nanos > 0) {
+                        TimeUnit.NANOSECONDS.timedWait(lock, nanos);
+                        nanos = deadline - Utils.nanoTime();
+                    }
+                    else
+                        break; // timed out
+                }
+            } catch (InterruptedException ie) {
+                interrupted = ie;
+            }
+
+            // Get and reset item and count after the wait.
+            // (We need to do this even if wait was aborted.)
+            other = item;
+            item = null;
+            count = arrivalCount;
+            arrivalCount = 0;
+            lock.notifyAll();
+
+            // If the other thread replaced item, then we must
+            // continue even if cancelled.
+            if (count == 2) {
+                if (interrupted != null)
+                    Thread.currentThread().interrupt();
+                return other;
+            }
+
+            // If no one is waiting for us, we can back out
+            if (interrupted != null)
+                throw interrupted;
+            else  // must be timeout
+                throw new TimeoutException();
+        }
+    }
+
+    /**
+     * Creates a new Exchanger.
+     **/
+    public Exchanger() {
+    }
+
+    /**
+     * Waits for another thread to arrive at this exchange point (unless
+     * it is {@link Thread#interrupt interrupted}),
+     * and then transfers the given object to it, receiving its object
+     * in return.
+     *
+     * <p>If another thread is already waiting at the exchange point then
+     * it is resumed for thread scheduling purposes and receives the object
+     * passed in by the current thread. The current thread returns immediately,
+     * receiving the object passed to the exchange by that other thread.
+     *
+     * <p>If no other thread is already waiting at the exchange then the
+     * current thread is disabled for thread scheduling purposes and lies
+     * dormant until one of two things happens:
+     * <ul>
+     * <li>Some other thread enters the exchange; or
+     * <li>Some other thread {@link Thread#interrupt interrupts} the current
+     * thread.
+     * </ul>
+     * <p>If the current thread:
+     * <ul>
+     * <li>has its interrupted status set on entry to this method; or
+     * <li>is {@link Thread#interrupt interrupted} while waiting
+     * for the exchange,
+     * </ul>
+     * then {@link InterruptedException} is thrown and the current thread's
+     * interrupted status is cleared.
+     *
+     * @param x the object to exchange
+     * @return the object provided by the other thread
+     * @throws InterruptedException if the current thread was
+     *         interrupted while waiting
+     */
+    public Object exchange(Object x) throws InterruptedException {
+        try {
+            return doExchange(x, false, 0);
+        } catch (TimeoutException cannotHappen) {
+            throw new Error(cannotHappen);
+        }
+    }
+
+    /**
+     * Waits for another thread to arrive at this exchange point (unless
+     * the current thread is {@link Thread#interrupt interrupted} or
+     * the specified waiting time elapses), and then transfers the given
+     * object to it, receiving its object in return.
+     *
+     * <p>If another thread is already waiting at the exchange point then
+     * it is resumed for thread scheduling purposes and receives the object
+     * passed in by the current thread. The current thread returns immediately,
+     * receiving the object passed to the exchange by that other thread.
+     *
+     * <p>If no other thread is already waiting at the exchange then the
+     * current thread is disabled for thread scheduling purposes and lies
+     * dormant until one of three things happens:
+     * <ul>
+     * <li>Some other thread enters the exchange; or
+     * <li>Some other thread {@link Thread#interrupt interrupts} the current
+     * thread; or
+     * <li>The specified waiting time elapses.
+     * </ul>
+     * <p>If the current thread:
+     * <ul>
+     * <li>has its interrupted status set on entry to this method; or
+     * <li>is {@link Thread#interrupt interrupted} while waiting
+     * for the exchange,
+     * </ul>
+     * then {@link InterruptedException} is thrown and the current thread's
+     * interrupted status is cleared.
+     *
+     * <p>If the specified waiting time elapses then {@link TimeoutException}
+     * is thrown.
+     * If the time is
+     * less than or equal to zero, the method will not wait at all.
+     *
+     * @param x the object to exchange
+     * @param timeout the maximum time to wait
+     * @param unit the time unit of the <tt>timeout</tt> argument
+     * @return the object provided by the other thread
+     * @throws InterruptedException if the current thread was
+     *         interrupted while waiting
+     * @throws TimeoutException if the specified waiting time elapses
+     *         before another thread enters the exchange
+     */
+    public Object exchange(Object x, long timeout, TimeUnit unit)
+        throws InterruptedException, TimeoutException {
+        return doExchange(x, true, unit.toNanos(timeout));
+    }
+}
+
+

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ExecutionException.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ExecutionException.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ExecutionException.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,65 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+
+/**
+ * Exception thrown when attempting to retrieve the result of a task
+ * that aborted by throwing an exception. This exception can be
+ * inspected using the {@link #getCause()} method.
+ *
+ * @see Future
+ * @since 1.5
+ * @author Doug Lea
+ */
+public class ExecutionException extends Exception {
+    private static final long serialVersionUID = 7830266012832686185L;
+
+    /**
+     * Constructs an <tt>ExecutionException</tt> with no detail message.
+     * The cause is not initialized, and may subsequently be
+     * initialized by a call to {@link #initCause(Throwable) initCause}.
+     */
+    protected ExecutionException() { }
+
+    /**
+     * Constructs an <tt>ExecutionException</tt> with the specified detail
+     * message. The cause is not initialized, and may subsequently be
+     * initialized by a call to {@link #initCause(Throwable) initCause}.
+     *
+     * @param message the detail message
+     */
+    protected ExecutionException(String message) {
+        super(message);
+    }
+
+    /**
+     * Constructs an <tt>ExecutionException</tt> with the specified detail
+     * message and cause.
+     *
+     * @param  message the detail message
+     * @param  cause the cause (which is saved for later retrieval by the
+     *         {@link #getCause()} method)
+     */
+    public ExecutionException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    /**
+     * Constructs an <tt>ExecutionException</tt> with the specified cause.
+     * The detail message is set to:
+     * <pre>
+     *  (cause == null ? null : cause.toString())</pre>
+     * (which typically contains the class and detail message of
+     * <tt>cause</tt>).
+     *
+     * @param  cause the cause (which is saved for later retrieval by the
+     *         {@link #getCause()} method)
+     */
+    public ExecutionException(Throwable cause) {
+        super(cause);
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/Executor.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/Executor.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/Executor.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,112 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+
+/**
+ * An object that executes submitted {@link Runnable} tasks. This
+ * interface provides a way of decoupling task submission from the
+ * mechanics of how each task will be run, including details of thread
+ * use, scheduling, etc.  An <tt>Executor</tt> is normally used
+ * instead of explicitly creating threads. For example, rather than
+ * invoking <tt>new Thread(new(RunnableTask())).start()</tt> for each
+ * of a set of tasks, you might use:
+ *
+ * <pre>
+ * Executor executor = <em>anExecutor</em>;
+ * executor.execute(new RunnableTask1());
+ * executor.execute(new RunnableTask2());
+ * ...
+ * </pre>
+ *
+ * However, the <tt>Executor</tt> interface does not strictly
+ * require that execution be asynchronous. In the simplest case, an
+ * executor can run the submitted task immediately in the caller's
+ * thread:
+ *
+ * <pre>
+ * class DirectExecutor implements Executor {
+ *     public void execute(Runnable r) {
+ *         r.run();
+ *     }
+ * }</pre>
+ *
+ * More typically, tasks are executed in some thread other
+ * than the caller's thread.  The executor below spawns a new thread
+ * for each task.
+ *
+ * <pre>
+ * class ThreadPerTaskExecutor implements Executor {
+ *     public void execute(Runnable r) {
+ *         new Thread(r).start();
+ *     }
+ * }</pre>
+ *
+ * Many <tt>Executor</tt> implementations impose some sort of
+ * limitation on how and when tasks are scheduled.  The executor below
+ * serializes the submission of tasks to a second executor,
+ * illustrating a composite executor.
+ *
+ * <pre>
+ * class SerialExecutor implements Executor {
+ *     final Queue&lt;Runnable&gt; tasks = new ArrayDeque&lt;Runnable&gt;();
+ *     final Executor executor;
+ *     Runnable active;
+ *
+ *     SerialExecutor(Executor executor) {
+ *         this.executor = executor;
+ *     }
+ *
+ *     public synchronized void execute(final Runnable r) {
+ *         tasks.offer(new Runnable() {
+ *             public void run() {
+ *                 try {
+ *                     r.run();
+ *                 } finally {
+ *                     scheduleNext();
+ *                 }
+ *             }
+ *         });
+ *         if (active == null) {
+ *             scheduleNext();
+ *         }
+ *     }
+ *
+ *     protected synchronized void scheduleNext() {
+ *         if ((active = tasks.poll()) != null) {
+ *             executor.execute(active);
+ *         }
+ *     }
+ * }</pre>
+ *
+ * The <tt>Executor</tt> implementations provided in this package
+ * implement {@link ExecutorService}, which is a more extensive
+ * interface.  The {@link ThreadPoolExecutor} class provides an
+ * extensible thread pool implementation. The {@link Executors} class
+ * provides convenient factory methods for these Executors.
+ *
+ * <p>Memory consistency effects: Actions in a thread prior to
+ * submitting a {@code Runnable} object to an {@code Executor}
+ * <a href="package-summary.html#MemoryVisibility"><i>happen-before</i></a>
+ * its execution begins, perhaps in another thread.
+ *
+ * @since 1.5
+ * @author Doug Lea
+ */
+public interface Executor {
+
+    /**
+     * Executes the given command at some time in the future.  The command
+     * may execute in a new thread, in a pooled thread, or in the calling
+     * thread, at the discretion of the <tt>Executor</tt> implementation.
+     *
+     * @param command the runnable task
+     * @throws RejectedExecutionException if this task cannot be
+     * accepted for execution.
+     * @throws NullPointerException if command is null
+     */
+    void execute(Runnable command);
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ExecutorCompletionService.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ExecutorCompletionService.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ExecutorCompletionService.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,175 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+import edu.emory.mathcs.backport.java.util.concurrent.*; // for javadoc (till 6280605 is fixed)
+
+/**
+ * A {@link CompletionService} that uses a supplied {@link Executor}
+ * to execute tasks.  This class arranges that submitted tasks are,
+ * upon completion, placed on a queue accessible using <tt>take</tt>.
+ * The class is lightweight enough to be suitable for transient use
+ * when processing groups of tasks.
+ *
+ * <p>
+ *
+ * <b>Usage Examples.</b>
+ *
+ * Suppose you have a set of solvers for a certain problem, each
+ * returning a value of some type <tt>Result</tt>, and would like to
+ * run them concurrently, processing the results of each of them that
+ * return a non-null value, in some method <tt>use(Result r)</tt>. You
+ * could write this as:
+ *
+ * <pre>
+ *   void solve(Executor e,
+ *              Collection&lt;Callable&lt;Result&gt;&gt; solvers)
+ *     throws InterruptedException, ExecutionException {
+ *       CompletionService&lt;Result&gt; ecs
+ *           = new ExecutorCompletionService&lt;Result&gt;(e);
+ *       for (Callable&lt;Result&gt; s : solvers)
+ *           ecs.submit(s);
+ *       int n = solvers.size();
+ *       for (int i = 0; i &lt; n; ++i) {
+ *           Result r = ecs.take().get();
+ *           if (r != null)
+ *               use(r);
+ *       }
+ *   }
+ * </pre>
+ *
+ * Suppose instead that you would like to use the first non-null result
+ * of the set of tasks, ignoring any that encounter exceptions,
+ * and cancelling all other tasks when the first one is ready:
+ *
+ * <pre>
+ *   void solve(Executor e,
+ *              Collection&lt;Callable&lt;Result&gt;&gt; solvers)
+ *     throws InterruptedException {
+ *       CompletionService&lt;Result&gt; ecs
+ *           = new ExecutorCompletionService&lt;Result&gt;(e);
+ *       int n = solvers.size();
+ *       List&lt;Future&lt;Result&gt;&gt; futures
+ *           = new ArrayList&lt;Future&lt;Result&gt;&gt;(n);
+ *       Result result = null;
+ *       try {
+ *           for (Callable&lt;Result&gt; s : solvers)
+ *               futures.add(ecs.submit(s));
+ *           for (int i = 0; i &lt; n; ++i) {
+ *               try {
+ *                   Result r = ecs.take().get();
+ *                   if (r != null) {
+ *                       result = r;
+ *                       break;
+ *                   }
+ *               } catch (ExecutionException ignore) {}
+ *           }
+ *       }
+ *       finally {
+ *           for (Future&lt;Result&gt; f : futures)
+ *               f.cancel(true);
+ *       }
+ *
+ *       if (result != null)
+ *           use(result);
+ *   }
+ * </pre>
+ */
+public class ExecutorCompletionService implements CompletionService {
+    private final Executor executor;
+    private final AbstractExecutorService aes;
+    private final BlockingQueue completionQueue;
+
+    /**
+     * FutureTask extension to enqueue upon completion
+     */
+    private class QueueingFuture extends FutureTask {
+        QueueingFuture(RunnableFuture task) {
+            super(task, null);
+            this.task = task;
+        }
+        protected void done() { completionQueue.add(task); }
+        private final Future task;
+    }
+
+    private RunnableFuture newTaskFor(Callable task) {
+        if (aes == null)
+            return new FutureTask(task);
+        else
+            return aes.newTaskFor(task);
+    }
+
+    private RunnableFuture newTaskFor(Runnable task, Object result) {
+        if (aes == null)
+            return new FutureTask(task, result);
+        else
+            return aes.newTaskFor(task, result);
+    }
+
+    /**
+     * Creates an ExecutorCompletionService using the supplied
+     * executor for base task execution and a
+     * {@link LinkedBlockingQueue} as a completion queue.
+     *
+     * @param executor the executor to use
+     * @throws NullPointerException if executor is <tt>null</tt>
+     */
+    public ExecutorCompletionService(Executor executor) {
+        if (executor == null)
+            throw new NullPointerException();
+        this.executor = executor;
+        this.aes = (executor instanceof AbstractExecutorService) ?
+            (AbstractExecutorService) executor : null;
+        this.completionQueue = new LinkedBlockingQueue();
+    }
+
+    /**
+     * Creates an ExecutorCompletionService using the supplied
+     * executor for base task execution and the supplied queue as its
+     * completion queue.
+     *
+     * @param executor the executor to use
+     * @param completionQueue the queue to use as the completion queue
+     * normally one dedicated for use by this service
+     * @throws NullPointerException if executor or completionQueue are <tt>null</tt>
+     */
+    public ExecutorCompletionService(Executor executor,
+                                     BlockingQueue completionQueue) {
+        if (executor == null || completionQueue == null)
+            throw new NullPointerException();
+        this.executor = executor;
+        this.aes = (executor instanceof AbstractExecutorService) ?
+            (AbstractExecutorService) executor : null;
+        this.completionQueue = completionQueue;
+    }
+
+    public Future submit(Callable task) {
+        if (task == null) throw new NullPointerException();
+        RunnableFuture f = newTaskFor(task);
+        executor.execute(new QueueingFuture(f));
+        return f;
+    }
+
+    public Future submit(Runnable task, Object result) {
+        if (task == null) throw new NullPointerException();
+        RunnableFuture f = newTaskFor(task, result);
+        executor.execute(new QueueingFuture(f));
+        return f;
+    }
+
+    public Future take() throws InterruptedException {
+        return (Future)completionQueue.take();
+    }
+
+    public Future poll() {
+        return (Future)completionQueue.poll();
+    }
+
+    public Future poll(long timeout, TimeUnit unit) throws InterruptedException {
+        return (Future)completionQueue.poll(timeout, unit);
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ExecutorService.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ExecutorService.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ExecutorService.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,303 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+import edu.emory.mathcs.backport.java.util.concurrent.*; // for javadoc (till 6280605 is fixed)
+import java.util.List;
+import java.util.Collection;
+
+/**
+ * An {@link Executor} that provides methods to manage termination and
+ * methods that can produce a {@link Future} for tracking progress of
+ * one or more asynchronous tasks.
+ *
+ * <p>
+ * An <tt>ExecutorService</tt> can be shut down, which will cause it
+ * to stop accepting new tasks.  After being shut down, the executor
+ * will eventually terminate, at which point no tasks are actively
+ * executing, no tasks are awaiting execution, and no new tasks can be
+ * submitted.  An unused <tt>ExecutorService</tt> should be shut down
+ * to allow reclamation of its resources.
+ *
+ * <p> Method <tt>submit</tt> extends base method {@link
+ * Executor#execute} by creating and returning a {@link Future} that
+ * can be used to cancel execution and/or wait for completion.
+ * Methods <tt>invokeAny</tt> and <tt>invokeAll</tt> perform the most
+ * commonly useful forms of bulk execution, executing a collection of
+ * tasks and then waiting for at least one, or all, to
+ * complete. (Class {@link ExecutorCompletionService} can be used to
+ * write customized variants of these methods.)
+ *
+ * <p>The {@link Executors} class provides factory methods for the
+ * executor services provided in this package.
+ *
+ * <h3>Usage Example</h3>
+ *
+ * Here is a sketch of a network service in which threads in a thread
+ * pool service incoming requests. It uses the preconfigured {@link
+ * Executors#newFixedThreadPool} factory method:
+ *
+ * <pre>
+ * class NetworkService {
+ *   private final ServerSocket serverSocket;
+ *   private final ExecutorService pool;
+ *
+ *   public NetworkService(int port, int poolSize)
+ *       throws IOException {
+ *     serverSocket = new ServerSocket(port);
+ *     pool = Executors.newFixedThreadPool(poolSize);
+ *   }
+ *
+ *   public void serve() {
+ *     try {
+ *       for (;;) {
+ *         pool.execute(new Handler(serverSocket.accept()));
+ *       }
+ *     } catch (IOException ex) {
+ *       pool.shutdown();
+ *     }
+ *   }
+ * }
+ *
+ * class Handler implements Runnable {
+ *   private final Socket socket;
+ *   Handler(Socket socket) { this.socket = socket; }
+ *   public void run() {
+ *     // read and service request
+ *   }
+ * }
+ * </pre>
+ *
+ * <p>Memory consistency effects: Actions in a thread prior to the
+ * submission of a {@code Runnable} or {@code Callable} task to an
+ * {@code ExecutorService}
+ * <a href="package-summary.html#MemoryVisibility"><i>happen-before</i></a>
+ * any actions taken by that task, which in turn <i>happen-before</i> the
+ * result is retrieved via {@code Future.get()}.
+ *
+ * @since 1.5
+ * @author Doug Lea
+ */
+public interface ExecutorService extends Executor {
+
+    /**
+     * Initiates an orderly shutdown in which previously submitted
+     * tasks are executed, but no new tasks will be accepted.
+     * Invocation has no additional effect if already shut down.
+     *
+     * @throws SecurityException if a security manager exists and
+     *         shutting down this ExecutorService may manipulate
+     *         threads that the caller is not permitted to modify
+     *         because it does not hold {@link
+     *         java.lang.RuntimePermission}<tt>("modifyThread")</tt>,
+     *         or the security manager's <tt>checkAccess</tt> method
+     *         denies access.
+     */
+    void shutdown();
+
+    /**
+     * Attempts to stop all actively executing tasks, halts the
+     * processing of waiting tasks, and returns a list of the tasks that were
+     * awaiting execution.
+     *
+     * <p>There are no guarantees beyond best-effort attempts to stop
+     * processing actively executing tasks.  For example, typical
+     * implementations will cancel via {@link Thread#interrupt}, so any
+     * task that fails to respond to interrupts may never terminate.
+     *
+     * @return list of tasks that never commenced execution
+     * @throws SecurityException if a security manager exists and
+     *         shutting down this ExecutorService may manipulate
+     *         threads that the caller is not permitted to modify
+     *         because it does not hold {@link
+     *         java.lang.RuntimePermission}<tt>("modifyThread")</tt>,
+     *         or the security manager's <tt>checkAccess</tt> method
+     *         denies access.
+     */
+    List shutdownNow();
+
+    /**
+     * Returns <tt>true</tt> if this executor has been shut down.
+     *
+     * @return <tt>true</tt> if this executor has been shut down
+     */
+    boolean isShutdown();
+
+    /**
+     * Returns <tt>true</tt> if all tasks have completed following shut down.
+     * Note that <tt>isTerminated</tt> is never <tt>true</tt> unless
+     * either <tt>shutdown</tt> or <tt>shutdownNow</tt> was called first.
+     *
+     * @return <tt>true</tt> if all tasks have completed following shut down
+     */
+    boolean isTerminated();
+
+    /**
+     * Blocks until all tasks have completed execution after a shutdown
+     * request, or the timeout occurs, or the current thread is
+     * interrupted, whichever happens first.
+     *
+     * @param timeout the maximum time to wait
+     * @param unit the time unit of the timeout argument
+     * @return <tt>true</tt> if this executor terminated and
+     *         <tt>false</tt> if the timeout elapsed before termination
+     * @throws InterruptedException if interrupted while waiting
+     */
+    boolean awaitTermination(long timeout, TimeUnit unit)
+        throws InterruptedException;
+
+
+    /**
+     * Submits a value-returning task for execution and returns a
+     * Future representing the pending results of the task. The
+     * Future's <tt>get</tt> method will return the task's result upon
+     * successful completion.
+     *
+     * <p>
+     * If you would like to immediately block waiting
+     * for a task, you can use constructions of the form
+     * <tt>result = exec.submit(aCallable).get();</tt>
+     *
+     * <p> Note: The {@link Executors} class includes a set of methods
+     * that can convert some other common closure-like objects,
+     * for example, {@link java.security.PrivilegedAction} to
+     * {@link Callable} form so they can be submitted.
+     *
+     * @param task the task to submit
+     * @return a Future representing pending completion of the task
+     * @throws RejectedExecutionException if the task cannot be
+     *         scheduled for execution
+     * @throws NullPointerException if the task is null
+     */
+    Future submit(Callable task);
+
+    /**
+     * Submits a Runnable task for execution and returns a Future
+     * representing that task. The Future's <tt>get</tt> method will
+     * return the given result upon successful completion.
+     *
+     * @param task the task to submit
+     * @param result the result to return
+     * @return a Future representing pending completion of the task
+     * @throws RejectedExecutionException if the task cannot be
+     *         scheduled for execution
+     * @throws NullPointerException if the task is null
+     */
+    Future submit(Runnable task, Object result);
+
+    /**
+     * Submits a Runnable task for execution and returns a Future
+     * representing that task. The Future's <tt>get</tt> method will
+     * return <tt>null</tt> upon <em>successful</em> completion.
+     *
+     * @param task the task to submit
+     * @return a Future representing pending completion of the task
+     * @throws RejectedExecutionException if the task cannot be
+     *         scheduled for execution
+     * @throws NullPointerException if the task is null
+     */
+    Future submit(Runnable task);
+
+    /**
+     * Executes the given tasks, returning a list of Futures holding
+     * their status and results when all complete.
+     * {@link Future#isDone} is <tt>true</tt> for each
+     * element of the returned list.
+     * Note that a <em>completed</em> task could have
+     * terminated either normally or by throwing an exception.
+     * The results of this method are undefined if the given
+     * collection is modified while this operation is in progress.
+     *
+     * @param tasks the collection of tasks
+     * @return A list of Futures representing the tasks, in the same
+     *         sequential order as produced by the iterator for the
+     *         given task list, each of which has completed.
+     * @throws InterruptedException if interrupted while waiting, in
+     *         which case unfinished tasks are cancelled.
+     * @throws NullPointerException if tasks or any of its elements are <tt>null</tt>
+     * @throws RejectedExecutionException if any task cannot be
+     *         scheduled for execution
+     */
+
+    List invokeAll(Collection tasks)
+        throws InterruptedException;
+
+    /**
+     * Executes the given tasks, returning a list of Futures holding
+     * their status and results
+     * when all complete or the timeout expires, whichever happens first.
+     * {@link Future#isDone} is <tt>true</tt> for each
+     * element of the returned list.
+     * Upon return, tasks that have not completed are cancelled.
+     * Note that a <em>completed</em> task could have
+     * terminated either normally or by throwing an exception.
+     * The results of this method are undefined if the given
+     * collection is modified while this operation is in progress.
+     *
+     * @param tasks the collection of tasks
+     * @param timeout the maximum time to wait
+     * @param unit the time unit of the timeout argument
+     * @return a list of Futures representing the tasks, in the same
+     *         sequential order as produced by the iterator for the
+     *         given task list. If the operation did not time out,
+     *         each task will have completed. If it did time out, some
+     *         of these tasks will not have completed.
+     * @throws InterruptedException if interrupted while waiting, in
+     *         which case unfinished tasks are cancelled
+     * @throws NullPointerException if tasks, any of its elements, or
+     *         unit are <tt>null</tt>
+     * @throws RejectedExecutionException if any task cannot be scheduled
+     *         for execution
+     */
+    List invokeAll(Collection tasks, long timeout, TimeUnit unit)
+        throws InterruptedException;
+
+    /**
+     * Executes the given tasks, returning the result
+     * of one that has completed successfully (i.e., without throwing
+     * an exception), if any do. Upon normal or exceptional return,
+     * tasks that have not completed are cancelled.
+     * The results of this method are undefined if the given
+     * collection is modified while this operation is in progress.
+     *
+     * @param tasks the collection of tasks
+     * @return the result returned by one of the tasks
+     * @throws InterruptedException if interrupted while waiting
+     * @throws NullPointerException if tasks or any of its elements
+     *         are <tt>null</tt>
+     * @throws IllegalArgumentException if tasks is empty
+     * @throws ExecutionException if no task successfully completes
+     * @throws RejectedExecutionException if tasks cannot be scheduled
+     *         for execution
+     */
+    Object invokeAny(Collection tasks)
+        throws InterruptedException, ExecutionException;
+
+    /**
+     * Executes the given tasks, returning the result
+     * of one that has completed successfully (i.e., without throwing
+     * an exception), if any do before the given timeout elapses.
+     * Upon normal or exceptional return, tasks that have not
+     * completed are cancelled.
+     * The results of this method are undefined if the given
+     * collection is modified while this operation is in progress.
+     *
+     * @param tasks the collection of tasks
+     * @param timeout the maximum time to wait
+     * @param unit the time unit of the timeout argument
+     * @return the result returned by one of the tasks.
+     * @throws InterruptedException if interrupted while waiting
+     * @throws NullPointerException if tasks, any of its elements, or
+     *         unit are <tt>null</tt>
+     * @throws TimeoutException if the given timeout elapses before
+     *         any task successfully completes
+     * @throws ExecutionException if no task successfully completes
+     * @throws RejectedExecutionException if tasks cannot be scheduled
+     *         for execution
+     */
+    Object invokeAny(Collection tasks, long timeout, TimeUnit unit)
+        throws InterruptedException, ExecutionException, TimeoutException;
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/Executors.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/Executors.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/Executors.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,668 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.atomic.AtomicInteger;
+import java.security.AccessControlContext;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.security.PrivilegedExceptionAction;
+import java.security.AccessControlException;
+import java.util.List;
+import java.util.Collection;
+
+/**
+ * Factory and utility methods for {@link Executor}, {@link
+ * ExecutorService}, {@link ScheduledExecutorService}, {@link
+ * ThreadFactory}, and {@link Callable} classes defined in this
+ * package. This class supports the following kinds of methods:
+ *
+ * <ul>
+ *   <li> Methods that create and return an {@link ExecutorService}
+ *        set up with commonly useful configuration settings.
+ *   <li> Methods that create and return a {@link ScheduledExecutorService}
+ *        set up with commonly useful configuration settings.
+ *   <li> Methods that create and return a "wrapped" ExecutorService, that
+ *        disables reconfiguration by making implementation-specific methods
+ *        inaccessible.
+ *   <li> Methods that create and return a {@link ThreadFactory}
+ *        that sets newly created threads to a known state.
+ *   <li> Methods that create and return a {@link Callable}
+ *        out of other closure-like forms, so they can be used
+ *        in execution methods requiring <tt>Callable</tt>.
+ * </ul>
+ *
+ * @since 1.5
+ * @author Doug Lea
+ */
+public class Executors {
+
+    /**
+     * Creates a thread pool that reuses a fixed number of threads
+     * operating off a shared unbounded queue.  At any point, at most
+     * <tt>nThreads</tt> threads will be active processing tasks.
+     * If additional tasks are submitted when all threads are active,
+     * they will wait in the queue until a thread is available.
+     * If any thread terminates due to a failure during execution
+     * prior to shutdown, a new one will take its place if needed to
+     * execute subsequent tasks.  The threads in the pool will exist
+     * until it is explicitly {@link ExecutorService#shutdown shutdown}.
+     *
+     * @param nThreads the number of threads in the pool
+     * @return the newly created thread pool
+     * @throws IllegalArgumentException if <tt>nThreads &lt;= 0</tt>
+     */
+    public static ExecutorService newFixedThreadPool(int nThreads) {
+        return new ThreadPoolExecutor(nThreads, nThreads,
+                                      0L, TimeUnit.MILLISECONDS,
+                                      new LinkedBlockingQueue());
+    }
+
+    /**
+     * Creates a thread pool that reuses a fixed number of threads
+     * operating off a shared unbounded queue, using the provided
+     * ThreadFactory to create new threads when needed.  At any point,
+     * at most <tt>nThreads</tt> threads will be active processing
+     * tasks.  If additional tasks are submitted when all threads are
+     * active, they will wait in the queue until a thread is
+     * available.  If any thread terminates due to a failure during
+     * execution prior to shutdown, a new one will take its place if
+     * needed to execute subsequent tasks.  The threads in the pool will
+     * exist until it is explicitly {@link ExecutorService#shutdown
+     * shutdown}.
+     *
+     * @param nThreads the number of threads in the pool
+     * @param threadFactory the factory to use when creating new threads
+     * @return the newly created thread pool
+     * @throws NullPointerException if threadFactory is null
+     * @throws IllegalArgumentException if <tt>nThreads &lt;= 0</tt>
+     */
+    public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) {
+        return new ThreadPoolExecutor(nThreads, nThreads,
+                                      0L, TimeUnit.MILLISECONDS,
+                                      new LinkedBlockingQueue(),
+                                      threadFactory);
+    }
+
+    /**
+     * Creates an Executor that uses a single worker thread operating
+     * off an unbounded queue. (Note however that if this single
+     * thread terminates due to a failure during execution prior to
+     * shutdown, a new one will take its place if needed to execute
+     * subsequent tasks.)  Tasks are guaranteed to execute
+     * sequentially, and no more than one task will be active at any
+     * given time. Unlike the otherwise equivalent
+     * <tt>newFixedThreadPool(1)</tt> the returned executor is
+     * guaranteed not to be reconfigurable to use additional threads.
+     *
+     * @return the newly created single-threaded Executor
+     */
+    public static ExecutorService newSingleThreadExecutor() {
+        return new FinalizableDelegatedExecutorService
+            (new ThreadPoolExecutor(1, 1,
+                                    0L, TimeUnit.MILLISECONDS,
+                                    new LinkedBlockingQueue()));
+    }
+
+    /**
+     * Creates an Executor that uses a single worker thread operating
+     * off an unbounded queue, and uses the provided ThreadFactory to
+     * create a new thread when needed. Unlike the otherwise
+     * equivalent <tt>newFixedThreadPool(1, threadFactory)</tt> the
+     * returned executor is guaranteed not to be reconfigurable to use
+     * additional threads.
+     *
+     * @param threadFactory the factory to use when creating new
+     * threads
+     *
+     * @return the newly created single-threaded Executor
+     * @throws NullPointerException if threadFactory is null
+     */
+    public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) {
+        return new FinalizableDelegatedExecutorService
+            (new ThreadPoolExecutor(1, 1,
+                                    0L, TimeUnit.MILLISECONDS,
+                                    new LinkedBlockingQueue(),
+                                    threadFactory));
+    }
+
+    /**
+     * Creates a thread pool that creates new threads as needed, but
+     * will reuse previously constructed threads when they are
+     * available.  These pools will typically improve the performance
+     * of programs that execute many short-lived asynchronous tasks.
+     * Calls to <tt>execute</tt> will reuse previously constructed
+     * threads if available. If no existing thread is available, a new
+     * thread will be created and added to the pool. Threads that have
+     * not been used for sixty seconds are terminated and removed from
+     * the cache. Thus, a pool that remains idle for long enough will
+     * not consume any resources. Note that pools with similar
+     * properties but different details (for example, timeout parameters)
+     * may be created using {@link ThreadPoolExecutor} constructors.
+     *
+     * @return the newly created thread pool
+     */
+    public static ExecutorService newCachedThreadPool() {
+        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
+                                      60L, TimeUnit.SECONDS,
+                                      new SynchronousQueue());
+    }
+
+    /**
+     * Creates a thread pool that creates new threads as needed, but
+     * will reuse previously constructed threads when they are
+     * available, and uses the provided
+     * ThreadFactory to create new threads when needed.
+     * @param threadFactory the factory to use when creating new threads
+     * @return the newly created thread pool
+     * @throws NullPointerException if threadFactory is null
+     */
+    public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) {
+        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
+                                      60L, TimeUnit.SECONDS,
+                                      new SynchronousQueue(),
+                                      threadFactory);
+    }
+
+    /**
+     * Creates a single-threaded executor that can schedule commands
+     * to run after a given delay, or to execute periodically.
+     * (Note however that if this single
+     * thread terminates due to a failure during execution prior to
+     * shutdown, a new one will take its place if needed to execute
+     * subsequent tasks.)  Tasks are guaranteed to execute
+     * sequentially, and no more than one task will be active at any
+     * given time. Unlike the otherwise equivalent
+     * <tt>newScheduledThreadPool(1)</tt> the returned executor is
+     * guaranteed not to be reconfigurable to use additional threads.
+     * @return the newly created scheduled executor
+     */
+    public static ScheduledExecutorService newSingleThreadScheduledExecutor() {
+        return new DelegatedScheduledExecutorService
+            (new ScheduledThreadPoolExecutor(1));
+    }
+
+    /**
+     * Creates a single-threaded executor that can schedule commands
+     * to run after a given delay, or to execute periodically.  (Note
+     * however that if this single thread terminates due to a failure
+     * during execution prior to shutdown, a new one will take its
+     * place if needed to execute subsequent tasks.)  Tasks are
+     * guaranteed to execute sequentially, and no more than one task
+     * will be active at any given time. Unlike the otherwise
+     * equivalent <tt>newScheduledThreadPool(1, threadFactory)</tt>
+     * the returned executor is guaranteed not to be reconfigurable to
+     * use additional threads.
+     * @param threadFactory the factory to use when creating new
+     * threads
+     * @return a newly created scheduled executor
+     * @throws NullPointerException if threadFactory is null
+     */
+    public static ScheduledExecutorService newSingleThreadScheduledExecutor(ThreadFactory threadFactory) {
+        return new DelegatedScheduledExecutorService
+            (new ScheduledThreadPoolExecutor(1, threadFactory));
+    }
+
+    /**
+     * Creates a thread pool that can schedule commands to run after a
+     * given delay, or to execute periodically.
+     * @param corePoolSize the number of threads to keep in the pool,
+     * even if they are idle.
+     * @return a newly created scheduled thread pool
+     * @throws IllegalArgumentException if <tt>corePoolSize &lt; 0</tt>
+     */
+    public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
+        return new ScheduledThreadPoolExecutor(corePoolSize);
+    }
+
+    /**
+     * Creates a thread pool that can schedule commands to run after a
+     * given delay, or to execute periodically.
+     * @param corePoolSize the number of threads to keep in the pool,
+     * even if they are idle.
+     * @param threadFactory the factory to use when the executor
+     * creates a new thread.
+     * @return a newly created scheduled thread pool
+     * @throws IllegalArgumentException if <tt>corePoolSize &lt; 0</tt>
+     * @throws NullPointerException if threadFactory is null
+     */
+    public static ScheduledExecutorService newScheduledThreadPool(
+            int corePoolSize, ThreadFactory threadFactory) {
+        return new ScheduledThreadPoolExecutor(corePoolSize, threadFactory);
+    }
+
+
+    /**
+     * Returns an object that delegates all defined {@link
+     * ExecutorService} methods to the given executor, but not any
+     * other methods that might otherwise be accessible using
+     * casts. This provides a way to safely "freeze" configuration and
+     * disallow tuning of a given concrete implementation.
+     * @param executor the underlying implementation
+     * @return an <tt>ExecutorService</tt> instance
+     * @throws NullPointerException if executor null
+     */
+    public static ExecutorService unconfigurableExecutorService(ExecutorService executor) {
+        if (executor == null)
+            throw new NullPointerException();
+        return new DelegatedExecutorService(executor);
+    }
+
+    /**
+     * Returns an object that delegates all defined {@link
+     * ScheduledExecutorService} methods to the given executor, but
+     * not any other methods that might otherwise be accessible using
+     * casts. This provides a way to safely "freeze" configuration and
+     * disallow tuning of a given concrete implementation.
+     * @param executor the underlying implementation
+     * @return a <tt>ScheduledExecutorService</tt> instance
+     * @throws NullPointerException if executor null
+     */
+    public static ScheduledExecutorService unconfigurableScheduledExecutorService(ScheduledExecutorService executor) {
+        if (executor == null)
+            throw new NullPointerException();
+        return new DelegatedScheduledExecutorService(executor);
+    }
+
+    /**
+     * Returns a default thread factory used to create new threads.
+     * This factory creates all new threads used by an Executor in the
+     * same {@link ThreadGroup}. If there is a {@link
+     * java.lang.SecurityManager}, it uses the group of {@link
+     * System#getSecurityManager}, else the group of the thread
+     * invoking this <tt>defaultThreadFactory</tt> method. Each new
+     * thread is created as a non-daemon thread with priority set to
+     * the smaller of <tt>Thread.NORM_PRIORITY</tt> and the maximum
+     * priority permitted in the thread group.  New threads have names
+     * accessible via {@link Thread#getName} of
+     * <em>pool-N-thread-M</em>, where <em>N</em> is the sequence
+     * number of this factory, and <em>M</em> is the sequence number
+     * of the thread created by this factory.
+     * @return a thread factory
+     */
+    public static ThreadFactory defaultThreadFactory() {
+        return new DefaultThreadFactory();
+    }
+
+    /**
+     * Returns a thread factory used to create new threads that
+     * have the same permissions as the current thread.
+     * This factory creates threads with the same settings as {@link
+     * Executors#defaultThreadFactory}, additionally setting the
+     * AccessControlContext and contextClassLoader of new threads to
+     * be the same as the thread invoking this
+     * <tt>privilegedThreadFactory</tt> method.  A new
+     * <tt>privilegedThreadFactory</tt> can be created within an
+     * {@link AccessController#doPrivileged} action setting the
+     * current thread's access control context to create threads with
+     * the selected permission settings holding within that action.
+     *
+     * <p> Note that while tasks running within such threads will have
+     * the same access control and class loader settings as the
+     * current thread, they need not have the same {@link
+     * java.lang.ThreadLocal} or {@link
+     * java.lang.InheritableThreadLocal} values. If necessary,
+     * particular values of thread locals can be set or reset before
+     * any task runs in {@link ThreadPoolExecutor} subclasses using
+     * {@link ThreadPoolExecutor#beforeExecute}. Also, if it is
+     * necessary to initialize worker threads to have the same
+     * InheritableThreadLocal settings as some other designated
+     * thread, you can create a custom ThreadFactory in which that
+     * thread waits for and services requests to create others that
+     * will inherit its values.
+     *
+     * @return a thread factory
+     * @throws AccessControlException if the current access control
+     * context does not have permission to both get and set context
+     * class loader.
+     */
+    public static ThreadFactory privilegedThreadFactory() {
+        return new PrivilegedThreadFactory();
+    }
+
+    /**
+     * Returns a {@link Callable} object that, when
+     * called, runs the given task and returns the given result.  This
+     * can be useful when applying methods requiring a
+     * <tt>Callable</tt> to an otherwise resultless action.
+     * @param task the task to run
+     * @param result the result to return
+     * @return a callable object
+     * @throws NullPointerException if task null
+     */
+    public static Callable callable(Runnable task, Object result) {
+        if (task == null)
+            throw new NullPointerException();
+        return new RunnableAdapter(task, result);
+    }
+
+    /**
+     * Returns a {@link Callable} object that, when
+     * called, runs the given task and returns <tt>null</tt>.
+     * @param task the task to run
+     * @return a callable object
+     * @throws NullPointerException if task null
+     */
+    public static Callable callable(Runnable task) {
+        if (task == null)
+            throw new NullPointerException();
+        return new RunnableAdapter(task, null);
+    }
+
+    /**
+     * Returns a {@link Callable} object that, when
+     * called, runs the given privileged action and returns its result.
+     * @param action the privileged action to run
+     * @return a callable object
+     * @throws NullPointerException if action null
+     */
+    public static Callable callable(final PrivilegedAction action) {
+        if (action == null)
+            throw new NullPointerException();
+        return new Callable() {
+	    public Object call() { return action.run(); }};
+    }
+
+    /**
+     * Returns a {@link Callable} object that, when
+     * called, runs the given privileged exception action and returns
+     * its result.
+     * @param action the privileged exception action to run
+     * @return a callable object
+     * @throws NullPointerException if action null
+     */
+    public static Callable callable(final PrivilegedExceptionAction action) {
+        if (action == null)
+            throw new NullPointerException();
+	return new Callable() {
+	    public Object call() throws Exception { return action.run(); }};
+    }
+
+    /**
+     * Returns a {@link Callable} object that will, when
+     * called, execute the given <tt>callable</tt> under the current
+     * access control context. This method should normally be
+     * invoked within an {@link AccessController#doPrivileged} action
+     * to create callables that will, if possible, execute under the
+     * selected permission settings holding within that action; or if
+     * not possible, throw an associated {@link
+     * AccessControlException}.
+     * @param callable the underlying task
+     * @return a callable object
+     * @throws NullPointerException if callable null
+     *
+     */
+    public static Callable privilegedCallable(Callable callable) {
+        if (callable == null)
+            throw new NullPointerException();
+        return new PrivilegedCallable(callable);
+    }
+
+    /**
+     * Returns a {@link Callable} object that will, when
+     * called, execute the given <tt>callable</tt> under the current
+     * access control context, with the current context class loader
+     * as the context class loader. This method should normally be
+     * invoked within an {@link AccessController#doPrivileged} action
+     * to create callables that will, if possible, execute under the
+     * selected permission settings holding within that action; or if
+     * not possible, throw an associated {@link
+     * AccessControlException}.
+     * @param callable the underlying task
+     *
+     * @return a callable object
+     * @throws NullPointerException if callable null
+     * @throws AccessControlException if the current access control
+     * context does not have permission to both set and get context
+     * class loader.
+     */
+    public static Callable privilegedCallableUsingCurrentClassLoader(Callable callable) {
+        if (callable == null)
+            throw new NullPointerException();
+        return new PrivilegedCallableUsingCurrentClassLoader(callable);
+    }
+
+    // Non-public classes supporting the public methods
+
+    /**
+     * A callable that runs given task and returns given result
+     */
+    static final class RunnableAdapter implements Callable {
+        final Runnable task;
+        final Object result;
+        RunnableAdapter(Runnable  task, Object result) {
+            this.task = task;
+            this.result = result;
+        }
+        public Object call() {
+            task.run();
+            return result;
+        }
+    }
+
+    /**
+     * A callable that runs under established access control settings
+     */
+    static final class PrivilegedCallable implements Callable {
+        private final AccessControlContext acc;
+        private final Callable task;
+        private Object result;
+        private Exception exception;
+        PrivilegedCallable(Callable task) {
+            this.task = task;
+            this.acc = AccessController.getContext();
+        }
+
+        public Object call() throws Exception {
+            AccessController.doPrivileged(new PrivilegedAction() {
+                    public Object run() {
+                        try {
+                            result = task.call();
+                        } catch (Exception ex) {
+                            exception = ex;
+                        }
+                        return null;
+                    }
+                }, acc);
+            if (exception != null)
+                throw exception;
+            else
+                return result;
+        }
+    }
+
+    /**
+     * A callable that runs under established access control settings and
+     * current ClassLoader
+     */
+    static final class PrivilegedCallableUsingCurrentClassLoader implements Callable {
+        private final ClassLoader ccl;
+        private final AccessControlContext acc;
+        private final Callable task;
+        private Object result;
+        private Exception exception;
+        PrivilegedCallableUsingCurrentClassLoader(Callable task) {
+            this.task = task;
+            this.ccl = Thread.currentThread().getContextClassLoader();
+            this.acc = AccessController.getContext();
+            acc.checkPermission(new RuntimePermission("getContextClassLoader"));
+            acc.checkPermission(new RuntimePermission("setContextClassLoader"));
+        }
+
+        public Object call() throws Exception {
+            AccessController.doPrivileged(new PrivilegedAction() {
+                    public Object run() {
+                        ClassLoader savedcl = null;
+                        Thread t = Thread.currentThread();
+                        try {
+                            ClassLoader cl = t.getContextClassLoader();
+                            if (ccl != cl) {
+                                t.setContextClassLoader(ccl);
+                                savedcl = cl;
+                            }
+                            result = task.call();
+                        } catch (Exception ex) {
+                            exception = ex;
+                        } finally {
+                            if (savedcl != null)
+                                t.setContextClassLoader(savedcl);
+                        }
+                        return null;
+                    }
+                }, acc);
+            if (exception != null)
+                throw exception;
+            else
+                return result;
+        }
+    }
+
+    /**
+     * The default thread factory
+     */
+    static class DefaultThreadFactory implements ThreadFactory {
+        static final AtomicInteger poolNumber = new AtomicInteger(1);
+        final ThreadGroup group;
+        final AtomicInteger threadNumber = new AtomicInteger(1);
+        final String namePrefix;
+
+        DefaultThreadFactory() {
+            SecurityManager s = System.getSecurityManager();
+            group = (s != null)? s.getThreadGroup() :
+                                 Thread.currentThread().getThreadGroup();
+            namePrefix = "pool-" +
+                          poolNumber.getAndIncrement() +
+                         "-thread-";
+        }
+
+        public Thread newThread(Runnable r) {
+            Thread t = new Thread(group, r,
+                                  namePrefix + threadNumber.getAndIncrement(),
+                                  0);
+            if (t.isDaemon())
+                t.setDaemon(false);
+            if (t.getPriority() != Thread.NORM_PRIORITY)
+                t.setPriority(Thread.NORM_PRIORITY);
+            return t;
+        }
+    }
+
+    /**
+     *  Thread factory capturing access control and class loader
+     */
+    static class PrivilegedThreadFactory extends DefaultThreadFactory {
+        private final ClassLoader ccl;
+        private final AccessControlContext acc;
+
+        PrivilegedThreadFactory() {
+            super();
+            this.ccl = Thread.currentThread().getContextClassLoader();
+            this.acc = AccessController.getContext();
+            acc.checkPermission(new RuntimePermission("setContextClassLoader"));
+        }
+
+        public Thread newThread(final Runnable r) {
+            return super.newThread(new Runnable() {
+                public void run() {
+                    AccessController.doPrivileged(new PrivilegedAction() {
+                        public Object run() {
+                            Thread.currentThread().setContextClassLoader(ccl);
+                            r.run();
+                            return null;
+                        }
+                    }, acc);
+                }
+            });
+        }
+
+    }
+
+    /**
+     * A wrapper class that exposes only the ExecutorService methods
+     * of an ExecutorService implementation.
+     */
+    static class DelegatedExecutorService extends AbstractExecutorService {
+        private final ExecutorService e;
+        DelegatedExecutorService(ExecutorService executor) { e = executor; }
+        public void execute(Runnable command) { e.execute(command); }
+        public void shutdown() { e.shutdown(); }
+        public List shutdownNow() { return e.shutdownNow(); }
+        public boolean isShutdown() { return e.isShutdown(); }
+        public boolean isTerminated() { return e.isTerminated(); }
+        public boolean awaitTermination(long timeout, TimeUnit unit)
+            throws InterruptedException {
+            return e.awaitTermination(timeout, unit);
+        }
+        public Future submit(Runnable task) {
+            return e.submit(task);
+        }
+        public Future submit(Callable task) {
+            return e.submit(task);
+        }
+        public Future submit(Runnable task, Object result) {
+            return e.submit(task, result);
+        }
+        public List invokeAll(Collection tasks)
+            throws InterruptedException {
+            return e.invokeAll(tasks);
+        }
+        public List invokeAll(Collection tasks,
+                                             long timeout, TimeUnit unit)
+            throws InterruptedException {
+            return e.invokeAll(tasks, timeout, unit);
+        }
+        public Object invokeAny(Collection tasks)
+            throws InterruptedException, ExecutionException {
+            return e.invokeAny(tasks);
+        }
+        public Object invokeAny(Collection tasks,
+                               long timeout, TimeUnit unit)
+            throws InterruptedException, ExecutionException, TimeoutException {
+            return e.invokeAny(tasks, timeout, unit);
+        }
+    }
+
+    static class FinalizableDelegatedExecutorService
+	extends DelegatedExecutorService {
+	FinalizableDelegatedExecutorService(ExecutorService executor) {
+	    super(executor);
+	}
+	protected void finalize()  {
+	    super.shutdown();
+	}
+    }
+
+    /**
+     * A wrapper class that exposes only the ScheduledExecutorService
+     * methods of a ScheduledExecutorService implementation.
+     */
+    static class DelegatedScheduledExecutorService
+            extends DelegatedExecutorService
+            implements ScheduledExecutorService {
+        private final ScheduledExecutorService e;
+        DelegatedScheduledExecutorService(ScheduledExecutorService executor) {
+            super(executor);
+            e = executor;
+        }
+        public ScheduledFuture schedule(Runnable command, long delay,  TimeUnit unit) {
+            return e.schedule(command, delay, unit);
+        }
+        public ScheduledFuture schedule(Callable callable, long delay, TimeUnit unit) {
+            return e.schedule(callable, delay, unit);
+        }
+        public ScheduledFuture scheduleAtFixedRate(Runnable command, long initialDelay,  long period, TimeUnit unit) {
+            return e.scheduleAtFixedRate(command, initialDelay, period, unit);
+        }
+        public ScheduledFuture scheduleWithFixedDelay(Runnable command, long initialDelay,  long delay, TimeUnit unit) {
+            return e.scheduleWithFixedDelay(command, initialDelay, delay, unit);
+        }
+    }
+
+
+    /** Cannot instantiate. */
+    private Executors() {}
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/Future.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/Future.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/Future.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,142 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+import edu.emory.mathcs.backport.java.util.concurrent.*; // for javadoc (till 6280605 is fixed)
+
+/**
+ * A <tt>Future</tt> represents the result of an asynchronous
+ * computation.  Methods are provided to check if the computation is
+ * complete, to wait for its completion, and to retrieve the result of
+ * the computation.  The result can only be retrieved using method
+ * <tt>get</tt> when the computation has completed, blocking if
+ * necessary until it is ready.  Cancellation is performed by the
+ * <tt>cancel</tt> method.  Additional methods are provided to
+ * determine if the task completed normally or was cancelled. Once a
+ * computation has completed, the computation cannot be cancelled.
+ * If you would like to use a <tt>Future</tt> for the sake
+ * of cancellability but not provide a usable result, you can
+ * declare types of the form <tt>Future&lt;?&gt;</tt> and
+ * return <tt>null</tt> as a result of the underlying task.
+ *
+ * <p>
+ * <b>Sample Usage</b> (Note that the following classes are all
+ * made-up.) <p>
+ * <pre>
+ * interface ArchiveSearcher { String search(String target); }
+ * class App {
+ *   ExecutorService executor = ...
+ *   ArchiveSearcher searcher = ...
+ *   void showSearch(final String target)
+ *       throws InterruptedException {
+ *     Future&lt;String&gt; future
+ *       = executor.submit(new Callable&lt;String&gt;() {
+ *         public String call() {
+ *             return searcher.search(target);
+ *         }});
+ *     displayOtherThings(); // do other things while searching
+ *     try {
+ *       displayText(future.get()); // use future
+ *     } catch (ExecutionException ex) { cleanup(); return; }
+ *   }
+ * }
+ * </pre>
+ *
+ * The {@link FutureTask} class is an implementation of <tt>Future</tt> that
+ * implements <tt>Runnable</tt>, and so may be executed by an <tt>Executor</tt>.
+ * For example, the above construction with <tt>submit</tt> could be replaced by:
+ * <pre>
+ *     FutureTask&lt;String&gt; future =
+ *       new FutureTask&lt;String&gt;(new Callable&lt;String&gt;() {
+ *         public String call() {
+ *           return searcher.search(target);
+ *       }});
+ *     executor.execute(future);
+ * </pre>
+ *
+ * <p>Memory consistency effects: Actions taken by the asynchronous computation
+ * <a href="package-summary.html#MemoryVisibility"> <i>happen-before</i></a>
+ * actions following the corresponding {@code Future.get()} in another thread.
+ *
+ * @see FutureTask
+ * @see Executor
+ * @since 1.5
+ * @author Doug Lea
+ */
+public interface Future {
+
+    /**
+     * Attempts to cancel execution of this task.  This attempt will
+     * fail if the task has already completed, has already been cancelled,
+     * or could not be cancelled for some other reason. If successful,
+     * and this task has not started when <tt>cancel</tt> is called,
+     * this task should never run.  If the task has already started,
+     * then the <tt>mayInterruptIfRunning</tt> parameter determines
+     * whether the thread executing this task should be interrupted in
+     * an attempt to stop the task.
+     *
+     * <p>After this method returns, subsequent calls to {@link #isDone} will
+     * always return <tt>true</tt>.  Subsequent calls to {@link #isCancelled}
+     * will always return <tt>true</tt> if this method returned <tt>true</tt>.
+     *
+     * @param mayInterruptIfRunning <tt>true</tt> if the thread executing this
+     * task should be interrupted; otherwise, in-progress tasks are allowed
+     * to complete
+     * @return <tt>false</tt> if the task could not be cancelled,
+     * typically because it has already completed normally;
+     * <tt>true</tt> otherwise
+     */
+    boolean cancel(boolean mayInterruptIfRunning);
+
+    /**
+     * Returns <tt>true</tt> if this task was cancelled before it completed
+     * normally.
+     *
+     * @return <tt>true</tt> if this task was cancelled before it completed
+     */
+    boolean isCancelled();
+
+    /**
+     * Returns <tt>true</tt> if this task completed.
+     *
+     * Completion may be due to normal termination, an exception, or
+     * cancellation -- in all of these cases, this method will return
+     * <tt>true</tt>.
+     *
+     * @return <tt>true</tt> if this task completed
+     */
+    boolean isDone();
+
+    /**
+     * Waits if necessary for the computation to complete, and then
+     * retrieves its result.
+     *
+     * @return the computed result
+     * @throws CancellationException if the computation was cancelled
+     * @throws ExecutionException if the computation threw an
+     * exception
+     * @throws InterruptedException if the current thread was interrupted
+     * while waiting
+     */
+    Object get() throws InterruptedException, ExecutionException;
+
+    /**
+     * Waits if necessary for at most the given time for the computation
+     * to complete, and then retrieves its result, if available.
+     *
+     * @param timeout the maximum time to wait
+     * @param unit the time unit of the timeout argument
+     * @return the computed result
+     * @throws CancellationException if the computation was cancelled
+     * @throws ExecutionException if the computation threw an
+     * exception
+     * @throws InterruptedException if the current thread was interrupted
+     * while waiting
+     * @throws TimeoutException if the wait timed out
+     */
+    Object get(long timeout, TimeUnit unit)
+        throws InterruptedException, ExecutionException, TimeoutException;
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/FutureTask.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/FutureTask.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/FutureTask.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,308 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain. Use, modify, and
+ * redistribute this code in any way without acknowledgement.
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+
+import edu.emory.mathcs.backport.java.util.concurrent.*; // for javadoc
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.*;
+
+/**
+ * A cancellable asynchronous computation.  This class provides a base
+ * implementation of {@link Future}, with methods to start and cancel
+ * a computation, query to see if the computation is complete, and
+ * retrieve the result of the computation.  The result can only be
+ * retrieved when the computation has completed; the <tt>get</tt>
+ * method will block if the computation has not yet completed.  Once
+ * the computation has completed, the computation cannot be restarted
+ * or cancelled.
+ *
+ * <p>A <tt>FutureTask</tt> can be used to wrap a {@link Callable} or
+ * {@link java.lang.Runnable} object.  Because <tt>FutureTask</tt>
+ * implements <tt>Runnable</tt>, a <tt>FutureTask</tt> can be
+ * submitted to an {@link Executor} for execution.
+ *
+ * <p>In addition to serving as a standalone class, this class provides
+ * <tt>protected</tt> functionality that may be useful when creating
+ * customized task classes.
+ *
+ * @since 1.5
+ * @author Doug Lea
+ */
+public class FutureTask implements RunnableFuture {
+
+    /** State value representing that task is running */
+    private static final int RUNNING   = 1;
+    /** State value representing that task ran */
+    private static final int RAN       = 2;
+    /** State value representing that task was cancelled */
+    private static final int CANCELLED = 4;
+
+    /** The underlying callable */
+    private final Callable callable;
+    /** The result to return from get() */
+    private Object result;
+    /** The exception to throw from get() */
+    private Throwable exception;
+
+    private int state;
+
+    /**
+     * The thread running task. When nulled after set/cancel, this
+     * indicates that the results are accessible.  Must be
+     * volatile, to ensure visibility upon completion.
+     */
+    private volatile Thread runner;
+
+    /**
+     * Creates a <tt>FutureTask</tt> that will upon running, execute the
+     * given <tt>Callable</tt>.
+     *
+     * @param  callable the callable task
+     * @throws NullPointerException if callable is null
+     */
+    public FutureTask(Callable callable) {
+        if (callable == null)
+            throw new NullPointerException();
+        this.callable = callable;
+    }
+
+    /**
+     * Creates a <tt>FutureTask</tt> that will upon running, execute the
+     * given <tt>Runnable</tt>, and arrange that <tt>get</tt> will return the
+     * given result on successful completion.
+     *
+     * @param  runnable the runnable task
+     * @param result the result to return on successful completion. If
+     * you don't need a particular result, consider using
+     * constructions of the form:
+     * <tt>Future&lt;?&gt; f = new FutureTask&lt;Object&gt;(runnable, null)</tt>
+     * @throws NullPointerException if runnable is null
+     */
+    public FutureTask(Runnable runnable, Object result) {
+        this(Executors.callable(runnable, result));
+    }
+
+    public synchronized boolean isCancelled() {
+        return state == CANCELLED;
+    }
+
+    public synchronized boolean isDone() {
+        return ranOrCancelled() && runner == null;
+    }
+
+    public boolean cancel(boolean mayInterruptIfRunning) {
+        synchronized (this) {
+            if (ranOrCancelled()) return false;
+            state = CANCELLED;
+            if (mayInterruptIfRunning) {
+                Thread r = runner;
+                if (r != null) r.interrupt();
+            }
+            runner = null;
+            notifyAll();
+        }
+        done();
+        return true;
+    }
+
+    /**
+     * @throws CancellationException {@inheritDoc}
+     */
+    public synchronized Object get()
+        throws InterruptedException, ExecutionException
+    {
+        waitFor();
+        return getResult();
+    }
+
+    /**
+     * @throws CancellationException {@inheritDoc}
+     */
+    public synchronized Object get(long timeout, TimeUnit unit)
+        throws InterruptedException, ExecutionException, TimeoutException
+    {
+        waitFor(unit.toNanos(timeout));
+        return getResult();
+    }
+
+    /**
+     * Protected method invoked when this task transitions to state
+     * <tt>isDone</tt> (whether normally or via cancellation). The
+     * default implementation does nothing.  Subclasses may override
+     * this method to invoke completion callbacks or perform
+     * bookkeeping. Note that you can query status inside the
+     * implementation of this method to determine whether this task
+     * has been cancelled.
+     */
+    protected void done() { }
+
+    /**
+     * Sets the result of this Future to the given value unless
+     * this future has already been set or has been cancelled.
+     * This method is invoked internally by the <tt>run</tt> method
+     * upon successful completion of the computation.
+     * @param v the value
+     */
+    protected void set(Object v) {
+        setCompleted(v);
+    }
+
+    /**
+     * Causes this future to report an <tt>ExecutionException</tt>
+     * with the given throwable as its cause, unless this Future has
+     * already been set or has been cancelled.
+     * This method is invoked internally by the <tt>run</tt> method
+     * upon failure of the computation.
+     * @param t the cause of failure
+     */
+    protected void setException(Throwable t) {
+        setFailed(t);
+    }
+
+    /**
+     * Sets this Future to the result of its computation
+     * unless it has been cancelled.
+     */
+    public void run() {
+        synchronized (this) {
+            if (state != 0) return;
+            state = RUNNING;
+            runner = Thread.currentThread();
+        }
+        try {
+            setCompleted(callable.call());
+        }
+        catch (Throwable ex) {
+            setFailed(ex);
+        }
+    }
+
+    /**
+     * Executes the computation without setting its result, and then
+     * resets this Future to initial state, failing to do so if the
+     * computation encounters an exception or is cancelled.  This is
+     * designed for use with tasks that intrinsically execute more
+     * than once.
+     * @return true if successfully run and reset
+     */
+    protected boolean runAndReset() {
+        synchronized (this) {
+            if (state != 0) return false;
+            state = RUNNING;
+            runner = Thread.currentThread();
+        }
+        try {
+            callable.call();
+            synchronized (this) {
+                runner = null;
+                if (state == RUNNING) {
+                    state = 0;
+                    return true;
+                }
+                else {
+                    return false;
+                }
+            }
+        }
+        catch (Throwable ex) {
+            setFailed(ex);
+            return false;
+        }
+    }
+
+    // PRE: lock owned
+    private boolean ranOrCancelled() {
+        return (state & (RAN | CANCELLED)) != 0;
+    }
+
+    /**
+     * Marks the task as completed.
+     * @param result the result of a task.
+     */
+    private void setCompleted(Object result) {
+        synchronized (this) {
+            if (ranOrCancelled()) return;
+            this.state = RAN;
+            this.result = result;
+            this.runner = null;
+            notifyAll();
+        }
+
+        // invoking callbacks *after* setting future as completed and
+        // outside the synchronization block makes it safe to call
+        // interrupt() from within callback code (in which case it will be
+        // ignored rather than cause deadlock / illegal state exception)
+        done();
+    }
+
+    /**
+     * Marks the task as failed.
+     * @param exception the cause of abrupt completion.
+     */
+    private void setFailed(Throwable exception) {
+        synchronized (this) {
+            if (ranOrCancelled()) return;
+            this.state = RAN;
+            this.exception = exception;
+            this.runner = null;
+            notifyAll();
+        }
+
+        // invoking callbacks *after* setting future as completed and
+        // outside the synchronization block makes it safe to call
+        // interrupt() from within callback code (in which case it will be
+        // ignored rather than cause deadlock / illegal state exception)
+        done();
+    }
+
+    /**
+     * Waits for the task to complete.
+     * PRE: lock owned
+     */
+    private void waitFor() throws InterruptedException {
+        while (!isDone()) {
+            wait();
+        }
+    }
+
+    /**
+     * Waits for the task to complete for timeout nanoseconds or throw
+     * TimeoutException if still not completed after that
+     * PRE: lock owned
+     */
+    private void waitFor(long nanos) throws InterruptedException, TimeoutException {
+        if (nanos < 0) throw new IllegalArgumentException();
+        if (isDone()) return;
+        long deadline = Utils.nanoTime() + nanos;
+        while (nanos > 0) {
+            TimeUnit.NANOSECONDS.timedWait(this, nanos);
+            if (isDone()) return;
+            nanos = deadline - Utils.nanoTime();
+        }
+        throw new TimeoutException();
+    }
+
+    /**
+     * Gets the result of the task.
+     *
+     * PRE: task completed
+     * PRE: lock owned
+     */
+    private Object getResult() throws ExecutionException {
+        if (state == CANCELLED) {
+            throw new CancellationException();
+        }
+        if (exception != null) {
+            throw new ExecutionException(exception);
+        }
+        return result;
+    }
+
+    // todo: consider
+    //public String toString() {
+    //    return callable.toString();
+    //}
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/LinkedBlockingDeque.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/LinkedBlockingDeque.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/LinkedBlockingDeque.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,1034 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.Utils;
+
+/**
+ * An optionally-bounded {@linkplain BlockingDeque blocking deque} based on
+ * linked nodes.
+ *
+ * <p> The optional capacity bound constructor argument serves as a
+ * way to prevent excessive expansion. The capacity, if unspecified,
+ * is equal to {@link Integer#MAX_VALUE}.  Linked nodes are
+ * dynamically created upon each insertion unless this would bring the
+ * deque above capacity.
+ *
+ * <p>Most operations run in constant time (ignoring time spent
+ * blocking).  Exceptions include {@link #remove(Object) remove},
+ * {@link #removeFirstOccurrence removeFirstOccurrence}, {@link
+ * #removeLastOccurrence removeLastOccurrence}, {@link #contains
+ * contains}, {@link #iterator iterator.remove()}, and the bulk
+ * operations, all of which run in linear time.
+ *
+ * <p>This class and its iterator implement all of the
+ * <em>optional</em> methods of the {@link Collection} and {@link
+ * Iterator} interfaces.
+ *
+ * <p>This class is a member of the
+ * <a href="{@docRoot}/../guide/collections/index.html">
+ * Java Collections Framework</a>.
+ *
+ * @since 1.6
+ * @author  Doug Lea
+ */
+public class LinkedBlockingDeque
+    extends AbstractQueue
+    implements BlockingDeque,  java.io.Serializable {
+
+    /*
+     * Implemented as a simple doubly-linked list protected by a
+     * single lock and using conditions to manage blocking.
+     */
+
+    /*
+     * We have "diamond" multiple interface/abstract class inheritance
+     * here, and that introduces ambiguities. Often we want the
+     * BlockingDeque javadoc combined with the AbstractQueue
+     * implementation, so a lot of method specs are duplicated here.
+     */
+
+    private static final long serialVersionUID = -387911632671998426L;
+
+    /** Doubly-linked list node class */
+    static final class Node {
+        Object item;
+        Node prev;
+        Node next;
+        Node(Object x, Node p, Node n) {
+            item = x;
+            prev = p;
+            next = n;
+        }
+    }
+
+    /** Pointer to first node */
+    private transient Node first;
+    /** Pointer to last node */
+    private transient Node last;
+    /** Number of items in the deque */
+    private transient int count;
+    /** Maximum number of items in the deque */
+    private final int capacity;
+    /** Main lock guarding all access */
+    private final ReentrantLock lock = new ReentrantLock();
+    /** Condition for waiting takes */
+    private final Condition notEmpty = lock.newCondition();
+    /** Condition for waiting puts */
+    private final Condition notFull = lock.newCondition();
+
+    /**
+     * Creates a <tt>LinkedBlockingDeque</tt> with a capacity of
+     * {@link Integer#MAX_VALUE}.
+     */
+    public LinkedBlockingDeque() {
+        this(Integer.MAX_VALUE);
+    }
+
+    /**
+     * Creates a <tt>LinkedBlockingDeque</tt> with the given (fixed) capacity.
+     *
+     * @param capacity the capacity of this deque
+     * @throws IllegalArgumentException if <tt>capacity</tt> is less than 1
+     */
+    public LinkedBlockingDeque(int capacity) {
+        if (capacity <= 0) throw new IllegalArgumentException();
+        this.capacity = capacity;
+    }
+
+    /**
+     * Creates a <tt>LinkedBlockingDeque</tt> with a capacity of
+     * {@link Integer#MAX_VALUE}, initially containing the elements of
+     * the given collection, added in traversal order of the
+     * collection's iterator.
+     *
+     * @param c the collection of elements to initially contain
+     * @throws NullPointerException if the specified collection or any
+     *         of its elements are null
+     */
+    public LinkedBlockingDeque(Collection c) {
+        this(Integer.MAX_VALUE);
+        for (Iterator itr = c.iterator(); itr.hasNext(); ) {
+            Object e = itr.next();
+            add(e);
+        }
+    }
+
+
+    // Basic linking and unlinking operations, called only while holding lock
+
+    /**
+     * Links e as first element, or returns false if full.
+     */
+    private boolean linkFirst(Object e) {
+        if (count >= capacity)
+            return false;
+        ++count;
+        Node f = first;
+        Node x = new Node(e, null, f);
+        first = x;
+        if (last == null)
+            last = x;
+        else
+            f.prev = x;
+        notEmpty.signal();
+        return true;
+    }
+
+    /**
+     * Links e as last element, or returns false if full.
+     */
+    private boolean linkLast(Object e) {
+        if (count >= capacity)
+            return false;
+        ++count;
+        Node l = last;
+        Node x = new Node(e, l, null);
+        last = x;
+        if (first == null)
+            first = x;
+        else
+            l.next = x;
+        notEmpty.signal();
+        return true;
+    }
+
+    /**
+     * Removes and returns first element, or null if empty.
+     */
+    private Object unlinkFirst() {
+        Node f = first;
+        if (f == null)
+            return null;
+        Node n = f.next;
+        first = n;
+        if (n == null)
+            last = null;
+        else
+            n.prev = null;
+        --count;
+        notFull.signal();
+        return f.item;
+    }
+
+    /**
+     * Removes and returns last element, or null if empty.
+     */
+    private Object unlinkLast() {
+        Node l = last;
+        if (l == null)
+            return null;
+        Node p = l.prev;
+        last = p;
+        if (p == null)
+            first = null;
+        else
+            p.next = null;
+        --count;
+        notFull.signal();
+        return l.item;
+    }
+
+    /**
+     * Unlink e
+     */
+    private void unlink(Node x) {
+        Node p = x.prev;
+        Node n = x.next;
+        if (p == null) {
+            if (n == null)
+                first = last = null;
+            else {
+                n.prev = null;
+                first = n;
+            }
+        } else if (n == null) {
+            p.next = null;
+            last = p;
+        } else {
+            p.next = n;
+            n.prev = p;
+        }
+        --count;
+        notFull.signalAll();
+    }
+
+    // BlockingDeque methods
+
+    /**
+     * @throws IllegalStateException {@inheritDoc}
+     * @throws NullPointerException  {@inheritDoc}
+     */
+    public void addFirst(Object e) {
+        if (!offerFirst(e))
+            throw new IllegalStateException("Deque full");
+    }
+
+    /**
+     * @throws IllegalStateException {@inheritDoc}
+     * @throws NullPointerException  {@inheritDoc}
+     */
+    public void addLast(Object e) {
+        if (!offerLast(e))
+            throw new IllegalStateException("Deque full");
+    }
+
+    /**
+     * @throws NullPointerException {@inheritDoc}
+     */
+    public boolean offerFirst(Object e) {
+        if (e == null) throw new NullPointerException();
+        lock.lock();
+        try {
+            return linkFirst(e);
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * @throws NullPointerException {@inheritDoc}
+     */
+    public boolean offerLast(Object e) {
+        if (e == null) throw new NullPointerException();
+        lock.lock();
+        try {
+            return linkLast(e);
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * @throws NullPointerException {@inheritDoc}
+     * @throws InterruptedException {@inheritDoc}
+     */
+    public void putFirst(Object e) throws InterruptedException {
+        if (e == null) throw new NullPointerException();
+        lock.lock();
+        try {
+            while (!linkFirst(e))
+                notFull.await();
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * @throws NullPointerException {@inheritDoc}
+     * @throws InterruptedException {@inheritDoc}
+     */
+    public void putLast(Object e) throws InterruptedException {
+        if (e == null) throw new NullPointerException();
+        lock.lock();
+        try {
+            while (!linkLast(e))
+                notFull.await();
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * @throws NullPointerException {@inheritDoc}
+     * @throws InterruptedException {@inheritDoc}
+     */
+    public boolean offerFirst(Object e, long timeout, TimeUnit unit)
+        throws InterruptedException {
+        if (e == null) throw new NullPointerException();
+        long nanos = unit.toNanos(timeout);
+        long deadline = Utils.nanoTime() + nanos;
+        lock.lockInterruptibly();
+        try {
+            for (;;) {
+                if (linkFirst(e))
+                    return true;
+                if (nanos <= 0)
+                    return false;
+                notFull.await(nanos, TimeUnit.NANOSECONDS);
+                nanos = deadline - Utils.nanoTime();
+            }
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * @throws NullPointerException {@inheritDoc}
+     * @throws InterruptedException {@inheritDoc}
+     */
+    public boolean offerLast(Object e, long timeout, TimeUnit unit)
+        throws InterruptedException {
+        if (e == null) throw new NullPointerException();
+        long nanos = unit.toNanos(timeout);
+        long deadline = Utils.nanoTime() + nanos;
+        lock.lockInterruptibly();
+        try {
+            for (;;) {
+                if (linkLast(e))
+                    return true;
+                if (nanos <= 0)
+                    return false;
+                notFull.await(nanos, TimeUnit.NANOSECONDS);
+                nanos = deadline - Utils.nanoTime();
+            }
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * @throws NoSuchElementException {@inheritDoc}
+     */
+    public Object removeFirst() {
+        Object x = pollFirst();
+        if (x == null) throw new NoSuchElementException();
+        return x;
+    }
+
+    /**
+     * @throws NoSuchElementException {@inheritDoc}
+     */
+    public Object removeLast() {
+        Object x = pollLast();
+        if (x == null) throw new NoSuchElementException();
+        return x;
+    }
+
+    public Object pollFirst() {
+        lock.lock();
+        try {
+            return unlinkFirst();
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    public Object pollLast() {
+        lock.lock();
+        try {
+            return unlinkLast();
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    public Object takeFirst() throws InterruptedException {
+        lock.lock();
+        try {
+            Object x;
+            while ( (x = unlinkFirst()) == null)
+                notEmpty.await();
+            return x;
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    public Object takeLast() throws InterruptedException {
+        lock.lock();
+        try {
+            Object x;
+            while ( (x = unlinkLast()) == null)
+                notEmpty.await();
+            return x;
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    public Object pollFirst(long timeout, TimeUnit unit)
+        throws InterruptedException {
+        long nanos = unit.toNanos(timeout);
+        long deadline = Utils.nanoTime() + nanos;
+        lock.lockInterruptibly();
+        try {
+            for (;;) {
+                Object x = unlinkFirst();
+                if (x != null)
+                    return x;
+                if (nanos <= 0)
+                    return null;
+                notEmpty.await(nanos, TimeUnit.NANOSECONDS);
+                nanos = deadline - Utils.nanoTime();
+            }
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    public Object pollLast(long timeout, TimeUnit unit)
+        throws InterruptedException {
+        long nanos = unit.toNanos(timeout);
+        long deadline = Utils.nanoTime() + nanos;
+        lock.lockInterruptibly();
+        try {
+            for (;;) {
+                Object x = unlinkLast();
+                if (x != null)
+                    return x;
+                if (nanos <= 0)
+                    return null;
+                notEmpty.await(nanos, TimeUnit.NANOSECONDS);
+                nanos = deadline - Utils.nanoTime();
+            }
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * @throws NoSuchElementException {@inheritDoc}
+     */
+    public Object getFirst() {
+        Object x = peekFirst();
+        if (x == null) throw new NoSuchElementException();
+        return x;
+    }
+
+    /**
+     * @throws NoSuchElementException {@inheritDoc}
+     */
+    public Object getLast() {
+        Object x = peekLast();
+        if (x == null) throw new NoSuchElementException();
+        return x;
+    }
+
+    public Object peekFirst() {
+        lock.lock();
+        try {
+            return (first == null) ? null : first.item;
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    public Object peekLast() {
+        lock.lock();
+        try {
+            return (last == null) ? null : last.item;
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    public boolean removeFirstOccurrence(Object o) {
+        if (o == null) return false;
+        lock.lock();
+        try {
+            for (Node p = first; p != null; p = p.next) {
+                if (o.equals(p.item)) {
+                    unlink(p);
+                    return true;
+                }
+            }
+            return false;
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    public boolean removeLastOccurrence(Object o) {
+        if (o == null) return false;
+        lock.lock();
+        try {
+            for (Node p = last; p != null; p = p.prev) {
+                if (o.equals(p.item)) {
+                    unlink(p);
+                    return true;
+                }
+            }
+            return false;
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    // BlockingQueue methods
+
+    /**
+     * Inserts the specified element at the end of this deque unless it would
+     * violate capacity restrictions.  When using a capacity-restricted deque,
+     * it is generally preferable to use method {@link #offer(Object) offer}.
+     *
+     * <p>This method is equivalent to {@link #addLast}.
+     *
+     * @throws IllegalStateException if the element cannot be added at this
+     *         time due to capacity restrictions
+     * @throws NullPointerException if the specified element is null
+     */
+    public boolean add(Object e) {
+        addLast(e);
+        return true;
+    }
+
+    /**
+     * @throws NullPointerException if the specified element is null
+     */
+    public boolean offer(Object e) {
+        return offerLast(e);
+    }
+
+    /**
+     * @throws NullPointerException {@inheritDoc}
+     * @throws InterruptedException {@inheritDoc}
+     */
+    public void put(Object e) throws InterruptedException {
+        putLast(e);
+    }
+
+    /**
+     * @throws NullPointerException {@inheritDoc}
+     * @throws InterruptedException {@inheritDoc}
+     */
+    public boolean offer(Object e, long timeout, TimeUnit unit)
+        throws InterruptedException {
+        return offerLast(e, timeout, unit);
+    }
+
+    /**
+     * Retrieves and removes the head of the queue represented by this deque.
+     * This method differs from {@link #poll poll} only in that it throws an
+     * exception if this deque is empty.
+     *
+     * <p>This method is equivalent to {@link #removeFirst() removeFirst}.
+     *
+     * @return the head of the queue represented by this deque
+     * @throws NoSuchElementException if this deque is empty
+     */
+    public Object remove() {
+        return removeFirst();
+    }
+
+    public Object poll() {
+        return pollFirst();
+    }
+
+    public Object take() throws InterruptedException {
+        return takeFirst();
+    }
+
+    public Object poll(long timeout, TimeUnit unit) throws InterruptedException {
+        return pollFirst(timeout, unit);
+    }
+
+    /**
+     * Retrieves, but does not remove, the head of the queue represented by
+     * this deque.  This method differs from {@link #peek peek} only in that
+     * it throws an exception if this deque is empty.
+     *
+     * <p>This method is equivalent to {@link #getFirst() getFirst}.
+     *
+     * @return the head of the queue represented by this deque
+     * @throws NoSuchElementException if this deque is empty
+     */
+    public Object element() {
+        return getFirst();
+    }
+
+    public Object peek() {
+        return peekFirst();
+    }
+
+    /**
+     * Returns the number of additional elements that this deque can ideally
+     * (in the absence of memory or resource constraints) accept without
+     * blocking. This is always equal to the initial capacity of this deque
+     * less the current <tt>size</tt> of this deque.
+     *
+     * <p>Note that you <em>cannot</em> always tell if an attempt to insert
+     * an element will succeed by inspecting <tt>remainingCapacity</tt>
+     * because it may be the case that another thread is about to
+     * insert or remove an element.
+     */
+    public int remainingCapacity() {
+        lock.lock();
+        try {
+            return capacity - count;
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * @throws UnsupportedOperationException {@inheritDoc}
+     * @throws ClassCastException            {@inheritDoc}
+     * @throws NullPointerException          {@inheritDoc}
+     * @throws IllegalArgumentException      {@inheritDoc}
+     */
+    public int drainTo(Collection c) {
+        if (c == null)
+            throw new NullPointerException();
+        if (c == this)
+            throw new IllegalArgumentException();
+        lock.lock();
+        try {
+            for (Node p = first; p != null; p = p.next)
+                c.add(p.item);
+            int n = count;
+            count = 0;
+            first = last = null;
+            notFull.signalAll();
+            return n;
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * @throws UnsupportedOperationException {@inheritDoc}
+     * @throws ClassCastException            {@inheritDoc}
+     * @throws NullPointerException          {@inheritDoc}
+     * @throws IllegalArgumentException      {@inheritDoc}
+     */
+    public int drainTo(Collection c, int maxElements) {
+        if (c == null)
+            throw new NullPointerException();
+        if (c == this)
+            throw new IllegalArgumentException();
+        lock.lock();
+        try {
+            int n = 0;
+            while (n < maxElements && first != null) {
+                c.add(first.item);
+                first.prev = null;
+                first = first.next;
+                --count;
+                ++n;
+            }
+            if (first == null)
+                last = null;
+            notFull.signalAll();
+            return n;
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    // Stack methods
+
+    /**
+     * @throws IllegalStateException {@inheritDoc}
+     * @throws NullPointerException  {@inheritDoc}
+     */
+    public void push(Object e) {
+        addFirst(e);
+    }
+
+    /**
+     * @throws NoSuchElementException {@inheritDoc}
+     */
+    public Object pop() {
+        return removeFirst();
+    }
+
+    // Collection methods
+
+    /**
+     * Removes the first occurrence of the specified element from this deque.
+     * If the deque does not contain the element, it is unchanged.
+     * More formally, removes the first element <tt>e</tt> such that
+     * <tt>o.equals(e)</tt> (if such an element exists).
+     * Returns <tt>true</tt> if this deque contained the specified element
+     * (or equivalently, if this deque changed as a result of the call).
+     *
+     * <p>This method is equivalent to
+     * {@link #removeFirstOccurrence(Object) removeFirstOccurrence}.
+     *
+     * @param o element to be removed from this deque, if present
+     * @return <tt>true</tt> if this deque changed as a result of the call
+     */
+    public boolean remove(Object o) {
+        return removeFirstOccurrence(o);
+    }
+
+    /**
+     * Returns the number of elements in this deque.
+     *
+     * @return the number of elements in this deque
+     */
+    public int size() {
+        lock.lock();
+        try {
+            return count;
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * Returns <tt>true</tt> if this deque contains the specified element.
+     * More formally, returns <tt>true</tt> if and only if this deque contains
+     * at least one element <tt>e</tt> such that <tt>o.equals(e)</tt>.
+     *
+     * @param o object to be checked for containment in this deque
+     * @return <tt>true</tt> if this deque contains the specified element
+     */
+    public boolean contains(Object o) {
+        if (o == null) return false;
+        lock.lock();
+        try {
+            for (Node p = first; p != null; p = p.next)
+                if (o.equals(p.item))
+                    return true;
+            return false;
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * Variant of removeFirstOccurrence needed by iterator.remove.
+     * Searches for the node, not its contents.
+     */
+    boolean removeNode(Node e) {
+        lock.lock();
+        try {
+            for (Node p = first; p != null; p = p.next) {
+                if (p == e) {
+                    unlink(p);
+                    return true;
+                }
+            }
+            return false;
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * Returns an array containing all of the elements in this deque, in
+     * proper sequence (from first to last element).
+     *
+     * <p>The returned array will be "safe" in that no references to it are
+     * maintained by this deque.  (In other words, this method must allocate
+     * a new array).  The caller is thus free to modify the returned array.
+     *
+     * <p>This method acts as bridge between array-based and collection-based
+     * APIs.
+     *
+     * @return an array containing all of the elements in this deque
+     */
+    public Object[] toArray() {
+        lock.lock();
+        try {
+            Object[] a = new Object[count];
+            int k = 0;
+            for (Node p = first; p != null; p = p.next)
+                a[k++] = p.item;
+            return a;
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * Returns an array containing all of the elements in this deque, in
+     * proper sequence; the runtime type of the returned array is that of
+     * the specified array.  If the deque fits in the specified array, it
+     * is returned therein.  Otherwise, a new array is allocated with the
+     * runtime type of the specified array and the size of this deque.
+     *
+     * <p>If this deque fits in the specified array with room to spare
+     * (i.e., the array has more elements than this deque), the element in
+     * the array immediately following the end of the deque is set to
+     * <tt>null</tt>.
+     *
+     * <p>Like the {@link #toArray()} method, this method acts as bridge between
+     * array-based and collection-based APIs.  Further, this method allows
+     * precise control over the runtime type of the output array, and may,
+     * under certain circumstances, be used to save allocation costs.
+     *
+     * <p>Suppose <tt>x</tt> is a deque known to contain only strings.
+     * The following code can be used to dump the deque into a newly
+     * allocated array of <tt>String</tt>:
+     *
+     * <pre>
+     *     String[] y = x.toArray(new String[0]);</pre>
+     *
+     * Note that <tt>toArray(new Object[0])</tt> is identical in function to
+     * <tt>toArray()</tt>.
+     *
+     * @param a the array into which the elements of the deque are to
+     *          be stored, if it is big enough; otherwise, a new array of the
+     *          same runtime type is allocated for this purpose
+     * @return an array containing all of the elements in this deque
+     * @throws ArrayStoreException if the runtime type of the specified array
+     *         is not a supertype of the runtime type of every element in
+     *         this deque
+     * @throws NullPointerException if the specified array is null
+     */
+    public Object[] toArray(Object[] a) {
+        lock.lock();
+        try {
+            if (a.length < count)
+                a = (Object[])java.lang.reflect.Array.newInstance(
+                    a.getClass().getComponentType(),
+                    count
+                    );
+
+            int k = 0;
+            for (Node p = first; p != null; p = p.next)
+                a[k++] = (Object)p.item;
+            if (a.length > k)
+                a[k] = null;
+            return a;
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    public String toString() {
+        lock.lock();
+        try {
+            return super.toString();
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * Atomically removes all of the elements from this deque.
+     * The deque will be empty after this call returns.
+     */
+    public void clear() {
+        lock.lock();
+        try {
+            first = last = null;
+            count = 0;
+            notFull.signalAll();
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * Returns an iterator over the elements in this deque in proper sequence.
+     * The elements will be returned in order from first (head) to last (tail).
+     * The returned <tt>Iterator</tt> is a "weakly consistent" iterator that
+     * will never throw {@link java.util.ConcurrentModificationException},
+     * and guarantees to traverse elements as they existed upon
+     * construction of the iterator, and may (but is not guaranteed to)
+     * reflect any modifications subsequent to construction.
+     *
+     * @return an iterator over the elements in this deque in proper sequence
+     */
+    public Iterator iterator() {
+        return new Itr();
+    }
+
+    /**
+     * Returns an iterator over the elements in this deque in reverse
+     * sequential order.  The elements will be returned in order from
+     * last (tail) to first (head).
+     * The returned <tt>Iterator</tt> is a "weakly consistent" iterator that
+     * will never throw {@link java.util.ConcurrentModificationException},
+     * and guarantees to traverse elements as they existed upon
+     * construction of the iterator, and may (but is not guaranteed to)
+     * reflect any modifications subsequent to construction.
+     */
+    public Iterator descendingIterator() {
+        return new DescendingItr();
+    }
+
+    /**
+     * Base class for Iterators for LinkedBlockingDeque
+     */
+    private abstract class AbstractItr implements Iterator {
+        /**
+         * The next node to return in next
+         */
+         Node next;
+
+        /**
+         * nextItem holds on to item fields because once we claim that
+         * an element exists in hasNext(), we must return item read
+         * under lock (in advance()) even if it was in the process of
+         * being removed when hasNext() was called.
+         */
+        Object nextItem;
+
+        /**
+         * Node returned by most recent call to next. Needed by remove.
+         * Reset to null if this element is deleted by a call to remove.
+         */
+        private Node lastRet;
+
+        AbstractItr() {
+            advance(); // set to initial position
+        }
+
+        /**
+         * Advances next, or if not yet initialized, sets to first node.
+         * Implemented to move forward vs backward in the two subclasses.
+         */
+        abstract void advance();
+
+        public boolean hasNext() {
+            return next != null;
+        }
+
+        public Object next() {
+            if (next == null)
+                throw new NoSuchElementException();
+            lastRet = next;
+            Object x = nextItem;
+            advance();
+            return x;
+        }
+
+        public void remove() {
+            Node n = lastRet;
+            if (n == null)
+                throw new IllegalStateException();
+            lastRet = null;
+            // Note: removeNode rescans looking for this node to make
+            // sure it was not already removed. Otherwise, trying to
+            // re-remove could corrupt list.
+            removeNode(n);
+        }
+    }
+
+    /** Forward iterator */
+    private class Itr extends AbstractItr {
+        void advance() {
+            final ReentrantLock lock = LinkedBlockingDeque.this.lock;
+            lock.lock();
+            try {
+                next = (next == null)? first : next.next;
+                nextItem = (next == null)? null : next.item;
+            } finally {
+                lock.unlock();
+            }
+        }
+    }
+
+    /**
+     * Descending iterator for LinkedBlockingDeque
+     */
+    private class DescendingItr extends AbstractItr {
+        void advance() {
+            final ReentrantLock lock = LinkedBlockingDeque.this.lock;
+            lock.lock();
+            try {
+                next = (next == null)? last : next.prev;
+                nextItem = (next == null)? null : next.item;
+            } finally {
+                lock.unlock();
+            }
+        }
+    }
+
+    /**
+     * Save the state of this deque to a stream (that is, serialize it).
+     *
+     * @serialData The capacity (int), followed by elements (each an
+     * <tt>Object</tt>) in the proper order, followed by a null
+     * @param s the stream
+     */
+    private void writeObject(java.io.ObjectOutputStream s)
+        throws java.io.IOException {
+        lock.lock();
+        try {
+            // Write out capacity and any hidden stuff
+            s.defaultWriteObject();
+            // Write out all elements in the proper order.
+            for (Node p = first; p != null; p = p.next)
+                s.writeObject(p.item);
+            // Use trailing null as sentinel
+            s.writeObject(null);
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * Reconstitute this deque from a stream (that is,
+     * deserialize it).
+     * @param s the stream
+     */
+    private void readObject(java.io.ObjectInputStream s)
+        throws java.io.IOException, ClassNotFoundException {
+        s.defaultReadObject();
+        count = 0;
+        first = null;
+        last = null;
+        // Read in all elements and place in queue
+        for (;;) {
+            Object item = (Object)s.readObject();
+            if (item == null)
+                break;
+            add(item);
+        }
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/LinkedBlockingQueue.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/LinkedBlockingQueue.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/LinkedBlockingQueue.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,751 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.*;
+
+/**
+ * An optionally-bounded {@linkplain BlockingQueue blocking queue} based on
+ * linked nodes.
+ * This queue orders elements FIFO (first-in-first-out).
+ * The <em>head</em> of the queue is that element that has been on the
+ * queue the longest time.
+ * The <em>tail</em> of the queue is that element that has been on the
+ * queue the shortest time. New elements
+ * are inserted at the tail of the queue, and the queue retrieval
+ * operations obtain elements at the head of the queue.
+ * Linked queues typically have higher throughput than array-based queues but
+ * less predictable performance in most concurrent applications.
+ *
+ * <p> The optional capacity bound constructor argument serves as a
+ * way to prevent excessive queue expansion. The capacity, if unspecified,
+ * is equal to {@link Integer#MAX_VALUE}.  Linked nodes are
+ * dynamically created upon each insertion unless this would bring the
+ * queue above capacity.
+ *
+ * <p>This class and its iterator implement all of the
+ * <em>optional</em> methods of the {@link Collection} and {@link
+ * Iterator} interfaces.
+ *
+ * <p>This class is a member of the
+ * <a href="{@docRoot}/../guide/collections/index.html">
+ * Java Collections Framework</a>.
+ *
+ * @since 1.5
+ * @author Doug Lea
+ *
+ */
+public class LinkedBlockingQueue extends AbstractQueue
+        implements BlockingQueue, java.io.Serializable {
+    private static final long serialVersionUID = -6903933977591709194L;
+
+    /*
+     * A variant of the "two lock queue" algorithm.  The putLock gates
+     * entry to put (and offer), and has an associated condition for
+     * waiting puts.  Similarly for the takeLock.  The "count" field
+     * that they both rely on is maintained as an atomic to avoid
+     * needing to get both locks in most cases. Also, to minimize need
+     * for puts to get takeLock and vice-versa, cascading notifies are
+     * used. When a put notices that it has enabled at least one take,
+     * it signals taker. That taker in turn signals others if more
+     * items have been entered since the signal. And symmetrically for
+     * takes signalling puts. Operations such as remove(Object) and
+     * iterators acquire both locks.
+     */
+
+    /**
+     * Linked list node class
+     */
+    static class Node {
+        /** The item, volatile to ensure barrier separating write and read */
+        volatile Object item;
+        Node next;
+        Node(Object x) { item = x; }
+    }
+
+    /** The capacity bound, or Integer.MAX_VALUE if none */
+    private final int capacity;
+
+    /** Current number of elements */
+    private volatile int count = 0;
+
+    /** Head of linked list */
+    private transient Node head;
+
+    /** Tail of linked list */
+    private transient Node last;
+
+    /** Lock held by take, poll, etc */
+    private final Object takeLock = new SerializableLock();
+
+    /** Lock held by put, offer, etc */
+    private final Object putLock = new SerializableLock();
+
+    /**
+     * Signals a waiting take. Called only from put/offer (which do not
+     * otherwise ordinarily lock takeLock.)
+     */
+    private void signalNotEmpty() {
+        synchronized (takeLock) {
+            takeLock.notify();
+        }
+    }
+
+    /**
+     * Signals a waiting put. Called only from take/poll.
+     */
+    private void signalNotFull() {
+        synchronized (putLock) {
+            putLock.notify();
+        }
+    }
+
+    /**
+     * Creates a node and links it at end of queue.
+     * @param x the item
+     */
+    private void insert(Object x) {
+        last = last.next = new Node(x);
+    }
+
+    /**
+     * Removes a node from head of queue,
+     * @return the node
+     */
+    private Object extract() {
+        Node first = head.next;
+        head = first;
+        Object x = first.item;
+        first.item = null;
+        return x;
+    }
+
+
+    /**
+     * Creates a <tt>LinkedBlockingQueue</tt> with a capacity of
+     * {@link Integer#MAX_VALUE}.
+     */
+    public LinkedBlockingQueue() {
+        this(Integer.MAX_VALUE);
+    }
+
+    /**
+     * Creates a <tt>LinkedBlockingQueue</tt> with the given (fixed) capacity.
+     *
+     * @param capacity the capacity of this queue
+     * @throws IllegalArgumentException if <tt>capacity</tt> is not greater
+     *         than zero
+     */
+    public LinkedBlockingQueue(int capacity) {
+        if (capacity <= 0) throw new IllegalArgumentException();
+        this.capacity = capacity;
+        last = head = new Node(null);
+    }
+
+    /**
+     * Creates a <tt>LinkedBlockingQueue</tt> with a capacity of
+     * {@link Integer#MAX_VALUE}, initially containing the elements of the
+     * given collection,
+     * added in traversal order of the collection's iterator.
+     *
+     * @param c the collection of elements to initially contain
+     * @throws NullPointerException if the specified collection or any
+     *         of its elements are null
+     */
+    public LinkedBlockingQueue(Collection c) {
+        this(Integer.MAX_VALUE);
+        for (Iterator itr = c.iterator(); itr.hasNext();) {
+            Object e = itr.next();
+            add(e);
+        }
+    }
+
+
+    // this doc comment is overridden to remove the reference to collections
+    // greater in size than Integer.MAX_VALUE
+    /**
+     * Returns the number of elements in this queue.
+     *
+     * @return the number of elements in this queue
+     */
+    public int size() {
+        return count;
+    }
+
+    // this doc comment is a modified copy of the inherited doc comment,
+    // without the reference to unlimited queues.
+    /**
+     * Returns the number of additional elements that this queue can ideally
+     * (in the absence of memory or resource constraints) accept without
+     * blocking. This is always equal to the initial capacity of this queue
+     * less the current <tt>size</tt> of this queue.
+     *
+     * <p>Note that you <em>cannot</em> always tell if an attempt to insert
+     * an element will succeed by inspecting <tt>remainingCapacity</tt>
+     * because it may be the case that another thread is about to
+     * insert or remove an element.
+     */
+    public int remainingCapacity() {
+        return capacity - count;
+    }
+
+    /**
+     * Inserts the specified element at the tail of this queue, waiting if
+     * necessary for space to become available.
+     *
+     * @throws InterruptedException {@inheritDoc}
+     * @throws NullPointerException {@inheritDoc}
+     */
+    public void put(Object e) throws InterruptedException {
+        if (e == null) throw new NullPointerException();
+        // Note: convention in all put/take/etc is to preset
+        // local var holding count  negative to indicate failure unless set.
+        int c = -1;
+        synchronized (putLock) {
+            /*
+             * Note that count is used in wait guard even though it is
+             * not protected by lock. This works because count can
+             * only decrease at this point (all other puts are shut
+             * out by lock), and we (or some other waiting put) are
+             * signalled if it ever changes from
+             * capacity. Similarly for all other uses of count in
+             * other wait guards.
+             */
+            try {
+                while (count == capacity)
+                    putLock.wait();
+            } catch (InterruptedException ie) {
+                putLock.notify(); // propagate to a non-interrupted thread
+                throw ie;
+            }
+            insert(e);
+            synchronized (this) { c = count++; }
+            if (c + 1 < capacity)
+                putLock.notify();
+        }
+
+        if (c == 0)
+            signalNotEmpty();
+    }
+
+    /**
+     * Inserts the specified element at the tail of this queue, waiting if
+     * necessary up to the specified wait time for space to become available.
+     *
+     * @return <tt>true</tt> if successful, or <tt>false</tt> if
+     *         the specified waiting time elapses before space is available.
+     * @throws InterruptedException {@inheritDoc}
+     * @throws NullPointerException {@inheritDoc}
+     */
+    public boolean offer(Object e, long timeout, TimeUnit unit)
+        throws InterruptedException {
+
+        if (e == null) throw new NullPointerException();
+        long nanos = unit.toNanos(timeout);
+        int c = -1;
+        synchronized (putLock) {
+            long deadline = Utils.nanoTime() + nanos;
+            for (;;) {
+                if (count < capacity) {
+                    insert(e);
+                    synchronized (this) { c = count++; }
+                    if (c + 1 < capacity)
+                        putLock.notify();
+                    break;
+                }
+                if (nanos <= 0)
+                    return false;
+                try {
+                    TimeUnit.NANOSECONDS.timedWait(putLock, nanos);
+                    nanos = deadline - Utils.nanoTime();
+                } catch (InterruptedException ie) {
+                    putLock.notify(); // propagate to a non-interrupted thread
+                    throw ie;
+                }
+            }
+        }
+        if (c == 0)
+            signalNotEmpty();
+        return true;
+    }
+
+    /**
+     * Inserts the specified element at the tail of this queue if it is
+     * possible to do so immediately without exceeding the queue's capacity,
+     * returning <tt>true</tt> upon success and <tt>false</tt> if this queue
+     * is full.
+     * When using a capacity-restricted queue, this method is generally
+     * preferable to method {@link BlockingQueue#add add}, which can fail to
+     * insert an element only by throwing an exception.
+     *
+     * @throws NullPointerException if the specified element is null
+     */
+    public boolean offer(Object e) {
+        if (e == null) throw new NullPointerException();
+        if (count == capacity)
+            return false;
+        int c = -1;
+        synchronized (putLock) {
+            if (count < capacity) {
+                insert(e);
+                synchronized (this) { c = count++; }
+                if (c + 1 < capacity)
+                    putLock.notify();
+            }
+        }
+        if (c == 0)
+            signalNotEmpty();
+        return c >= 0;
+    }
+
+
+    public Object take() throws InterruptedException {
+        Object x;
+        int c = -1;
+        synchronized (takeLock) {
+            try {
+                while (count == 0)
+                    takeLock.wait();
+            } catch (InterruptedException ie) {
+                takeLock.notify(); // propagate to a non-interrupted thread
+                throw ie;
+            }
+
+            x = extract();
+            synchronized (this) { c = count--; }
+            if (c > 1)
+                takeLock.notify();
+        }
+        if (c == capacity)
+            signalNotFull();
+        return x;
+    }
+
+    public Object poll(long timeout, TimeUnit unit) throws InterruptedException {
+        Object x = null;
+        int c = -1;
+        long nanos = unit.toNanos(timeout);
+        synchronized (takeLock) {
+            long deadline = Utils.nanoTime() + nanos;
+            for (;;) {
+                if (count > 0) {
+                    x = extract();
+                    synchronized (this) { c = count--; }
+                    if (c > 1)
+                        takeLock.notify();
+                    break;
+                }
+                if (nanos <= 0)
+                    return null;
+                try {
+                    TimeUnit.NANOSECONDS.timedWait(takeLock, nanos);
+                    nanos = deadline - Utils.nanoTime();
+                } catch (InterruptedException ie) {
+                    takeLock.notify(); // propagate to a non-interrupted thread
+                    throw ie;
+                }
+            }
+        }
+        if (c == capacity)
+            signalNotFull();
+        return x;
+    }
+
+    public Object poll() {
+        if (count == 0)
+            return null;
+        Object x = null;
+        int c = -1;
+        synchronized (takeLock) {
+            if (count > 0) {
+                x = extract();
+                synchronized (this) { c = count--; }
+                if (c > 1)
+                    takeLock.notify();
+            }
+        }
+        if (c == capacity)
+            signalNotFull();
+        return x;
+    }
+
+
+    public Object peek() {
+        if (count == 0)
+            return null;
+        synchronized (takeLock) {
+            Node first = head.next;
+            if (first == null)
+                return null;
+            else
+                return first.item;
+        }
+    }
+
+    /**
+     * Removes a single instance of the specified element from this queue,
+     * if it is present.  More formally, removes an element <tt>e</tt> such
+     * that <tt>o.equals(e)</tt>, if this queue contains one or more such
+     * elements.
+     * Returns <tt>true</tt> if this queue contained the specified element
+     * (or equivalently, if this queue changed as a result of the call).
+     *
+     * @param o element to be removed from this queue, if present
+     * @return <tt>true</tt> if this queue changed as a result of the call
+     */
+    public boolean remove(Object o) {
+        if (o == null) return false;
+        boolean removed = false;
+        synchronized (putLock) {
+            synchronized (takeLock) {
+                Node trail = head;
+                Node p = head.next;
+                while (p != null) {
+                    if (o.equals(p.item)) {
+                        removed = true;
+                        break;
+                    }
+                    trail = p;
+                    p = p.next;
+                }
+                if (removed) {
+                    p.item = null;
+                    trail.next = p.next;
+                    if (last == p)
+                        last = trail;
+                    synchronized (this) {
+                        if (count-- == capacity)
+                            putLock.notifyAll();
+                    }
+                }
+            }
+        }
+        return removed;
+    }
+
+    /**
+     * Returns an array containing all of the elements in this queue, in
+     * proper sequence.
+     *
+     * <p>The returned array will be "safe" in that no references to it are
+     * maintained by this queue.  (In other words, this method must allocate
+     * a new array).  The caller is thus free to modify the returned array.
+     *
+     * <p>This method acts as bridge between array-based and collection-based
+     * APIs.
+     *
+     * @return an array containing all of the elements in this queue
+     */
+    public Object[] toArray() {
+        synchronized (putLock) {
+            synchronized (takeLock) {
+                int size = count;
+                Object[] a = new Object[size];
+                int k = 0;
+                for (Node p = head.next; p != null; p = p.next)
+                    a[k++] = p.item;
+                return a;
+            }
+        }
+    }
+
+    /**
+     * Returns an array containing all of the elements in this queue, in
+     * proper sequence; the runtime type of the returned array is that of
+     * the specified array.  If the queue fits in the specified array, it
+     * is returned therein.  Otherwise, a new array is allocated with the
+     * runtime type of the specified array and the size of this queue.
+     *
+     * <p>If this queue fits in the specified array with room to spare
+     * (i.e., the array has more elements than this queue), the element in
+     * the array immediately following the end of the queue is set to
+     * <tt>null</tt>.
+     *
+     * <p>Like the {@link #toArray()} method, this method acts as bridge between
+     * array-based and collection-based APIs.  Further, this method allows
+     * precise control over the runtime type of the output array, and may,
+     * under certain circumstances, be used to save allocation costs.
+     *
+     * <p>Suppose <tt>x</tt> is a queue known to contain only strings.
+     * The following code can be used to dump the queue into a newly
+     * allocated array of <tt>String</tt>:
+     *
+     * <pre>
+     *     String[] y = x.toArray(new String[0]);</pre>
+     *
+     * Note that <tt>toArray(new Object[0])</tt> is identical in function to
+     * <tt>toArray()</tt>.
+     *
+     * @param a the array into which the elements of the queue are to
+     *          be stored, if it is big enough; otherwise, a new array of the
+     *          same runtime type is allocated for this purpose
+     * @return an array containing all of the elements in this queue
+     * @throws ArrayStoreException if the runtime type of the specified array
+     *         is not a supertype of the runtime type of every element in
+     *         this queue
+     * @throws NullPointerException if the specified array is null
+     */
+    public Object[] toArray(Object[] a) {
+        synchronized (putLock) {
+            synchronized (takeLock) {
+                int size = count;
+                if (a.length < size)
+                    a = (Object[])java.lang.reflect.Array.newInstance
+                        (a.getClass().getComponentType(), size);
+
+                int k = 0;
+                for (Node p = head.next; p != null; p = p.next)
+                    a[k++] = (Object)p.item;
+                if (a.length > k)
+                    a[k] = null;
+                return a;
+            }
+        }
+    }
+
+    public String toString() {
+        synchronized (putLock) {
+            synchronized (takeLock) {
+                return super.toString();
+            }
+        }
+    }
+
+    /**
+     * Atomically removes all of the elements from this queue.
+     * The queue will be empty after this call returns.
+     */
+    public void clear() {
+        synchronized (putLock) {
+            synchronized (takeLock) {
+                head.next = null;
+                assert head.item == null;
+                last = head;
+                int c;
+                synchronized (this) {
+                    c = count;
+                    count = 0;
+                }
+                if (c == capacity)
+                    putLock.notifyAll();
+            }
+        }
+    }
+
+    /**
+     * @throws UnsupportedOperationException {@inheritDoc}
+     * @throws ClassCastException            {@inheritDoc}
+     * @throws NullPointerException          {@inheritDoc}
+     * @throws IllegalArgumentException      {@inheritDoc}
+     */
+    public int drainTo(Collection c) {
+        if (c == null)
+            throw new NullPointerException();
+        if (c == this)
+            throw new IllegalArgumentException();
+        Node first;
+        synchronized (putLock) {
+            synchronized (takeLock) {
+                first = head.next;
+                head.next = null;
+                assert head.item == null;
+                last = head;
+                int cold;
+                synchronized (this) {
+                    cold = count;
+                    count = 0;
+                }
+                if (cold == capacity)
+                    putLock.notifyAll();
+            }
+        }
+        // Transfer the elements outside of locks
+        int n = 0;
+        for (Node p = first; p != null; p = p.next) {
+            c.add(p.item);
+            p.item = null;
+            ++n;
+        }
+        return n;
+    }
+
+    /**
+     * @throws UnsupportedOperationException {@inheritDoc}
+     * @throws ClassCastException            {@inheritDoc}
+     * @throws NullPointerException          {@inheritDoc}
+     * @throws IllegalArgumentException      {@inheritDoc}
+     */
+    public int drainTo(Collection c, int maxElements) {
+        if (c == null)
+            throw new NullPointerException();
+        if (c == this)
+            throw new IllegalArgumentException();
+        synchronized (putLock) {
+            synchronized (takeLock) {
+                int n = 0;
+                Node p = head.next;
+                while (p != null && n < maxElements) {
+                    c.add(p.item);
+                    p.item = null;
+                    p = p.next;
+                    ++n;
+                }
+                if (n != 0) {
+                    head.next = p;
+                    assert head.item == null;
+                    if (p == null)
+                        last = head;
+                    int cold;
+                    synchronized (this) {
+                        cold = count;
+                        count -= n;
+                    }
+                    if (cold == capacity)
+                        putLock.notifyAll();
+                }
+                return n;
+            }
+        }
+    }
+
+    /**
+     * Returns an iterator over the elements in this queue in proper sequence.
+     * The returned <tt>Iterator</tt> is a "weakly consistent" iterator that
+     * will never throw {@link java.util.ConcurrentModificationException},
+     * and guarantees to traverse elements as they existed upon
+     * construction of the iterator, and may (but is not guaranteed to)
+     * reflect any modifications subsequent to construction.
+     *
+     * @return an iterator over the elements in this queue in proper sequence
+     */
+    public Iterator iterator() {
+      return new Itr();
+    }
+
+    private class Itr implements Iterator {
+        /*
+         * Basic weak-consistent iterator.  At all times hold the next
+         * item to hand out so that if hasNext() reports true, we will
+         * still have it to return even if lost race with a take etc.
+         */
+        private Node current;
+        private Node lastRet;
+        private Object currentElement;
+
+        Itr() {
+            synchronized (putLock) {
+                synchronized (takeLock) {
+                    current = head.next;
+                    if (current != null)
+                        currentElement = current.item;
+                }
+            }
+        }
+
+        public boolean hasNext() {
+            return current != null;
+        }
+
+        public Object next() {
+            synchronized (putLock) {
+                synchronized (takeLock) {
+                    if (current == null)
+                        throw new NoSuchElementException();
+                    Object x = currentElement;
+                    lastRet = current;
+                    current = current.next;
+                    if (current != null)
+                        currentElement = current.item;
+                    return x;
+                }
+            }
+        }
+
+        public void remove() {
+            if (lastRet == null)
+                throw new IllegalStateException();
+            synchronized (putLock) {
+                synchronized (takeLock) {
+                    Node node = lastRet;
+                    lastRet = null;
+                    Node trail = head;
+                    Node p = head.next;
+                    while (p != null && p != node) {
+                        trail = p;
+                        p = p.next;
+                    }
+                    if (p == node) {
+                        p.item = null;
+                        trail.next = p.next;
+                        if (last == p)
+                            last = trail;
+                        int c;
+                        synchronized (this) { c = count--; }
+                        if (c == capacity)
+                            putLock.notifyAll();
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * Save the state to a stream (that is, serialize it).
+     *
+     * @serialData The capacity is emitted (int), followed by all of
+     * its elements (each an <tt>Object</tt>) in the proper order,
+     * followed by a null
+     * @param s the stream
+     */
+    private void writeObject(java.io.ObjectOutputStream s)
+        throws java.io.IOException {
+
+        synchronized (putLock) {
+            synchronized (takeLock) {
+                // Write out any hidden stuff, plus capacity
+                s.defaultWriteObject();
+
+                // Write out all elements in the proper order.
+                for (Node p = head.next; p != null; p = p.next)
+                    s.writeObject(p.item);
+
+                // Use trailing null as sentinel
+                s.writeObject(null);
+            }
+        }
+    }
+
+    /**
+     * Reconstitute this queue instance from a stream (that is,
+     * deserialize it).
+     * @param s the stream
+     */
+    private void readObject(java.io.ObjectInputStream s)
+        throws java.io.IOException, ClassNotFoundException {
+        // Read in capacity, and any hidden stuff
+        s.defaultReadObject();
+
+        synchronized (this) { count = 0; }
+        last = head = new Node(null);
+
+        // Read in all elements and place in queue
+        for (;;) {
+            Object item = (Object)s.readObject();
+            if (item == null)
+                break;
+            add(item);
+        }
+    }
+
+    private static class SerializableLock implements java.io.Serializable {
+        private final static long serialVersionUID = -8856990691138858668L;
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/PriorityBlockingQueue.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/PriorityBlockingQueue.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/PriorityBlockingQueue.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,568 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import edu.emory.mathcs.backport.java.util.*;
+import java.util.Comparator;
+import java.util.Collection;
+import java.util.Iterator;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.Utils;
+import java.util.NoSuchElementException;
+
+/**
+ * An unbounded {@linkplain BlockingQueue blocking queue} that uses
+ * the same ordering rules as class {@link PriorityQueue} and supplies
+ * blocking retrieval operations.  While this queue is logically
+ * unbounded, attempted additions may fail due to resource exhaustion
+ * (causing <tt>OutOfMemoryError</tt>). This class does not permit
+ * <tt>null</tt> elements.  A priority queue relying on {@linkplain
+ * Comparable natural ordering} also does not permit insertion of
+ * non-comparable objects (doing so results in
+ * <tt>ClassCastException</tt>).
+ *
+ * <p>This class and its iterator implement all of the
+ * <em>optional</em> methods of the {@link Collection} and {@link
+ * Iterator} interfaces.  The Iterator provided in method {@link
+ * #iterator()} is <em>not</em> guaranteed to traverse the elements of
+ * the PriorityBlockingQueue in any particular order. If you need
+ * ordered traversal, consider using
+ * <tt>Arrays.sort(pq.toArray())</tt>.  Also, method <tt>drainTo</tt>
+ * can be used to <em>remove</em> some or all elements in priority
+ * order and place them in another collection.
+ *
+ * <p>Operations on this class make no guarantees about the ordering
+ * of elements with equal priority. If you need to enforce an
+ * ordering, you can define custom classes or comparators that use a
+ * secondary key to break ties in primary priority values.  For
+ * example, here is a class that applies first-in-first-out
+ * tie-breaking to comparable elements. To use it, you would insert a
+ * <tt>new FIFOEntry(anEntry)</tt> instead of a plain entry object.
+ *
+ * <pre>
+ * class FIFOEntry implements Comparable {
+ *   final static AtomicLong seq = new AtomicLong();
+ *   final long seqNum;
+ *   final Object entry;
+ *   public FIFOEntry(Object entry) {
+ *     seqNum = seq.getAndIncrement();
+ *     this.entry = entry;
+ *   }
+ *   public Object getEntry() { return entry; }
+ *   public int compareTo(FIFOEntr other) {
+ *     int res = entry.compareTo(other.entry);
+ *     if (res == 0 &amp;&amp; other.entry != this.entry)
+ *       res = (seqNum &lt; other.seqNum ? -1 : 1);
+ *     return res;
+ *   }
+ * }</pre>
+ *
+ * <p>This class is a member of the
+ * <a href="{@docRoot}/../guide/collections/index.html">
+ * Java Collections Framework</a>.
+ *
+ * @since 1.5
+ * @author Doug Lea
+ */
+public class PriorityBlockingQueue extends AbstractQueue
+    implements BlockingQueue, java.io.Serializable {
+    private static final long serialVersionUID = 5595510919245408276L;
+
+    private final PriorityQueue q;
+    private final ReentrantLock lock = new ReentrantLock(true);
+    private final Condition notEmpty = lock.newCondition();
+
+    /**
+     * Creates a <tt>PriorityBlockingQueue</tt> with the default
+     * initial capacity (11) that orders its elements according to
+     * their {@linkplain Comparable natural ordering}.
+     */
+    public PriorityBlockingQueue() {
+        q = new PriorityQueue();
+    }
+
+    /**
+     * Creates a <tt>PriorityBlockingQueue</tt> with the specified
+     * initial capacity that orders its elements according to their
+     * {@linkplain Comparable natural ordering}.
+     *
+     * @param initialCapacity the initial capacity for this priority queue
+     * @throws IllegalArgumentException if <tt>initialCapacity</tt> is less
+     *         than 1
+     */
+    public PriorityBlockingQueue(int initialCapacity) {
+        q = new PriorityQueue(initialCapacity, null);
+    }
+
+    /**
+     * Creates a <tt>PriorityBlockingQueue</tt> with the specified initial
+     * capacity that orders its elements according to the specified
+     * comparator.
+     *
+     * @param initialCapacity the initial capacity for this priority queue
+     * @param  comparator the comparator that will be used to order this
+     *         priority queue.  If {@code null}, the {@linkplain Comparable
+     *         natural ordering} of the elements will be used.
+     * @throws IllegalArgumentException if <tt>initialCapacity</tt> is less
+     *         than 1
+     */
+    public PriorityBlockingQueue(int initialCapacity,
+                                 Comparator comparator) {
+        q = new PriorityQueue(initialCapacity, comparator);
+    }
+
+    /**
+     * Creates a <tt>PriorityBlockingQueue</tt> containing the elements
+     * in the specified collection.  If the specified collection is a
+     * {@link java.util.SortedSet} or a {@link PriorityQueue},  this
+     * priority queue will be ordered according to the same ordering.
+     * Otherwise, this priority queue will be ordered according to the
+     * {@linkplain Comparable natural ordering} of its elements.
+     *
+     * @param  c the collection whose elements are to be placed
+     *         into this priority queue
+     * @throws ClassCastException if elements of the specified collection
+     *         cannot be compared to one another according to the priority
+     *         queue's ordering
+     * @throws NullPointerException if the specified collection or any
+     *         of its elements are null
+     */
+    public PriorityBlockingQueue(Collection c) {
+        q = new PriorityQueue(c);
+    }
+
+    /**
+     * Inserts the specified element into this priority queue.
+     *
+     * @param e the element to add
+     * @return <tt>true</tt> (as specified by {@link Collection#add})
+     * @throws ClassCastException if the specified element cannot be compared
+     *         with elements currently in the priority queue according to the
+     *         priority queue's ordering
+     * @throws NullPointerException if the specified element is null
+     */
+    public boolean add(Object e) {
+        return offer(e);
+    }
+
+    /**
+     * Inserts the specified element into this priority queue.
+     *
+     * @param e the element to add
+     * @return <tt>true</tt> (as specified by {@link Queue#offer})
+     * @throws ClassCastException if the specified element cannot be compared
+     *         with elements currently in the priority queue according to the
+     *         priority queue's ordering
+     * @throws NullPointerException if the specified element is null
+     */
+    public boolean offer(Object e) {
+        final ReentrantLock lock = this.lock;
+        lock.lock();
+        try {
+            boolean ok = q.offer(e);
+            assert ok;
+            notEmpty.signal();
+            return true;
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * Inserts the specified element into this priority queue. As the queue is
+     * unbounded this method will never block.
+     *
+     * @param e the element to add
+     * @throws ClassCastException if the specified element cannot be compared
+     *         with elements currently in the priority queue according to the
+     *         priority queue's ordering
+     * @throws NullPointerException if the specified element is null
+     */
+    public void put(Object e) {
+        offer(e); // never need to block
+    }
+
+    /**
+     * Inserts the specified element into this priority queue. As the queue is
+     * unbounded this method will never block.
+     *
+     * @param e the element to add
+     * @param timeout This parameter is ignored as the method never blocks
+     * @param unit This parameter is ignored as the method never blocks
+     * @return <tt>true</tt>
+     * @throws ClassCastException if the specified element cannot be compared
+     *         with elements currently in the priority queue according to the
+     *         priority queue's ordering
+     * @throws NullPointerException if the specified element is null
+     */
+    public boolean offer(Object e, long timeout, TimeUnit unit) {
+        return offer(e); // never need to block
+    }
+
+    public Object poll() {
+        final ReentrantLock lock = this.lock;
+        lock.lock();
+        try {
+            return q.poll();
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    public Object take() throws InterruptedException {
+        final ReentrantLock lock = this.lock;
+        lock.lockInterruptibly();
+        try {
+            try {
+                while (q.size() == 0)
+                    notEmpty.await();
+            } catch (InterruptedException ie) {
+                notEmpty.signal(); // propagate to non-interrupted thread
+                throw ie;
+            }
+            Object x = q.poll();
+            assert x != null;
+            return x;
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    public Object poll(long timeout, TimeUnit unit) throws InterruptedException {
+        long nanos = unit.toNanos(timeout);
+        final ReentrantLock lock = this.lock;
+        lock.lockInterruptibly();
+        try {
+            long deadline = Utils.nanoTime() + nanos;
+            for (;;) {
+                Object x = q.poll();
+                if (x != null)
+                    return x;
+                if (nanos <= 0)
+                    return null;
+                try {
+                    notEmpty.await(nanos, TimeUnit.NANOSECONDS);
+                    nanos = deadline - Utils.nanoTime();
+                } catch (InterruptedException ie) {
+                    notEmpty.signal(); // propagate to non-interrupted thread
+                    throw ie;
+                }
+            }
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    public Object peek() {
+        final ReentrantLock lock = this.lock;
+        lock.lock();
+        try {
+            return q.peek();
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * Returns the comparator used to order the elements in this queue,
+     * or <tt>null</tt> if this queue uses the {@linkplain Comparable
+     * natural ordering} of its elements.
+     *
+     * @return the comparator used to order the elements in this queue,
+     *         or <tt>null</tt> if this queue uses the natural
+     *         ordering of its elements
+     */
+    public Comparator comparator() {
+        return q.comparator();
+    }
+
+    public int size() {
+        final ReentrantLock lock = this.lock;
+        lock.lock();
+        try {
+            return q.size();
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * Always returns <tt>Integer.MAX_VALUE</tt> because
+     * a <tt>PriorityBlockingQueue</tt> is not capacity constrained.
+     * @return <tt>Integer.MAX_VALUE</tt>
+     */
+    public int remainingCapacity() {
+        return Integer.MAX_VALUE;
+    }
+
+    /**
+     * Removes a single instance of the specified element from this queue,
+     * if it is present.  More formally, removes an element {@code e} such
+     * that {@code o.equals(e)}, if this queue contains one or more such
+     * elements.  Returns {@code true} if and only if this queue contained
+     * the specified element (or equivalently, if this queue changed as a
+     * result of the call).
+     *
+     * @param o element to be removed from this queue, if present
+     * @return <tt>true</tt> if this queue changed as a result of the call
+     */
+    public boolean remove(Object o) {
+        final ReentrantLock lock = this.lock;
+        lock.lock();
+        try {
+            return q.remove(o);
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * Returns {@code true} if this queue contains the specified element.
+     * More formally, returns {@code true} if and only if this queue contains
+     * at least one element {@code e} such that {@code o.equals(e)}.
+     *
+     * @param o object to be checked for containment in this queue
+     * @return <tt>true</tt> if this queue contains the specified element
+     */
+    public boolean contains(Object o) {
+        final ReentrantLock lock = this.lock;
+        lock.lock();
+        try {
+            return q.contains(o);
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * Returns an array containing all of the elements in this queue.
+     * The returned array elements are in no particular order.
+     *
+     * <p>The returned array will be "safe" in that no references to it are
+     * maintained by this queue.  (In other words, this method must allocate
+     * a new array).  The caller is thus free to modify the returned array.
+     *
+     * <p>This method acts as bridge between array-based and collection-based
+     * APIs.
+     *
+     * @return an array containing all of the elements in this queue
+     */
+    public Object[] toArray() {
+        final ReentrantLock lock = this.lock;
+        lock.lock();
+        try {
+            return q.toArray();
+        } finally {
+            lock.unlock();
+        }
+    }
+
+
+    public String toString() {
+        final ReentrantLock lock = this.lock;
+        lock.lock();
+        try {
+            return q.toString();
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * @throws UnsupportedOperationException {@inheritDoc}
+     * @throws ClassCastException            {@inheritDoc}
+     * @throws NullPointerException          {@inheritDoc}
+     * @throws IllegalArgumentException      {@inheritDoc}
+     */
+    public int drainTo(Collection c) {
+        if (c == null)
+            throw new NullPointerException();
+        if (c == this)
+            throw new IllegalArgumentException();
+        final ReentrantLock lock = this.lock;
+        lock.lock();
+        try {
+            int n = 0;
+            Object e;
+            while ( (e = q.poll()) != null) {
+                c.add(e);
+                ++n;
+            }
+            return n;
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * @throws UnsupportedOperationException {@inheritDoc}
+     * @throws ClassCastException            {@inheritDoc}
+     * @throws NullPointerException          {@inheritDoc}
+     * @throws IllegalArgumentException      {@inheritDoc}
+     */
+    public int drainTo(Collection c, int maxElements) {
+        if (c == null)
+            throw new NullPointerException();
+        if (c == this)
+            throw new IllegalArgumentException();
+        if (maxElements <= 0)
+            return 0;
+        final ReentrantLock lock = this.lock;
+        lock.lock();
+        try {
+            int n = 0;
+            Object e;
+            while (n < maxElements && (e = q.poll()) != null) {
+                c.add(e);
+                ++n;
+            }
+            return n;
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * Atomically removes all of the elements from this queue.
+     * The queue will be empty after this call returns.
+     */
+    public void clear() {
+        final ReentrantLock lock = this.lock;
+        lock.lock();
+        try {
+            q.clear();
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * Returns an array containing all of the elements in this queue; the
+     * runtime type of the returned array is that of the specified array.
+     * The returned array elements are in no particular order.
+     * If the queue fits in the specified array, it is returned therein.
+     * Otherwise, a new array is allocated with the runtime type of the
+     * specified array and the size of this queue.
+     *
+     * <p>If this queue fits in the specified array with room to spare
+     * (i.e., the array has more elements than this queue), the element in
+     * the array immediately following the end of the queue is set to
+     * <tt>null</tt>.
+     *
+     * <p>Like the {@link #toArray()} method, this method acts as bridge between
+     * array-based and collection-based APIs.  Further, this method allows
+     * precise control over the runtime type of the output array, and may,
+     * under certain circumstances, be used to save allocation costs.
+     *
+     * <p>Suppose <tt>x</tt> is a queue known to contain only strings.
+     * The following code can be used to dump the queue into a newly
+     * allocated array of <tt>String</tt>:
+     *
+     * <pre>
+     *     String[] y = x.toArray(new String[0]);</pre>
+     *
+     * Note that <tt>toArray(new Object[0])</tt> is identical in function to
+     * <tt>toArray()</tt>.
+     *
+     * @param a the array into which the elements of the queue are to
+     *          be stored, if it is big enough; otherwise, a new array of the
+     *          same runtime type is allocated for this purpose
+     * @return an array containing all of the elements in this queue
+     * @throws ArrayStoreException if the runtime type of the specified array
+     *         is not a supertype of the runtime type of every element in
+     *         this queue
+     * @throws NullPointerException if the specified array is null
+     */
+    public Object[] toArray(Object[] a) {
+        final ReentrantLock lock = this.lock;
+        lock.lock();
+        try {
+            return q.toArray(a);
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * Returns an iterator over the elements in this queue. The
+     * iterator does not return the elements in any particular order.
+     * The returned <tt>Iterator</tt> is a "weakly consistent"
+     * iterator that will never throw {@link
+     * java.util.ConcurrentModificationException}, and guarantees to traverse
+     * elements as they existed upon construction of the iterator, and
+     * may (but is not guaranteed to) reflect any modifications
+     * subsequent to construction.
+     *
+     * @return an iterator over the elements in this queue
+     */
+    public Iterator iterator() {
+        return new Itr(toArray());
+    }
+
+    /**
+     * Snapshot iterator that works off copy of underlying q array.
+     */
+    private class Itr implements Iterator {
+        final Object[] array; // Array of all elements
+        int cursor;           // index of next element to return;
+        int lastRet;          // index of last element, or -1 if no such
+
+        Itr(Object[] array) {
+            lastRet = -1;
+            this.array = array;
+        }
+
+        public boolean hasNext() {
+            return cursor < array.length;
+        }
+
+        public Object next() {
+            if (cursor >= array.length)
+                throw new NoSuchElementException();
+            lastRet = cursor;
+            return array[cursor++];
+        }
+
+        public void remove() {
+            if (lastRet < 0)
+                throw new IllegalStateException();
+            Object x = array[lastRet];
+            lastRet = -1;
+            // Traverse underlying queue to find == element,
+            // not just a .equals element.
+            lock.lock();
+            try {
+                for (Iterator it = q.iterator(); it.hasNext(); ) {
+                    if (it.next() == x) {
+                        it.remove();
+                        return;
+                    }
+                }
+            } finally {
+                lock.unlock();
+            }
+        }
+    }
+
+    /**
+     * Saves the state to a stream (that is, serializes it).  This
+     * merely wraps default serialization within lock.  The
+     * serialization strategy for items is left to underlying
+     * Queue. Note that locking is not needed on deserialization, so
+     * readObject is not defined, just relying on default.
+     */
+    private void writeObject(java.io.ObjectOutputStream s)
+        throws java.io.IOException {
+        lock.lock();
+        try {
+            s.defaultWriteObject();
+        } finally {
+            lock.unlock();
+        }
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/RejectedExecutionException.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/RejectedExecutionException.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/RejectedExecutionException.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,62 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+
+/**
+ * Exception thrown by an {@link Executor} when a task cannot be
+ * accepted for execution.
+ *
+ * @since 1.5
+ * @author Doug Lea
+ */
+public class RejectedExecutionException extends RuntimeException {
+    private static final long serialVersionUID = -375805702767069545L;
+
+    /**
+     * Constructs a <tt>RejectedExecutionException</tt> with no detail message.
+     * The cause is not initialized, and may subsequently be
+     * initialized by a call to {@link #initCause(Throwable) initCause}.
+     */
+    public RejectedExecutionException() { }
+
+    /**
+     * Constructs a <tt>RejectedExecutionException</tt> with the
+     * specified detail message. The cause is not initialized, and may
+     * subsequently be initialized by a call to {@link
+     * #initCause(Throwable) initCause}.
+     *
+     * @param message the detail message
+     */
+    public RejectedExecutionException(String message) {
+        super(message);
+    }
+
+    /**
+     * Constructs a <tt>RejectedExecutionException</tt> with the
+     * specified detail message and cause.
+     *
+     * @param  message the detail message
+     * @param  cause the cause (which is saved for later retrieval by the
+     *         {@link #getCause()} method)
+     */
+    public RejectedExecutionException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    /**
+     * Constructs a <tt>RejectedExecutionException</tt> with the
+     * specified cause.  The detail message is set to: <pre> (cause ==
+     * null ? null : cause.toString())</pre> (which typically contains
+     * the class and detail message of <tt>cause</tt>).
+     *
+     * @param  cause the cause (which is saved for later retrieval by the
+     *         {@link #getCause()} method)
+     */
+    public RejectedExecutionException(Throwable cause) {
+        super(cause);
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/RejectedExecutionHandler.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/RejectedExecutionHandler.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/RejectedExecutionHandler.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,34 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+
+/**
+ * A handler for tasks that cannot be executed by a {@link
+ * ThreadPoolExecutor}.
+ *
+ * @since 1.5
+ * @author Doug Lea
+ */
+public interface RejectedExecutionHandler {
+
+    /**
+     * Method that may be invoked by a {@link ThreadPoolExecutor} when
+     * <tt>execute</tt> cannot accept a task. This may occur when no
+     * more threads or queue slots are available because their bounds
+     * would be exceeded, or upon shutdown of the Executor.
+     *
+     * In the absence other alternatives, the method may throw an
+     * unchecked {@link RejectedExecutionException}, which will be
+     * propagated to the caller of <tt>execute</tt>.
+     *
+     * @param r the runnable task requested to be executed
+     * @param executor the executor attempting to execute this task
+     * @throws RejectedExecutionException if there is no remedy
+     */
+
+    void rejectedExecution(Runnable r, ThreadPoolExecutor executor);
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/RunnableFuture.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/RunnableFuture.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/RunnableFuture.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,24 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+
+/**
+ * A {@link Future} that is {@link Runnable}. Successful execution of
+ * the <tt>run</tt> method causes completion of the <tt>Future</tt>
+ * and allows access to its results.
+ * @see FutureTask
+ * @see Executor
+ * @since 1.6
+ * @author Doug Lea
+ */
+public interface RunnableFuture extends Runnable, Future {
+    /**
+     * Sets this Future to the result of its computation
+     * unless it has been cancelled.
+     */
+    void run();
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/RunnableScheduledFuture.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/RunnableScheduledFuture.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/RunnableScheduledFuture.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,28 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+
+/**
+ * A {@link ScheduledFuture} that is {@link Runnable}. Successful
+ * execution of the <tt>run</tt> method causes completion of the
+ * <tt>Future</tt> and allows access to its results.
+ * @see FutureTask
+ * @see Executor
+ * @since 1.6
+ * @author Doug Lea
+ */
+public interface RunnableScheduledFuture extends RunnableFuture, ScheduledFuture {
+
+    /**
+     * Returns true if this is a periodic task. A periodic task may
+     * re-run according to some schedule. A non-periodic task can be
+     * run only once.
+     *
+     * @return true if this task is periodic
+     */
+    boolean isPeriodic();
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ScheduledExecutorService.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ScheduledExecutorService.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ScheduledExecutorService.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,158 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+import edu.emory.mathcs.backport.java.util.*;
+
+/**
+ * An {@link ExecutorService} that can schedule commands to run after a given
+ * delay, or to execute periodically.
+ *
+ * <p> The <tt>schedule</tt> methods create tasks with various delays
+ * and return a task object that can be used to cancel or check
+ * execution. The <tt>scheduleAtFixedRate</tt> and
+ * <tt>scheduleWithFixedDelay</tt> methods create and execute tasks
+ * that run periodically until cancelled.
+ *
+ * <p> Commands submitted using the {@link Executor#execute} and
+ * {@link ExecutorService} <tt>submit</tt> methods are scheduled with
+ * a requested delay of zero. Zero and negative delays (but not
+ * periods) are also allowed in <tt>schedule</tt> methods, and are
+ * treated as requests for immediate execution.
+ *
+ * <p>All <tt>schedule</tt> methods accept <em>relative</em> delays and
+ * periods as arguments, not absolute times or dates. It is a simple
+ * matter to transform an absolute time represented as a {@link
+ * java.util.Date} to the required form. For example, to schedule at
+ * a certain future <tt>date</tt>, you can use: <tt>schedule(task,
+ * date.getTime() - System.currentTimeMillis(),
+ * TimeUnit.MILLISECONDS)</tt>. Beware however that expiration of a
+ * relative delay need not coincide with the current <tt>Date</tt> at
+ * which the task is enabled due to network time synchronization
+ * protocols, clock drift, or other factors.
+ *
+ * The {@link Executors} class provides convenient factory methods for
+ * the ScheduledExecutorService implementations provided in this package.
+ *
+ * <h3>Usage Example</h3>
+ *
+ * Here is a class with a method that sets up a ScheduledExecutorService
+ * to beep every ten seconds for an hour:
+ *
+ * <pre>
+ * import static edu.emory.mathcs.backport.java.util.concurrent.TimeUnit.*;
+ * class BeeperControl {
+ *    private final ScheduledExecutorService scheduler =
+ *       Executors.newScheduledThreadPool(1);
+ *
+ *    public void beepForAnHour() {
+ *        final Runnable beeper = new Runnable() {
+ *                public void run() { System.out.println("beep"); }
+ *            };
+ *        final ScheduledFuture&lt;?&gt; beeperHandle =
+ *            scheduler.scheduleAtFixedRate(beeper, 10, 10, SECONDS);
+ *        scheduler.schedule(new Runnable() {
+ *                public void run() { beeperHandle.cancel(true); }
+ *            }, 60 * 60, SECONDS);
+ *    }
+ * }
+ * </pre>
+ *
+ * @since 1.5
+ * @author Doug Lea
+ */
+public interface ScheduledExecutorService extends ExecutorService {
+
+    /**
+     * Creates and executes a one-shot action that becomes enabled
+     * after the given delay.
+     *
+     * @param command the task to execute
+     * @param delay the time from now to delay execution
+     * @param unit the time unit of the delay parameter
+     * @return a ScheduledFuture representing pending completion of
+     *         the task and whose <tt>get()</tt> method will return
+     *         <tt>null</tt> upon completion
+     * @throws RejectedExecutionException if the task cannot be
+     *         scheduled for execution
+     * @throws NullPointerException if command is null
+     */
+    public ScheduledFuture schedule(Runnable command,
+                                    long delay, TimeUnit unit);
+
+    /**
+     * Creates and executes a ScheduledFuture that becomes enabled after the
+     * given delay.
+     *
+     * @param callable the function to execute
+     * @param delay the time from now to delay execution
+     * @param unit the time unit of the delay parameter
+     * @return a ScheduledFuture that can be used to extract result or cancel
+     * @throws RejectedExecutionException if the task cannot be
+     *         scheduled for execution
+     * @throws NullPointerException if callable is null
+     */
+    public ScheduledFuture schedule(Callable callable,
+                                           long delay, TimeUnit unit);
+
+    /**
+     * Creates and executes a periodic action that becomes enabled first
+     * after the given initial delay, and subsequently with the given
+     * period; that is executions will commence after
+     * <tt>initialDelay</tt> then <tt>initialDelay+period</tt>, then
+     * <tt>initialDelay + 2 * period</tt>, and so on.
+     * If any execution of the task
+     * encounters an exception, subsequent executions are suppressed.
+     * Otherwise, the task will only terminate via cancellation or
+     * termination of the executor.  If any execution of this task
+     * takes longer than its period, then subsequent executions
+     * may start late, but will not concurrently execute.
+     *
+     * @param command the task to execute
+     * @param initialDelay the time to delay first execution
+     * @param period the period between successive executions
+     * @param unit the time unit of the initialDelay and period parameters
+     * @return a ScheduledFuture representing pending completion of
+     *         the task, and whose <tt>get()</tt> method will throw an
+     *         exception upon cancellation
+     * @throws RejectedExecutionException if the task cannot be
+     *         scheduled for execution
+     * @throws NullPointerException if command is null
+     * @throws IllegalArgumentException if period less than or equal to zero
+     */
+    public ScheduledFuture scheduleAtFixedRate(Runnable command,
+                                               long initialDelay,
+                                               long period,
+                                               TimeUnit unit);
+
+    /**
+     * Creates and executes a periodic action that becomes enabled first
+     * after the given initial delay, and subsequently with the
+     * given delay between the termination of one execution and the
+     * commencement of the next.  If any execution of the task
+     * encounters an exception, subsequent executions are suppressed.
+     * Otherwise, the task will only terminate via cancellation or
+     * termination of the executor.
+     *
+     * @param command the task to execute
+     * @param initialDelay the time to delay first execution
+     * @param delay the delay between the termination of one
+     * execution and the commencement of the next
+     * @param unit the time unit of the initialDelay and delay parameters
+     * @return a ScheduledFuture representing pending completion of
+     *         the task, and whose <tt>get()</tt> method will throw an
+     *         exception upon cancellation
+     * @throws RejectedExecutionException if the task cannot be
+     *         scheduled for execution
+     * @throws NullPointerException if command is null
+     * @throws IllegalArgumentException if delay less than or equal to zero
+     */
+    public ScheduledFuture scheduleWithFixedDelay(Runnable command,
+                                                  long initialDelay,
+                                                  long delay,
+                                                  TimeUnit unit);
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ScheduledFuture.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ScheduledFuture.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ScheduledFuture.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,18 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+
+/**
+ * A delayed result-bearing action that can be cancelled.
+ * Usually a scheduled future is the result of scheduling
+ * a task with a {@link ScheduledExecutorService}.
+ *
+ * @since 1.5
+ * @author Doug Lea
+ */
+public interface ScheduledFuture extends Delayed, Future {
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ScheduledThreadPoolExecutor.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ScheduledThreadPoolExecutor.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ScheduledThreadPoolExecutor.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,632 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+import edu.emory.mathcs.backport.java.util.concurrent.*; // for javadoc (till 6280605 is fixed)
+import edu.emory.mathcs.backport.java.util.concurrent.atomic.*;
+import java.util.List;
+import java.util.AbstractCollection;
+import java.util.Collection;
+import java.util.Iterator;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.Utils;
+
+/**
+ * A {@link ThreadPoolExecutor} that can additionally schedule
+ * commands to run after a given delay, or to execute
+ * periodically. This class is preferable to {@link java.util.Timer}
+ * when multiple worker threads are needed, or when the additional
+ * flexibility or capabilities of {@link ThreadPoolExecutor} (which
+ * this class extends) are required.
+ *
+ * <p> Delayed tasks execute no sooner than they are enabled, but
+ * without any real-time guarantees about when, after they are
+ * enabled, they will commence. Tasks scheduled for exactly the same
+ * execution time are enabled in first-in-first-out (FIFO) order of
+ * submission.
+ *
+ * <p>While this class inherits from {@link ThreadPoolExecutor}, a few
+ * of the inherited tuning methods are not useful for it. In
+ * particular, because it acts as a fixed-sized pool using
+ * <tt>corePoolSize</tt> threads and an unbounded queue, adjustments
+ * to <tt>maximumPoolSize</tt> have no useful effect.
+ *
+ * <p><b>Extension notes:</b> This class overrides {@link
+ * AbstractExecutorService} <tt>submit</tt> methods to generate
+ * internal objects to control per-task delays and scheduling. To
+ * preserve functionality, any further overrides of these methods in
+ * subclasses must invoke superclass versions, which effectively
+ * disables additional task customization. However, this class
+ * provides alternative protected extension method
+ * <tt>decorateTask</tt> (one version each for <tt>Runnable</tt> and
+ * <tt>Callable</tt>) that can be used to customize the concrete task
+ * types used to execute commands entered via <tt>execute</tt>,
+ * <tt>submit</tt>, <tt>schedule</tt>, <tt>scheduleAtFixedRate</tt>,
+ * and <tt>scheduleWithFixedDelay</tt>.  By default, a
+ * <tt>ScheduledThreadPoolExecutor</tt> uses a task type extending
+ * {@link FutureTask}. However, this may be modified or replaced using
+ * subclasses of the form:
+ *
+ * <pre>
+ * public class CustomScheduledExecutor extends ScheduledThreadPoolExecutor {
+ *
+ *   static class CustomTask&lt;V&gt; implements RunnableScheduledFuture&lt;V&gt; { ... }
+ *
+ *   protected &lt;V&gt; RunnableScheduledFuture&lt;V&gt; decorateTask(
+ *                Runnable r, RunnableScheduledFuture&lt;V&gt; task) {
+ *       return new CustomTask&lt;V&gt;(r, task);
+ *   }
+ *
+ *   protected &lt;V&gt; RunnableScheduledFuture&lt;V&gt; decorateTask(
+ *                Callable&lt;V&gt; c, RunnableScheduledFuture&lt;V&gt; task) {
+ *       return new CustomTask&lt;V&gt;(c, task);
+ *   }
+ *   // ... add constructors, etc.
+ * }
+ * </pre>
+ * @since 1.5
+ * @author Doug Lea
+ */
+public class ScheduledThreadPoolExecutor
+        extends ThreadPoolExecutor
+        implements ScheduledExecutorService {
+
+    /**
+     * False if should cancel/suppress periodic tasks on shutdown.
+     */
+    private volatile boolean continueExistingPeriodicTasksAfterShutdown;
+
+    /**
+     * False if should cancel non-periodic tasks on shutdown.
+     */
+    private volatile boolean executeExistingDelayedTasksAfterShutdown = true;
+
+    /**
+     * Sequence number to break scheduling ties, and in turn to
+     * guarantee FIFO order among tied entries.
+     */
+    private static final AtomicLong sequencer = new AtomicLong(0);
+
+    /** Base of nanosecond timings, to avoid wrapping */
+    private static final long NANO_ORIGIN = Utils.nanoTime();
+
+    /**
+     * Returns nanosecond time offset by origin
+     */
+    final long now() {
+        return Utils.nanoTime() - NANO_ORIGIN;
+    }
+
+    private class ScheduledFutureTask
+            extends FutureTask implements RunnableScheduledFuture {
+
+        /** Sequence number to break ties FIFO */
+        private final long sequenceNumber;
+        /** The time the task is enabled to execute in nanoTime units */
+        private long time;
+        /**
+         * Period in nanoseconds for repeating tasks.  A positive
+         * value indicates fixed-rate execution.  A negative value
+         * indicates fixed-delay execution.  A value of 0 indicates a
+         * non-repeating task.
+         */
+        private final long period;
+
+        /**
+         * Creates a one-shot action with given nanoTime-based trigger time.
+         */
+        ScheduledFutureTask(Runnable r, Object result, long ns) {
+            super(r, result);
+            this.time = ns;
+            this.period = 0;
+            this.sequenceNumber = sequencer.getAndIncrement();
+        }
+
+        /**
+         * Creates a periodic action with given nano time and period.
+         */
+        ScheduledFutureTask(Runnable r, Object result, long ns, long period) {
+            super(r, result);
+            this.time = ns;
+            this.period = period;
+            this.sequenceNumber = sequencer.getAndIncrement();
+        }
+
+        /**
+         * Creates a one-shot action with given nanoTime-based trigger.
+         */
+        ScheduledFutureTask(Callable callable, long ns) {
+            super(callable);
+            this.time = ns;
+            this.period = 0;
+            this.sequenceNumber = sequencer.getAndIncrement();
+        }
+
+        public long getDelay(TimeUnit unit) {
+            long d = unit.convert(time - now(), TimeUnit.NANOSECONDS);
+            return d;
+        }
+
+        public int compareTo(Object other) {
+            return compareTo((Delayed)other);
+        }
+
+        public int compareTo(Delayed other) {
+            if (other == this) // compare zero ONLY if same object
+                return 0;
+            if (other instanceof ScheduledFutureTask) {
+                ScheduledFutureTask x = (ScheduledFutureTask)other;
+                long diff = time - x.time;
+                if (diff < 0)
+                    return -1;
+                else if (diff > 0)
+                    return 1;
+                else if (sequenceNumber < x.sequenceNumber)
+                    return -1;
+                else
+                    return 1;
+            }
+            long d = (getDelay(TimeUnit.NANOSECONDS) -
+                      other.getDelay(TimeUnit.NANOSECONDS));
+            return (d == 0)? 0 : ((d < 0)? -1 : 1);
+        }
+
+        /**
+         * Returns true if this is a periodic (not a one-shot) action.
+         *
+         * @return true if periodic
+         */
+        public boolean isPeriodic() {
+            return period != 0;
+        }
+
+        /**
+         * Runs a periodic task.
+         */
+        private void runPeriodic() {
+            boolean ok = ScheduledFutureTask.super.runAndReset();
+            boolean down = isShutdown();
+            // Reschedule if not cancelled and not shutdown or policy allows
+            if (ok && (!down ||
+                       (getContinueExistingPeriodicTasksAfterShutdownPolicy() &&
+                        !isTerminating()))) {
+                long p = period;
+                if (p > 0)
+                    time += p;
+                else
+                    time = now() - p;
+                ScheduledThreadPoolExecutor.super.getQueue().add(this);
+            }
+            // This might have been the final executed delayed
+            // task.  Wake up threads to check.
+            else if (down)
+                interruptIdleWorkers();
+        }
+
+        /**
+         * Overrides FutureTask version so as to reset/requeue if periodic.
+         */
+        public void run() {
+            if (isPeriodic())
+                runPeriodic();
+            else
+                ScheduledFutureTask.super.run();
+        }
+    }
+
+    /**
+     * Specialized variant of ThreadPoolExecutor.execute for delayed tasks.
+     */
+    private void delayedExecute(Runnable command) {
+        if (isShutdown()) {
+            reject(command);
+            return;
+        }
+        // Prestart a thread if necessary. We cannot prestart it
+        // running the task because the task (probably) shouldn't be
+        // run yet, so thread will just idle until delay elapses.
+        if (getPoolSize() < getCorePoolSize())
+            prestartCoreThread();
+
+        super.getQueue().add(command);
+    }
+
+    /**
+     * Cancels and clears the queue of all tasks that should not be run
+     * due to shutdown policy.
+     */
+    private void cancelUnwantedTasks() {
+        boolean keepDelayed = getExecuteExistingDelayedTasksAfterShutdownPolicy();
+        boolean keepPeriodic = getContinueExistingPeriodicTasksAfterShutdownPolicy();
+        if (!keepDelayed && !keepPeriodic)
+            super.getQueue().clear();
+        else if (keepDelayed || keepPeriodic) {
+            Object[] entries = super.getQueue().toArray();
+            for (int i = 0; i < entries.length; ++i) {
+                Object e = entries[i];
+                if (e instanceof RunnableScheduledFuture) {
+                    RunnableScheduledFuture t = (RunnableScheduledFuture)e;
+                    if (t.isPeriodic()? !keepPeriodic : !keepDelayed)
+                        t.cancel(false);
+                }
+            }
+            entries = null;
+            purge();
+        }
+    }
+
+    public boolean remove(Runnable task) {
+        if (!(task instanceof RunnableScheduledFuture))
+            return false;
+        return getQueue().remove(task);
+    }
+
+    /**
+     * Modifies or replaces the task used to execute a runnable.
+     * This method can be used to override the concrete
+     * class used for managing internal tasks.
+     * The default implementation simply returns the given task.
+     *
+     * @param runnable the submitted Runnable
+     * @param task the task created to execute the runnable
+     * @return a task that can execute the runnable
+     * @since 1.6
+     */
+    protected RunnableScheduledFuture decorateTask(
+        Runnable runnable, RunnableScheduledFuture task) {
+        return task;
+    }
+
+    /**
+     * Modifies or replaces the task used to execute a callable.
+     * This method can be used to override the concrete
+     * class used for managing internal tasks.
+     * The default implementation simply returns the given task.
+     *
+     * @param callable the submitted Callable
+     * @param task the task created to execute the callable
+     * @return a task that can execute the callable
+     * @since 1.6
+     */
+    protected RunnableScheduledFuture decorateTask(
+        Callable callable, RunnableScheduledFuture task) {
+        return task;
+    }
+
+    /**
+     * Creates a new ScheduledThreadPoolExecutor with the given core
+     * pool size.
+     *
+     * @param corePoolSize the number of threads to keep in the pool,
+     * even if they are idle
+     * @throws IllegalArgumentException if <tt>corePoolSize &lt; 0</tt>
+     */
+    public ScheduledThreadPoolExecutor(int corePoolSize) {
+        super(corePoolSize, Integer.MAX_VALUE, 0, TimeUnit.NANOSECONDS,
+              new DelayedWorkQueue());
+    }
+
+    /**
+     * Creates a new ScheduledThreadPoolExecutor with the given
+     * initial parameters.
+     *
+     * @param corePoolSize the number of threads to keep in the pool,
+     * even if they are idle
+     * @param threadFactory the factory to use when the executor
+     * creates a new thread
+     * @throws IllegalArgumentException if <tt>corePoolSize &lt; 0</tt>
+     * @throws NullPointerException if threadFactory is null
+     */
+    public ScheduledThreadPoolExecutor(int corePoolSize,
+                             ThreadFactory threadFactory) {
+        super(corePoolSize, Integer.MAX_VALUE, 0, TimeUnit.NANOSECONDS,
+              new DelayedWorkQueue(), threadFactory);
+    }
+
+    /**
+     * Creates a new ScheduledThreadPoolExecutor with the given
+     * initial parameters.
+     *
+     * @param corePoolSize the number of threads to keep in the pool,
+     * even if they are idle
+     * @param handler the handler to use when execution is blocked
+     * because the thread bounds and queue capacities are reached
+     * @throws IllegalArgumentException if <tt>corePoolSize &lt; 0</tt>
+     * @throws NullPointerException if handler is null
+     */
+    public ScheduledThreadPoolExecutor(int corePoolSize,
+                              RejectedExecutionHandler handler) {
+        super(corePoolSize, Integer.MAX_VALUE, 0, TimeUnit.NANOSECONDS,
+              new DelayedWorkQueue(), handler);
+    }
+
+    /**
+     * Creates a new ScheduledThreadPoolExecutor with the given
+     * initial parameters.
+     *
+     * @param corePoolSize the number of threads to keep in the pool,
+     * even if they are idle
+     * @param threadFactory the factory to use when the executor
+     * creates a new thread
+     * @param handler the handler to use when execution is blocked
+     * because the thread bounds and queue capacities are reached.
+     * @throws IllegalArgumentException if <tt>corePoolSize &lt; 0</tt>
+     * @throws NullPointerException if threadFactory or handler is null
+     */
+    public ScheduledThreadPoolExecutor(int corePoolSize,
+                              ThreadFactory threadFactory,
+                              RejectedExecutionHandler handler) {
+        super(corePoolSize, Integer.MAX_VALUE, 0, TimeUnit.NANOSECONDS,
+              new DelayedWorkQueue(), threadFactory, handler);
+    }
+
+    public ScheduledFuture schedule(Runnable command,
+                                       long delay,
+                                       TimeUnit unit) {
+        if (command == null || unit == null)
+            throw new NullPointerException();
+        long triggerTime = now() + unit.toNanos(delay);
+        RunnableScheduledFuture t = decorateTask(command,
+            new ScheduledFutureTask(command, null, triggerTime));
+        delayedExecute(t);
+        return t;
+    }
+
+    public ScheduledFuture schedule(Callable callable,
+                                    long delay,
+                                    TimeUnit unit) {
+        if (callable == null || unit == null)
+            throw new NullPointerException();
+        if (delay < 0) delay = 0;
+        long triggerTime = now() + unit.toNanos(delay);
+        RunnableScheduledFuture t = decorateTask(callable,
+            new ScheduledFutureTask(callable, triggerTime));
+        delayedExecute(t);
+        return t;
+    }
+
+    public ScheduledFuture scheduleAtFixedRate(Runnable command,
+                                               long initialDelay,
+                                               long period,
+                                               TimeUnit unit) {
+        if (command == null || unit == null)
+            throw new NullPointerException();
+        if (period <= 0)
+            throw new IllegalArgumentException();
+        if (initialDelay < 0) initialDelay = 0;
+        long triggerTime = now() + unit.toNanos(initialDelay);
+        RunnableScheduledFuture t = decorateTask(command,
+            new ScheduledFutureTask(command,
+                                    null,
+                                    triggerTime,
+                                    unit.toNanos(period)));
+        delayedExecute(t);
+        return t;
+    }
+
+    public ScheduledFuture scheduleWithFixedDelay(Runnable command,
+                                                  long initialDelay,
+                                                  long delay,
+                                                  TimeUnit unit) {
+        if (command == null || unit == null)
+            throw new NullPointerException();
+        if (delay <= 0)
+            throw new IllegalArgumentException();
+        if (initialDelay < 0) initialDelay = 0;
+        long triggerTime = now() + unit.toNanos(initialDelay);
+        RunnableScheduledFuture t = decorateTask(command,
+            new ScheduledFutureTask(command,
+                                    null,
+                                    triggerTime,
+                                    unit.toNanos(-delay)));
+        delayedExecute(t);
+        return t;
+    }
+
+
+    /**
+     * Executes command with zero required delay. This has effect
+     * equivalent to <tt>schedule(command, 0, anyUnit)</tt>.  Note
+     * that inspections of the queue and of the list returned by
+     * <tt>shutdownNow</tt> will access the zero-delayed
+     * {@link ScheduledFuture}, not the <tt>command</tt> itself.
+     *
+     * @param command the task to execute
+     * @throws RejectedExecutionException at discretion of
+     * <tt>RejectedExecutionHandler</tt>, if task cannot be accepted
+     * for execution because the executor has been shut down.
+     * @throws NullPointerException if command is null
+     */
+    public void execute(Runnable command) {
+        if (command == null)
+            throw new NullPointerException();
+        schedule(command, 0, TimeUnit.NANOSECONDS);
+    }
+
+    // Override AbstractExecutorService methods
+
+    public Future submit(Runnable task) {
+        return schedule(task, 0, TimeUnit.NANOSECONDS);
+    }
+
+    public Future submit(Runnable task, Object result) {
+        return schedule(Executors.callable(task, result),
+                        0, TimeUnit.NANOSECONDS);
+    }
+
+    public Future submit(Callable task) {
+        return schedule(task, 0, TimeUnit.NANOSECONDS);
+    }
+
+    /**
+     * Sets the policy on whether to continue executing existing periodic
+     * tasks even when this executor has been <tt>shutdown</tt>. In
+     * this case, these tasks will only terminate upon
+     * <tt>shutdownNow</tt>, or after setting the policy to
+     * <tt>false</tt> when already shutdown. This value is by default
+     * false.
+     *
+     * @param value if true, continue after shutdown, else don't.
+     * @see #getContinueExistingPeriodicTasksAfterShutdownPolicy
+     */
+    public void setContinueExistingPeriodicTasksAfterShutdownPolicy(boolean value) {
+        continueExistingPeriodicTasksAfterShutdown = value;
+        if (!value && isShutdown())
+            cancelUnwantedTasks();
+    }
+
+    /**
+     * Gets the policy on whether to continue executing existing
+     * periodic tasks even when this executor has been
+     * <tt>shutdown</tt>. In this case, these tasks will only
+     * terminate upon <tt>shutdownNow</tt> or after setting the policy
+     * to <tt>false</tt> when already shutdown. This value is by
+     * default false.
+     *
+     * @return true if will continue after shutdown
+     * @see #setContinueExistingPeriodicTasksAfterShutdownPolicy
+     */
+    public boolean getContinueExistingPeriodicTasksAfterShutdownPolicy() {
+        return continueExistingPeriodicTasksAfterShutdown;
+    }
+
+    /**
+     * Sets the policy on whether to execute existing delayed
+     * tasks even when this executor has been <tt>shutdown</tt>. In
+     * this case, these tasks will only terminate upon
+     * <tt>shutdownNow</tt>, or after setting the policy to
+     * <tt>false</tt> when already shutdown. This value is by default
+     * true.
+     *
+     * @param value if true, execute after shutdown, else don't.
+     * @see #getExecuteExistingDelayedTasksAfterShutdownPolicy
+     */
+    public void setExecuteExistingDelayedTasksAfterShutdownPolicy(boolean value) {
+        executeExistingDelayedTasksAfterShutdown = value;
+        if (!value && isShutdown())
+            cancelUnwantedTasks();
+    }
+
+    /**
+     * Gets the policy on whether to execute existing delayed
+     * tasks even when this executor has been <tt>shutdown</tt>. In
+     * this case, these tasks will only terminate upon
+     * <tt>shutdownNow</tt>, or after setting the policy to
+     * <tt>false</tt> when already shutdown. This value is by default
+     * true.
+     *
+     * @return true if will execute after shutdown
+     * @see #setExecuteExistingDelayedTasksAfterShutdownPolicy
+     */
+    public boolean getExecuteExistingDelayedTasksAfterShutdownPolicy() {
+        return executeExistingDelayedTasksAfterShutdown;
+    }
+
+
+    /**
+     * Initiates an orderly shutdown in which previously submitted
+     * tasks are executed, but no new tasks will be accepted. If the
+     * <tt>ExecuteExistingDelayedTasksAfterShutdownPolicy</tt> has
+     * been set <tt>false</tt>, existing delayed tasks whose delays
+     * have not yet elapsed are cancelled. And unless the
+     * <tt>ContinueExistingPeriodicTasksAfterShutdownPolicy</tt> has
+     * been set <tt>true</tt>, future executions of existing periodic
+     * tasks will be cancelled.
+     */
+    public void shutdown() {
+        cancelUnwantedTasks();
+        super.shutdown();
+    }
+
+    /**
+     * Attempts to stop all actively executing tasks, halts the
+     * processing of waiting tasks, and returns a list of the tasks
+     * that were awaiting execution.
+     *
+     * <p>There are no guarantees beyond best-effort attempts to stop
+     * processing actively executing tasks.  This implementation
+     * cancels tasks via {@link Thread#interrupt}, so any task that
+     * fails to respond to interrupts may never terminate.
+     *
+     * @return list of tasks that never commenced execution.  Each
+     * element of this list is a {@link ScheduledFuture},
+     * including those tasks submitted using <tt>execute</tt>, which
+     * are for scheduling purposes used as the basis of a zero-delay
+     * <tt>ScheduledFuture</tt>.
+     * @throws SecurityException {@inheritDoc}
+     */
+    public List shutdownNow() {
+        return super.shutdownNow();
+    }
+
+    /**
+     * Returns the task queue used by this executor.  Each element of
+     * this queue is a {@link ScheduledFuture}, including those
+     * tasks submitted using <tt>execute</tt> which are for scheduling
+     * purposes used as the basis of a zero-delay
+     * <tt>ScheduledFuture</tt>. Iteration over this queue is
+     * <em>not</em> guaranteed to traverse tasks in the order in
+     * which they will execute.
+     *
+     * @return the task queue
+     */
+    public BlockingQueue getQueue() {
+        return super.getQueue();
+    }
+
+    /**
+     * An annoying wrapper class to convince javac to use a
+     * DelayQueue<RunnableScheduledFuture> as a BlockingQueue<Runnable>
+     */
+    private static class DelayedWorkQueue
+        extends AbstractCollection
+        implements BlockingQueue {
+
+        private final DelayQueue dq = new DelayQueue();
+        public Object poll() { return dq.poll(); }
+        public Object peek() { return dq.peek(); }
+        public Object take() throws InterruptedException { return dq.take(); }
+        public Object poll(long timeout, TimeUnit unit) throws InterruptedException {
+            return dq.poll(timeout, unit);
+        }
+
+        public boolean add(Object x) {
+            return dq.add((RunnableScheduledFuture)x);
+        }
+        public boolean offer(Object x) {
+            return dq.offer((RunnableScheduledFuture)x);
+        }
+        public void put(Object x) {
+            dq.put((RunnableScheduledFuture)x);
+        }
+        public boolean offer(Object x, long timeout, TimeUnit unit) {
+            return dq.offer((RunnableScheduledFuture)x, timeout, unit);
+        }
+
+        public Object remove() { return dq.remove(); }
+        public Object element() { return dq.element(); }
+        public void clear() { dq.clear(); }
+        public int drainTo(Collection c) { return dq.drainTo(c); }
+        public int drainTo(Collection c, int maxElements) {
+            return dq.drainTo(c, maxElements);
+        }
+
+        public int remainingCapacity() { return dq.remainingCapacity(); }
+        public boolean remove(Object x) { return dq.remove(x); }
+        public boolean contains(Object x) { return dq.contains(x); }
+        public int size() { return dq.size(); }
+        public boolean isEmpty() { return dq.isEmpty(); }
+        public Object[] toArray() { return dq.toArray(); }
+        public Object[] toArray(Object[] array) { return dq.toArray(array); }
+        public Iterator iterator() {
+            return new Iterator() {
+                private Iterator it = dq.iterator();
+                public boolean hasNext() { return it.hasNext(); }
+                public Object next() { return it.next(); }
+                public void remove() { it.remove(); }
+            };
+        }
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/Semaphore.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/Semaphore.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/Semaphore.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,869 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+
+import java.util.Collection;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.WaitQueue.*;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.*;
+
+/**
+ * A counting semaphore.  Conceptually, a semaphore maintains a set of
+ * permits.  Each {@link #acquire} blocks if necessary until a permit is
+ * available, and then takes it.  Each {@link #release} adds a permit,
+ * potentially releasing a blocking acquirer.
+ * However, no actual permit objects are used; the {@code Semaphore} just
+ * keeps a count of the number available and acts accordingly.
+ *
+ * <p>Semaphores are often used to restrict the number of threads than can
+ * access some (physical or logical) resource. For example, here is
+ * a class that uses a semaphore to control access to a pool of items:
+ * <pre>
+ * class Pool {
+ *   private static final int MAX_AVAILABLE = 100;
+ *   private final Semaphore available = new Semaphore(MAX_AVAILABLE, true);
+ *
+ *   public Object getItem() throws InterruptedException {
+ *     available.acquire();
+ *     return getNextAvailableItem();
+ *   }
+ *
+ *   public void putItem(Object x) {
+ *     if (markAsUnused(x))
+ *       available.release();
+ *   }
+ *
+ *   // Not a particularly efficient data structure; just for demo
+ *
+ *   protected Object[] items = ... whatever kinds of items being managed
+ *   protected boolean[] used = new boolean[MAX_AVAILABLE];
+ *
+ *   protected synchronized Object getNextAvailableItem() {
+ *     for (int i = 0; i < MAX_AVAILABLE; ++i) {
+ *       if (!used[i]) {
+ *          used[i] = true;
+ *          return items[i];
+ *       }
+ *     }
+ *     return null; // not reached
+ *   }
+ *
+ *   protected synchronized boolean markAsUnused(Object item) {
+ *     for (int i = 0; i < MAX_AVAILABLE; ++i) {
+ *       if (item == items[i]) {
+ *          if (used[i]) {
+ *            used[i] = false;
+ *            return true;
+ *          } else
+ *            return false;
+ *       }
+ *     }
+ *     return false;
+ *   }
+ *
+ * }
+ * </pre>
+ *
+ * <p>Before obtaining an item each thread must acquire a permit from
+ * the semaphore, guaranteeing that an item is available for use. When
+ * the thread has finished with the item it is returned back to the
+ * pool and a permit is returned to the semaphore, allowing another
+ * thread to acquire that item.  Note that no synchronization lock is
+ * held when {@link #acquire} is called as that would prevent an item
+ * from being returned to the pool.  The semaphore encapsulates the
+ * synchronization needed to restrict access to the pool, separately
+ * from any synchronization needed to maintain the consistency of the
+ * pool itself.
+ *
+ * <p>A semaphore initialized to one, and which is used such that it
+ * only has at most one permit available, can serve as a mutual
+ * exclusion lock.  This is more commonly known as a <em>binary
+ * semaphore</em>, because it only has two states: one permit
+ * available, or zero permits available.  When used in this way, the
+ * binary semaphore has the property (unlike many
+ * {@link edu.emory.mathcs.backport.java.util.concurrent.locks.Lock}
+ * implementations), that the &quot;lock&quot; can be released by a
+ * thread other than the owner (as semaphores have no notion of
+ * ownership).  This can be useful in some specialized contexts, such
+ * as deadlock recovery.
+ *
+ * <p> The constructor for this class optionally accepts a
+ * <em>fairness</em> parameter. When set false, this class makes no
+ * guarantees about the order in which threads acquire permits. In
+ * particular, <em>barging</em> is permitted, that is, a thread
+ * invoking {@link #acquire} can be allocated a permit ahead of a
+ * thread that has been waiting - logically the new thread places itself at
+ * the head of the queue of waiting threads. When fairness is set true, the
+ * semaphore guarantees that threads invoking any of the {@link
+ * #acquire() acquire} methods are selected to obtain permits in the order in
+ * which their invocation of those methods was processed
+ * (first-in-first-out; FIFO). Note that FIFO ordering necessarily
+ * applies to specific internal points of execution within these
+ * methods.  So, it is possible for one thread to invoke
+ * {@code acquire} before another, but reach the ordering point after
+ * the other, and similarly upon return from the method.
+ * Also note that the untimed {@link #tryAcquire() tryAcquire} methods do not
+ * honor the fairness setting, but will take any permits that are
+ * available.
+ *
+ * <p>Generally, semaphores used to control resource access should be
+ * initialized as fair, to ensure that no thread is starved out from
+ * accessing a resource. When using semaphores for other kinds of
+ * synchronization control, the throughput advantages of non-fair
+ * ordering often outweigh fairness considerations.
+ *
+ * <p>This class also provides convenience methods to {@link
+ * #acquire(int) acquire} and {@link #release(int) release} multiple
+ * permits at a time.  BACKPORT NOTE: currently, these methods are only
+ * supported for FAIR semaphores.
+ *
+ * <p>Memory consistency effects: Actions in a thread prior to calling
+ * a "release" method such as {@code release()}
+ * <a href="package-summary.html#MemoryVisibility"><i>happen-before</i></a>
+ * actions following a successful "acquire" method such as {@code acquire()}
+ * in another thread.
+ *
+ * @since 1.5
+ * @author Doug Lea
+ *
+ */
+
+public class Semaphore implements java.io.Serializable {
+    private static final long serialVersionUID = -3222578661600680210L;
+
+    private final Sync sync;
+
+    /**
+     * Synchronization implementation for semaphore.
+     * Subclassed into fair and nonfair versions.
+     */
+    static abstract class Sync implements java.io.Serializable {
+        private static final long serialVersionUID = 1192457210091910933L;
+
+        /** current number of available permits **/
+        int permits_;
+
+        protected Sync(int permits) {
+            this.permits_ = permits;
+        }
+
+        abstract void acquireUninterruptibly(int n);
+
+        abstract void acquire(int n) throws InterruptedException;
+
+        public boolean attempt(int n) {
+            synchronized (this) {
+                if (permits_ >= n) {
+                    permits_ -= n;
+                    return true;
+                }
+                else {
+                    return false;
+                }
+            }
+        }
+
+        abstract boolean attempt(int n, long nanos) throws InterruptedException;
+
+        abstract void release(int n);
+
+        public synchronized int getPermits() {
+            return permits_;
+        }
+
+        public synchronized int drain() {
+            int acquired = permits_;
+            permits_ = 0;
+            return acquired;
+        }
+
+        public synchronized void reduce(int reduction) {
+            permits_ -= reduction;
+        }
+
+        abstract boolean hasQueuedThreads();
+        abstract int getQueueLength();
+        abstract Collection getQueuedThreads();
+    }
+
+    /**
+     * Nonfair version
+     */
+    final static class NonfairSync extends Sync {
+        private static final long serialVersionUID = -2694183684443567898L;
+
+        protected NonfairSync(int initialPermits) {
+            super(initialPermits);
+        }
+
+        private static void checkAgainstMultiacquire(int n) {
+            if (n != 1) {
+                throw new UnsupportedOperationException(
+                    "Atomic multi-acquire supported only in FAIR semaphores");
+            }
+        }
+
+        public void acquireUninterruptibly(int n) {
+            if (n == 0) return;
+            checkAgainstMultiacquire(n);
+            synchronized (this) {
+                if (permits_ > 0) {
+                    --permits_;
+                    return;
+                }
+                // else must wait
+                boolean wasInterrupted = Thread.interrupted();
+                try {
+                    while (true) {
+                        try {
+                            wait();
+                        }
+                        catch (InterruptedException e) {
+                            wasInterrupted = true;
+                            // no need to notify; if we were signalled, we will
+                            // act as signalled (interruption is ignored anyway)
+                        }
+                        if (permits_ > 0) {
+                            --permits_;
+                            return;
+                        }
+                    }
+                }
+                finally {
+                    if (wasInterrupted) Thread.currentThread().interrupt();
+                }
+            }
+        }
+
+        public void acquire(int n) throws InterruptedException {
+            if (Thread.interrupted()) throw new InterruptedException();
+            if (n == 0) return;
+            checkAgainstMultiacquire(n);
+            synchronized (this) {
+                while (permits_ <= 0) {
+                    try {
+                        wait();
+                    }
+                    catch (InterruptedException ex) {
+                        notify();
+                        throw ex;
+                    }
+                }
+                --permits_;
+            }
+        }
+
+        public boolean attempt(int n, long nanos) throws InterruptedException {
+            if (Thread.interrupted()) throw new InterruptedException();
+            if (n == 0) return true;
+            checkAgainstMultiacquire(n);
+
+            synchronized (this) {
+                if (permits_ > 0) {
+                    --permits_;
+                    return true;
+                }
+                else if (nanos <= 0)
+                    return false;
+                else {
+                    try {
+                        long deadline = Utils.nanoTime() + nanos;
+                        for (; ; ) {
+                            TimeUnit.NANOSECONDS.timedWait(this, nanos);
+                            if (permits_ > 0) {
+                                --permits_;
+                                return true;
+                            }
+                            else {
+                                nanos = deadline - Utils.nanoTime();
+                                if (nanos <= 0)
+                                    return false;
+                            }
+                        }
+                    }
+                    catch (InterruptedException ex) {
+                        notify();
+                        throw ex;
+                    }
+                }
+            }
+        }
+
+        public synchronized void release(int n) {
+            if (n < 0) throw new IllegalArgumentException("Negative argument");
+
+            permits_ += n;
+            for (int i = 0; i < n; ++i) notify();
+        }
+
+        public boolean hasQueuedThreads() {
+            throw new UnsupportedOperationException("Use FAIR version");
+        }
+
+        public int getQueueLength() {
+            throw new UnsupportedOperationException("Use FAIR version");
+        }
+
+        public Collection getQueuedThreads() {
+            throw new UnsupportedOperationException("Use FAIR version");
+        }
+    }
+
+    /**
+     * Fair version
+     */
+    final static class FairSync extends Sync implements QueuedSync {
+        private static final long serialVersionUID = 2014338818796000944L;
+
+        private transient WaitQueue wq_ = new FIFOWaitQueue();
+
+        FairSync(int initialPermits) {
+            super(initialPermits);
+        }
+
+        public void acquireUninterruptibly(int n) {
+            if (precheck(n)) return;
+            WaitQueue.WaitNode w = new Node(n);
+            w.doWaitUninterruptibly(this);
+        }
+
+        public void acquire(int n) throws InterruptedException {
+            if (Thread.interrupted()) throw new InterruptedException();
+            if (precheck(n)) return;
+            WaitQueue.WaitNode w = new Node(n);
+            w.doWait(this);
+        }
+
+        public boolean attempt(int n, long nanos) throws InterruptedException {
+            if (Thread.interrupted()) throw new InterruptedException();
+            if (precheck(n)) return true;
+            if (nanos <= 0) return false;
+
+            WaitQueue.WaitNode w = new Node(n);
+            return w.doTimedWait(this, nanos);
+        }
+
+        protected synchronized boolean precheck(int n) {
+            boolean pass = (permits_ >= n);
+            if (pass) permits_ -= n;
+            return pass;
+        }
+
+        public synchronized boolean recheck(WaitQueue.WaitNode w) {
+            Node node = (Node)w;
+            boolean pass = (permits_ >= node.requests);
+            if (pass) permits_ -= node.requests;
+            else      wq_.insert(w);
+            return pass;
+        }
+
+        public void takeOver(WaitQueue.WaitNode n) {}
+
+        protected synchronized Node getSignallee(int n) {
+            Node w = (Node)wq_.extract();
+            permits_ += n;
+            if (w == null) {
+                return null;
+            }
+            else if (w.requests > permits_) {
+                // not enough permits released for the "next in line"
+                wq_.putBack(w);
+                return null;
+            }
+            else {
+                permits_ -= w.requests;
+                return w;
+            }
+        }
+
+        public void release(int n) {
+            if (n < 0) throw new IllegalArgumentException("Negative argument");
+            for (;;) {
+                Node w = getSignallee(n);
+                if (w == null) return;  // no one to signal, or not enough permits
+                if (w.signal(this)) return; // notify if still waiting, else skip
+                n = w.requests;
+            }
+        }
+
+        public synchronized boolean hasQueuedThreads() {
+            return wq_.hasNodes();
+        }
+
+        public synchronized int getQueueLength() {
+            return wq_.getLength();
+        }
+
+        public synchronized Collection getQueuedThreads() {
+            return wq_.getWaitingThreads();
+        }
+
+        private void readObject(java.io.ObjectInputStream in)
+                throws java.io.IOException, ClassNotFoundException {
+            in.defaultReadObject();
+            synchronized (this) {
+                wq_ = new FIFOWaitQueue();
+            }
+        }
+
+        final static class Node extends WaitQueue.WaitNode {
+            final int requests;
+            Node(int requests) { this.requests = requests; }
+        }
+    }
+
+    /**
+     * Creates a {@code Semaphore} with the given number of
+     * permits and nonfair fairness setting.
+     *
+     * @param permits the initial number of permits available.
+     *        This value may be negative, in which case releases
+     *        must occur before any acquires will be granted.
+     */
+    public Semaphore(int permits) {
+        sync = new NonfairSync(permits);
+    }
+
+    /**
+     * Creates a {@code Semaphore} with the given number of
+     * permits and the given fairness setting.
+     *
+     * @param permits the initial number of permits available.
+     *        This value may be negative, in which case releases
+     *        must occur before any acquires will be granted.
+     * @param fair {@code true} if this semaphore will guarantee
+     *        first-in first-out granting of permits under contention,
+     *        else {@code false}
+     */
+    public Semaphore(int permits, boolean fair) {
+        sync = (fair)? (Sync)new FairSync(permits) : new NonfairSync(permits);
+    }
+
+    /**
+     * Acquires a permit from this semaphore, blocking until one is
+     * available, or the thread is {@linkplain Thread#interrupt interrupted}.
+     *
+     * <p>Acquires a permit, if one is available and returns immediately,
+     * reducing the number of available permits by one.
+     *
+     * <p>If no permit is available then the current thread becomes
+     * disabled for thread scheduling purposes and lies dormant until
+     * one of two things happens:
+     * <ul>
+     * <li>Some other thread invokes the {@link #release} method for this
+     * semaphore and the current thread is next to be assigned a permit; or
+     * <li>Some other thread {@linkplain Thread#interrupt interrupts}
+     * the current thread.
+     * </ul>
+     *
+     * <p>If the current thread:
+     * <ul>
+     * <li>has its interrupted status set on entry to this method; or
+     * <li>is {@linkplain Thread#interrupt interrupted} while waiting
+     * for a permit,
+     * </ul>
+     * then {@link InterruptedException} is thrown and the current thread's
+     * interrupted status is cleared.
+     *
+     * @throws InterruptedException if the current thread is interrupted
+     */
+    public void acquire() throws InterruptedException {
+        sync.acquire(1);
+    }
+
+    /**
+     * Acquires a permit from this semaphore, blocking until one is
+     * available.
+     *
+     * <p>Acquires a permit, if one is available and returns immediately,
+     * reducing the number of available permits by one.
+     *
+     * <p>If no permit is available then the current thread becomes
+     * disabled for thread scheduling purposes and lies dormant until
+     * some other thread invokes the {@link #release} method for this
+     * semaphore and the current thread is next to be assigned a permit.
+     *
+     * <p>If the current thread is {@linkplain Thread#interrupt interrupted}
+     * while waiting for a permit then it will continue to wait, but the
+     * time at which the thread is assigned a permit may change compared to
+     * the time it would have received the permit had no interruption
+     * occurred.  When the thread does return from this method its interrupt
+     * status will be set.
+     */
+    public void acquireUninterruptibly() {
+        sync.acquireUninterruptibly(1);
+    }
+
+    /**
+     * Acquires a permit from this semaphore, only if one is available at the
+     * time of invocation.
+     *
+     * <p>Acquires a permit, if one is available and returns immediately,
+     * with the value {@code true},
+     * reducing the number of available permits by one.
+     *
+     * <p>If no permit is available then this method will return
+     * immediately with the value {@code false}.
+     *
+     * <p>Even when this semaphore has been set to use a
+     * fair ordering policy, a call to {@code tryAcquire()} <em>will</em>
+     * immediately acquire a permit if one is available, whether or not
+     * other threads are currently waiting.
+     * This &quot;barging&quot; behavior can be useful in certain
+     * circumstances, even though it breaks fairness. If you want to honor
+     * the fairness setting, then use
+     * {@link #tryAcquire(long, TimeUnit) tryAcquire(0, TimeUnit.SECONDS) }
+     * which is almost equivalent (it also detects interruption).
+     *
+     * @return {@code true} if a permit was acquired and {@code false}
+     *         otherwise
+     */
+    public boolean tryAcquire() {
+        return sync.attempt(1);
+    }
+
+    /**
+     * Acquires a permit from this semaphore, if one becomes available
+     * within the given waiting time and the current thread has not
+     * been {@linkplain Thread#interrupt interrupted}.
+     *
+     * <p>Acquires a permit, if one is available and returns immediately,
+     * with the value {@code true},
+     * reducing the number of available permits by one.
+     *
+     * <p>If no permit is available then the current thread becomes
+     * disabled for thread scheduling purposes and lies dormant until
+     * one of three things happens:
+     * <ul>
+     * <li>Some other thread invokes the {@link #release} method for this
+     * semaphore and the current thread is next to be assigned a permit; or
+     * <li>Some other thread {@linkplain Thread#interrupt interrupts}
+     * the current thread; or
+     * <li>The specified waiting time elapses.
+     * </ul>
+     *
+     * <p>If a permit is acquired then the value {@code true} is returned.
+     *
+     * <p>If the current thread:
+     * <ul>
+     * <li>has its interrupted status set on entry to this method; or
+     * <li>is {@linkplain Thread#interrupt interrupted} while waiting
+     * to acquire a permit,
+     * </ul>
+     * then {@link InterruptedException} is thrown and the current thread's
+     * interrupted status is cleared.
+     *
+     * <p>If the specified waiting time elapses then the value {@code false}
+     * is returned.  If the time is less than or equal to zero, the method
+     * will not wait at all.
+     *
+     * @param timeout the maximum time to wait for a permit
+     * @param unit the time unit of the {@code timeout} argument
+     * @return {@code true} if a permit was acquired and {@code false}
+     *         if the waiting time elapsed before a permit was acquired
+     * @throws InterruptedException if the current thread is interrupted
+     */
+    public boolean tryAcquire(long timeout, TimeUnit unit)
+        throws InterruptedException {
+        return sync.attempt(1, unit.toNanos(timeout));
+    }
+
+    /**
+     * Releases a permit, returning it to the semaphore.
+     *
+     * <p>Releases a permit, increasing the number of available permits by
+     * one.  If any threads are trying to acquire a permit, then one is
+     * selected and given the permit that was just released.  That thread
+     * is (re)enabled for thread scheduling purposes.
+     *
+     * <p>There is no requirement that a thread that releases a permit must
+     * have acquired that permit by calling {@link #acquire}.
+     * Correct usage of a semaphore is established by programming convention
+     * in the application.
+     */
+    public void release() {
+        sync.release(1);
+    }
+
+    /**
+     * Acquires the given number of permits from this semaphore,
+     * blocking until all are available,
+     * or the thread is {@linkplain Thread#interrupt interrupted}.
+     *
+     * <p>Acquires the given number of permits, if they are available,
+     * and returns immediately, reducing the number of available permits
+     * by the given amount.
+     *
+     * <p>If insufficient permits are available then the current thread becomes
+     * disabled for thread scheduling purposes and lies dormant until
+     * one of two things happens:
+     * <ul>
+     * <li>Some other thread invokes one of the {@link #release() release}
+     * methods for this semaphore, the current thread is next to be assigned
+     * permits and the number of available permits satisfies this request; or
+     * <li>Some other thread {@linkplain Thread#interrupt interrupts}
+     * the current thread.
+     * </ul>
+     *
+     * <p>If the current thread:
+     * <ul>
+     * <li>has its interrupted status set on entry to this method; or
+     * <li>is {@linkplain Thread#interrupt interrupted} while waiting
+     * for a permit,
+     * </ul>
+     * then {@link InterruptedException} is thrown and the current thread's
+     * interrupted status is cleared.
+     * Any permits that were to be assigned to this thread are instead
+     * assigned to other threads trying to acquire permits, as if
+     * permits had been made available by a call to {@link #release()}.
+     *
+     * @param permits the number of permits to acquire
+     * @throws InterruptedException if the current thread is interrupted
+     * @throws IllegalArgumentException if {@code permits} is negative
+     */
+    public void acquire(int permits) throws InterruptedException {
+        if (permits < 0) throw new IllegalArgumentException();
+        sync.acquire(permits);
+    }
+
+    /**
+     * Acquires the given number of permits from this semaphore,
+     * blocking until all are available.
+     *
+     * <p>Acquires the given number of permits, if they are available,
+     * and returns immediately, reducing the number of available permits
+     * by the given amount.
+     *
+     * <p>If insufficient permits are available then the current thread becomes
+     * disabled for thread scheduling purposes and lies dormant until
+     * some other thread invokes one of the {@link #release() release}
+     * methods for this semaphore, the current thread is next to be assigned
+     * permits and the number of available permits satisfies this request.
+     *
+     * <p>If the current thread is {@linkplain Thread#interrupt interrupted}
+     * while waiting for permits then it will continue to wait and its
+     * position in the queue is not affected.  When the thread does return
+     * from this method its interrupt status will be set.
+     *
+     * @param permits the number of permits to acquire
+     * @throws IllegalArgumentException if {@code permits} is negative
+     *
+     */
+    public void acquireUninterruptibly(int permits) {
+        sync.acquireUninterruptibly(permits);
+    }
+
+    /**
+     * Acquires the given number of permits from this semaphore, only
+     * if all are available at the time of invocation.
+     *
+     * <p>Acquires the given number of permits, if they are available, and
+     * returns immediately, with the value {@code true},
+     * reducing the number of available permits by the given amount.
+     *
+     * <p>If insufficient permits are available then this method will return
+     * immediately with the value {@code false} and the number of available
+     * permits is unchanged.
+     *
+     * <p>Even when this semaphore has been set to use a fair ordering
+     * policy, a call to {@code tryAcquire} <em>will</em>
+     * immediately acquire a permit if one is available, whether or
+     * not other threads are currently waiting.  This
+     * &quot;barging&quot; behavior can be useful in certain
+     * circumstances, even though it breaks fairness. If you want to
+     * honor the fairness setting, then use {@link #tryAcquire(int,
+     * long, TimeUnit) tryAcquire(permits, 0, TimeUnit.SECONDS) }
+     * which is almost equivalent (it also detects interruption).
+     *
+     * @param permits the number of permits to acquire
+     * @return {@code true} if the permits were acquired and
+     *         {@code false} otherwise
+     * @throws IllegalArgumentException if {@code permits} is negative
+     */
+    public boolean tryAcquire(int permits) {
+        if (permits < 0) throw new IllegalArgumentException();
+        return sync.attempt(permits);
+    }
+
+    /**
+     * Acquires the given number of permits from this semaphore, if all
+     * become available within the given waiting time and the current
+     * thread has not been {@linkplain Thread#interrupt interrupted}.
+     *
+     * <p>Acquires the given number of permits, if they are available and
+     * returns immediately, with the value {@code true},
+     * reducing the number of available permits by the given amount.
+     *
+     * <p>If insufficient permits are available then
+     * the current thread becomes disabled for thread scheduling
+     * purposes and lies dormant until one of three things happens:
+     * <ul>
+     * <li>Some other thread invokes one of the {@link #release() release}
+     * methods for this semaphore, the current thread is next to be assigned
+     * permits and the number of available permits satisfies this request; or
+     * <li>Some other thread {@linkplain Thread#interrupt interrupts}
+     * the current thread; or
+     * <li>The specified waiting time elapses.
+     * </ul>
+     *
+     * <p>If the permits are acquired then the value {@code true} is returned.
+     *
+     * <p>If the current thread:
+     * <ul>
+     * <li>has its interrupted status set on entry to this method; or
+     * <li>is {@linkplain Thread#interrupt interrupted} while waiting
+     * to acquire the permits,
+     * </ul>
+     * then {@link InterruptedException} is thrown and the current thread's
+     * interrupted status is cleared.
+     * Any permits that were to be assigned to this thread, are instead
+     * assigned to other threads trying to acquire permits, as if
+     * the permits had been made available by a call to {@link #release()}.
+     *
+     * <p>If the specified waiting time elapses then the value {@code false}
+     * is returned.  If the time is less than or equal to zero, the method
+     * will not wait at all.  Any permits that were to be assigned to this
+     * thread, are instead assigned to other threads trying to acquire
+     * permits, as if the permits had been made available by a call to
+     * {@link #release()}.
+     *
+     * @param permits the number of permits to acquire
+     * @param timeout the maximum time to wait for the permits
+     * @param unit the time unit of the {@code timeout} argument
+     * @return {@code true} if all permits were acquired and {@code false}
+     *         if the waiting time elapsed before all permits were acquired
+     * @throws InterruptedException if the current thread is interrupted
+     * @throws IllegalArgumentException if {@code permits} is negative
+     */
+    public boolean tryAcquire(int permits, long timeout, TimeUnit unit)
+        throws InterruptedException {
+        if (permits < 0) throw new IllegalArgumentException();
+        return sync.attempt(permits, unit.toNanos(timeout));
+    }
+
+    /**
+     * Releases the given number of permits, returning them to the semaphore.
+     *
+     * <p>Releases the given number of permits, increasing the number of
+     * available permits by that amount.
+     * If any threads are trying to acquire permits, then one
+     * is selected and given the permits that were just released.
+     * If the number of available permits satisfies that thread's request
+     * then that thread is (re)enabled for thread scheduling purposes;
+     * otherwise the thread will wait until sufficient permits are available.
+     * If there are still permits available
+     * after this thread's request has been satisfied, then those permits
+     * are assigned in turn to other threads trying to acquire permits.
+     *
+     * <p>There is no requirement that a thread that releases a permit must
+     * have acquired that permit by calling {@link Semaphore#acquire acquire}.
+     * Correct usage of a semaphore is established by programming convention
+     * in the application.
+     *
+     * @param permits the number of permits to release
+     * @throws IllegalArgumentException if {@code permits} is negative
+     */
+    public void release(int permits) {
+        if (permits < 0) throw new IllegalArgumentException();
+        sync.release(permits);
+    }
+
+    /**
+     * Returns the current number of permits available in this semaphore.
+     *
+     * <p>This method is typically used for debugging and testing purposes.
+     *
+     * @return the number of permits available in this semaphore
+     */
+    public int availablePermits() {
+        return sync.getPermits();
+    }
+
+    /**
+     * Acquires and returns all permits that are immediately available.
+     *
+     * @return the number of permits acquired
+     */
+    public int drainPermits() {
+        return sync.drain();
+    }
+
+    /**
+     * Shrinks the number of available permits by the indicated
+     * reduction. This method can be useful in subclasses that use
+     * semaphores to track resources that become unavailable. This
+     * method differs from {@code acquire} in that it does not block
+     * waiting for permits to become available.
+     *
+     * @param reduction the number of permits to remove
+     * @throws IllegalArgumentException if {@code reduction} is negative
+     */
+    protected void reducePermits(int reduction) {
+        if (reduction < 0) throw new IllegalArgumentException();
+        sync.reduce(reduction);
+    }
+
+    /**
+     * Returns {@code true} if this semaphore has fairness set true.
+     *
+     * @return {@code true} if this semaphore has fairness set true
+     */
+    public boolean isFair() {
+        return sync instanceof FairSync;
+    }
+
+    /**
+     * Queries whether any threads are waiting to acquire. Note that
+     * because cancellations may occur at any time, a {@code true}
+     * return does not guarantee that any other thread will ever
+     * acquire.  This method is designed primarily for use in
+     * monitoring of the system state.
+     *
+     * @return {@code true} if there may be other threads waiting to
+     *         acquire the lock
+     */
+    public final boolean hasQueuedThreads() {
+        return sync.hasQueuedThreads();
+    }
+
+    /**
+     * Returns an estimate of the number of threads waiting to acquire.
+     * The value is only an estimate because the number of threads may
+     * change dynamically while this method traverses internal data
+     * structures.  This method is designed for use in monitoring of the
+     * system state, not for synchronization control.
+     *
+     * @return the estimated number of threads waiting for this lock
+     */
+    public final int getQueueLength() {
+        return sync.getQueueLength();
+    }
+
+    /**
+     * Returns a collection containing threads that may be waiting to acquire.
+     * Because the actual set of threads may change dynamically while
+     * constructing this result, the returned collection is only a best-effort
+     * estimate.  The elements of the returned collection are in no particular
+     * order.  This method is designed to facilitate construction of
+     * subclasses that provide more extensive monitoring facilities.
+     *
+     * @return the collection of threads
+     */
+    protected Collection getQueuedThreads() {
+        return sync.getQueuedThreads();
+    }
+
+    /**
+     * Returns a string identifying this semaphore, as well as its state.
+     * The state, in brackets, includes the String {@code "Permits ="}
+     * followed by the number of permits.
+     *
+     * @return a string identifying this semaphore, as well as its state
+     */
+    public String toString() {
+        return super.toString() + "[Permits = " + sync.getPermits() + "]";
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/SynchronousQueue.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/SynchronousQueue.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/SynchronousQueue.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,833 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import edu.emory.mathcs.backport.java.util.*;
+import java.util.Collection;
+import java.util.Iterator;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.Utils;
+import java.util.NoSuchElementException;
+
+/**
+ * A {@linkplain BlockingQueue blocking queue} in which each insert
+ * operation must wait for a corresponding remove operation by another
+ * thread, and vice versa.  A synchronous queue does not have any
+ * internal capacity, not even a capacity of one.  You cannot
+ * <tt>peek</tt> at a synchronous queue because an element is only
+ * present when you try to remove it; you cannot insert an element
+ * (using any method) unless another thread is trying to remove it;
+ * you cannot iterate as there is nothing to iterate.  The
+ * <em>head</em> of the queue is the element that the first queued
+ * inserting thread is trying to add to the queue; if there is no such
+ * queued thread then no element is available for removal and
+ * <tt>poll()</tt> will return <tt>null</tt>.  For purposes of other
+ * <tt>Collection</tt> methods (for example <tt>contains</tt>), a
+ * <tt>SynchronousQueue</tt> acts as an empty collection.  This queue
+ * does not permit <tt>null</tt> elements.
+ *
+ * <p>Synchronous queues are similar to rendezvous channels used in
+ * CSP and Ada. They are well suited for handoff designs, in which an
+ * object running in one thread must sync up with an object running
+ * in another thread in order to hand it some information, event, or
+ * task.
+ *
+ * <p> This class supports an optional fairness policy for ordering
+ * waiting producer and consumer threads.  By default, this ordering
+ * is not guaranteed. However, a queue constructed with fairness set
+ * to <tt>true</tt> grants threads access in FIFO order. Fairness
+ * generally decreases throughput but reduces variability and avoids
+ * starvation.
+ *
+ * <p>This class and its iterator implement all of the
+ * <em>optional</em> methods of the {@link Collection} and {@link
+ * Iterator} interfaces.
+ *
+ * <p>This class is a member of the
+ * <a href="{@docRoot}/../guide/collections/index.html">
+ * Java Collections Framework</a>.
+ *
+ * @since 1.5
+ * @author Doug Lea
+ */
+public class SynchronousQueue extends AbstractQueue
+        implements BlockingQueue, java.io.Serializable {
+    private static final long serialVersionUID = -3223113410248163686L;
+
+    /*
+      This implementation divides actions into two cases for puts:
+
+      * An arriving producer that does not already have a waiting consumer
+        creates a node holding item, and then waits for a consumer to take it.
+      * An arriving producer that does already have a waiting consumer fills
+        the slot node created by the consumer, and notifies it to continue.
+
+      And symmetrically, two for takes:
+
+      * An arriving consumer that does not already have a waiting producer
+        creates an empty slot node, and then waits for a producer to fill it.
+      * An arriving consumer that does already have a waiting producer takes
+        item from the node created by the producer, and notifies it to continue.
+
+      When a put or take waiting for the actions of its counterpart
+      aborts due to interruption or timeout, it marks the node
+      it created as "CANCELLED", which causes its counterpart to retry
+      the entire put or take sequence.
+
+      This requires keeping two simple queues, waitingProducers and
+      waitingConsumers. Each of these can be FIFO (preserves fairness)
+      or LIFO (improves throughput).
+    */
+
+    /** Lock protecting both wait queues */
+    private final ReentrantLock qlock;
+    /** Queue holding waiting puts */
+    private final WaitQueue waitingProducers;
+    /** Queue holding waiting takes */
+    private final WaitQueue waitingConsumers;
+
+    /**
+     * Creates a <tt>SynchronousQueue</tt> with nonfair access policy.
+     */
+    public SynchronousQueue() {
+        this(false);
+    }
+
+    /**
+     * Creates a <tt>SynchronousQueue</tt> with specified fairness policy.
+     * @param fair if true, threads contend in FIFO order for access;
+     * otherwise the order is unspecified.
+     */
+    public SynchronousQueue(boolean fair) {
+        if (fair) {
+            qlock = new ReentrantLock(true);
+            waitingProducers = new FifoWaitQueue();
+            waitingConsumers = new FifoWaitQueue();
+        }
+        else {
+            qlock = new ReentrantLock();
+            waitingProducers = new LifoWaitQueue();
+            waitingConsumers = new LifoWaitQueue();
+        }
+    }
+
+    /**
+     * Queue to hold waiting puts/takes; specialized to Fifo/Lifo below.
+     * These queues have all transient fields, but are serializable
+     * in order to recover fairness settings when deserialized.
+     */
+    static abstract class WaitQueue implements java.io.Serializable {
+        /** Creates, adds, and returns node for x. */
+        abstract Node enq(Object x);
+        /** Removes and returns node, or null if empty. */
+        abstract Node deq();
+        /** Removes a cancelled node to avoid garbage retention. */
+        abstract void unlink(Node node);
+        /** Returns true if a cancelled node might be on queue. */
+        abstract boolean shouldUnlink(Node node);
+    }
+
+    /**
+     * FIFO queue to hold waiting puts/takes.
+     */
+    static final class FifoWaitQueue extends WaitQueue implements java.io.Serializable {
+        private static final long serialVersionUID = -3623113410248163686L;
+        private transient Node head;
+        private transient Node last;
+
+        Node enq(Object x) {
+            Node p = new Node(x);
+            if (last == null)
+                last = head = p;
+            else
+                last = last.next = p;
+            return p;
+        }
+
+        Node deq() {
+            Node p = head;
+            if (p != null) {
+                if ((head = p.next) == null)
+                    last = null;
+                p.next = null;
+            }
+            return p;
+        }
+
+        boolean shouldUnlink(Node node) {
+            return (node == last || node.next != null);
+        }
+
+        void unlink(Node node) {
+            Node p = head;
+            Node trail = null;
+            while (p != null) {
+                if (p == node) {
+                    Node next = p.next;
+                    if (trail == null)
+                        head = next;
+                    else
+                        trail.next = next;
+                    if (last == node)
+                        last = trail;
+                    break;
+                }
+                trail = p;
+                p = p.next;
+            }
+        }
+    }
+
+    /**
+     * LIFO queue to hold waiting puts/takes.
+     */
+    static final class LifoWaitQueue extends WaitQueue implements java.io.Serializable {
+        private static final long serialVersionUID = -3633113410248163686L;
+        private transient Node head;
+
+        Node enq(Object x) {
+            return head = new Node(x, head);
+        }
+
+        Node deq() {
+            Node p = head;
+            if (p != null) {
+                head = p.next;
+                p.next = null;
+            }
+            return p;
+        }
+
+        boolean shouldUnlink(Node node) {
+            // Return false if already dequeued or is bottom node (in which
+            // case we might retain at most one garbage node)
+            return (node == head || node.next != null);
+        }
+
+        void unlink(Node node) {
+            Node p = head;
+            Node trail = null;
+            while (p != null) {
+                if (p == node) {
+                    Node next = p.next;
+                    if (trail == null)
+                        head = next;
+                    else
+                        trail.next = next;
+                    break;
+                }
+                trail = p;
+                p = p.next;
+            }
+        }
+    }
+
+    /**
+     * Unlinks the given node from consumer queue.  Called by cancelled
+     * (timeout, interrupt) waiters to avoid garbage retention in the
+     * absence of producers.
+     */
+    private void unlinkCancelledConsumer(Node node) {
+        // Use a form of double-check to avoid unnecessary locking and
+        // traversal. The first check outside lock might
+        // conservatively report true.
+        if (waitingConsumers.shouldUnlink(node)) {
+            qlock.lock();
+            try {
+                if (waitingConsumers.shouldUnlink(node))
+                    waitingConsumers.unlink(node);
+            } finally {
+                qlock.unlock();
+            }
+        }
+    }
+
+    /**
+     * Unlinks the given node from producer queue.  Symmetric
+     * to unlinkCancelledConsumer.
+     */
+    private void unlinkCancelledProducer(Node node) {
+        if (waitingProducers.shouldUnlink(node)) {
+            qlock.lock();
+            try {
+                if (waitingProducers.shouldUnlink(node))
+                    waitingProducers.unlink(node);
+            } finally {
+                qlock.unlock();
+            }
+        }
+    }
+
+    /**
+     * Nodes each maintain an item and handle waits and signals for
+     * getting and setting it. The class extends
+     * AbstractQueuedSynchronizer to manage blocking, using AQS state
+     *  0 for waiting, 1 for ack, -1 for cancelled.
+     */
+    static final class Node implements java.io.Serializable {
+        private static final long serialVersionUID = -3223113410248163686L;
+
+        /** Synchronization state value representing that node acked */
+        private static final int ACK    =  1;
+        /** Synchronization state value representing that node cancelled */
+        private static final int CANCEL = -1;
+
+        int state = 0;
+
+        /** The item being transferred */
+        Object item;
+        /** Next node in wait queue */
+        Node next;
+
+        /** Creates a node with initial item */
+        Node(Object x) { item = x; }
+
+        /** Creates a node with initial item and next */
+        Node(Object x, Node n) { item = x; next = n; }
+
+        /**
+         * Takes item and nulls out field (for sake of GC)
+         *
+         * PRE: lock owned
+         */
+        private Object extract() {
+            Object x = item;
+            item = null;
+            return x;
+        }
+
+        /**
+         * Tries to cancel on interrupt; if so rethrowing,
+         * else setting interrupt state
+         *
+         * PRE: lock owned
+         */
+        private void checkCancellationOnInterrupt(InterruptedException ie)
+            throws InterruptedException
+        {
+            if (state == 0) {
+                state = CANCEL;
+                notify();
+                throw ie;
+            }
+            Thread.currentThread().interrupt();
+        }
+
+        /**
+         * Fills in the slot created by the consumer and signal consumer to
+         * continue.
+         */
+        synchronized boolean setItem(Object x) {
+            if (state != 0) return false;
+            item = x;
+            state = ACK;
+            notify();
+            return true;
+        }
+
+        /**
+         * Removes item from slot created by producer and signal producer
+         * to continue.
+         */
+        synchronized Object getItem() {
+            if (state != 0) return null;
+            state = ACK;
+            notify();
+            return extract();
+        }
+
+        /**
+         * Waits for a consumer to take item placed by producer.
+         */
+        synchronized void waitForTake() throws InterruptedException {
+            try {
+                while (state == 0) wait();
+            } catch (InterruptedException ie) {
+                checkCancellationOnInterrupt(ie);
+            }
+        }
+
+        /**
+         * Waits for a producer to put item placed by consumer.
+         */
+        synchronized Object waitForPut() throws InterruptedException {
+            try {
+                while (state == 0) wait();
+            } catch (InterruptedException ie) {
+                checkCancellationOnInterrupt(ie);
+            }
+            return extract();
+        }
+
+        private boolean attempt(long nanos) throws InterruptedException {
+            if (state != 0) return true;
+            if (nanos <= 0) {
+                state = CANCEL;
+                notify();
+                return false;
+            }
+            long deadline = Utils.nanoTime() + nanos;
+            while (true) {
+                TimeUnit.NANOSECONDS.timedWait(this, nanos);
+                if (state != 0) return true;
+                nanos = deadline - Utils.nanoTime();
+                if (nanos <= 0) {
+                    state = CANCEL;
+                    notify();
+                    return false;
+                }
+            }
+        }
+
+        /**
+         * Waits for a consumer to take item placed by producer or time out.
+         */
+        synchronized boolean waitForTake(long nanos) throws InterruptedException {
+            try {
+                if (!attempt(nanos)) return false;
+            } catch (InterruptedException ie) {
+                checkCancellationOnInterrupt(ie);
+            }
+            return true;
+        }
+
+        /**
+         * Waits for a producer to put item placed by consumer, or time out.
+         */
+        synchronized Object waitForPut(long nanos) throws InterruptedException {
+            try {
+                if (!attempt(nanos)) return null;
+            } catch (InterruptedException ie) {
+                checkCancellationOnInterrupt(ie);
+            }
+            return extract();
+        }
+    }
+
+    /**
+     * Adds the specified element to this queue, waiting if necessary for
+     * another thread to receive it.
+     *
+     * @throws InterruptedException {@inheritDoc}
+     * @throws NullPointerException {@inheritDoc}
+     */
+    public void put(Object e) throws InterruptedException {
+        if (e == null) throw new NullPointerException();
+        final ReentrantLock qlock = this.qlock;
+
+        for (;;) {
+            Node node;
+            boolean mustWait;
+            if (Thread.interrupted()) throw new InterruptedException();
+            qlock.lock();
+            try {
+                node = waitingConsumers.deq();
+                if ( (mustWait = (node == null)) )
+                    node = waitingProducers.enq(e);
+            } finally {
+                qlock.unlock();
+            }
+
+            if (mustWait) {
+                try {
+                    node.waitForTake();
+                    return;
+                } catch (InterruptedException ex) {
+                    unlinkCancelledProducer(node);
+                    throw ex;
+                }
+            }
+
+            else if (node.setItem(e))
+                return;
+
+            // else consumer cancelled, so retry
+        }
+    }
+
+    /**
+     * Inserts the specified element into this queue, waiting if necessary
+     * up to the specified wait time for another thread to receive it.
+     *
+     * @return <tt>true</tt> if successful, or <tt>false</tt> if the
+     *         specified waiting time elapses before a consumer appears.
+     * @throws InterruptedException {@inheritDoc}
+     * @throws NullPointerException {@inheritDoc}
+     */
+    public boolean offer(Object e, long timeout, TimeUnit unit) throws InterruptedException {
+        if (e == null) throw new NullPointerException();
+        long nanos = unit.toNanos(timeout);
+        final ReentrantLock qlock = this.qlock;
+        for (;;) {
+            Node node;
+            boolean mustWait;
+            if (Thread.interrupted()) throw new InterruptedException();
+            qlock.lock();
+            try {
+                node = waitingConsumers.deq();
+                if ( (mustWait = (node == null)) )
+                    node = waitingProducers.enq(e);
+            } finally {
+                qlock.unlock();
+            }
+
+            if (mustWait) {
+                try {
+                    boolean x = node.waitForTake(nanos);
+                    if (!x)
+                        unlinkCancelledProducer(node);
+                    return x;
+                } catch (InterruptedException ex) {
+                    unlinkCancelledProducer(node);
+                    throw ex;
+                }
+            }
+
+            else if (node.setItem(e))
+                return true;
+
+            // else consumer cancelled, so retry
+        }
+    }
+
+    /**
+     * Retrieves and removes the head of this queue, waiting if necessary
+     * for another thread to insert it.
+     *
+     * @return the head of this queue
+     * @throws InterruptedException {@inheritDoc}
+     */
+    public Object take() throws InterruptedException {
+        final ReentrantLock qlock = this.qlock;
+        for (;;) {
+            Node node;
+            boolean mustWait;
+
+            if (Thread.interrupted()) throw new InterruptedException();
+            qlock.lock();
+            try {
+                node = waitingProducers.deq();
+                if ( (mustWait = (node == null)) )
+                    node = waitingConsumers.enq(null);
+            } finally {
+                qlock.unlock();
+            }
+
+            if (mustWait) {
+                try {
+                    Object x = node.waitForPut();
+                    return (Object)x;
+                } catch (InterruptedException ex) {
+                    unlinkCancelledConsumer(node);
+                    throw ex;
+                }
+            }
+            else {
+                Object x = node.getItem();
+                if (x != null)
+                    return (Object)x;
+                // else cancelled, so retry
+            }
+        }
+    }
+
+    /**
+     * Retrieves and removes the head of this queue, waiting
+     * if necessary up to the specified wait time, for another thread
+     * to insert it.
+     *
+     * @return the head of this queue, or <tt>null</tt> if the
+     *         specified waiting time elapses before an element is present.
+     * @throws InterruptedException {@inheritDoc}
+     */
+    public Object poll(long timeout, TimeUnit unit) throws InterruptedException {
+        long nanos = unit.toNanos(timeout);
+        final ReentrantLock qlock = this.qlock;
+
+        for (;;) {
+            Node node;
+            boolean mustWait;
+
+            if (Thread.interrupted()) throw new InterruptedException();
+            qlock.lock();
+            try {
+                node = waitingProducers.deq();
+                if ( (mustWait = (node == null)) )
+                    node = waitingConsumers.enq(null);
+            } finally {
+                qlock.unlock();
+            }
+
+            if (mustWait) {
+                try {
+                    Object x = node.waitForPut(nanos);
+                    if (x == null)
+                        unlinkCancelledConsumer(node);
+                    return (Object)x;
+                } catch (InterruptedException ex) {
+                    unlinkCancelledConsumer(node);
+                    throw ex;
+                }
+            }
+            else {
+                Object x = node.getItem();
+                if (x != null)
+                    return (Object)x;
+                // else cancelled, so retry
+            }
+        }
+    }
+
+    // Untimed nonblocking versions
+
+    /**
+     * Inserts the specified element into this queue, if another thread is
+     * waiting to receive it.
+     *
+     * @param e the element to add
+     * @return <tt>true</tt> if the element was added to this queue, else
+     *         <tt>false</tt>
+     * @throws NullPointerException if the specified element is null
+     */
+    public boolean offer(Object e) {
+        if (e == null) throw new NullPointerException();
+        final ReentrantLock qlock = this.qlock;
+
+        for (;;) {
+            Node node;
+            qlock.lock();
+            try {
+                node = waitingConsumers.deq();
+            } finally {
+                qlock.unlock();
+            }
+            if (node == null)
+                return false;
+
+            else if (node.setItem(e))
+                return true;
+            // else retry
+        }
+    }
+
+    /**
+     * Retrieves and removes the head of this queue, if another thread
+     * is currently making an element available.
+     *
+     * @return the head of this queue, or <tt>null</tt> if no
+     *         element is available.
+     */
+    public Object poll() {
+        final ReentrantLock qlock = this.qlock;
+        for (;;) {
+            Node node;
+            qlock.lock();
+            try {
+                node = waitingProducers.deq();
+            } finally {
+                qlock.unlock();
+            }
+            if (node == null)
+                return null;
+
+            else {
+                Object x = node.getItem();
+                if (x != null)
+                    return (Object)x;
+                // else retry
+            }
+        }
+    }
+
+    /**
+     * Always returns <tt>true</tt>.
+     * A <tt>SynchronousQueue</tt> has no internal capacity.
+     *
+     * @return <tt>true</tt>
+     */
+    public boolean isEmpty() {
+        return true;
+    }
+
+    /**
+     * Always returns zero.
+     * A <tt>SynchronousQueue</tt> has no internal capacity.
+     *
+     * @return zero
+     */
+    public int size() {
+        return 0;
+    }
+
+    /**
+     * Always returns zero.
+     * A <tt>SynchronousQueue</tt> has no internal capacity.
+     *
+     * @return zero
+     */
+    public int remainingCapacity() {
+        return 0;
+    }
+
+    /**
+     * Does nothing.
+     * A <tt>SynchronousQueue</tt> has no internal capacity.
+     */
+    public void clear() {}
+
+    /**
+     * Always returns <tt>false</tt>.
+     * A <tt>SynchronousQueue</tt> has no internal capacity.
+     *
+     * @param o object to be checked for containment in this queue
+     * @return <tt>false</tt>
+     */
+    public boolean contains(Object o) {
+        return false;
+    }
+
+    /**
+     * Always returns <tt>false</tt>.
+     * A <tt>SynchronousQueue</tt> has no internal capacity.
+     *
+     * @param o the element to remove
+     * @return <tt>false</tt>
+     */
+    public boolean remove(Object o) {
+        return false;
+    }
+
+    /**
+     * Returns <tt>false</tt> unless the given collection is empty.
+     * A <tt>SynchronousQueue</tt> has no internal capacity.
+     *
+     * @param c the collection
+     * @return <tt>false</tt> unless the given collection is empty
+     * @throws NullPointerException if the specified collection is null
+     */
+    public boolean containsAll(Collection c) {
+        return c.isEmpty();
+    }
+
+    /**
+     * Always returns <tt>false</tt>.
+     * A <tt>SynchronousQueue</tt> has no internal capacity.
+     *
+     * @param c the collection
+     * @return <tt>false</tt>
+     */
+    public boolean removeAll(Collection c) {
+        return false;
+    }
+
+    /**
+     * Always returns <tt>false</tt>.
+     * A <tt>SynchronousQueue</tt> has no internal capacity.
+     *
+     * @param c the collection
+     * @return <tt>false</tt>
+     */
+    public boolean retainAll(Collection c) {
+        return false;
+    }
+
+    /**
+     * Always returns <tt>null</tt>.
+     * A <tt>SynchronousQueue</tt> does not return elements
+     * unless actively waited on.
+     *
+     * @return <tt>null</tt>
+     */
+    public Object peek() {
+        return null;
+    }
+
+
+    static class EmptyIterator implements Iterator {
+        public boolean hasNext() {
+            return false;
+        }
+        public Object next() {
+            throw new NoSuchElementException();
+        }
+        public void remove() {
+            throw new IllegalStateException();
+        }
+    }
+
+    /**
+     * Returns an empty iterator in which <tt>hasNext</tt> always returns
+     * <tt>false</tt>.
+     *
+     * @return an empty iterator
+     */
+    public Iterator iterator() {
+        return new EmptyIterator();
+    }
+
+
+    /**
+     * Returns a zero-length array.
+     * @return a zero-length array
+     */
+    public Object[] toArray() {
+        return new Object[0];
+    }
+
+    /**
+     * Sets the zeroeth element of the specified array to <tt>null</tt>
+     * (if the array has non-zero length) and returns it.
+     *
+     * @param a the array
+     * @return the specified array
+     * @throws NullPointerException if the specified array is null
+     */
+    public Object[] toArray(Object[] a) {
+        if (a.length > 0)
+            a[0] = null;
+        return a;
+    }
+
+    /**
+     * @throws UnsupportedOperationException {@inheritDoc}
+     * @throws ClassCastException            {@inheritDoc}
+     * @throws NullPointerException          {@inheritDoc}
+     * @throws IllegalArgumentException      {@inheritDoc}
+     */
+    public int drainTo(Collection c) {
+        if (c == null)
+            throw new NullPointerException();
+        if (c == this)
+            throw new IllegalArgumentException();
+        int n = 0;
+        Object e;
+        while ( (e = poll()) != null) {
+            c.add(e);
+            ++n;
+        }
+        return n;
+    }
+
+    /**
+     * @throws UnsupportedOperationException {@inheritDoc}
+     * @throws ClassCastException            {@inheritDoc}
+     * @throws NullPointerException          {@inheritDoc}
+     * @throws IllegalArgumentException      {@inheritDoc}
+     */
+    public int drainTo(Collection c, int maxElements) {
+        if (c == null)
+            throw new NullPointerException();
+        if (c == this)
+            throw new IllegalArgumentException();
+        int n = 0;
+        Object e;
+        while (n < maxElements && (e = poll()) != null) {
+            c.add(e);
+            ++n;
+        }
+        return n;
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ThreadFactory.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ThreadFactory.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ThreadFactory.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,40 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+
+/**
+ * An object that creates new threads on demand.  Using thread factories
+ * removes hardwiring of calls to {@link Thread#Thread(Runnable) new Thread},
+ * enabling applications to use special thread subclasses, priorities, etc.
+ *
+ * <p>
+ * The simplest implementation of this interface is just:
+ * <pre>
+ * class SimpleThreadFactory implements ThreadFactory {
+ *   public Thread newThread(Runnable r) {
+ *     return new Thread(r);
+ *   }
+ * }
+ * </pre>
+ *
+ * The {@link Executors#defaultThreadFactory} method provides a more
+ * useful simple implementation, that sets the created thread context
+ * to known values before returning it.
+ * @since 1.5
+ * @author Doug Lea
+ */
+public interface ThreadFactory {
+
+    /**
+     * Constructs a new <tt>Thread</tt>.  Implementations may also initialize
+     * priority, name, daemon status, <tt>ThreadGroup</tt>, etc.
+     *
+     * @param r a runnable to be executed by new thread instance
+     * @return constructed thread
+     */
+    Thread newThread(Runnable r);
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ThreadPoolExecutor.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ThreadPoolExecutor.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/ThreadPoolExecutor.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,1568 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Iterator;
+import java.util.Arrays;
+import java.util.ConcurrentModificationException;
+import edu.emory.mathcs.backport.java.util.concurrent.*; // for javadoc (till 6280605 is fixed)
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.Utils;
+
+/**
+ * An {@link ExecutorService} that executes each submitted task using
+ * one of possibly several pooled threads, normally configured
+ * using {@link Executors} factory methods.
+ *
+ * <p>Thread pools address two different problems: they usually
+ * provide improved performance when executing large numbers of
+ * asynchronous tasks, due to reduced per-task invocation overhead,
+ * and they provide a means of bounding and managing the resources,
+ * including threads, consumed when executing a collection of tasks.
+ * Each <tt>ThreadPoolExecutor</tt> also maintains some basic
+ * statistics, such as the number of completed tasks.
+ *
+ * <p>To be useful across a wide range of contexts, this class
+ * provides many adjustable parameters and extensibility
+ * hooks. However, programmers are urged to use the more convenient
+ * {@link Executors} factory methods {@link
+ * Executors#newCachedThreadPool} (unbounded thread pool, with
+ * automatic thread reclamation), {@link Executors#newFixedThreadPool}
+ * (fixed size thread pool) and {@link
+ * Executors#newSingleThreadExecutor} (single background thread), that
+ * preconfigure settings for the most common usage
+ * scenarios. Otherwise, use the following guide when manually
+ * configuring and tuning this class:
+ *
+ * <dl>
+ *
+ * <dt>Core and maximum pool sizes</dt>
+ *
+ * <dd>A <tt>ThreadPoolExecutor</tt> will automatically adjust the
+ * pool size
+ * (see {@link ThreadPoolExecutor#getPoolSize})
+ * according to the bounds set by corePoolSize
+ * (see {@link ThreadPoolExecutor#getCorePoolSize})
+ * and
+ * maximumPoolSize
+ * (see {@link ThreadPoolExecutor#getMaximumPoolSize}).
+ * When a new task is submitted in method {@link
+ * ThreadPoolExecutor#execute}, and fewer than corePoolSize threads
+ * are running, a new thread is created to handle the request, even if
+ * other worker threads are idle.  If there are more than
+ * corePoolSize but less than maximumPoolSize threads running, a new
+ * thread will be created only if the queue is full.  By setting
+ * corePoolSize and maximumPoolSize the same, you create a fixed-size
+ * thread pool. By setting maximumPoolSize to an essentially unbounded
+ * value such as <tt>Integer.MAX_VALUE</tt>, you allow the pool to
+ * accommodate an arbitrary number of concurrent tasks. Most typically,
+ * core and maximum pool sizes are set only upon construction, but they
+ * may also be changed dynamically using {@link
+ * ThreadPoolExecutor#setCorePoolSize} and {@link
+ * ThreadPoolExecutor#setMaximumPoolSize}. <dd>
+ *
+ * <dt> On-demand construction
+ *
+ * <dd> By default, even core threads are initially created and
+ * started only when new tasks arrive, but this can be overridden
+ * dynamically using method {@link
+ * ThreadPoolExecutor#prestartCoreThread} or
+ * {@link ThreadPoolExecutor#prestartAllCoreThreads}.
+ * You probably want to prestart threads if you construct the
+ * pool with a non-empty queue. </dd>
+ *
+ * <dt>Creating new threads</dt>
+ *
+ * <dd>New threads are created using a {@link
+ * edu.emory.mathcs.backport.java.util.concurrent.ThreadFactory}.  If not otherwise specified, a
+ * {@link Executors#defaultThreadFactory} is used, that creates threads to all
+ * be in the same {@link ThreadGroup} and with the same
+ * <tt>NORM_PRIORITY</tt> priority and non-daemon status. By supplying
+ * a different ThreadFactory, you can alter the thread's name, thread
+ * group, priority, daemon status, etc. If a <tt>ThreadFactory</tt> fails to create
+ * a thread when asked by returning null from <tt>newThread</tt>,
+ * the executor will continue, but might
+ * not be able to execute any tasks. </dd>
+ *
+ * <dt>Keep-alive times</dt>
+ *
+ * <dd>If the pool currently has more than corePoolSize threads,
+ * excess threads will be terminated if they have been idle for more
+ * than the keepAliveTime (see {@link
+ * ThreadPoolExecutor#getKeepAliveTime}). This provides a means of
+ * reducing resource consumption when the pool is not being actively
+ * used. If the pool becomes more active later, new threads will be
+ * constructed. This parameter can also be changed dynamically using
+ * method {@link ThreadPoolExecutor#setKeepAliveTime}. Using a value
+ * of <tt>Long.MAX_VALUE</tt> {@link TimeUnit#NANOSECONDS} effectively
+ * disables idle threads from ever terminating prior to shut down. By
+ * default, the keep-alive policy applies only when there are more
+ * than corePoolSizeThreads. But method {@link
+ * ThreadPoolExecutor#allowCoreThreadTimeOut} can be used to apply
+ * this time-out policy to core threads as well, so long as
+ * the keepAliveTime value is non-zero. </dd>
+ *
+ * <dt>Queuing</dt>
+ *
+ * <dd>Any {@link BlockingQueue} may be used to transfer and hold
+ * submitted tasks.  The use of this queue interacts with pool sizing:
+ *
+ * <ul>
+ *
+ * <li> If fewer than corePoolSize threads are running, the Executor
+ * always prefers adding a new thread
+ * rather than queuing.</li>
+ *
+ * <li> If corePoolSize or more threads are running, the Executor
+ * always prefers queuing a request rather than adding a new
+ * thread.</li>
+ *
+ * <li> If a request cannot be queued, a new thread is created unless
+ * this would exceed maximumPoolSize, in which case, the task will be
+ * rejected.</li>
+ *
+ * </ul>
+ *
+ * There are three general strategies for queuing:
+ * <ol>
+ *
+ * <li> <em> Direct handoffs.</em> A good default choice for a work
+ * queue is a {@link SynchronousQueue} that hands off tasks to threads
+ * without otherwise holding them. Here, an attempt to queue a task
+ * will fail if no threads are immediately available to run it, so a
+ * new thread will be constructed. This policy avoids lockups when
+ * handling sets of requests that might have internal dependencies.
+ * Direct handoffs generally require unbounded maximumPoolSizes to
+ * avoid rejection of new submitted tasks. This in turn admits the
+ * possibility of unbounded thread growth when commands continue to
+ * arrive on average faster than they can be processed.  </li>
+ *
+ * <li><em> Unbounded queues.</em> Using an unbounded queue (for
+ * example a {@link LinkedBlockingQueue} without a predefined
+ * capacity) will cause new tasks to wait in the queue when all
+ * corePoolSize threads are busy. Thus, no more than corePoolSize
+ * threads will ever be created. (And the value of the maximumPoolSize
+ * therefore doesn't have any effect.)  This may be appropriate when
+ * each task is completely independent of others, so tasks cannot
+ * affect each others execution; for example, in a web page server.
+ * While this style of queuing can be useful in smoothing out
+ * transient bursts of requests, it admits the possibility of
+ * unbounded work queue growth when commands continue to arrive on
+ * average faster than they can be processed.  </li>
+ *
+ * <li><em>Bounded queues.</em> A bounded queue (for example, an
+ * {@link ArrayBlockingQueue}) helps prevent resource exhaustion when
+ * used with finite maximumPoolSizes, but can be more difficult to
+ * tune and control.  Queue sizes and maximum pool sizes may be traded
+ * off for each other: Using large queues and small pools minimizes
+ * CPU usage, OS resources, and context-switching overhead, but can
+ * lead to artificially low throughput.  If tasks frequently block (for
+ * example if they are I/O bound), a system may be able to schedule
+ * time for more threads than you otherwise allow. Use of small queues
+ * generally requires larger pool sizes, which keeps CPUs busier but
+ * may encounter unacceptable scheduling overhead, which also
+ * decreases throughput.  </li>
+ *
+ * </ol>
+ *
+ * </dd>
+ *
+ * <dt>Rejected tasks</dt>
+ *
+ * <dd> New tasks submitted in method {@link
+ * ThreadPoolExecutor#execute} will be <em>rejected</em> when the
+ * Executor has been shut down, and also when the Executor uses finite
+ * bounds for both maximum threads and work queue capacity, and is
+ * saturated.  In either case, the <tt>execute</tt> method invokes the
+ * {@link RejectedExecutionHandler#rejectedExecution} method of its
+ * {@link RejectedExecutionHandler}.  Four predefined handler policies
+ * are provided:
+ *
+ * <ol>
+ *
+ * <li> In the
+ * default {@link ThreadPoolExecutor.AbortPolicy}, the handler throws a
+ * runtime {@link RejectedExecutionException} upon rejection. </li>
+ *
+ * <li> In {@link
+ * ThreadPoolExecutor.CallerRunsPolicy}, the thread that invokes
+ * <tt>execute</tt> itself runs the task. This provides a simple
+ * feedback control mechanism that will slow down the rate that new
+ * tasks are submitted. </li>
+ *
+ * <li> In {@link ThreadPoolExecutor.DiscardPolicy},
+ * a task that cannot be executed is simply dropped.  </li>
+ *
+ * <li>In {@link
+ * ThreadPoolExecutor.DiscardOldestPolicy}, if the executor is not
+ * shut down, the task at the head of the work queue is dropped, and
+ * then execution is retried (which can fail again, causing this to be
+ * repeated.) </li>
+ *
+ * </ol>
+ *
+ * It is possible to define and use other kinds of {@link
+ * RejectedExecutionHandler} classes. Doing so requires some care
+ * especially when policies are designed to work only under particular
+ * capacity or queuing policies. </dd>
+ *
+ * <dt>Hook methods</dt>
+ *
+ * <dd>This class provides <tt>protected</tt> overridable {@link
+ * ThreadPoolExecutor#beforeExecute} and {@link
+ * ThreadPoolExecutor#afterExecute} methods that are called before and
+ * after execution of each task.  These can be used to manipulate the
+ * execution environment; for example, reinitializing ThreadLocals,
+ * gathering statistics, or adding log entries. Additionally, method
+ * {@link ThreadPoolExecutor#terminated} can be overridden to perform
+ * any special processing that needs to be done once the Executor has
+ * fully terminated.
+ *
+ * <p>If hook or callback methods throw
+ * exceptions, internal worker threads may in turn fail and
+ * abruptly terminate.</dd>
+ *
+ * <dt>Queue maintenance</dt>
+ *
+ * <dd> Method {@link ThreadPoolExecutor#getQueue} allows access to
+ * the work queue for purposes of monitoring and debugging.  Use of
+ * this method for any other purpose is strongly discouraged.  Two
+ * supplied methods, {@link ThreadPoolExecutor#remove} and {@link
+ * ThreadPoolExecutor#purge} are available to assist in storage
+ * reclamation when large numbers of queued tasks become
+ * cancelled.</dd>
+ *
+ * <dt>Finalization</dt>
+ *
+ * <dd> A pool that is no longer referenced in a program <em>AND</em>
+ * has no remaining threads will be <tt>shutdown</tt>
+ * automatically. If you would like to ensure that unreferenced pools
+ * are reclaimed even if users forget to call {@link
+ * ThreadPoolExecutor#shutdown}, then you must arrange that unused
+ * threads eventually die, by setting appropriate keep-alive times,
+ * using a lower bound of zero core threads and/or setting {@link
+ * ThreadPoolExecutor#allowCoreThreadTimeOut}.  </dd> </dl>
+ *
+ * <p> <b>Extension example</b>. Most extensions of this class
+ * override one or more of the protected hook methods. For example,
+ * here is a subclass that adds a simple pause/resume feature:
+ *
+ * <pre>
+ * class PausableThreadPoolExecutor extends ThreadPoolExecutor {
+ *   private boolean isPaused;
+ *   private ReentrantLock pauseLock = new ReentrantLock();
+ *   private Condition unpaused = pauseLock.newCondition();
+ *
+ *   public PausableThreadPoolExecutor(...) { super(...); }
+ *
+ *   protected void beforeExecute(Thread t, Runnable r) {
+ *     super.beforeExecute(t, r);
+ *     pauseLock.lock();
+ *     try {
+ *       while (isPaused) unpaused.await();
+ *     } catch (InterruptedException ie) {
+ *       t.interrupt();
+ *     } finally {
+ *       pauseLock.unlock();
+ *     }
+ *   }
+ *
+ *   public void pause() {
+ *     pauseLock.lock();
+ *     try {
+ *       isPaused = true;
+ *     } finally {
+ *       pauseLock.unlock();
+ *     }
+ *   }
+ *
+ *   public void resume() {
+ *     pauseLock.lock();
+ *     try {
+ *       isPaused = false;
+ *       unpaused.signalAll();
+ *     } finally {
+ *       pauseLock.unlock();
+ *     }
+ *   }
+ * }
+ * </pre>
+ * @since 1.5
+ * @author Doug Lea
+ */
+public class ThreadPoolExecutor extends AbstractExecutorService {
+    /**
+     * Only used to force toArray() to produce a Runnable[].
+     */
+    private static final Runnable[] EMPTY_RUNNABLE_ARRAY = new Runnable[0];
+
+    /**
+     * Permission for checking shutdown
+     */
+    private static final RuntimePermission shutdownPerm =
+        new RuntimePermission("modifyThread");
+
+    /**
+     * Queue used for holding tasks and handing off to worker threads.
+     */
+    private final BlockingQueue workQueue;
+
+    /**
+     * Lock held on updates to poolSize, corePoolSize, maximumPoolSize, and
+     * workers set.
+     */
+    private final Object mainLock = new Object();
+
+    /**
+     * Set containing all worker threads in pool.
+     */
+    private final HashSet workers = new HashSet();
+
+    /**
+     * Timeout in nanoseconds for idle threads waiting for work.
+     * Threads use this timeout only when there are more than
+     * corePoolSize present. Otherwise they wait forever for new work.
+     */
+    private volatile long  keepAliveTime;
+
+    /**
+     * If false (default) core threads stay alive even when idle.
+     * If true, core threads use keepAliveTime to time out waiting for work.
+     */
+    private boolean allowCoreThreadTimeOut;
+
+    /**
+     * Core pool size, updated only while holding mainLock,
+     * but volatile to allow concurrent readability even
+     * during updates.
+     */
+    private volatile int   corePoolSize;
+
+    /**
+     * Maximum pool size, updated only while holding mainLock
+     * but volatile to allow concurrent readability even
+     * during updates.
+     */
+    private volatile int   maximumPoolSize;
+
+    /**
+     * Current pool size, updated only while holding mainLock
+     * but volatile to allow concurrent readability even
+     * during updates.
+     */
+    private volatile int   poolSize;
+
+    /**
+     * Lifecycle state
+     */
+    volatile int runState;
+
+    // Special values for runState
+    /** Normal, not-shutdown mode */
+    static final int RUNNING    = 0;
+    /** Controlled shutdown mode */
+    static final int SHUTDOWN   = 1;
+    /** Immediate shutdown mode */
+    static final int STOP       = 2;
+    /** Final state */
+    static final int TERMINATED = 3;
+
+    /**
+     * Handler called when saturated or shutdown in execute.
+     */
+    private volatile RejectedExecutionHandler handler;
+
+    /**
+     * Factory for new threads.
+     */
+    private volatile ThreadFactory threadFactory;
+
+    /**
+     * Tracks largest attained pool size.
+     */
+    private int largestPoolSize;
+
+    /**
+     * Counter for completed tasks. Updated only on termination of
+     * worker threads.
+     */
+    private long completedTaskCount;
+
+    /**
+     * The default rejected execution handler
+     */
+    private static final RejectedExecutionHandler defaultHandler =
+        new AbortPolicy();
+
+    /**
+     * Invokes the rejected execution handler for the given command.
+     */
+    void reject(Runnable command) {
+        handler.rejectedExecution(command, this);
+    }
+
+    /**
+     * Creates and returns a new thread running firstTask as its first
+     * task. Call only while holding mainLock.
+     * @param firstTask the task the new thread should run first (or
+     * null if none)
+     * @return the new thread, or null if threadFactory fails to create thread
+     */
+    private Thread addThread(Runnable firstTask) {
+        Worker w = new Worker(firstTask);
+        Thread t = threadFactory.newThread(w);
+        if (t != null) {
+            w.thread = t;
+            workers.add(w);
+            int nt = ++poolSize;
+            if (nt > largestPoolSize)
+                largestPoolSize = nt;
+        }
+        return t;
+    }
+
+    /**
+     * Creates and starts a new thread running firstTask as its first
+     * task, only if fewer than corePoolSize threads are running.
+     * @param firstTask the task the new thread should run first (or
+     * null if none)
+     * @return true if successful.
+     */
+    private boolean addIfUnderCorePoolSize(Runnable firstTask) {
+        Thread t = null;
+        synchronized (mainLock) {
+            if (poolSize < corePoolSize)
+                t = addThread(firstTask);
+        }
+        if (t == null)
+            return false;
+        t.start();
+        return true;
+    }
+
+    /**
+     * Creates and starts a new thread only if fewer than maximumPoolSize
+     * threads are running.  The new thread runs as its first task the
+     * next task in queue, or if there is none, the given task.
+     * @param firstTask the task the new thread should run first (or
+     * null if none)
+     * @return 0 if a new thread cannot be created, a positive number
+     * if firstTask will be run in a new thread, or a negative number
+     * if a new thread was created but is running some other task, in
+     * which case the caller must try some other way to run firstTask
+     * (perhaps by calling this method again).
+     */
+    private int addIfUnderMaximumPoolSize(Runnable firstTask) {
+        Thread t = null;
+        int status = 0;
+        synchronized (mainLock) {
+            if (poolSize < maximumPoolSize) {
+                Runnable next = (Runnable)workQueue.poll();
+                if (next == null) {
+                    next = firstTask;
+                    status = 1;
+                } else
+                    status = -1;
+                t = addThread(next);
+            }
+        }
+        if (t == null)
+            return 0;
+        t.start();
+        return status;
+    }
+
+
+    /**
+     * Gets the next task for a worker thread to run.
+     * @return the task
+     */
+    Runnable getTask() {
+        for (;;) {
+            try {
+                switch (runState) {
+                case RUNNING: {
+                    // untimed wait if core and not allowing core timeout
+                    if (poolSize <= corePoolSize && !allowCoreThreadTimeOut)
+                        return (Runnable)workQueue.take();
+
+                    long timeout = keepAliveTime;
+                    if (timeout <= 0) // die immediately for 0 timeout
+                        return null;
+                    Runnable r = (Runnable)workQueue.poll(timeout, TimeUnit.NANOSECONDS);
+                    if (r != null)
+                        return r;
+                    if (poolSize > corePoolSize || allowCoreThreadTimeOut)
+                        return null; // timed out
+                    // Else, after timeout, the pool shrank. Retry
+                    break;
+                }
+
+                case SHUTDOWN: {
+                    // Help drain queue
+                    Runnable r = (Runnable)workQueue.poll();
+                    if (r != null)
+                        return r;
+
+                    // Check if can terminate
+                    if (workQueue.isEmpty()) {
+                        interruptIdleWorkers();
+                        return null;
+                    }
+
+                    // Else there could still be delayed tasks in queue.
+                    return (Runnable)workQueue.take();
+                }
+
+                case STOP:
+                    return null;
+                default:
+                    assert false;
+                }
+            } catch (InterruptedException ie) {
+                // On interruption, re-check runstate
+            }
+        }
+    }
+
+    /**
+     * Wakes up all threads that might be waiting for tasks.
+     */
+    void interruptIdleWorkers() {
+        synchronized (mainLock) {
+            for (Iterator itr = workers.iterator(); itr.hasNext();) {
+                Worker w = (Worker)itr.next();
+                w.interruptIfIdle();
+            }
+        }
+    }
+
+    /**
+     * Performs bookkeeping for a terminated worker thread.
+     * @param w the worker
+     */
+    void workerDone(Worker w) {
+        synchronized (mainLock) {
+            completedTaskCount += w.completedTasks;
+            workers.remove(w);
+            if (--poolSize > 0)
+                return;
+
+            // Else, this is the last thread. Deal with potential shutdown.
+
+            int state = runState;
+            assert state != TERMINATED;
+
+            if (state != STOP) {
+                // If there are queued tasks but no threads, create
+                // replacement thread. We must create it initially
+                // idle to avoid orphaned tasks in case addThread
+                // fails.  This also handles case of delayed tasks
+                // that will sometime later become runnable.
+                if (!workQueue.isEmpty()) {
+                    Thread t = addThread(null);
+                    if (t != null)
+                        t.start();
+                    return;
+                }
+
+                // Otherwise, we can exit without replacement
+                if (state == RUNNING)
+                    return;
+            }
+
+            // Either state is STOP, or state is SHUTDOWN and there is
+            // no work to do. So we can terminate.
+            mainLock.notifyAll();
+            runState = TERMINATED;
+            // fall through to call terminate() outside of lock.
+        }
+
+        assert runState == TERMINATED;
+        terminated();
+    }
+
+    /**
+     *  Worker threads
+     */
+    private class Worker implements Runnable {
+
+        /**
+         * The runLock is acquired and released surrounding each task
+         * execution. It mainly protects against interrupts that are
+         * intended to cancel the worker thread from instead
+         * interrupting the task being run.
+         */
+        private final ReentrantLock runLock = new ReentrantLock();
+
+        /**
+         * Initial task to run before entering run loop
+         */
+        private Runnable firstTask;
+
+        /**
+         * Per thread completed task counter; accumulated
+         * into completedTaskCount upon termination.
+         */
+        volatile long completedTasks;
+
+        /**
+         * Thread this worker is running in.  Acts as a final field,
+         * but cannot be set until thread is created.
+         */
+        Thread thread;
+
+        Worker(Runnable firstTask) {
+            this.firstTask = firstTask;
+        }
+
+        boolean isActive() {
+            return runLock.isLocked();
+        }
+
+        /**
+         * Interrupts thread if not running a task.
+         */
+        void interruptIfIdle() {
+            final ReentrantLock runLock = this.runLock;
+            if (runLock.tryLock()) {
+                try {
+                    thread.interrupt();
+                } finally {
+                    runLock.unlock();
+                }
+            }
+        }
+
+        /**
+         * Interrupts thread even if running a task.
+         */
+        void interruptNow() {
+            thread.interrupt();
+        }
+
+        /**
+         * Runs a single task between before/after methods.
+         */
+        private void runTask(Runnable task) {
+            final ReentrantLock runLock = this.runLock;
+            runLock.lock();
+            try {
+                // If not shutting down then clear an outstanding interrupt.
+                if (runState != STOP &&
+                    Thread.interrupted() &&
+                    runState == STOP) // Re-interrupt if stopped after clearing
+                    thread.interrupt();
+                boolean ran = false;
+                beforeExecute(thread, task);
+                try {
+                    task.run();
+                    ran = true;
+                    afterExecute(task, null);
+                    ++completedTasks;
+                } catch (RuntimeException ex) {
+                    if (!ran)
+                        afterExecute(task, ex);
+                    // Else the exception occurred within
+                    // afterExecute itself in which case we don't
+                    // want to call it again.
+                    throw ex;
+                }
+            } finally {
+                runLock.unlock();
+            }
+        }
+
+        /**
+         * Main run loop
+         */
+        public void run() {
+            try {
+                Runnable task = firstTask;
+                firstTask = null;
+                while (task != null || (task = getTask()) != null) {
+                    runTask(task);
+                    task = null; // unnecessary but can help GC
+                }
+            } finally {
+                workerDone(this);
+            }
+        }
+    }
+
+    // Public methods
+
+    /**
+     * Creates a new <tt>ThreadPoolExecutor</tt> with the given initial
+     * parameters and default thread factory and rejected execution handler.
+     * It may be more convenient to use one of the {@link Executors} factory
+     * methods instead of this general purpose constructor.
+     *
+     * @param corePoolSize the number of threads to keep in the
+     * pool, even if they are idle.
+     * @param maximumPoolSize the maximum number of threads to allow in the
+     * pool.
+     * @param keepAliveTime when the number of threads is greater than
+     * the core, this is the maximum time that excess idle threads
+     * will wait for new tasks before terminating.
+     * @param unit the time unit for the keepAliveTime
+     * argument.
+     * @param workQueue the queue to use for holding tasks before they
+     * are executed. This queue will hold only the <tt>Runnable</tt>
+     * tasks submitted by the <tt>execute</tt> method.
+     * @throws IllegalArgumentException if corePoolSize, or
+     * keepAliveTime less than zero, or if maximumPoolSize less than or
+     * equal to zero, or if corePoolSize greater than maximumPoolSize.
+     * @throws NullPointerException if <tt>workQueue</tt> is null
+     */
+    public ThreadPoolExecutor(int corePoolSize,
+                              int maximumPoolSize,
+                              long keepAliveTime,
+                              TimeUnit unit,
+                              BlockingQueue workQueue) {
+        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
+             Executors.defaultThreadFactory(), defaultHandler);
+    }
+
+    /**
+     * Creates a new <tt>ThreadPoolExecutor</tt> with the given initial
+     * parameters and default rejected execution handler.
+     *
+     * @param corePoolSize the number of threads to keep in the
+     * pool, even if they are idle.
+     * @param maximumPoolSize the maximum number of threads to allow in the
+     * pool.
+     * @param keepAliveTime when the number of threads is greater than
+     * the core, this is the maximum time that excess idle threads
+     * will wait for new tasks before terminating.
+     * @param unit the time unit for the keepAliveTime
+     * argument.
+     * @param workQueue the queue to use for holding tasks before they
+     * are executed. This queue will hold only the <tt>Runnable</tt>
+     * tasks submitted by the <tt>execute</tt> method.
+     * @param threadFactory the factory to use when the executor
+     * creates a new thread.
+     * @throws IllegalArgumentException if corePoolSize, or
+     * keepAliveTime less than zero, or if maximumPoolSize less than or
+     * equal to zero, or if corePoolSize greater than maximumPoolSize.
+     * @throws NullPointerException if <tt>workQueue</tt>
+     * or <tt>threadFactory</tt> are null.
+     */
+    public ThreadPoolExecutor(int corePoolSize,
+                              int maximumPoolSize,
+                              long keepAliveTime,
+                              TimeUnit unit,
+                              BlockingQueue workQueue,
+                              ThreadFactory threadFactory) {
+        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
+             threadFactory, defaultHandler);
+    }
+
+    /**
+     * Creates a new <tt>ThreadPoolExecutor</tt> with the given initial
+     * parameters and default thread factory.
+     *
+     * @param corePoolSize the number of threads to keep in the
+     * pool, even if they are idle.
+     * @param maximumPoolSize the maximum number of threads to allow in the
+     * pool.
+     * @param keepAliveTime when the number of threads is greater than
+     * the core, this is the maximum time that excess idle threads
+     * will wait for new tasks before terminating.
+     * @param unit the time unit for the keepAliveTime
+     * argument.
+     * @param workQueue the queue to use for holding tasks before they
+     * are executed. This queue will hold only the <tt>Runnable</tt>
+     * tasks submitted by the <tt>execute</tt> method.
+     * @param handler the handler to use when execution is blocked
+     * because the thread bounds and queue capacities are reached.
+     * @throws IllegalArgumentException if corePoolSize, or
+     * keepAliveTime less than zero, or if maximumPoolSize less than or
+     * equal to zero, or if corePoolSize greater than maximumPoolSize.
+     * @throws NullPointerException if <tt>workQueue</tt>
+     * or <tt>handler</tt> are null.
+     */
+    public ThreadPoolExecutor(int corePoolSize,
+                              int maximumPoolSize,
+                              long keepAliveTime,
+                              TimeUnit unit,
+                              BlockingQueue workQueue,
+                              RejectedExecutionHandler handler) {
+        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
+             Executors.defaultThreadFactory(), handler);
+    }
+
+    /**
+     * Creates a new <tt>ThreadPoolExecutor</tt> with the given initial
+     * parameters.
+     *
+     * @param corePoolSize the number of threads to keep in the
+     * pool, even if they are idle.
+     * @param maximumPoolSize the maximum number of threads to allow in the
+     * pool.
+     * @param keepAliveTime when the number of threads is greater than
+     * the core, this is the maximum time that excess idle threads
+     * will wait for new tasks before terminating.
+     * @param unit the time unit for the keepAliveTime
+     * argument.
+     * @param workQueue the queue to use for holding tasks before they
+     * are executed. This queue will hold only the <tt>Runnable</tt>
+     * tasks submitted by the <tt>execute</tt> method.
+     * @param threadFactory the factory to use when the executor
+     * creates a new thread.
+     * @param handler the handler to use when execution is blocked
+     * because the thread bounds and queue capacities are reached.
+     * @throws IllegalArgumentException if corePoolSize, or
+     * keepAliveTime less than zero, or if maximumPoolSize less than or
+     * equal to zero, or if corePoolSize greater than maximumPoolSize.
+     * @throws NullPointerException if <tt>workQueue</tt>
+     * or <tt>threadFactory</tt> or <tt>handler</tt> are null.
+     */
+    public ThreadPoolExecutor(int corePoolSize,
+                              int maximumPoolSize,
+                              long keepAliveTime,
+                              TimeUnit unit,
+                              BlockingQueue workQueue,
+                              ThreadFactory threadFactory,
+                              RejectedExecutionHandler handler) {
+        if (corePoolSize < 0 ||
+            maximumPoolSize <= 0 ||
+            maximumPoolSize < corePoolSize ||
+            keepAliveTime < 0)
+            throw new IllegalArgumentException();
+        if (workQueue == null || threadFactory == null || handler == null)
+            throw new NullPointerException();
+        this.corePoolSize = corePoolSize;
+        this.maximumPoolSize = maximumPoolSize;
+        this.workQueue = workQueue;
+        this.keepAliveTime = unit.toNanos(keepAliveTime);
+        this.threadFactory = threadFactory;
+        this.handler = handler;
+    }
+
+
+    /**
+     * Executes the given task sometime in the future.  The task
+     * may execute in a new thread or in an existing pooled thread.
+     *
+     * If the task cannot be submitted for execution, either because this
+     * executor has been shutdown or because its capacity has been reached,
+     * the task is handled by the current <tt>RejectedExecutionHandler</tt>.
+     *
+     * @param command the task to execute
+     * @throws RejectedExecutionException at discretion of
+     * <tt>RejectedExecutionHandler</tt>, if task cannot be accepted
+     * for execution
+     * @throws NullPointerException if command is null
+     */
+    public void execute(Runnable command) {
+        if (command == null)
+            throw new NullPointerException();
+        for (;;) {
+            if (runState != RUNNING) {
+                reject(command);
+                return;
+            }
+            if (poolSize < corePoolSize && addIfUnderCorePoolSize(command))
+                return;
+            if (workQueue.offer(command))
+                return;
+            int status = addIfUnderMaximumPoolSize(command);
+            if (status > 0)      // created new thread
+                return;
+            if (status == 0) {   // failed to create thread
+                reject(command);
+                return;
+            }
+            // Retry if created a new thread but it is busy with another task
+        }
+    }
+
+    /**
+     * Initiates an orderly shutdown in which previously submitted
+     * tasks are executed, but no new tasks will be
+     * accepted. Invocation has no additional effect if already shut
+     * down.
+     * @throws SecurityException if a security manager exists and
+     * shutting down this ExecutorService may manipulate threads that
+     * the caller is not permitted to modify because it does not hold
+     * {@link java.lang.RuntimePermission}<tt>("modifyThread")</tt>,
+     * or the security manager's <tt>checkAccess</tt> method denies access.
+     */
+    public void shutdown() {
+        // Fail if caller doesn't have modifyThread permission.
+        SecurityManager security = System.getSecurityManager();
+        if (security != null)
+            security.checkPermission(shutdownPerm);
+
+        boolean fullyTerminated = false;
+        synchronized (mainLock) {
+            if (workers.size() > 0) {
+                // Check if caller can modify worker threads.  This
+                // might not be true even if passed above check, if
+                // the SecurityManager treats some threads specially.
+                if (security != null) {
+                    for (Iterator itr = workers.iterator(); itr.hasNext();) {
+                        Worker w = (Worker)itr.next();
+                        security.checkAccess(w.thread);
+                    }
+                }
+
+                int state = runState;
+                if (state == RUNNING) // don't override shutdownNow
+                    runState = SHUTDOWN;
+
+                try {
+                    for (Iterator itr = workers.iterator(); itr.hasNext();) {
+                        Worker w = (Worker)itr.next();
+                        w.interruptIfIdle();
+                    }
+                } catch (SecurityException se) {
+                    // If SecurityManager allows above checks, but
+                    // then unexpectedly throws exception when
+                    // interrupting threads (which it ought not do),
+                    // back out as cleanly as we can. Some threads may
+                    // have been killed but we remain in non-shutdown
+                    // state.
+                    runState = state;
+                    throw se;
+                }
+            }
+            else { // If no workers, trigger full termination now
+                fullyTerminated = true;
+                runState = TERMINATED;
+                mainLock.notifyAll();
+            }
+        }
+        if (fullyTerminated)
+            terminated();
+    }
+
+
+    /**
+     * Attempts to stop all actively executing tasks, halts the
+     * processing of waiting tasks, and returns a list of the tasks
+     * that were awaiting execution.
+     *
+     * <p>There are no guarantees beyond best-effort attempts to stop
+     * processing actively executing tasks.  This implementation
+     * cancels tasks via {@link Thread#interrupt}, so any task that
+     * fails to respond to interrupts may never terminate.
+     *
+     * @return list of tasks that never commenced execution
+     * @throws SecurityException if a security manager exists and
+     * shutting down this ExecutorService may manipulate threads that
+     * the caller is not permitted to modify because it does not hold
+     * {@link java.lang.RuntimePermission}<tt>("modifyThread")</tt>,
+     * or the security manager's <tt>checkAccess</tt> method denies access.
+     */
+    public List shutdownNow() {
+        // Almost the same code as shutdown()
+        SecurityManager security = System.getSecurityManager();
+        if (security != null)
+            security.checkPermission(shutdownPerm);
+
+        boolean fullyTerminated = false;
+        synchronized (mainLock) {
+            if (workers.size() > 0) {
+                if (security != null) {
+                    for (Iterator itr = workers.iterator(); itr.hasNext();) {
+                        Worker w = (Worker)itr.next();
+                        security.checkAccess(w.thread);
+                    }
+                }
+
+                int state = runState;
+                if (state != TERMINATED)
+                    runState = STOP;
+                try {
+                    for (Iterator itr = workers.iterator(); itr.hasNext();) {
+                        Worker w = (Worker)itr.next();
+                        w.interruptNow();
+                    }
+                } catch (SecurityException se) {
+                    runState = state; // back out;
+                    throw se;
+                }
+            }
+            else { // If no workers, trigger full termination now
+                fullyTerminated = true;
+                runState = TERMINATED;
+                mainLock.notifyAll();
+            }
+        }
+        if (fullyTerminated)
+            terminated();
+        return Arrays.asList(workQueue.toArray(EMPTY_RUNNABLE_ARRAY));
+    }
+
+    public boolean isShutdown() {
+        return runState != RUNNING;
+    }
+
+    /**
+     * Returns true if this executor is in the process of terminating
+     * after <tt>shutdown</tt> or <tt>shutdownNow</tt> but has not
+     * completely terminated.  This method may be useful for
+     * debugging. A return of <tt>true</tt> reported a sufficient
+     * period after shutdown may indicate that submitted tasks have
+     * ignored or suppressed interruption, causing this executor not
+     * to properly terminate.
+     * @return true if terminating but not yet terminated.
+     */
+    public boolean isTerminating() {
+        return runState == STOP;
+    }
+
+    public boolean isTerminated() {
+        return runState == TERMINATED;
+    }
+
+    public boolean awaitTermination(long timeout, TimeUnit unit)
+        throws InterruptedException {
+        long nanos = unit.toNanos(timeout);
+        synchronized (mainLock) {
+            long deadline = Utils.nanoTime() + nanos;
+            for (;;) {
+                if (runState == TERMINATED)
+                    return true;
+                if (nanos <= 0)
+                    return false;
+                TimeUnit.NANOSECONDS.timedWait(mainLock, nanos);
+                nanos = deadline - Utils.nanoTime();
+            }
+        }
+    }
+
+    /**
+     * Invokes <tt>shutdown</tt> when this executor is no longer
+     * referenced.
+     */
+    protected void finalize()  {
+        shutdown();
+    }
+
+    /**
+     * Sets the thread factory used to create new threads.
+     *
+     * @param threadFactory the new thread factory
+     * @throws NullPointerException if threadFactory is null
+     * @see #getThreadFactory
+     */
+    public void setThreadFactory(ThreadFactory threadFactory) {
+        if (threadFactory == null)
+            throw new NullPointerException();
+        this.threadFactory = threadFactory;
+    }
+
+    /**
+     * Returns the thread factory used to create new threads.
+     *
+     * @return the current thread factory
+     * @see #setThreadFactory
+     */
+    public ThreadFactory getThreadFactory() {
+        return threadFactory;
+    }
+
+    /**
+     * Sets a new handler for unexecutable tasks.
+     *
+     * @param handler the new handler
+     * @throws NullPointerException if handler is null
+     * @see #getRejectedExecutionHandler
+     */
+    public void setRejectedExecutionHandler(RejectedExecutionHandler handler) {
+        if (handler == null)
+            throw new NullPointerException();
+        this.handler = handler;
+    }
+
+    /**
+     * Returns the current handler for unexecutable tasks.
+     *
+     * @return the current handler
+     * @see #setRejectedExecutionHandler
+     */
+    public RejectedExecutionHandler getRejectedExecutionHandler() {
+        return handler;
+    }
+
+    /**
+     * Returns the task queue used by this executor. Access to the
+     * task queue is intended primarily for debugging and monitoring.
+     * This queue may be in active use.  Retrieving the task queue
+     * does not prevent queued tasks from executing.
+     *
+     * @return the task queue
+     */
+    public BlockingQueue getQueue() {
+        return workQueue;
+    }
+
+    /**
+     * Removes this task from the executor's internal queue if it is
+     * present, thus causing it not to be run if it has not already
+     * started.
+     *
+     * <p> This method may be useful as one part of a cancellation
+     * scheme.  It may fail to remove tasks that have been converted
+     * into other forms before being placed on the internal queue. For
+     * example, a task entered using <tt>submit</tt> might be
+     * converted into a form that maintains <tt>Future</tt> status.
+     * However, in such cases, method {@link ThreadPoolExecutor#purge}
+     * may be used to remove those Futures that have been cancelled.
+     *
+     * @param task the task to remove
+     * @return true if the task was removed
+     */
+    public boolean remove(Runnable task) {
+        return getQueue().remove(task);
+    }
+
+
+    /**
+     * Tries to remove from the work queue all {@link Future}
+     * tasks that have been cancelled. This method can be useful as a
+     * storage reclamation operation, that has no other impact on
+     * functionality. Cancelled tasks are never executed, but may
+     * accumulate in work queues until worker threads can actively
+     * remove them. Invoking this method instead tries to remove them now.
+     * However, this method may fail to remove tasks in
+     * the presence of interference by other threads.
+     */
+    public void purge() {
+        // Fail if we encounter interference during traversal
+        try {
+            Iterator it = getQueue().iterator();
+            while (it.hasNext()) {
+                Runnable r = (Runnable)it.next();
+                if (r instanceof Future) {
+                    Future c = (Future)r;
+                    if (c.isCancelled())
+                        it.remove();
+                }
+            }
+        }
+        catch (ConcurrentModificationException ex) {
+            return;
+        }
+    }
+
+    /**
+     * Sets the core number of threads.  This overrides any value set
+     * in the constructor.  If the new value is smaller than the
+     * current value, excess existing threads will be terminated when
+     * they next become idle. If larger, new threads will, if needed,
+     * be started to execute any queued tasks.
+     *
+     * @param corePoolSize the new core size
+     * @throws IllegalArgumentException if <tt>corePoolSize</tt>
+     * less than zero
+     * @see #getCorePoolSize
+     */
+    public void setCorePoolSize(int corePoolSize) {
+        if (corePoolSize < 0)
+            throw new IllegalArgumentException();
+        synchronized (mainLock) {
+            int extra = this.corePoolSize - corePoolSize;
+            this.corePoolSize = corePoolSize;
+            if (extra < 0) {
+                int n = workQueue.size();
+                // We have to create initially-idle threads here
+                // because we otherwise have no recourse about
+                // what to do with a dequeued task if addThread fails.
+                while (extra++ < 0 && n-- > 0 && poolSize < corePoolSize ) {
+                    Thread t = addThread(null);
+                    if (t != null)
+                        t.start();
+                    else
+                        break;
+                }
+            }
+            else if (extra > 0 && poolSize > corePoolSize) {
+                Iterator it = workers.iterator();
+                while (it.hasNext() &&
+                       extra-- > 0 &&
+                       poolSize > corePoolSize &&
+                       workQueue.remainingCapacity() == 0)
+                    ((Worker)it.next()).interruptIfIdle();
+            }
+        }
+    }
+
+    /**
+     * Returns the core number of threads.
+     *
+     * @return the core number of threads
+     * @see #setCorePoolSize
+     */
+    public int getCorePoolSize() {
+        return corePoolSize;
+    }
+
+    /**
+     * Starts a core thread, causing it to idly wait for work. This
+     * overrides the default policy of starting core threads only when
+     * new tasks are executed. This method will return <tt>false</tt>
+     * if all core threads have already been started.
+     * @return true if a thread was started
+     */
+    public boolean prestartCoreThread() {
+        return addIfUnderCorePoolSize(null);
+    }
+
+    /**
+     * Starts all core threads, causing them to idly wait for work. This
+     * overrides the default policy of starting core threads only when
+     * new tasks are executed.
+     * @return the number of threads started.
+     */
+    public int prestartAllCoreThreads() {
+        int n = 0;
+        while (addIfUnderCorePoolSize(null))
+            ++n;
+        return n;
+    }
+
+    /**
+     * Returns true if this pool allows core threads to time out and
+     * terminate if no tasks arrive within the keepAlive time, being
+     * replaced if needed when new tasks arrive. When true, the same
+     * keep-alive policy applying to non-core threads applies also to
+     * core threads. When false (the default), core threads are never
+     * terminated due to lack of incoming tasks.
+     * @return <tt>true</tt> if core threads are allowed to time out,
+     * else <tt>false</tt>
+     *
+     * @since 1.6
+     */
+    public boolean allowsCoreThreadTimeOut() {
+        return allowCoreThreadTimeOut;
+    }
+
+    /**
+     * Sets the policy governing whether core threads may time out and
+     * terminate if no tasks arrive within the keep-alive time, being
+     * replaced if needed when new tasks arrive. When false, core
+     * threads are never terminated due to lack of incoming
+     * tasks. When true, the same keep-alive policy applying to
+     * non-core threads applies also to core threads. To avoid
+     * continual thread replacement, the keep-alive time must be
+     * greater than zero when setting <tt>true</tt>. This method
+     * should in general be called before the pool is actively used.
+     * @param value <tt>true</tt> if should time out, else <tt>false</tt>
+     * @throws IllegalArgumentException if value is <tt>true</tt>
+     * and the current keep-alive time is not greater than zero.
+     *
+     * @since 1.6
+     */
+    public void allowCoreThreadTimeOut(boolean value) {
+        if (value && keepAliveTime <= 0)
+            throw new IllegalArgumentException("Core threads must have nonzero keep alive times");
+
+        allowCoreThreadTimeOut = value;
+    }
+
+    /**
+     * Sets the maximum allowed number of threads. This overrides any
+     * value set in the constructor. If the new value is smaller than
+     * the current value, excess existing threads will be
+     * terminated when they next become idle.
+     *
+     * @param maximumPoolSize the new maximum
+     * @throws IllegalArgumentException if maximumPoolSize less than zero or
+     * the {@link #getCorePoolSize core pool size}
+     * @see #getMaximumPoolSize
+     */
+    public void setMaximumPoolSize(int maximumPoolSize) {
+        if (maximumPoolSize <= 0 || maximumPoolSize < corePoolSize)
+            throw new IllegalArgumentException();
+        synchronized (mainLock) {
+            int extra = this.maximumPoolSize - maximumPoolSize;
+            this.maximumPoolSize = maximumPoolSize;
+            if (extra > 0 && poolSize > maximumPoolSize) {
+                Iterator it = workers.iterator();
+                while (it.hasNext() &&
+                       extra > 0 &&
+                       poolSize > maximumPoolSize) {
+                    ((Worker)it.next()).interruptIfIdle();
+                    --extra;
+                }
+            }
+        }
+    }
+
+    /**
+     * Returns the maximum allowed number of threads.
+     *
+     * @return the maximum allowed number of threads
+     * @see #setMaximumPoolSize
+     */
+    public int getMaximumPoolSize() {
+        return maximumPoolSize;
+    }
+
+    /**
+     * Sets the time limit for which threads may remain idle before
+     * being terminated.  If there are more than the core number of
+     * threads currently in the pool, after waiting this amount of
+     * time without processing a task, excess threads will be
+     * terminated.  This overrides any value set in the constructor.
+     * @param time the time to wait.  A time value of zero will cause
+     * excess threads to terminate immediately after executing tasks.
+     * @param unit  the time unit of the time argument
+     * @throws IllegalArgumentException if time less than zero or
+     * if time is zero and allowsCoreThreadTimeOut
+     * @see #getKeepAliveTime
+     */
+    public void setKeepAliveTime(long time, TimeUnit unit) {
+        if (time < 0)
+            throw new IllegalArgumentException();
+        if (time == 0 && allowsCoreThreadTimeOut())
+            throw new IllegalArgumentException("Core threads must have nonzero keep alive times");
+        this.keepAliveTime = unit.toNanos(time);
+    }
+
+    /**
+     * Returns the thread keep-alive time, which is the amount of time
+     * which threads in excess of the core pool size may remain
+     * idle before being terminated.
+     *
+     * @param unit the desired time unit of the result
+     * @return the time limit
+     * @see #setKeepAliveTime
+     */
+    public long getKeepAliveTime(TimeUnit unit) {
+        return unit.convert(keepAliveTime, TimeUnit.NANOSECONDS);
+    }
+
+    /* Statistics */
+
+    /**
+     * Returns the current number of threads in the pool.
+     *
+     * @return the number of threads
+     */
+    public int getPoolSize() {
+        return poolSize;
+    }
+
+    /**
+     * Returns the approximate number of threads that are actively
+     * executing tasks.
+     *
+     * @return the number of threads
+     */
+    public int getActiveCount() {
+        synchronized (mainLock) {
+            int n = 0;
+            for (Iterator itr = workers.iterator(); itr.hasNext();) {
+                Worker w = (Worker)itr.next();
+                if (w.isActive())
+                    ++n;
+            }
+            return n;
+        }
+    }
+
+    /**
+     * Returns the largest number of threads that have ever
+     * simultaneously been in the pool.
+     *
+     * @return the number of threads
+     */
+    public int getLargestPoolSize() {
+        synchronized (mainLock) {
+            return largestPoolSize;
+        }
+    }
+
+    /**
+     * Returns the approximate total number of tasks that have been
+     * scheduled for execution. Because the states of tasks and
+     * threads may change dynamically during computation, the returned
+     * value is only an approximation, but one that does not ever
+     * decrease across successive calls.
+     *
+     * @return the number of tasks
+     */
+    public long getTaskCount() {
+        synchronized (mainLock) {
+            long n = completedTaskCount;
+            for (Iterator itr = workers.iterator(); itr.hasNext();) {
+                Worker w = (Worker)itr.next();
+                n += w.completedTasks;
+                if (w.isActive())
+                    ++n;
+            }
+            return n + workQueue.size();
+        }
+    }
+
+    /**
+     * Returns the approximate total number of tasks that have
+     * completed execution. Because the states of tasks and threads
+     * may change dynamically during computation, the returned value
+     * is only an approximation, but one that does not ever decrease
+     * across successive calls.
+     *
+     * @return the number of tasks
+     */
+    public long getCompletedTaskCount() {
+        synchronized (mainLock) {
+            long n = completedTaskCount;
+            for (Iterator itr = workers.iterator(); itr.hasNext();) {
+                Worker w = (Worker)itr.next();
+                n += w.completedTasks;
+            }
+            return n;
+        }
+    }
+
+    /**
+     * Method invoked prior to executing the given Runnable in the
+     * given thread.  This method is invoked by thread <tt>t</tt> that
+     * will execute task <tt>r</tt>, and may be used to re-initialize
+     * ThreadLocals, or to perform logging.
+     *
+     * <p>This implementation does nothing, but may be customized in
+     * subclasses. Note: To properly nest multiple overridings, subclasses
+     * should generally invoke <tt>super.beforeExecute</tt> at the end of
+     * this method.
+     *
+     * @param t the thread that will run task r.
+     * @param r the task that will be executed.
+     */
+    protected void beforeExecute(Thread t, Runnable r) { }
+
+    /**
+     * Method invoked upon completion of execution of the given Runnable.
+     * This method is invoked by the thread that executed the task. If
+     * non-null, the Throwable is the uncaught <tt>RuntimeException</tt>
+     * or <tt>Error</tt> that caused execution to terminate abruptly.
+     *
+     * <p><b>Note:</b> When actions are enclosed in tasks (such as
+     * {@link FutureTask}) either explicitly or via methods such as
+     * <tt>submit</tt>, these task objects catch and maintain
+     * computational exceptions, and so they do not cause abrupt
+     * termination, and the internal exceptions are <em>not</em>
+     * passed to this method.
+     *
+     * <p>This implementation does nothing, but may be customized in
+     * subclasses. Note: To properly nest multiple overridings, subclasses
+     * should generally invoke <tt>super.afterExecute</tt> at the
+     * beginning of this method.
+     *
+     * @param r the runnable that has completed.
+     * @param t the exception that caused termination, or null if
+     * execution completed normally.
+     */
+    protected void afterExecute(Runnable r, Throwable t) { }
+
+    /**
+     * Method invoked when the Executor has terminated.  Default
+     * implementation does nothing. Note: To properly nest multiple
+     * overridings, subclasses should generally invoke
+     * <tt>super.terminated</tt> within this method.
+     */
+    protected void terminated() { }
+
+    /**
+     * A handler for rejected tasks that runs the rejected task
+     * directly in the calling thread of the <tt>execute</tt> method,
+     * unless the executor has been shut down, in which case the task
+     * is discarded.
+     */
+    public static class CallerRunsPolicy implements RejectedExecutionHandler {
+        /**
+         * Creates a <tt>CallerRunsPolicy</tt>.
+         */
+        public CallerRunsPolicy() { }
+
+        /**
+         * Executes task r in the caller's thread, unless the executor
+         * has been shut down, in which case the task is discarded.
+         * @param r the runnable task requested to be executed
+         * @param e the executor attempting to execute this task
+         */
+        public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
+            if (!e.isShutdown()) {
+                r.run();
+            }
+        }
+    }
+
+    /**
+     * A handler for rejected tasks that throws a
+     * <tt>RejectedExecutionException</tt>.
+     */
+    public static class AbortPolicy implements RejectedExecutionHandler {
+        /**
+         * Creates an <tt>AbortPolicy</tt>.
+         */
+        public AbortPolicy() { }
+
+        /**
+         * Always throws RejectedExecutionException.
+         * @param r the runnable task requested to be executed
+         * @param e the executor attempting to execute this task
+         * @throws RejectedExecutionException always.
+         */
+        public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
+            throw new RejectedExecutionException();
+        }
+    }
+
+    /**
+     * A handler for rejected tasks that silently discards the
+     * rejected task.
+     */
+    public static class DiscardPolicy implements RejectedExecutionHandler {
+        /**
+         * Creates a <tt>DiscardPolicy</tt>.
+         */
+        public DiscardPolicy() { }
+
+        /**
+         * Does nothing, which has the effect of discarding task r.
+         * @param r the runnable task requested to be executed
+         * @param e the executor attempting to execute this task
+         */
+        public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
+        }
+    }
+
+    /**
+     * A handler for rejected tasks that discards the oldest unhandled
+     * request and then retries <tt>execute</tt>, unless the executor
+     * is shut down, in which case the task is discarded.
+     */
+    public static class DiscardOldestPolicy implements RejectedExecutionHandler {
+        /**
+         * Creates a <tt>DiscardOldestPolicy</tt> for the given executor.
+         */
+        public DiscardOldestPolicy() { }
+
+        /**
+         * Obtains and ignores the next task that the executor
+         * would otherwise execute, if one is immediately available,
+         * and then retries execution of task r, unless the executor
+         * is shut down, in which case task r is instead discarded.
+         * @param r the runnable task requested to be executed
+         * @param e the executor attempting to execute this task
+         */
+        public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
+            if (!e.isShutdown()) {
+                e.getQueue().poll();
+                e.execute(r);
+            }
+        }
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/TimeUnit.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/TimeUnit.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/TimeUnit.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,344 @@
+/*
+  * Written by Doug Lea with assistance from members of JCP JSR-166
+  * Expert Group and released to the public domain, as explained at
+  * http://creativecommons.org/licenses/publicdomain
+  */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+
+/**
+  * A <tt>TimeUnit</tt> represents time durations at a given unit of
+  * granularity and provides utility methods to convert across units,
+  * and to perform timing and delay operations in these units.  A
+  * <tt>TimeUnit</tt> does not maintain time information, but only
+  * helps organize and use time representations that may be maintained
+  * separately across various contexts.  A nanosecond is defined as one
+  * thousandth of a microsecond, a microsecond as one thousandth of a
+  * millisecond, a millisecond as one thousandth of a second, a minute
+  * as sixty seconds, an hour as sixty minutes, and a day as twenty four
+  * hours.
+  *
+  * <p>A <tt>TimeUnit</tt> is mainly used to inform time-based methods
+  * how a given timing parameter should be interpreted. For example,
+  * the following code will timeout in 50 milliseconds if the {@link
+  * edu.emory.mathcs.backport.java.util.concurrent.locks.Lock lock} is not available:
+  *
+  * <pre>  Lock lock = ...;
+  *  if ( lock.tryLock(50L, TimeUnit.MILLISECONDS) ) ...
+  * </pre>
+  * while this code will timeout in 50 seconds:
+  * <pre>
+  *  Lock lock = ...;
+  *  if ( lock.tryLock(50L, TimeUnit.SECONDS) ) ...
+  * </pre>
+  *
+  * Note however, that there is no guarantee that a particular timeout
+  * implementation will be able to notice the passage of time at the
+  * same granularity as the given <tt>TimeUnit</tt>.
+  *
+  * @since 1.5
+  * @author Doug Lea
+  */
+public abstract class TimeUnit implements java.io.Serializable {
+
+    public static final TimeUnit NANOSECONDS = new TimeUnit(0, "NANOSECONDS") {
+        private final static long serialVersionUID = 535148490883208361L;
+        public long toNanos(long d)   { return d; }
+        public long toMicros(long d)  { return d/(C1/C0); }
+        public long toMillis(long d)  { return d/(C2/C0); }
+        public long toSeconds(long d) { return d/(C3/C0); }
+        public long toMinutes(long d) { return d/(C4/C0); }
+        public long toHours(long d)   { return d/(C5/C0); }
+        public long toDays(long d)    { return d/(C6/C0); }
+        public long convert(long d, TimeUnit u) { return u.toNanos(d); }
+        int excessNanos(long d, long m) { return (int)(d - (m*C2)); }
+    };
+    public static final TimeUnit MICROSECONDS = new TimeUnit(1, "MICROSECONDS") {
+        private final static long serialVersionUID = 2185906575929579108L;
+        public long toNanos(long d)   { return x(d, C1/C0, MAX/(C1/C0)); }
+        public long toMicros(long d)  { return d; }
+        public long toMillis(long d)  { return d/(C2/C1); }
+        public long toSeconds(long d) { return d/(C3/C1); }
+        public long toMinutes(long d) { return d/(C4/C1); }
+        public long toHours(long d)   { return d/(C5/C1); }
+        public long toDays(long d)    { return d/(C6/C1); }
+        public long convert(long d, TimeUnit u) { return u.toMicros(d); }
+        int excessNanos(long d, long m) { return (int)((d*C1) - (m*C2)); }
+    };
+    public static final TimeUnit MILLISECONDS = new TimeUnit(2, "MILLISECONDS") {
+        private final static long serialVersionUID = 9032047794123325184L;
+        public long toNanos(long d)   { return x(d, C2/C0, MAX/(C2/C0)); }
+        public long toMicros(long d)  { return x(d, C2/C1, MAX/(C2/C1)); }
+        public long toMillis(long d)  { return d; }
+        public long toSeconds(long d) { return d/(C3/C2); }
+        public long toMinutes(long d) { return d/(C4/C2); }
+        public long toHours(long d)   { return d/(C5/C2); }
+        public long toDays(long d)    { return d/(C6/C2); }
+        public long convert(long d, TimeUnit u) { return u.toMillis(d); }
+        int excessNanos(long d, long m) { return 0; }
+    };
+    public static final TimeUnit SECONDS = new TimeUnit(3, "SECONDS") {
+        private final static long serialVersionUID = 227755028449378390L;
+        public long toNanos(long d)   { return x(d, C3/C0, MAX/(C3/C0)); }
+        public long toMicros(long d)  { return x(d, C3/C1, MAX/(C3/C1)); }
+        public long toMillis(long d)  { return x(d, C3/C2, MAX/(C3/C2)); }
+        public long toSeconds(long d) { return d; }
+        public long toMinutes(long d) { return d/(C4/C3); }
+        public long toHours(long d)   { return d/(C5/C3); }
+        public long toDays(long d)    { return d/(C6/C3); }
+        public long convert(long d, TimeUnit u) { return u.toSeconds(d); }
+        int excessNanos(long d, long m) { return 0; }
+    };
+    public static final TimeUnit MINUTES = new TimeUnit(4, "MINUTES") {
+        private final static long serialVersionUID = 1827351566402609187L;
+        public long toNanos(long d)   { return x(d, C4/C0, MAX/(C4/C0)); }
+        public long toMicros(long d)  { return x(d, C4/C1, MAX/(C4/C1)); }
+        public long toMillis(long d)  { return x(d, C4/C2, MAX/(C4/C2)); }
+        public long toSeconds(long d) { return x(d, C4/C3, MAX/(C4/C3)); }
+        public long toMinutes(long d) { return d; }
+        public long toHours(long d)   { return d/(C5/C4); }
+        public long toDays(long d)    { return d/(C6/C4); }
+        public long convert(long d, TimeUnit u) { return u.toMinutes(d); }
+        int excessNanos(long d, long m) { return 0; }
+    };
+    public static final TimeUnit HOURS = new TimeUnit(5, "HOURS") {
+        private final static long serialVersionUID = -6438436134732089810L;
+        public long toNanos(long d)   { return x(d, C5/C0, MAX/(C5/C0)); }
+        public long toMicros(long d)  { return x(d, C5/C1, MAX/(C5/C1)); }
+        public long toMillis(long d)  { return x(d, C5/C2, MAX/(C5/C2)); }
+        public long toSeconds(long d) { return x(d, C5/C3, MAX/(C5/C3)); }
+        public long toMinutes(long d) { return x(d, C5/C4, MAX/(C5/C4)); }
+        public long toHours(long d)   { return d; }
+        public long toDays(long d)    { return d/(C6/C5); }
+        public long convert(long d, TimeUnit u) { return u.toHours(d); }
+        int excessNanos(long d, long m) { return 0; }
+    };
+    public static final TimeUnit DAYS = new TimeUnit(6, "DAYS") {
+        private final static long serialVersionUID = 567463171959674600L;
+        public long toNanos(long d)   { return x(d, C6/C0, MAX/(C6/C0)); }
+        public long toMicros(long d)  { return x(d, C6/C1, MAX/(C6/C1)); }
+        public long toMillis(long d)  { return x(d, C6/C2, MAX/(C6/C2)); }
+        public long toSeconds(long d) { return x(d, C6/C3, MAX/(C6/C3)); }
+        public long toMinutes(long d) { return x(d, C6/C4, MAX/(C6/C4)); }
+        public long toHours(long d)   { return x(d, C6/C5, MAX/(C6/C5)); }
+        public long toDays(long d)    { return d; }
+        public long convert(long d, TimeUnit u) { return u.toDays(d); }
+        int excessNanos(long d, long m) { return 0; }
+    };
+
+    private static final TimeUnit[] values = new TimeUnit[]
+        { NANOSECONDS, MICROSECONDS, MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS };
+
+    public static TimeUnit[] values() {
+        return (TimeUnit[])values.clone();
+    }
+
+    /**
+     * The index of this unit. This value is no longer used in this
+     * version of this class, but is retained for serialization
+     * compatibility with previous version.
+     */
+    private final int index;
+
+    /** name of this unit */
+    private final String name;
+
+    /** Internal constructor */
+    TimeUnit(int index, String name) {
+        this.index = index;
+        this.name = name;
+    }
+
+    // Handy constants for conversion methods
+    static final long C0 = 1;
+    static final long C1 = C0 * 1000;
+    static final long C2 = C1 * 1000;
+    static final long C3 = C2 * 1000;
+    static final long C4 = C3 * 60;
+    static final long C5 = C4 * 60;
+    static final long C6 = C5 * 24;
+
+    static final long MAX = Long.MAX_VALUE;
+
+    /**
+     * Scale d by m, checking for overflow.
+     * This has a short name to make above code more readable.
+     */
+    static long x(long d, long m, long over) {
+        if (d >  over) return Long.MAX_VALUE;
+        if (d < -over) return Long.MIN_VALUE;
+        return d * m;
+    }
+
+    /**
+     * Convert the given time duration in the given unit to this
+     * unit.  Conversions from finer to coarser granularities
+     * truncate, so lose precision. For example converting
+     * <tt>999</tt> milliseconds to seconds results in
+     * <tt>0</tt>. Conversions from coarser to finer granularities
+     * with arguments that would numerically overflow saturate to
+     * <tt>Long.MIN_VALUE</tt> if negative or <tt>Long.MAX_VALUE</tt>
+     * if positive.
+     *
+     * <p>For example, to convert 10 minutes to milliseconds, use:
+     * <tt>TimeUnit.MILLISECONDS.convert(10L, TimeUnit.MINUTES)</tt>
+     *
+     * @param sourceDuration the time duration in the given <tt>sourceUnit</tt>
+     * @param sourceUnit the unit of the <tt>sourceDuration</tt> argument
+     * @return the converted duration in this unit,
+     * or <tt>Long.MIN_VALUE</tt> if conversion would negatively
+     * overflow, or <tt>Long.MAX_VALUE</tt> if it would positively overflow.
+     */
+    public abstract long convert(long sourceDuration, TimeUnit sourceUnit);
+
+    /**
+     * Equivalent to <tt>NANOSECONDS.convert(duration, this)</tt>.
+     * @param duration the duration
+     * @return the converted duration,
+     * or <tt>Long.MIN_VALUE</tt> if conversion would negatively
+     * overflow, or <tt>Long.MAX_VALUE</tt> if it would positively overflow.
+     * @see #convert
+     */
+    public abstract long toNanos(long duration);
+
+    /**
+     * Equivalent to <tt>MICROSECONDS.convert(duration, this)</tt>.
+     * @param duration the duration
+     * @return the converted duration,
+     * or <tt>Long.MIN_VALUE</tt> if conversion would negatively
+     * overflow, or <tt>Long.MAX_VALUE</tt> if it would positively overflow.
+     * @see #convert
+     */
+    public abstract long toMicros(long duration);
+
+    /**
+     * Equivalent to <tt>MILLISECONDS.convert(duration, this)</tt>.
+     * @param duration the duration
+     * @return the converted duration,
+     * or <tt>Long.MIN_VALUE</tt> if conversion would negatively
+     * overflow, or <tt>Long.MAX_VALUE</tt> if it would positively overflow.
+     * @see #convert
+     */
+    public abstract long toMillis(long duration);
+
+    /**
+     * Equivalent to <tt>SECONDS.convert(duration, this)</tt>.
+     * @param duration the duration
+     * @return the converted duration,
+     * or <tt>Long.MIN_VALUE</tt> if conversion would negatively
+     * overflow, or <tt>Long.MAX_VALUE</tt> if it would positively overflow.
+     * @see #convert
+     */
+    public abstract long toSeconds(long duration);
+
+    /**
+     * Equivalent to <tt>MINUTES.convert(duration, this)</tt>.
+     * @param duration the duration
+     * @return the converted duration,
+     * or <tt>Long.MIN_VALUE</tt> if conversion would negatively
+     * overflow, or <tt>Long.MAX_VALUE</tt> if it would positively overflow.
+     * @see #convert
+     * @since 1.6
+     */
+    public abstract long toMinutes(long duration);
+
+    /**
+     * Equivalent to <tt>HOURS.convert(duration, this)</tt>.
+     * @param duration the duration
+     * @return the converted duration,
+     * or <tt>Long.MIN_VALUE</tt> if conversion would negatively
+     * overflow, or <tt>Long.MAX_VALUE</tt> if it would positively overflow.
+     * @see #convert
+     * @since 1.6
+     */
+    public abstract long toHours(long duration);
+
+    /**
+     * Equivalent to <tt>DAYS.convert(duration, this)</tt>.
+     * @param duration the duration
+     * @return the converted duration
+     * @see #convert
+     * @since 1.6
+     */
+    public abstract long toDays(long duration);
+
+    /**
+     * Utility to compute the excess-nanosecond argument to wait,
+     * sleep, join.
+     * @param d the duration
+     * @param m the number of milliseconds
+     * @return the number of nanoseconds
+     */
+    abstract int excessNanos(long d, long m);
+
+    /**
+     * Performs a timed <tt>Object.wait</tt> using this time unit.
+     * This is a convenience method that converts timeout arguments
+     * into the form required by the <tt>Object.wait</tt> method.
+     *
+     * <p>For example, you could implement a blocking <tt>poll</tt>
+     * method (see {@link BlockingQueue#poll BlockingQueue.poll})
+     * using:
+     *
+     * <pre>  public synchronized  Object poll(long timeout, TimeUnit unit) throws InterruptedException {
+     *    while (empty) {
+     *      unit.timedWait(this, timeout);
+     *      ...
+     *    }
+     *  }</pre>
+     *
+     * @param obj the object to wait on
+     * @param timeout the maximum time to wait. If less than
+     * or equal to zero, do not wait at all.
+     * @throws InterruptedException if interrupted while waiting.
+     * @see java.lang.Object#wait(long, int)
+     */
+    public void timedWait(Object obj, long timeout)
+        throws InterruptedException {
+        if (timeout > 0) {
+            long ms = toMillis(timeout);
+            int ns = excessNanos(timeout, ms);
+            obj.wait(ms, ns);
+        }
+    }
+
+    /**
+     * Performs a timed <tt>Thread.join</tt> using this time unit.
+     * This is a convenience method that converts time arguments into the
+     * form required by the <tt>Thread.join</tt> method.
+     * @param thread the thread to wait for
+     * @param timeout the maximum time to wait. If less than
+     * or equal to zero, do not wait at all.
+     * @throws InterruptedException if interrupted while waiting.
+     * @see java.lang.Thread#join(long, int)
+     */
+    public void timedJoin(Thread thread, long timeout)
+        throws InterruptedException {
+        if (timeout > 0) {
+            long ms = toMillis(timeout);
+            int ns = excessNanos(timeout, ms);
+            thread.join(ms, ns);
+        }
+    }
+
+    /**
+     * Performs a <tt>Thread.sleep</tt> using this unit.
+     * This is a convenience method that converts time arguments into the
+     * form required by the <tt>Thread.sleep</tt> method.
+     * @param timeout the maximum time to sleep. If less than
+     * or equal to zero, do not sleep at all.
+     * @throws InterruptedException if interrupted while sleeping.
+     * @see java.lang.Thread#sleep
+     */
+    public void sleep(long timeout) throws InterruptedException {
+        if (timeout > 0) {
+            long ms = toMillis(timeout);
+            int ns = excessNanos(timeout, ms);
+            Thread.sleep(ms, ns);
+        }
+    }
+
+    public String toString() {
+        return name;
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/TimeoutException.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/TimeoutException.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/TimeoutException.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,38 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent;
+
+/**
+ * Exception thrown when a blocking operation times out.  Blocking
+ * operations for which a timeout is specified need a means to
+ * indicate that the timeout has occurred. For many such operations it
+ * is possible to return a value that indicates timeout; when that is
+ * not possible or desirable then <tt>TimeoutException</tt> should be
+ * declared and thrown.
+ *
+ * @since 1.5
+ * @author Doug Lea
+ */
+public class TimeoutException extends Exception {
+    private static final long serialVersionUID = 1900926677490660714L;
+
+    /**
+     * Constructs a <tt>TimeoutException</tt> with no specified detail
+     * message.
+     */
+    public TimeoutException() {}
+
+    /**
+     * Constructs a <tt>TimeoutException</tt> with the specified detail
+     * message.
+     *
+     * @param message the detail message
+     */
+    public TimeoutException(String message) {
+        super(message);
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic/AtomicBoolean.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic/AtomicBoolean.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic/AtomicBoolean.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,126 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent.atomic;
+
+/**
+ * A <tt>boolean</tt> value that may be updated atomically. See the
+ * {@link edu.emory.mathcs.backport.java.util.concurrent.atomic} package specification for
+ * description of the properties of atomic variables. An
+ * <tt>AtomicBoolean</tt> is used in applications such as atomically
+ * updated flags, and cannot be used as a replacement for a
+ * {@link java.lang.Boolean}.
+ *
+ * @since 1.5
+ * @author Doug Lea
+ */
+public class AtomicBoolean implements java.io.Serializable {
+    private static final long serialVersionUID = 4654671469794556979L;
+
+    private volatile int value;
+
+    /**
+     * Creates a new <tt>AtomicBoolean</tt> with the given initial value.
+     *
+     * @param initialValue the initial value
+     */
+    public AtomicBoolean(boolean initialValue) {
+        value = initialValue ? 1 : 0;
+    }
+
+    /**
+     * Creates a new <tt>AtomicBoolean</tt> with initial value <tt>false</tt>.
+     */
+    public AtomicBoolean() {
+    }
+
+    /**
+     * Returns the current value.
+     *
+     * @return the current value
+     */
+    public final boolean get() {
+        return value != 0;
+    }
+
+    /**
+     * Atomically sets the value to the given updated value
+     * if the current value <tt>==</tt> the expected value.
+     *
+     * @param expect the expected value
+     * @param update the new value
+     * @return true if successful. False return indicates that
+     * the actual value was not equal to the expected value.
+     */
+    public final synchronized boolean compareAndSet(boolean expect, boolean update) {
+        if (expect == (value != 0)) {
+            value = update ? 1 : 0;
+            return true;
+        }
+        else {
+            return false;
+        }
+    }
+
+    /**
+     * Atomically sets the value to the given updated value
+     * if the current value <tt>==</tt> the expected value.
+     * May fail spuriously.
+     *
+     * @param expect the expected value
+     * @param update the new value
+     * @return true if successful.
+     */
+    public synchronized boolean weakCompareAndSet(boolean expect, boolean update) {
+        if (expect == (value != 0)) {
+            value = update ? 1 : 0;
+            return true;
+        }
+        else {
+            return false;
+        }
+    }
+
+    /**
+     * Unconditionally sets to the given value.
+     *
+     * @param newValue the new value
+     */
+    public final synchronized void set(boolean newValue) {
+        value = newValue ? 1 : 0;
+    }
+
+    /**
+     * Eventually sets to the given value.
+     *
+     * @param newValue the new value
+     * @since 1.6
+     */
+    public final synchronized void lazySet(boolean newValue) {
+        value = newValue ? 1 : 0;
+    }
+
+    /**
+     * Atomically sets to the given value and returns the previous value.
+     *
+     * @param newValue the new value
+     * @return the previous value
+     */
+    public final synchronized boolean getAndSet(boolean newValue) {
+        int old = value;
+        value = newValue ? 1 : 0;
+        return old != 0;
+    }
+
+    /**
+     * Returns the String representation of the current value.
+     * @return the String representation of the current value.
+     */
+    public String toString() {
+        return Boolean.toString(get());
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic/AtomicInteger.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic/AtomicInteger.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic/AtomicInteger.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,207 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent.atomic;
+
+/**
+ * An <tt>int</tt> value that may be updated atomically.  See the
+ * {@link edu.emory.mathcs.backport.java.util.concurrent.atomic} package specification for
+ * description of the properties of atomic variables. An
+ * <tt>AtomicInteger</tt> is used in applications such as atomically
+ * incremented counters, and cannot be used as a replacement for an
+ * {@link java.lang.Integer}. However, this class does extend
+ * <tt>Number</tt> to allow uniform access by tools and utilities that
+ * deal with numerically-based classes.
+ *
+ * @since 1.5
+ * @author Doug Lea
+*/
+public class AtomicInteger extends Number implements java.io.Serializable {
+    private static final long serialVersionUID = 6214790243416807050L;
+
+    private volatile int value;
+
+    /**
+     * Creates a new AtomicInteger with the given initial value.
+     *
+     * @param initialValue the initial value
+     */
+    public AtomicInteger(int initialValue) {
+        value = initialValue;
+    }
+
+    /**
+     * Creates a new AtomicInteger with initial value <tt>0</tt>.
+     */
+    public AtomicInteger() {
+    }
+
+    /**
+     * Gets the current value.
+     *
+     * @return the current value
+     */
+    public final int get() {
+        return value;
+    }
+
+    /**
+     * Sets to the given value.
+     *
+     * @param newValue the new value
+     */
+    public final synchronized void set(int newValue) {
+        value = newValue;
+    }
+
+    /**
+     * Eventually sets to the given value.
+     *
+     * @param newValue the new value
+     * @since 1.6
+     */
+    public final synchronized void lazySet(int newValue) {
+        value = newValue;
+    }
+
+    /**
+     * Atomically sets to the given value and returns the old value.
+     *
+     * @param newValue the new value
+     * @return the previous value
+     */
+    public final synchronized int getAndSet(int newValue) {
+        int old = value;
+        value = newValue;
+        return old;
+    }
+
+    /**
+     * Atomically sets the value to the given updated value
+     * if the current value <tt>==</tt> the expected value.
+     *
+     * @param expect the expected value
+     * @param update the new value
+     * @return true if successful. False return indicates that
+     * the actual value was not equal to the expected value.
+     */
+    public final synchronized boolean compareAndSet(int expect, int update) {
+        if (value == expect) {
+            value = update;
+            return true;
+        }
+        else {
+            return false;
+        }
+    }
+
+    /**
+     * Atomically sets the value to the given updated value
+     * if the current value <tt>==</tt> the expected value.
+     * May fail spuriously.
+     *
+     * @param expect the expected value
+     * @param update the new value
+     * @return true if successful.
+     */
+    public final synchronized boolean weakCompareAndSet(int expect, int update) {
+        if (value == expect) {
+            value = update;
+            return true;
+        }
+        else {
+            return false;
+        }
+    }
+
+
+    /**
+     * Atomically increments by one the current value.
+     *
+     * @return the previous value
+     */
+    public final synchronized int getAndIncrement() {
+        return value++;
+    }
+
+
+    /**
+     * Atomically decrements by one the current value.
+     *
+     * @return the previous value
+     */
+    public final synchronized int getAndDecrement() {
+        return value--;
+    }
+
+
+    /**
+     * Atomically adds the given value to the current value.
+     *
+     * @param delta the value to add
+     * @return the previous value
+     */
+    public final synchronized int getAndAdd(int delta) {
+        int old = value;
+        value += delta;
+        return old;
+    }
+
+    /**
+     * Atomically increments by one the current value.
+     *
+     * @return the updated value
+     */
+    public final synchronized int incrementAndGet() {
+        return ++value;
+    }
+
+    /**
+     * Atomically decrements by one the current value.
+     *
+     * @return the updated value
+     */
+    public final synchronized int decrementAndGet() {
+        return --value;
+    }
+
+
+    /**
+     * Atomically adds the given value to the current value.
+     *
+     * @param delta the value to add
+     * @return the updated value
+     */
+    public final synchronized int addAndGet(int delta) {
+        return value += delta;
+    }
+
+    /**
+     * Returns the String representation of the current value.
+     * @return the String representation of the current value.
+     */
+    public String toString() {
+        return Integer.toString(get());
+    }
+
+
+    public int intValue() {
+        return get();
+    }
+
+    public long longValue() {
+        return (long)get();
+    }
+
+    public float floatValue() {
+        return (float)get();
+    }
+
+    public double doubleValue() {
+        return (double)get();
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic/AtomicIntegerArray.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic/AtomicIntegerArray.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic/AtomicIntegerArray.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,225 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent.atomic;
+
+/**
+ * An <tt>int</tt> array in which elements may be updated atomically.
+ * See the {@link edu.emory.mathcs.backport.java.util.concurrent.atomic} package
+ * specification for description of the properties of atomic
+ * variables.
+ * @since 1.5
+ * @author Doug Lea
+ */
+public class AtomicIntegerArray implements java.io.Serializable {
+    private static final long serialVersionUID = 2862133569453604235L;
+
+    private final int[] array;
+
+    /**
+     * Creates a new AtomicIntegerArray of given length.
+     *
+     * @param length the length of the array
+     */
+    public AtomicIntegerArray(int length) {
+        array = new int[length];
+    }
+
+    /**
+     * Creates a new AtomicIntegerArray with the same length as, and
+     * all elements copied from, the given array.
+     *
+     * @param array the array to copy elements from
+     * @throws NullPointerException if array is null
+     */
+    public AtomicIntegerArray(int[] array) {
+        if (array == null)
+            throw new NullPointerException();
+        int length = array.length;
+        this.array = new int[length];
+        System.arraycopy(array, 0, this.array, 0, array.length);
+    }
+
+    /**
+     * Returns the length of the array.
+     *
+     * @return the length of the array
+     */
+    public final int length() {
+        return array.length;
+    }
+
+    /**
+     * Gets the current value at position <tt>i</tt>.
+     *
+     * @param i the index
+     * @return the current value
+     */
+    public final synchronized int get(int i) {
+        return array[i];
+    }
+
+    /**
+     * Sets the element at position <tt>i</tt> to the given value.
+     *
+     * @param i the index
+     * @param newValue the new value
+     */
+    public final synchronized void set(int i, int newValue) {
+        array[i] = newValue;
+    }
+
+    /**
+     * Eventually sets the element at position <tt>i</tt> to the given value.
+     *
+     * @param i the index
+     * @param newValue the new value
+     * @since 1.6
+     */
+    public final synchronized void lazySet(int i, int newValue) {
+        array[i] = newValue;
+    }
+
+    /**
+     * Atomically sets the element at position <tt>i</tt> to the given
+     * value and returns the old value.
+     *
+     * @param i the index
+     * @param newValue the new value
+     * @return the previous value
+     */
+    public final synchronized int getAndSet(int i, int newValue) {
+        int old = array[i];
+        array[i] = newValue;
+        return old;
+    }
+
+    /**
+     * Atomically sets the element at position <tt>i</tt> to the given
+     * updated value if the current value <tt>==</tt> the expected value.
+     *
+     * @param i the index
+     * @param expect the expected value
+     * @param update the new value
+     * @return true if successful. False return indicates that
+     * the actual value was not equal to the expected value.
+     */
+    public final synchronized boolean compareAndSet(int i, int expect, int update) {
+        if (array[i] == expect) {
+            array[i] = update;
+            return true;
+        }
+        else {
+            return false;
+        }
+    }
+
+    /**
+     * Atomically sets the element at position <tt>i</tt> to the given
+     * updated value if the current value <tt>==</tt> the expected value.
+     * May fail spuriously.
+     *
+     * @param i the index
+     * @param expect the expected value
+     * @param update the new value
+     * @return true if successful.
+     */
+    public final synchronized boolean weakCompareAndSet(int i, int expect, int update) {
+        if (array[i] == expect) {
+            array[i] = update;
+            return true;
+        }
+        else {
+            return false;
+        }
+    }
+
+    /**
+     * Atomically increments by one the element at index <tt>i</tt>.
+     *
+     * @param i the index
+     * @return the previous value
+     */
+    public final synchronized int getAndIncrement(int i) {
+        return array[i]++;
+    }
+
+    /**
+     * Atomically decrements by one the element at index <tt>i</tt>.
+     *
+     * @param i the index
+     * @return the previous value
+     */
+    public final synchronized int getAndDecrement(int i) {
+        return array[i]--;
+    }
+
+    /**
+     * Atomically adds the given value to the element at index <tt>i</tt>.
+     *
+     * @param i the index
+     * @param delta the value to add
+     * @return the previous value
+     */
+    public final synchronized int getAndAdd(int i, int delta) {
+        int old = array[i];
+        array[i] += delta;
+        return old;
+    }
+
+    /**
+     * Atomically increments by one the element at index <tt>i</tt>.
+     *
+     * @param i the index
+     * @return the updated value
+     */
+    public final synchronized int incrementAndGet(int i) {
+        return ++array[i];
+    }
+
+    /**
+     * Atomically decrements by one the element at index <tt>i</tt>.
+     *
+     * @param i the index
+     * @return the updated value
+     */
+    public final synchronized int decrementAndGet(int i) {
+        return --array[i];
+    }
+
+    /**
+     * Atomically adds the given value to the element at index <tt>i</tt>.
+     *
+     * @param i the index
+     * @param delta the value to add
+     * @return the updated value
+     */
+    public final synchronized int addAndGet(int i, int delta) {
+        return array[i] += delta;
+    }
+
+    /**
+     * Returns the String representation of the current values of array.
+     * @return the String representation of the current values of array.
+     */
+    public synchronized String toString() {
+        if (array.length == 0)
+            return "[]";
+
+        StringBuffer buf = new StringBuffer();
+        buf.append('[');
+        buf.append(array[0]);
+
+        for (int i = 1; i < array.length; i++) {
+            buf.append(", ");
+            buf.append(array[i]);
+        }
+
+        buf.append("]");
+        return buf.toString();
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic/AtomicLong.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic/AtomicLong.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic/AtomicLong.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,206 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent.atomic;
+
+/**
+ * A <tt>long</tt> value that may be updated atomically.  See the
+ * {@link edu.emory.mathcs.backport.java.util.concurrent.atomic} package specification for
+ * description of the properties of atomic variables. An
+ * <tt>AtomicLong</tt> is used in applications such as atomically
+ * incremented sequence numbers, and cannot be used as a replacement
+ * for a {@link java.lang.Long}. However, this class does extend
+ * <tt>Number</tt> to allow uniform access by tools and utilities that
+ * deal with numerically-based classes.
+ *
+ * @since 1.5
+ * @author Doug Lea
+ */
+public class AtomicLong extends Number implements java.io.Serializable {
+    private static final long serialVersionUID = 1927816293512124184L;
+
+    private volatile long value;
+
+    /**
+     * Creates a new AtomicLong with the given initial value.
+     *
+     * @param initialValue the initial value
+     */
+    public AtomicLong(long initialValue) {
+        value = initialValue;
+    }
+
+    /**
+     * Creates a new AtomicLong with initial value <tt>0</tt>.
+     */
+    public AtomicLong() {
+    }
+
+    /**
+     * Gets the current value.
+     *
+     * @return the current value
+     */
+    public final long get() {
+        return value;
+    }
+
+    /**
+     * Sets to the given value.
+     *
+     * @param newValue the new value
+     */
+    public final synchronized void set(long newValue) {
+        value = newValue;
+    }
+
+    /**
+     * Eventually sets to the given value.
+     *
+     * @param newValue the new value
+     * @since 1.6
+     */
+    public final synchronized void lazySet(long newValue) {
+        value = newValue;
+    }
+
+    /**
+     * Atomically sets to the given value and returns the old value.
+     *
+     * @param newValue the new value
+     * @return the previous value
+     */
+    public final synchronized long getAndSet(long newValue) {
+        long old = value;
+        value = newValue;
+        return old;
+    }
+
+    /**
+     * Atomically sets the value to the given updated value
+     * if the current value <tt>==</tt> the expected value.
+     *
+     * @param expect the expected value
+     * @param update the new value
+     * @return true if successful. False return indicates that
+     * the actual value was not equal to the expected value.
+     */
+    public final synchronized boolean compareAndSet(long expect, long update) {
+        if (value == expect) {
+            value = update;
+            return true;
+        }
+        else {
+            return false;
+        }
+    }
+
+    /**
+     * Atomically sets the value to the given updated value
+     * if the current value <tt>==</tt> the expected value.
+     * May fail spuriously.
+     *
+     * @param expect the expected value
+     * @param update the new value
+     * @return true if successful.
+     */
+    public final synchronized boolean weakCompareAndSet(long expect, long update) {
+        if (value == expect) {
+            value = update;
+            return true;
+        }
+        else {
+            return false;
+        }
+    }
+
+    /**
+     * Atomically increments by one the current value.
+     *
+     * @return the previous value
+     */
+    public final synchronized long getAndIncrement() {
+        return value++;
+    }
+
+
+    /**
+     * Atomically decrements by one the current value.
+     *
+     * @return the previous value
+     */
+    public final synchronized long getAndDecrement() {
+        return value--;
+    }
+
+
+    /**
+     * Atomically adds the given value to the current value.
+     *
+     * @param delta the value to add
+     * @return the previous value
+     */
+    public final synchronized long getAndAdd(long delta) {
+        long old = value;
+        value += delta;
+        return old;
+    }
+
+    /**
+     * Atomically increments by one the current value.
+     *
+     * @return the updated value
+     */
+    public final synchronized long incrementAndGet() {
+        return ++value;
+    }
+
+    /**
+     * Atomically decrements by one the current value.
+     *
+     * @return the updated value
+     */
+    public final synchronized long decrementAndGet() {
+        return --value;
+    }
+
+
+    /**
+     * Atomically adds the given value to the current value.
+     *
+     * @param delta the value to add
+     * @return the updated value
+     */
+    public final synchronized long addAndGet(long delta) {
+        return value += delta;
+    }
+
+    /**
+     * Returns the String representation of the current value.
+     * @return the String representation of the current value.
+     */
+    public String toString() {
+        return Long.toString(get());
+    }
+
+
+    public int intValue() {
+        return (int)get();
+    }
+
+    public long longValue() {
+        return (long)get();
+    }
+
+    public float floatValue() {
+        return (float)get();
+    }
+
+    public double doubleValue() {
+        return (double)get();
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic/AtomicLongArray.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic/AtomicLongArray.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic/AtomicLongArray.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,226 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent.atomic;
+
+/**
+ * A <tt>long</tt> array in which elements may be updated atomically.
+ * See the {@link edu.emory.mathcs.backport.java.util.concurrent.atomic} package specification
+ * for description of the properties of atomic variables.
+ * @since 1.5
+ * @author Doug Lea
+ */
+public class AtomicLongArray implements java.io.Serializable {
+    private static final long serialVersionUID = -2308431214976778248L;
+
+    private final long[] array;
+
+    /**
+     * Creates a new AtomicLongArray of given length.
+     *
+     * @param length the length of the array
+     */
+    public AtomicLongArray(int length) {
+        array = new long[length];
+    }
+
+    /**
+     * Creates a new AtomicLongArray with the same length as, and
+     * all elements copied from, the given array.
+     *
+     * @param array the array to copy elements from
+     * @throws NullPointerException if array is null
+     */
+    public AtomicLongArray(long[] array) {
+        if (array == null)
+            throw new NullPointerException();
+        int length = array.length;
+        this.array = new long[length];
+        System.arraycopy(array, 0, this.array, 0, array.length);
+    }
+
+    /**
+     * Returns the length of the array.
+     *
+     * @return the length of the array
+     */
+    public final int length() {
+        return array.length;
+    }
+
+    /**
+     * Gets the current value at position <tt>i</tt>.
+     *
+     * @param i the index
+     * @return the current value
+     */
+    public final synchronized long get(int i) {
+        return array[i];
+    }
+
+    /**
+     * Sets the element at position <tt>i</tt> to the given value.
+     *
+     * @param i the index
+     * @param newValue the new value
+     */
+    public final synchronized void set(int i, long newValue) {
+        array[i] = newValue;
+    }
+
+    /**
+     * Eventually sets the element at position <tt>i</tt> to the given value.
+     *
+     * @param i the index
+     * @param newValue the new value
+     * @since 1.6
+     */
+    public final synchronized void lazySet(int i, long newValue) {
+        array[i] = newValue;
+    }
+
+
+    /**
+     * Atomically sets the element at position <tt>i</tt> to the given value
+     * and returns the old value.
+     *
+     * @param i the index
+     * @param newValue the new value
+     * @return the previous value
+     */
+    public final synchronized long getAndSet(int i, long newValue) {
+        long old = array[i];
+        array[i] = newValue;
+        return old;
+    }
+
+    /**
+     * Atomically sets the value to the given updated value
+     * if the current value <tt>==</tt> the expected value.
+     *
+     * @param i the index
+     * @param expect the expected value
+     * @param update the new value
+     * @return true if successful. False return indicates that
+     * the actual value was not equal to the expected value.
+     */
+    public final synchronized boolean compareAndSet(int i, long expect, long update) {
+        if (array[i] == expect) {
+            array[i] = update;
+            return true;
+        }
+        else {
+            return false;
+        }
+    }
+
+    /**
+     * Atomically sets the value to the given updated value
+     * if the current value <tt>==</tt> the expected value.
+     * May fail spuriously.
+     *
+     * @param i the index
+     * @param expect the expected value
+     * @param update the new value
+     * @return true if successful.
+     */
+    public final synchronized boolean weakCompareAndSet(int i, long expect, long update) {
+        if (array[i] == expect) {
+            array[i] = update;
+            return true;
+        }
+        else {
+            return false;
+        }
+    }
+
+    /**
+     * Atomically increments by one the element at index <tt>i</tt>.
+     *
+     * @param i the index
+     * @return the previous value
+     */
+    public final synchronized long getAndIncrement(int i) {
+        return array[i]++;
+    }
+
+    /**
+     * Atomically decrements by one the element at index <tt>i</tt>.
+     *
+     * @param i the index
+     * @return the previous value
+     */
+    public final synchronized long getAndDecrement(int i) {
+        return array[i]--;
+    }
+
+    /**
+     * Atomically adds the given value to the element at index <tt>i</tt>.
+     *
+     * @param i the index
+     * @param delta the value to add
+     * @return the previous value
+     */
+    public final synchronized long getAndAdd(int i, long delta) {
+        long old = array[i];
+        array[i] += delta;
+        return old;
+    }
+
+
+    /**
+     * Atomically increments by one the element at index <tt>i</tt>.
+     *
+     * @param i the index
+     * @return the updated value
+     */
+    public final synchronized long incrementAndGet(int i) {
+        return ++array[i];
+    }
+
+    /**
+     * Atomically decrements by one the element at index <tt>i</tt>.
+     *
+     * @param i the index
+     * @return the updated value
+     */
+    public final synchronized long decrementAndGet(int i) {
+        return --array[i];
+    }
+
+    /**
+     * Atomically adds the given value to the element at index <tt>i</tt>.
+     *
+     * @param i the index
+     * @param delta the value to add
+     * @return the updated value
+     */
+    public synchronized long addAndGet(int i, long delta) {
+        return array[i] += delta;
+    }
+
+    /**
+     * Returns the String representation of the current values of array.
+     * @return the String representation of the current values of array.
+     */
+    public synchronized String toString() {
+        if (array.length == 0)
+            return "[]";
+
+        StringBuffer buf = new StringBuffer();
+        buf.append('[');
+        buf.append(array[0]);
+
+        for (int i = 1; i < array.length; i++) {
+            buf.append(", ");
+            buf.append(array[i]);
+        }
+
+        buf.append("]");
+        return buf.toString();
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic/AtomicMarkableReference.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic/AtomicMarkableReference.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic/AtomicMarkableReference.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,166 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent.atomic;
+
+/**
+ * An <tt>AtomicMarkableReference</tt> maintains an object reference
+ * along with a mark bit, that can be updated atomically.
+ * <p>
+ * <p> Implementation note. This implementation maintains markable
+ * references by creating internal objects representing "boxed"
+ * [reference, boolean] pairs.
+ *
+ * @since 1.5
+ * @author Doug Lea
+ */
+public class AtomicMarkableReference  {
+
+    private static class ReferenceBooleanPair {
+        private final Object reference;
+        private final boolean bit;
+        ReferenceBooleanPair(Object r, boolean i) {
+            reference = r; bit = i;
+        }
+    }
+
+    private final AtomicReference atomicRef;
+
+    /**
+     * Creates a new <tt>AtomicMarkableReference</tt> with the given
+     * initial values.
+     *
+     * @param initialRef the initial reference
+     * @param initialMark the initial mark
+     */
+    public AtomicMarkableReference(Object initialRef, boolean initialMark) {
+        atomicRef = new AtomicReference(new ReferenceBooleanPair(initialRef, initialMark));
+    }
+
+    private ReferenceBooleanPair getPair() {
+        return (ReferenceBooleanPair)atomicRef.get();
+    }
+
+    /**
+     * Returns the current value of the reference.
+     *
+     * @return the current value of the reference
+     */
+    public Object getReference() {
+        return getPair().reference;
+    }
+
+    /**
+     * Returns the current value of the mark.
+     *
+     * @return the current value of the mark
+     */
+    public boolean isMarked() {
+        return getPair().bit;
+    }
+
+    /**
+     * Returns the current values of both the reference and the mark.
+     * Typical usage is <tt>boolean[1] holder; ref = v.get(holder); </tt>.
+     *
+     * @param markHolder an array of size of at least one. On return,
+     * <tt>markholder[0]</tt> will hold the value of the mark.
+     * @return the current value of the reference
+     */
+    public Object get(boolean[] markHolder) {
+        ReferenceBooleanPair p = getPair();
+        markHolder[0] = p.bit;
+        return p.reference;
+    }
+
+    /**
+     * Atomically sets the value of both the reference and mark
+     * to the given update values if the
+     * current reference is <tt>==</tt> to the expected reference
+     * and the current mark is equal to the expected mark.  Any given
+     * invocation of this operation may fail (return
+     * <tt>false</tt>) spuriously, but repeated invocation when
+     * the current value holds the expected value and no other thread
+     * is also attempting to set the value will eventually succeed.
+     *
+     * @param expectedReference the expected value of the reference
+     * @param newReference the new value for the reference
+     * @param expectedMark the expected value of the mark
+     * @param newMark the new value for the mark
+     * @return true if successful
+     */
+    public boolean weakCompareAndSet(Object  expectedReference,
+                                     Object  newReference,
+                                     boolean expectedMark,
+                                     boolean newMark) {
+        ReferenceBooleanPair current = getPair();
+        return  expectedReference == current.reference &&
+            expectedMark == current.bit &&
+            ((newReference == current.reference && newMark == current.bit) ||
+             atomicRef.weakCompareAndSet(current,
+                                     new ReferenceBooleanPair(newReference,
+                                                              newMark)));
+    }
+
+    /**
+     * Atomically sets the value of both the reference and mark
+     * to the given update values if the
+     * current reference is <tt>==</tt> to the expected reference
+     * and the current mark is equal to the expected mark.
+     *
+     * @param expectedReference the expected value of the reference
+     * @param newReference the new value for the reference
+     * @param expectedMark the expected value of the mark
+     * @param newMark the new value for the mark
+     * @return true if successful
+     */
+    public boolean compareAndSet(Object       expectedReference,
+                                 Object       newReference,
+                                 boolean expectedMark,
+                                 boolean newMark) {
+        ReferenceBooleanPair current = getPair();
+        return  expectedReference == current.reference &&
+            expectedMark == current.bit &&
+            ((newReference == current.reference && newMark == current.bit) ||
+             atomicRef.compareAndSet(current,
+                                     new ReferenceBooleanPair(newReference,
+                                                              newMark)));
+    }
+
+    /**
+     * Unconditionally sets the value of both the reference and mark.
+     *
+     * @param newReference the new value for the reference
+     * @param newMark the new value for the mark
+     */
+    public void set(Object newReference, boolean newMark) {
+        ReferenceBooleanPair current = getPair();
+        if (newReference != current.reference || newMark != current.bit)
+            atomicRef.set(new ReferenceBooleanPair(newReference, newMark));
+    }
+
+    /**
+     * Atomically sets the value of the mark to the given update value
+     * if the current reference is <tt>==</tt> to the expected
+     * reference.  Any given invocation of this operation may fail
+     * (return <tt>false</tt>) spuriously, but repeated invocation
+     * when the current value holds the expected value and no other
+     * thread is also attempting to set the value will eventually
+     * succeed.
+     *
+     * @param expectedReference the expected value of the reference
+     * @param newMark the new value for the mark
+     * @return true if successful
+     */
+    public boolean attemptMark(Object expectedReference, boolean newMark) {
+        ReferenceBooleanPair current = getPair();
+        return  expectedReference == current.reference &&
+            (newMark == current.bit ||
+             atomicRef.compareAndSet
+             (current, new ReferenceBooleanPair(expectedReference,
+                                                newMark)));
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic/AtomicReference.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic/AtomicReference.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic/AtomicReference.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,116 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent.atomic;
+
+/**
+ * An object reference that may be updated atomically. See the {@link
+ * edu.emory.mathcs.backport.java.util.concurrent.atomic} package specification for description
+ * of the properties of atomic variables.
+ * @since 1.5
+ * @author Doug Lea
+ */
+public class AtomicReference  implements java.io.Serializable {
+    private static final long serialVersionUID = -1848883965231344442L;
+
+    private volatile Object value;
+
+    /**
+     * Creates a new AtomicReference with the given initial value.
+     *
+     * @param initialValue the initial value
+     */
+    public AtomicReference(Object initialValue) {
+        value = initialValue;
+    }
+
+    /**
+     * Creates a new AtomicReference with null initial value.
+     */
+    public AtomicReference() {
+    }
+
+    /**
+     * Gets the current value.
+     *
+     * @return the current value
+     */
+    public final Object get() {
+        return value;
+    }
+
+    /**
+     * Sets to the given value.
+     *
+     * @param newValue the new value
+     */
+    public final synchronized void set(Object newValue) {
+        value = newValue;
+    }
+
+    /**
+     * Eventually sets to the given value.
+     *
+     * @param newValue the new value
+     * @since 1.6
+     */
+    public final synchronized void lazySet(Object newValue) {
+        value = newValue;
+    }
+
+    /**
+     * Atomically sets the value to the given updated value
+     * if the current value <tt>==</tt> the expected value.
+     * @param expect the expected value
+     * @param update the new value
+     * @return true if successful. False return indicates that
+     * the actual value was not equal to the expected value.
+     */
+    public final synchronized boolean compareAndSet(Object expect, Object update) {
+        if (value == expect) {
+            value = update;
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Atomically sets the value to the given updated value
+     * if the current value <tt>==</tt> the expected value.
+     * May fail spuriously.
+     * @param expect the expected value
+     * @param update the new value
+     * @return true if successful.
+     */
+    public final synchronized boolean weakCompareAndSet(Object expect, Object update) {
+        if (value == expect) {
+            value = update;
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Atomically sets to the given value and returns the old value.
+     *
+     * @param newValue the new value
+     * @return the previous value
+     */
+    public final synchronized Object getAndSet(Object newValue) {
+        Object old = value;
+        value = newValue;
+        return old;
+    }
+
+    /**
+     * Returns the String representation of the current value.
+     * @return the String representation of the current value.
+     */
+    public String toString() {
+        return String.valueOf(get());
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic/AtomicReferenceArray.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic/AtomicReferenceArray.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic/AtomicReferenceArray.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,161 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent.atomic;
+
+/**
+ * An array of object references in which elements may be updated
+ * atomically.  See the {@link edu.emory.mathcs.backport.java.util.concurrent.atomic} package
+ * specification for description of the properties of atomic
+ * variables.
+ * @since 1.5
+ * @author Doug Lea
+ */
+public class AtomicReferenceArray implements java.io.Serializable {
+    private static final long serialVersionUID = -6209656149925076980L;
+
+    private final Object[] array;
+
+    /**
+     * Creates a new AtomicReferenceArray of given length.
+     * @param length the length of the array
+     */
+    public AtomicReferenceArray(int length) {
+        array = new Object[length];
+    }
+
+    /**
+     * Creates a new AtomicReferenceArray with the same length as, and
+     * all elements copied from, the given array.
+     *
+     * @param array the array to copy elements from
+     * @throws NullPointerException if array is null
+     */
+    public AtomicReferenceArray(Object[] array) {
+        if (array == null)
+            throw new NullPointerException();
+        int length = array.length;
+        this.array = new Object[length];
+        System.arraycopy(array, 0, this.array, 0, array.length);
+    }
+
+    /**
+     * Returns the length of the array.
+     *
+     * @return the length of the array
+     */
+    public final int length() {
+        return array.length;
+    }
+
+    /**
+     * Gets the current value at position <tt>i</tt>.
+     *
+     * @param i the index
+     * @return the current value
+     */
+    public final synchronized Object get(int i) {
+        return array[i];
+    }
+
+    /**
+     * Sets the element at position <tt>i</tt> to the given value.
+     *
+     * @param i the index
+     * @param newValue the new value
+     */
+    public final synchronized void set(int i, Object newValue) {
+        array[i] = newValue;
+    }
+
+    /**
+     * Eventually sets the element at position <tt>i</tt> to the given value.
+     *
+     * @param i the index
+     * @param newValue the new value
+     * @since 1.6
+     */
+    public final synchronized void lazySet(int i, Object newValue) {
+        array[i] = newValue;
+    }
+
+
+    /**
+     * Atomically sets the element at position <tt>i</tt> to the given
+     * value and returns the old value.
+     *
+     * @param i the index
+     * @param newValue the new value
+     * @return the previous value
+     */
+    public final synchronized Object getAndSet(int i, Object newValue) {
+        Object old = array[i];
+        array[i] = newValue;
+        return old;
+    }
+
+    /**
+     * Atomically sets the element at position <tt>i</tt> to the given
+     * updated value if the current value <tt>==</tt> the expected value.
+     * @param i the index
+     * @param expect the expected value
+     * @param update the new value
+     * @return true if successful. False return indicates that
+     * the actual value was not equal to the expected value.
+     */
+    public final synchronized boolean compareAndSet(int i, Object expect, Object update) {
+        if (array[i] == expect) {
+            array[i] = update;
+            return true;
+        }
+        else {
+            return false;
+        }
+    }
+
+    /**
+     * Atomically sets the element at position <tt>i</tt> to the given
+     * updated value if the current value <tt>==</tt> the expected value.
+     * May fail spuriously.
+     * @param i the index
+     * @param expect the expected value
+     * @param update the new value
+     * @return true if successful.
+     */
+    public final synchronized boolean weakCompareAndSet(int i, Object expect, Object update) {
+        if (array[i] == expect) {
+            array[i] = update;
+            return true;
+        }
+        else {
+            return false;
+        }
+    }
+
+    /**
+     * Returns the String representation of the current values of array.
+     * @return the String representation of the current values of array.
+     */
+    public synchronized String toString() {
+        if (array.length == 0)
+            return "[]";
+
+        StringBuffer buf = new StringBuffer();
+
+        for (int i = 0; i < array.length; i++) {
+            if (i == 0)
+                buf.append('[');
+            else
+                buf.append(", ");
+
+            buf.append(String.valueOf(array[i]));
+        }
+
+        buf.append("]");
+        return buf.toString();
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic/AtomicStampedReference.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic/AtomicStampedReference.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic/AtomicStampedReference.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,170 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent.atomic;
+
+/**
+ * An <tt>AtomicStampedReference</tt> maintains an object reference
+ * along with an integer "stamp", that can be updated atomically.
+ *
+ * <p> Implementation note. This implementation maintains stamped
+ * references by creating internal objects representing "boxed"
+ * [reference, integer] pairs.
+ *
+ * @since 1.5
+ * @author Doug Lea
+ */
+public class AtomicStampedReference {
+
+    private static class ReferenceIntegerPair {
+        private final Object reference;
+        private final int integer;
+        ReferenceIntegerPair(Object r, int i) {
+            reference = r; integer = i;
+        }
+    }
+
+    private final AtomicReference atomicRef;
+
+    /**
+     * Creates a new <tt>AtomicStampedReference</tt> with the given
+     * initial values.
+     *
+     * @param initialRef the initial reference
+     * @param initialStamp the initial stamp
+     */
+    public AtomicStampedReference(Object initialRef, int initialStamp) {
+        atomicRef = new AtomicReference(
+            new ReferenceIntegerPair(initialRef, initialStamp));
+    }
+
+    /**
+     * Returns the current value of the reference.
+     *
+     * @return the current value of the reference
+     */
+    public Object getReference() {
+        return getPair().reference;
+    }
+
+    /**
+     * Returns the current value of the stamp.
+     *
+     * @return the current value of the stamp
+     */
+    public int getStamp() {
+        return getPair().integer;
+    }
+
+    /**
+     * Returns the current values of both the reference and the stamp.
+     * Typical usage is <tt>int[1] holder; ref = v.get(holder); </tt>.
+     *
+     * @param stampHolder an array of size of at least one.  On return,
+     * <tt>stampholder[0]</tt> will hold the value of the stamp.
+     * @return the current value of the reference
+     */
+    public Object get(int[] stampHolder) {
+        ReferenceIntegerPair p = getPair();
+        stampHolder[0] = p.integer;
+        return p.reference;
+    }
+
+    /**
+     * Atomically sets the value of both the reference and stamp
+     * to the given update values if the
+     * current reference is <tt>==</tt> to the expected reference
+     * and the current stamp is equal to the expected stamp.  Any given
+     * invocation of this operation may fail (return
+     * <tt>false</tt>) spuriously, but repeated invocation when
+     * the current value holds the expected value and no other thread
+     * is also attempting to set the value will eventually succeed.
+     *
+     * @param expectedReference the expected value of the reference
+     * @param newReference the new value for the reference
+     * @param expectedStamp the expected value of the stamp
+     * @param newStamp the new value for the stamp
+     * @return true if successful
+     */
+    public boolean weakCompareAndSet(Object expectedReference,
+                                     Object newReference,
+                                     int    expectedStamp,
+                                     int    newStamp) {
+        ReferenceIntegerPair current = getPair();
+        return  expectedReference == current.reference &&
+            expectedStamp == current.integer &&
+            ((newReference == current.reference &&
+              newStamp == current.integer) ||
+             atomicRef.weakCompareAndSet(current,
+                                     new ReferenceIntegerPair(newReference,
+                                                              newStamp)));
+    }
+
+    /**
+     * Atomically sets the value of both the reference and stamp
+     * to the given update values if the
+     * current reference is <tt>==</tt> to the expected reference
+     * and the current stamp is equal to the expected stamp.
+     *
+     * @param expectedReference the expected value of the reference
+     * @param newReference the new value for the reference
+     * @param expectedStamp the expected value of the stamp
+     * @param newStamp the new value for the stamp
+     * @return true if successful
+     */
+    public boolean compareAndSet(Object expectedReference,
+                                 Object newReference,
+                                 int    expectedStamp,
+                                 int    newStamp) {
+        ReferenceIntegerPair current = getPair();
+        return  expectedReference == current.reference &&
+            expectedStamp == current.integer &&
+            ((newReference == current.reference &&
+              newStamp == current.integer) ||
+             atomicRef.compareAndSet(current,
+                                     new ReferenceIntegerPair(newReference,
+                                                              newStamp)));
+    }
+
+
+    /**
+     * Unconditionally sets the value of both the reference and stamp.
+     *
+     * @param newReference the new value for the reference
+     * @param newStamp the new value for the stamp
+     */
+    public void set(Object newReference, int newStamp) {
+        ReferenceIntegerPair current = getPair();
+        if (newReference != current.reference || newStamp != current.integer)
+            atomicRef.set(new ReferenceIntegerPair(newReference, newStamp));
+    }
+
+    /**
+     * Atomically sets the value of the stamp to the given update value
+     * if the current reference is <tt>==</tt> to the expected
+     * reference.  Any given invocation of this operation may fail
+     * (return <tt>false</tt>) spuriously, but repeated invocation
+     * when the current value holds the expected value and no other
+     * thread is also attempting to set the value will eventually
+     * succeed.
+     *
+     * @param expectedReference the expected value of the reference
+     * @param newStamp the new value for the stamp
+     * @return true if successful
+     */
+    public boolean attemptStamp(Object expectedReference, int newStamp) {
+        ReferenceIntegerPair current = getPair();
+        return  expectedReference == current.reference &&
+            (newStamp == current.integer ||
+             atomicRef.compareAndSet(current,
+                                     new ReferenceIntegerPair(expectedReference,
+                                                              newStamp)));
+    }
+
+    private ReferenceIntegerPair getPair() {
+        return (ReferenceIntegerPair)atomicRef.get();
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic/package.html
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic/package.html	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/atomic/package.html	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,138 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html> <head><title>Atomics</title></head>
+
+<body>A small toolkit of classes that support lock-free thread-safe
+programming on single variables. In essence, the classes in this
+package extend the notion of <tt>volatile</tt> values, fields, and
+array elements to those that also provide an atomic conditional update
+operation of the form:
+
+<pre>
+  boolean compareAndSet(expectedValue, updateValue);
+</pre>
+
+<p> This method (which varies in argument types across different
+classes) atomically sets a variable to the <tt>updateValue</tt> if it
+currently holds the <tt>expectedValue</tt>, reporting <tt>true</tt> on
+success.  The classes in this package also contain methods to get and
+unconditionally set values, as well as a weaker conditional atomic
+update operation <tt> weakCompareAndSet</tt>.  The weak version may be
+more efficient in the normal case, but differs in that any given
+invocation of <tt>weakCompareAndSet</tt> method may fail, even
+spuriously (that is, for no apparent reason). A <tt>false</tt> return
+means only that the operation may be retried if desired, relying on
+the guarantee that repeated invocation when the variable holds
+<tt>expectedValue</tt> and no other thread is also attempting to set
+the variable will eventually succeed.
+
+<p> The specifications of these methods enable implementations to
+employ efficient machine-level atomic instructions that are available
+on contemporary processors. However on some platforms, support may
+entail some form of internal locking. Thus the methods are not
+strictly guaranteed to be non-blocking --
+a thread may block transiently before performing the operation.
+
+<p> Instances of classes {@link
+edu.emory.mathcs.backport.java.util.concurrent.atomic.AtomicBoolean}, {@link
+edu.emory.mathcs.backport.java.util.concurrent.atomic.AtomicInteger}, {@link
+edu.emory.mathcs.backport.java.util.concurrent.atomic.AtomicLong}, and {@link
+edu.emory.mathcs.backport.java.util.concurrent.atomic.AtomicReference} each provide access and
+updates to a single variable of the corresponding type.  Each class
+also provides appropriate utility methods for that type.  For example,
+classes <tt>AtomicLong</tt> and <tt>AtomicInteger</tt> provide atomic
+increment methods.  One application is to generate sequence numbers,
+as in:
+
+<pre>
+class Sequencer {
+  private AtomicLong sequenceNumber = new AtomicLong(0);
+  public long next() { return sequenceNumber.getAndIncrement(); }
+}
+</pre>
+
+<p>The memory effects for accesses and updates of atomics generally
+follow the rules for volatiles, as stated in <a
+href="http://java.sun.com/docs/books/jls/"> The Java Language
+Specification, Third Edition (17.4 Memory Model)</a>:
+
+<ul>
+
+  <li> <tt>get</tt> has the memory effects of reading a
+<tt>volatile</tt> variable.
+
+  <li> <tt>set</tt> has the memory effects of writing (assigning) a
+<tt>volatile</tt> variable.
+
+  <li> <tt>lazySet</tt> has the memory effects of writing (assigning)
+  a <tt>volatile</tt> variable except that it permits reorderings with
+  subsequent (but not previous) memory actions that do not themselves
+  impose reordering constraints with ordinary non-<tt>volatile</tt>
+  writes.  Among other usage contexts, <tt>lazySet</tt> may apply when
+  nulling out, for the sake of garbage collection, a reference that is
+  never accessed again.
+  
+  <li><tt>weakCompareAndSet</tt> atomically reads and conditionally
+  writes a variable, is ordered with respect to other
+  memory operations on that variable, but otherwise acts as an
+  ordinary non-volatile memory operation.
+
+  <li> <tt>compareAndSet</tt>
+  and all other read-and-update operations such as <tt>getAndIncrement</tt>
+  have the memory effects of both reading and
+  writing <tt>volatile</tt> variables.
+</ul>
+
+<!--
+<p>In addition to classes representing single values, this package
+contains <em>Updater</em> classes that can be used to obtain
+<tt>compareAndSet</tt> operations on any selected <tt>volatile</tt>
+field of any selected class.  {@link
+edu.emory.mathcs.backport.java.util.concurrent.atomic.AtomicReferenceFieldUpdater}, {@link
+edu.emory.mathcs.backport.java.util.concurrent.atomic.AtomicIntegerFieldUpdater}, and {@link
+edu.emory.mathcs.backport.java.util.concurrent.atomic.AtomicLongFieldUpdater} are
+reflection-based utilities that provide access to the associated field
+types. These are mainly of use in atomic data structures in which
+several <tt>volatile</tt> fields of the same node (for example, the
+links of a tree node) are independently subject to atomic
+updates. These classes enable greater flexibility in how and when to
+use atomic updates, at the expense of more awkward reflection-based
+setup, less convenient usage, and weaker guarantees.
+-->
+
+<p>The {@link edu.emory.mathcs.backport.java.util.concurrent.atomic.AtomicIntegerArray}, {@link
+edu.emory.mathcs.backport.java.util.concurrent.atomic.AtomicLongArray}, and {@link
+edu.emory.mathcs.backport.java.util.concurrent.atomic.AtomicReferenceArray} classes further
+extend atomic operation support to arrays of these types. These
+classes are also notable in providing <tt>volatile</tt> access
+semantics for their array elements, which is not supported for
+ordinary arrays.
+
+<p> The {@link edu.emory.mathcs.backport.java.util.concurrent.atomic.AtomicMarkableReference}
+class associates a single boolean with a reference. For example, this
+bit might be used inside a data structure to mean that the object
+being referenced has logically been deleted. The {@link
+edu.emory.mathcs.backport.java.util.concurrent.atomic.AtomicStampedReference} class associates
+an integer value with a reference. This may be used for example, to
+represent version numbers corresponding to series of updates.
+
+<p> Atomic classes are designed primarily as building blocks for
+implementing non-blocking data structures and related infrastructure
+classes.  The <tt>compareAndSet</tt> method is not a general
+replacement for locking. It applies only when critical updates for an
+object are confined to a <em>single</em> variable.
+
+<p> Atomic classes are not general purpose replacements for
+<tt>java.lang.Integer</tt> and related classes. They do <em>not</em>
+define methods such as <tt>hashCode</tt> and
+<tt>compareTo</tt>. (Because atomic variables are expected to be
+mutated, they are poor choices for hash table keys.)  Additionally,
+classes are provided only for those types that are commonly useful in
+intended applications. For example, there is no atomic class for
+representing <tt>byte</tt>. In those infrequent cases where you would
+like to do so, you can use an <tt>AtomicInteger</tt> to hold
+<tt>byte</tt> values, and cast appropriately. You can also hold floats
+using <tt>Float.floatToIntBits</tt> and <tt>Float.intBitstoFloat</tt>
+conversions, and doubles using <tt>Double.doubleToLongBits</tt> and
+<tt>Double.longBitsToDouble</tt> conversions.
+
+ at since 1.5</body> </html>

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/helpers/FIFOWaitQueue.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/helpers/FIFOWaitQueue.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/helpers/FIFOWaitQueue.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,85 @@
+package edu.emory.mathcs.backport.java.util.concurrent.helpers;
+
+import java.util.Collection;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Simple linked list queue used in FIFOSemaphore.
+ * Methods are not synchronized; they depend on synch of callers.
+ * Must be public, since it is used by Semaphore (outside this package).
+ * NOTE: this class is NOT present in java.util.concurrent.
+ **/
+
+public class FIFOWaitQueue extends WaitQueue implements java.io.Serializable {
+
+    private final static long serialVersionUID = 2416444691925378811L;
+
+    protected transient WaitNode head_ = null;
+    protected transient WaitNode tail_ = null;
+
+    public FIFOWaitQueue() {}
+
+    public void insert(WaitNode w) {
+        if (tail_ == null)
+            head_ = tail_ = w;
+        else {
+            tail_.next = w;
+            tail_ = w;
+        }
+    }
+
+    public WaitNode extract() {
+        if (head_ == null)
+            return null;
+        else {
+            WaitNode w = head_;
+            head_ = w.next;
+            if (head_ == null)
+                tail_ = null;
+            w.next = null;
+            return w;
+        }
+    }
+
+    public void putBack(WaitNode w) {
+        w.next = head_;
+        head_ = w;
+        if (tail_ == null)
+            tail_ = w;
+    }
+
+    public boolean hasNodes() {
+        return head_ != null;
+    }
+
+    public int getLength() {
+        int count = 0;
+        WaitNode node = head_;
+        while (node != null) {
+            if (node.waiting) count++;
+            node = node.next;
+        }
+        return count;
+    }
+
+    public Collection getWaitingThreads() {
+        List list = new ArrayList();
+        int count = 0;
+        WaitNode node = head_;
+        while (node != null) {
+            if (node.waiting) list.add(node.owner);
+            node = node.next;
+        }
+        return list;
+    }
+
+    public boolean isWaiting(Thread thread) {
+        if (thread == null) throw new NullPointerException();
+        for (WaitNode node = head_; node != null; node = node.next) {
+            if (node.waiting && node.owner == thread) return true;
+        }
+        return false;
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/helpers/NanoTimer.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/helpers/NanoTimer.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/helpers/NanoTimer.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,29 @@
+/*
+ * Written by Dawid Kurzyniec and released to the public domain, as explained
+ * at http://creativecommons.org/licenses/publicdomain
+ */
+package edu.emory.mathcs.backport.java.util.concurrent.helpers;
+
+/**
+ * Interface to specify custom implementation of precise timer.
+ *
+ * @author Dawid Kurzyniec
+ * @version 1.0
+ */
+public interface NanoTimer {
+    /**
+     * Returns the current value of the most precise available system timer,
+     * in nanoseconds. This method can only be used to measure elapsed time and
+     * is not related to any other notion of system or wall-clock time. The
+     * value returned represents nanoseconds since some fixed but arbitrary
+     * time (perhaps in the future, so values may be negative). This method
+     * provides nanosecond precision, but not necessarily nanosecond accuracy.
+     * No guarantees are made about how frequently values change. Differences
+     * in successive calls that span greater than approximately 292 years
+     * (263 nanoseconds) will not accurately compute elapsed time due to
+     * numerical overflow.
+     *
+     * @return The current value of the system timer, in nanoseconds.
+     */
+    long nanoTime();
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/helpers/ThreadHelpers.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/helpers/ThreadHelpers.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/helpers/ThreadHelpers.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,66 @@
+/*
+ * Written by Dawid Kurzyniec and released to the public domain, as explained
+ * at http://creativecommons.org/licenses/publicdomain
+ */
+package edu.emory.mathcs.backport.java.util.concurrent.helpers;
+
+/**
+ * Emulation of some new functionality present in java.lang.Thread in J2SE 5.0.
+ *
+ * @author Dawid Kurzyniec
+ * @version 1.0
+ */
+public class ThreadHelpers {
+
+    private ThreadHelpers() {}
+
+    /**
+     * Returns wrapped runnable that ensures that if an exception occurs
+     * during the execution, the specified exception handler is invoked.
+     * @param runnable runnable for which exceptions are to be intercepted
+     * @param handler the exception handler to call when exception occurs
+     *        during execution of the given runnable
+     * @return wrapped runnable
+     */
+    public static Runnable assignExceptionHandler(final Runnable runnable,
+                                                  final UncaughtExceptionHandler handler)
+    {
+        if (runnable == null || handler == null) {
+            throw new NullPointerException();
+        }
+        return new Runnable() {
+            public void run() {
+                try {
+                    runnable.run();
+                }
+                catch (Throwable error) {
+                    try {
+                        handler.uncaughtException(Thread.currentThread(), error);
+                    }
+                    catch (Throwable ignore) {}
+                }
+            }
+        };
+    }
+
+    /**
+     * Abstraction of the exception handler which receives notifications of
+     * exceptions occurred possibly in various parts of the system. Exception
+     * handlers present attractive approach to exception handling in multi-threaded
+     * systems, as they can handle exceptions that occurred in different threads.
+     * <p>
+     * This class is analogous to Thread.UncaughtExceptionHandler in J2SE 5.0.
+     * Obviously you cannot use it the same way, e.g. you cannot assign the
+     * handler to the thread so that it is invoked when thread terminates.
+     * However, it can be {@link ThreadHelpers#assignExceptionHandler emulated}.
+     */
+    public static interface UncaughtExceptionHandler {
+        /**
+         * Notification of the uncaught exception that occurred within specified
+         * thread.
+         * @param thread the thread where the exception occurred
+         * @param error the exception
+         */
+        void uncaughtException(Thread thread, Throwable error);
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/helpers/Utils.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/helpers/Utils.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/helpers/Utils.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,343 @@
+/*
+ * Written by Dawid Kurzyniec, based on code written by Doug Lea with assistance
+ * from members of JCP JSR-166 Expert Group. Released to the public domain,
+ * as explained at http://creativecommons.org/licenses/publicdomain.
+ *
+ * Thanks to Craig Mattocks for suggesting to use <code>sun.misc.Perf</code>.
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent.helpers;
+
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.lang.reflect.Array;
+import java.util.Iterator;
+import java.util.Collection;
+
+/**
+ * <p>
+ * This class groups together the functionality of java.util.concurrent that
+ * cannot be fully and reliably implemented in backport, but for which some
+ * form of emulation is possible.
+ * <p>
+ * Currently, this class contains methods related to nanosecond-precision
+ * timing, particularly via the {@link #nanoTime} method. To measure time
+ * accurately, this method by default uses <code>java.sun.Perf</code> on
+ * JDK1.4.2 and it falls back to <code>System.currentTimeMillis</code>
+ * on earlier JDKs.
+ *
+ * @author Dawid Kurzyniec
+ * @version 1.0
+ */
+public final class Utils {
+
+    private final static NanoTimer nanoTimer;
+    private final static String providerProp =
+        "edu.emory.mathcs.backport.java.util.concurrent.NanoTimerProvider";
+
+    static {
+        NanoTimer timer = null;
+        try {
+            String nanoTimerClassName = (String)
+                AccessController.doPrivileged(new PrivilegedAction() {
+                    public Object run() {
+                        return System.getProperty(providerProp);
+                    }
+                });
+            if (nanoTimerClassName != null) {
+                Class cls = Class.forName(nanoTimerClassName);
+                timer = (NanoTimer) cls.newInstance();
+            }
+        }
+        catch (Exception e) {
+            System.err.println("WARNING: unable to load the system-property-defined " +
+                               "nanotime provider; switching to the default");
+            e.printStackTrace();
+        }
+
+        if (timer == null) {
+            try {
+                timer = new SunPerfProvider();
+            }
+            catch (Throwable e) {}
+        }
+
+        if (timer == null) {
+            timer = new MillisProvider();
+        }
+
+        nanoTimer = timer;
+    }
+
+    private Utils() {}
+
+    /**
+     * Returns the current value of the most precise available system timer,
+     * in nanoseconds. This method can only be used to measure elapsed time and
+     * is not related to any other notion of system or wall-clock time. The
+     * value returned represents nanoseconds since some fixed but arbitrary
+     * time (perhaps in the future, so values may be negative). This method
+     * provides nanosecond precision, but not necessarily nanosecond accuracy.
+     * No guarantees are made about how frequently values change. Differences
+     * in successive calls that span greater than approximately 292 years
+     * (2^63 nanoseconds) will not accurately compute elapsed time due to
+     * numerical overflow.
+     * <p>
+     * <em>Implementation note:</em>By default, this method uses
+     * <code>sun.misc.Perf</code> on Java 1.4.2, and falls back to
+     * System.currentTimeMillis() emulation on earlier JDKs. Custom
+     * timer can be provided via the system property
+     * <code>edu.emory.mathcs.backport.java.util.concurrent.NanoTimerProvider</code>.
+     * The value of the property should name a class implementing
+     * {@link NanoTimer} interface.
+     * <p>
+     * Note: on JDK 1.4.2, <code>sun.misc.Perf</code> timer seems to have
+     * resolution of the order of 1 microsecond, measured on Linux.
+     *
+     * @return The current value of the system timer, in nanoseconds.
+     */
+    public static long nanoTime() {
+        return nanoTimer.nanoTime();
+    }
+
+    /**
+     * Causes the current thread to wait until it is signalled or interrupted,
+     * or the specified waiting time elapses. This method originally appears
+     * in the {@link Condition} interface, but it was moved to here since it
+     * can only be emulated, with very little accuracy guarantees: the
+     * efficient implementation requires accurate nanosecond timer and native
+     * support for nanosecond-precision wait queues, which are not usually
+     * present in JVMs prior to 1.5. Loss of precision may cause total waiting
+     * times to be systematically shorter than specified when re-waits occur.
+     *
+     * <p>The lock associated with this condition is atomically
+     * released and the current thread becomes disabled for thread scheduling
+     * purposes and lies dormant until <em>one</em> of five things happens:
+     * <ul>
+     * <li>Some other thread invokes the {@link
+     * edu.emory.mathcs.backport.java.util.concurrent.locks.Condition#signal}
+     * method for this
+     * <tt>Condition</tt> and the current thread happens to be chosen as the
+     * thread to be awakened; or
+     * <li>Some other thread invokes the {@link
+     * edu.emory.mathcs.backport.java.util.concurrent.locks.Condition#signalAll}
+     * method for this
+     * <tt>Condition</tt>; or
+     * <li>Some other thread {@link Thread#interrupt interrupts} the current
+     * thread, and interruption of thread suspension is supported; or
+     * <li>The specified waiting time elapses; or
+     * <li>A &quot;<em>spurious wakeup</em>&quot; occurs.
+     * </ul>
+     *
+     * <p>In all cases, before this method can return the current thread must
+     * re-acquire the lock associated with this condition. When the
+     * thread returns it is <em>guaranteed</em> to hold this lock.
+     *
+     * <p>If the current thread:
+     * <ul>
+     * <li>has its interrupted status set on entry to this method; or
+     * <li>is {@link Thread#interrupt interrupted} while waiting
+     * and interruption of thread suspension is supported,
+     * </ul>
+     * then {@link InterruptedException} is thrown and the current thread's
+     * interrupted status is cleared. It is not specified, in the first
+     * case, whether or not the test for interruption occurs before the lock
+     * is released.
+     *
+     * <p>The method returns an estimate of the number of nanoseconds
+     * remaining to wait given the supplied <tt>nanosTimeout</tt>
+     * value upon return, or a value less than or equal to zero if it
+     * timed out. Accuracy of this estimate is directly dependent on the
+     * accuracy of {@link #nanoTime}. This value can be used to determine
+     * whether and how long to re-wait in cases where the wait returns but an
+     * awaited condition still does not hold. Typical uses of this method take
+     * the following form:
+     *
+     * <pre>
+     * synchronized boolean aMethod(long timeout, TimeUnit unit) {
+     *   long nanosTimeout = unit.toNanos(timeout);
+     *   while (!conditionBeingWaitedFor) {
+     *     if (nanosTimeout &gt; 0)
+     *         nanosTimeout = theCondition.awaitNanos(nanosTimeout);
+     *      else
+     *        return false;
+     *   }
+     *   // ...
+     * }
+     * </pre>
+     *
+     * <p><b>Implementation Considerations</b>
+     * <p>The current thread is assumed to hold the lock associated with this
+     * <tt>Condition</tt> when this method is called.
+     * It is up to the implementation to determine if this is
+     * the case and if not, how to respond. Typically, an exception will be
+     * thrown (such as {@link IllegalMonitorStateException}) and the
+     * implementation must document that fact.
+     *
+     * <p>A condition implementation can favor responding to an interrupt over
+     * normal method return in response to a signal, or over indicating the
+     * elapse of the specified waiting time. In either case the implementation
+     * must ensure that the signal is redirected to another waiting thread, if
+     * there is one.
+     *
+     * @param cond the condition to wait for
+     * @param nanosTimeout the maximum time to wait, in nanoseconds
+     * @return A value less than or equal to zero if the wait has
+     * timed out; otherwise an estimate, that
+     * is strictly less than the <tt>nanosTimeout</tt> argument,
+     * of the time still remaining when this method returned.
+     *
+     * @throws InterruptedException if the current thread is interrupted (and
+     * interruption of thread suspension is supported).
+     */
+    public static long awaitNanos(Condition cond, long nanosTimeout)
+        throws InterruptedException
+    {
+        if (nanosTimeout <= 0) return nanosTimeout;
+        long now = nanoTime();
+        cond.await(nanosTimeout, TimeUnit.NANOSECONDS);
+        return nanosTimeout - (nanoTime() - now);
+    }
+
+    private static final class SunPerfProvider implements NanoTimer {
+        final sun.misc.Perf perf;
+        final long multiplier, divisor;
+        SunPerfProvider() {
+            perf = (sun.misc.Perf)
+                AccessController.doPrivileged(new PrivilegedAction() {
+                    public Object run() {
+                        return sun.misc.Perf.getPerf();
+                    }
+                });
+            // trying to avoid BOTH overflow and rounding errors
+            long numerator = 1000000000;
+            long denominator = perf.highResFrequency();
+            long gcd = gcd(numerator, denominator);
+            this.multiplier = numerator / gcd;
+            this.divisor = denominator / gcd;
+        }
+        public long nanoTime() {
+            long ctr = perf.highResCounter();
+
+            // anything less sophisticated suffers either from rounding errors
+            // (FP arithmetics, backport v1.0) or overflow, when gcd is small
+            // (a bug in backport v1.0_01 reported by Ramesh Nethi)
+
+            return ((ctr / divisor) * multiplier) +
+                    (ctr % divisor) * multiplier / divisor;
+
+            // even the above can theoretically cause problems if your JVM is
+            // running for sufficiently long time, but "sufficiently" means 292
+            // years (worst case), or 30,000 years (common case).
+
+            // Details: when the ticks ctr overflows, there is no way to avoid
+            // discontinuity in computed nanos, even in infinite arithmetics,
+            // unless we count number of overflows that the ctr went through
+            // since the JVM started. This follows from the fact that
+            // (2^64*multiplier/divisor) mod (2^64) > 0 in general case.
+            // Theoretically we could find out the number of overflows by
+            // checking System.currentTimeMillis(), but this is unreliable
+            // since the system time can unpredictably change during the JVM
+            // lifetime.
+            // The time to overflow is 2^63 / ticks frequency. With current
+            // ticks frequencies of several MHz, it gives about 30,000 years
+            // before the problem happens. If ticks frequency reaches 1 GHz, the
+            // time to overflow is 292 years. It is unlikely that the frequency
+            // ever exceeds 1 GHz. We could double the time to overflow
+            // (to 2^64 / frequency) by using unsigned arithmetics, e.g. by
+            // adding the following correction whenever the ticks is negative:
+            //      -2*((Long.MIN_VALUE / divisor) * multiplier +
+            //          (Long.MIN_VALUE % divisor) * multiplier / divisor)
+            // But, with the worst case of as much as 292 years, it does not
+            // seem justified.
+        }
+    }
+
+    private static final class MillisProvider implements NanoTimer {
+        MillisProvider() {}
+        public long nanoTime() {
+            return System.currentTimeMillis() * 1000000;
+        }
+    }
+
+    private static long gcd(long a, long b) {
+        long r;
+        while (b>0) { r = a % b; a = b; b = r; }
+        return a;
+    }
+
+
+    public static Object[] collectionToArray(Collection c) {
+        // guess the array size; expect to possibly be different
+        int len = c.size();
+        Object[] arr = new Object[len];
+        Iterator itr = c.iterator();
+        int idx = 0;
+        while (true) {
+            while (idx < len && itr.hasNext()) {
+                arr[idx++] = itr.next();
+            }
+            if (!itr.hasNext()) {
+                if (idx == len) return arr;
+                // otherwise have to trim
+                return Arrays.copyOf(arr, idx, Object[].class);
+            }
+            // otherwise, have to grow
+            int newcap = ((arr.length/2)+1)*3;
+            if (newcap < arr.length) {
+                // overflow
+                if (arr.length < Integer.MAX_VALUE) {
+                    newcap = Integer.MAX_VALUE;
+                }
+                else {
+                    throw new OutOfMemoryError("required array size too large");
+                }
+            }
+            arr = Arrays.copyOf(arr, newcap, Object[].class);
+            len = newcap;
+        }
+    }
+
+    public static Object[] collectionToArray(Collection c, Object[] a) {
+        Class aType = a.getClass();
+        // guess the array size; expect to possibly be different
+        int len = c.size();
+        Object[] arr = (a.length >= len ? a :
+                        (Object[])Array.newInstance(aType.getComponentType(), len));
+        Iterator itr = c.iterator();
+        int idx = 0;
+        while (true) {
+            while (idx < len && itr.hasNext()) {
+                arr[idx++] = itr.next();
+            }
+            if (!itr.hasNext()) {
+                if (idx == len) return arr;
+                if (arr == a) {
+                    // orig array -> null terminate
+                    a[idx] = null;
+                    return a;
+                }
+                else {
+                    // have to trim
+                    return Arrays.copyOf(arr, idx, aType);
+                }
+            }
+            // otherwise, have to grow
+            int newcap = ((arr.length/2)+1)*3;
+            if (newcap < arr.length) {
+                // overflow
+                if (arr.length < Integer.MAX_VALUE) {
+                    newcap = Integer.MAX_VALUE;
+                }
+                else {
+                    throw new OutOfMemoryError("required array size too large");
+                }
+            }
+            arr = Arrays.copyOf(arr, newcap, aType);
+            len = newcap;
+        }
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/helpers/WaitQueue.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/helpers/WaitQueue.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/helpers/WaitQueue.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,146 @@
+/*
+  based on file: QueuedSemaphore.java
+  Originally written by Doug Lea and released into the public domain.
+  This may be used for any purposes whatsoever without acknowledgment.
+  Thanks for the assistance and support of Sun Microsystems Labs,
+  and everyone contributing, testing, and using this code.
+  History:
+  Date       Who                What
+  11Jun1998  dl               Create public version
+   5Aug1998  dl               replaced int counters with longs
+  24Aug1999  dl               release(n): screen arguments
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent.helpers;
+
+import java.util.Collection;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+
+/**
+ * Base class for internal queue classes for semaphores, etc.
+ * Relies on subclasses to actually implement queue mechanics.
+ * NOTE: this class is NOT present in java.util.concurrent.
+ **/
+
+public abstract class WaitQueue {
+
+    public abstract void insert(WaitNode w); // assumed not to block
+    public abstract WaitNode extract(); // should return null if empty
+    public abstract void putBack(WaitNode w);
+
+    public abstract boolean hasNodes();
+    public abstract int getLength();
+    public abstract Collection getWaitingThreads();
+    public abstract boolean isWaiting(Thread thread);
+
+    public static interface QueuedSync {
+        // invoked with sync on wait node, (atomically) just before enqueuing
+        boolean recheck(WaitNode node);
+        // invoked with sync on wait node, (atomically) just before signalling
+        void takeOver(WaitNode node);
+    }
+
+    public static class WaitNode {
+        boolean waiting = true;
+        WaitNode next = null;
+        final Thread owner;
+
+        public WaitNode() {
+            this.owner = Thread.currentThread();
+        }
+
+        public Thread getOwner() {
+            return owner;
+        }
+
+        public synchronized boolean signal(QueuedSync sync) {
+            boolean signalled = waiting;
+            if (signalled) {
+                waiting = false;
+                notify();
+                sync.takeOver(this);
+            }
+            return signalled;
+        }
+
+        public synchronized boolean doTimedWait(QueuedSync sync, long nanos)
+            throws InterruptedException
+        {
+            if (sync.recheck(this) || !waiting)
+                return true;
+            else if (nanos <= 0) {
+                waiting = false;
+                return false;
+            }
+            else {
+                long deadline = Utils.nanoTime() + nanos;
+                try {
+                    for (; ; ) {
+                        TimeUnit.NANOSECONDS.timedWait(this, nanos);
+                        if (!waiting) // definitely signalled
+                            return true;
+                        else {
+                            nanos = deadline - Utils.nanoTime();
+                            if (nanos <= 0) { //  timed out
+                                waiting = false;
+                                return false;
+                            }
+                        }
+                    }
+                }
+                catch (InterruptedException ex) {
+                    if (waiting) { // no notification
+                        waiting = false; // invalidate for the signaller
+                        throw ex;
+                    }
+                    else { // thread was interrupted after it was notified
+                        Thread.currentThread().interrupt();
+                        return true;
+                    }
+                }
+            }
+        }
+
+        public synchronized void doWait(QueuedSync sync)
+            throws InterruptedException
+        {
+            if (!sync.recheck(this)) {
+                try {
+                    while (waiting) wait();
+                }
+                catch (InterruptedException ex) {
+                    if (waiting) { // no notification
+                        waiting = false; // invalidate for the signaller
+                        throw ex;
+                    }
+                    else { // thread was interrupted after it was notified
+                        Thread.currentThread().interrupt();
+                        return;
+                    }
+                }
+            }
+        }
+
+        public synchronized void doWaitUninterruptibly(QueuedSync sync) {
+            if (!sync.recheck(this)) {
+                boolean wasInterrupted = Thread.interrupted();
+                try {
+                    while (waiting) {
+                        try {
+                            wait();
+                        }
+                        catch (InterruptedException ex) {
+                            wasInterrupted = true;
+                            // no need to notify; if we were signalled, we
+                            // must be not waiting, and we'll act like signalled
+                        }
+                    }
+                }
+                finally {
+                    if (wasInterrupted) Thread.currentThread().interrupt();
+                }
+            }
+        }
+    }
+}
+

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/helpers/package.html
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/helpers/package.html	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/helpers/package.html	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,11 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head><!--
+  Copyright (c) 2004 
+  All Rights Reserved.
+--></head>
+
+<body bgcolor="white">Auxiliary and helper classes for backport.util.concurrent, NOT present in
+java.util.concurrent.
+</body>
+</html>

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/locks/CondVar.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/locks/CondVar.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/locks/CondVar.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,194 @@
+/*
+  File: ConditionVariable.java
+  Originally written by Doug Lea and released into the public domain.
+  This may be used for any purposes whatsoever without acknowledgment.
+  Thanks for the assistance and support of Sun Microsystems Labs,
+  and everyone contributing, testing, and using this code.
+  History:
+  Date       Who                What
+  11Jun1998  dl               Create public version
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent.locks;
+
+import java.util.Collection;
+import java.util.Date;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.*;
+
+class CondVar implements Condition, java.io.Serializable {
+
+    /** The lock **/
+    protected final ExclusiveLock lock;
+
+    /**
+     * Create a new CondVar that relies on the given mutual
+     * exclusion lock.
+     * @param lock A non-reentrant mutual exclusion lock.
+     **/
+
+    CondVar(ExclusiveLock lock) {
+        this.lock = lock;
+    }
+
+    public void awaitUninterruptibly() {
+        int holdCount = lock.getHoldCount();
+        if (holdCount == 0) {
+            throw new IllegalMonitorStateException();
+        }
+        // avoid instant spurious wakeup if thread already interrupted
+        boolean wasInterrupted = Thread.interrupted();
+        try {
+            synchronized (this) {
+                for (int i=holdCount; i>0; i--) lock.unlock();
+                while (true) {
+                    try {
+                        wait();
+                        break;
+                    }
+                    catch (InterruptedException ex) {
+                        wasInterrupted = true;
+                        // may have masked the signal and there is no way
+                        // to tell; defensively propagate the signal
+                        notify();
+                    }
+                }
+            }
+        }
+        finally {
+            for (int i=holdCount; i>0; i--) lock.lock();
+            if (wasInterrupted) {
+                Thread.currentThread().interrupt();
+            }
+        }
+    }
+
+    public void await() throws InterruptedException {
+        int holdCount = lock.getHoldCount();
+        if (holdCount == 0) {
+            throw new IllegalMonitorStateException();
+        }
+        if (Thread.interrupted()) throw new InterruptedException();
+        try {
+            synchronized (this) {
+                for (int i=holdCount; i>0; i--) lock.unlock();
+                try {
+                    wait();
+                }
+                catch (InterruptedException ex) {
+                    notify();
+                    throw ex;
+                }
+            }
+        }
+        finally {
+            for (int i=holdCount; i>0; i--) lock.lock();
+        }
+    }
+
+    public boolean await(long timeout, TimeUnit unit) throws InterruptedException {
+        int holdCount = lock.getHoldCount();
+        if (holdCount == 0) {
+            throw new IllegalMonitorStateException();
+        }
+        if (Thread.interrupted()) throw new InterruptedException();
+        long nanos = unit.toNanos(timeout);
+        boolean success = false;
+        try {
+            synchronized (this) {
+                for (int i=holdCount; i>0; i--) lock.unlock();
+                try {
+                    if (nanos > 0) {
+                        long start = Utils.nanoTime();
+                        TimeUnit.NANOSECONDS.timedWait(this, nanos);
+                        // DK: due to coarse-grained (millis) clock, it seems
+                        // preferable to acknowledge timeout (success == false)
+                        // when the equality holds (timing is exact)
+                        success = Utils.nanoTime() - start < nanos;
+                    }
+                }
+                catch (InterruptedException ex) {
+                    notify();
+                    throw ex;
+                }
+            }
+        }
+        finally {
+            for (int i=holdCount; i>0; i--) lock.lock();
+        }
+        return success;
+    }
+
+//    public long awaitNanos(long timeout) throws InterruptedException {
+//        throw new UnsupportedOperationException();
+//    }
+//
+    public boolean awaitUntil(Date deadline) throws InterruptedException {
+        if (deadline == null) throw new NullPointerException();
+        int holdCount = lock.getHoldCount();
+        if (holdCount == 0) {
+            throw new IllegalMonitorStateException();
+        }
+        long abstime = deadline.getTime();
+        if (Thread.interrupted()) throw new InterruptedException();
+
+        boolean success = false;
+        try {
+            synchronized (this) {
+                for (int i=holdCount; i>0; i--) lock.unlock();
+                try {
+                    long start = System.currentTimeMillis();
+                    long msecs = abstime - start;
+                    if (msecs > 0) {
+                        wait(msecs);
+                        // DK: due to coarse-grained (millis) clock, it seems
+                        // preferable to acknowledge timeout (success == false)
+                        // when the equality holds (timing is exact)
+                        success = System.currentTimeMillis() - start < msecs;
+                    }
+                }
+                catch (InterruptedException ex) {
+                    notify();
+                    throw ex;
+                }
+            }
+        }
+        finally {
+            for (int i=holdCount; i>0; i--) lock.lock();
+        }
+        return success;
+    }
+
+    public synchronized void signal() {
+        if (!lock.isHeldByCurrentThread()) {
+            throw new IllegalMonitorStateException();
+        }
+        notify();
+    }
+
+    public synchronized void signalAll() {
+        if (!lock.isHeldByCurrentThread()) {
+            throw new IllegalMonitorStateException();
+        }
+        notifyAll();
+    }
+
+    protected ExclusiveLock getLock() { return lock; }
+
+    protected boolean hasWaiters() {
+        throw new UnsupportedOperationException("Use FAIR version");
+    }
+
+    protected int getWaitQueueLength() {
+        throw new UnsupportedOperationException("Use FAIR version");
+    }
+
+    protected Collection getWaitingThreads() {
+        throw new UnsupportedOperationException("Use FAIR version");
+    }
+
+    static interface ExclusiveLock extends Lock {
+        boolean isHeldByCurrentThread();
+        int getHoldCount();
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/locks/Condition.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/locks/Condition.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/locks/Condition.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,434 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent.locks;
+
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import java.util.Date;
+
+/**
+ * {@code Condition} factors out the {@code Object} monitor
+ * methods ({@link Object#wait() wait}, {@link Object#notify notify}
+ * and {@link Object#notifyAll notifyAll}) into distinct objects to
+ * give the effect of having multiple wait-sets per object, by
+ * combining them with the use of arbitrary {@link Lock} implementations.
+ * Where a {@code Lock} replaces the use of {@code synchronized} methods
+ * and statements, a {@code Condition} replaces the use of the Object
+ * monitor methods.
+ *
+ * <p>Conditions (also known as <em>condition queues</em> or
+ * <em>condition variables</em>) provide a means for one thread to
+ * suspend execution (to &quot;wait&quot;) until notified by another
+ * thread that some state condition may now be true.  Because access
+ * to this shared state information occurs in different threads, it
+ * must be protected, so a lock of some form is associated with the
+ * condition. The key property that waiting for a condition provides
+ * is that it <em>atomically</em> releases the associated lock and
+ * suspends the current thread, just like {@code Object.wait}.
+ *
+ * <p>A {@code Condition} instance is intrinsically bound to a lock.
+ * To obtain a {@code Condition} instance for a particular {@link Lock}
+ * instance use its {@link Lock#newCondition newCondition()} method.
+ *
+ * <p>As an example, suppose we have a bounded buffer which supports
+ * {@code put} and {@code take} methods.  If a
+ * {@code take} is attempted on an empty buffer, then the thread will block
+ * until an item becomes available; if a {@code put} is attempted on a
+ * full buffer, then the thread will block until a space becomes available.
+ * We would like to keep waiting {@code put} threads and {@code take}
+ * threads in separate wait-sets so that we can use the optimization of
+ * only notifying a single thread at a time when items or spaces become
+ * available in the buffer. This can be achieved using two
+ * {@link Condition} instances.
+ * <pre>
+ * class BoundedBuffer {
+ *   <b>final Lock lock = new ReentrantLock();</b>
+ *   final Condition notFull  = <b>lock.newCondition(); </b>
+ *   final Condition notEmpty = <b>lock.newCondition(); </b>
+ *
+ *   final Object[] items = new Object[100];
+ *   int putptr, takeptr, count;
+ *
+ *   public void put(Object x) throws InterruptedException {
+ *     <b>lock.lock();
+ *     try {</b>
+ *       while (count == items.length)
+ *         <b>notFull.await();</b>
+ *       items[putptr] = x;
+ *       if (++putptr == items.length) putptr = 0;
+ *       ++count;
+ *       <b>notEmpty.signal();</b>
+ *     <b>} finally {
+ *       lock.unlock();
+ *     }</b>
+ *   }
+ *
+ *   public Object take() throws InterruptedException {
+ *     <b>lock.lock();
+ *     try {</b>
+ *       while (count == 0)
+ *         <b>notEmpty.await();</b>
+ *       Object x = items[takeptr];
+ *       if (++takeptr == items.length) takeptr = 0;
+ *       --count;
+ *       <b>notFull.signal();</b>
+ *       return x;
+ *     <b>} finally {
+ *       lock.unlock();
+ *     }</b>
+ *   }
+ * }
+ * </pre>
+ *
+ * (The {@link edu.emory.mathcs.backport.java.util.concurrent.ArrayBlockingQueue} class provides
+ * this functionality, so there is no reason to implement this
+ * sample usage class.)
+ *
+ * <p>A {@code Condition} implementation can provide behavior and semantics
+ * that is
+ * different from that of the {@code Object} monitor methods, such as
+ * guaranteed ordering for notifications, or not requiring a lock to be held
+ * when performing notifications.
+ * If an implementation provides such specialized semantics then the
+ * implementation must document those semantics.
+ *
+ * <p>Note that {@code Condition} instances are just normal objects and can
+ * themselves be used as the target in a {@code synchronized} statement,
+ * and can have their own monitor {@link Object#wait wait} and
+ * {@link Object#notify notification} methods invoked.
+ * Acquiring the monitor lock of a {@code Condition} instance, or using its
+ * monitor methods, has no specified relationship with acquiring the
+ * {@link Lock} associated with that {@code Condition} or the use of its
+ * {@linkplain #await waiting} and {@linkplain #signal signalling} methods.
+ * It is recommended that to avoid confusion you never use {@code Condition}
+ * instances in this way, except perhaps within their own implementation.
+ *
+ * <p>Except where noted, passing a {@code null} value for any parameter
+ * will result in a {@link NullPointerException} being thrown.
+ *
+ * <h3>Implementation Considerations</h3>
+ *
+ * <p>When waiting upon a {@code Condition}, a &quot;<em>spurious
+ * wakeup</em>&quot; is permitted to occur, in
+ * general, as a concession to the underlying platform semantics.
+ * This has little practical impact on most application programs as a
+ * {@code Condition} should always be waited upon in a loop, testing
+ * the state predicate that is being waited for.  An implementation is
+ * free to remove the possibility of spurious wakeups but it is
+ * recommended that applications programmers always assume that they can
+ * occur and so always wait in a loop.
+ *
+ * <p>The three forms of condition waiting
+ * (interruptible, non-interruptible, and timed) may differ in their ease of
+ * implementation on some platforms and in their performance characteristics.
+ * In particular, it may be difficult to provide these features and maintain
+ * specific semantics such as ordering guarantees.
+ * Further, the ability to interrupt the actual suspension of the thread may
+ * not always be feasible to implement on all platforms.
+ *
+ * <p>Consequently, an implementation is not required to define exactly the
+ * same guarantees or semantics for all three forms of waiting, nor is it
+ * required to support interruption of the actual suspension of the thread.
+ *
+ * <p>An implementation is required to
+ * clearly document the semantics and guarantees provided by each of the
+ * waiting methods, and when an implementation does support interruption of
+ * thread suspension then it must obey the interruption semantics as defined
+ * in this interface.
+ *
+ * <p>As interruption generally implies cancellation, and checks for
+ * interruption are often infrequent, an implementation can favor responding
+ * to an interrupt over normal method return. This is true even if it can be
+ * shown that the interrupt occurred after another action may have unblocked
+ * the thread. An implementation should document this behavior.
+ *
+ * @since 1.5
+ * @author Doug Lea
+ */
+public interface Condition {
+
+    /**
+     * Causes the current thread to wait until it is signalled or
+     * {@linkplain Thread#interrupt interrupted}.
+     *
+     * <p>The lock associated with this {@code Condition} is atomically
+     * released and the current thread becomes disabled for thread scheduling
+     * purposes and lies dormant until <em>one</em> of four things happens:
+     * <ul>
+     * <li>Some other thread invokes the {@link #signal} method for this
+     * {@code Condition} and the current thread happens to be chosen as the
+     * thread to be awakened; or
+     * <li>Some other thread invokes the {@link #signalAll} method for this
+     * {@code Condition}; or
+     * <li>Some other thread {@linkplain Thread#interrupt interrupts} the
+     * current thread, and interruption of thread suspension is supported; or
+     * <li>A &quot;<em>spurious wakeup</em>&quot; occurs.
+     * </ul>
+     *
+     * <p>In all cases, before this method can return the current thread must
+     * re-acquire the lock associated with this condition. When the
+     * thread returns it is <em>guaranteed</em> to hold this lock.
+     *
+     * <p>If the current thread:
+     * <ul>
+     * <li>has its interrupted status set on entry to this method; or
+     * <li>is {@linkplain Thread#interrupt interrupted} while waiting
+     * and interruption of thread suspension is supported,
+     * </ul>
+     * then {@link InterruptedException} is thrown and the current thread's
+     * interrupted status is cleared. It is not specified, in the first
+     * case, whether or not the test for interruption occurs before the lock
+     * is released.
+     *
+     * <p><b>Implementation Considerations</b>
+     *
+     * <p>The current thread is assumed to hold the lock associated with this
+     * {@code Condition} when this method is called.
+     * It is up to the implementation to determine if this is
+     * the case and if not, how to respond. Typically, an exception will be
+     * thrown (such as {@link IllegalMonitorStateException}) and the
+     * implementation must document that fact.
+     *
+     * <p>An implementation can favor responding to an interrupt over normal
+     * method return in response to a signal. In that case the implementation
+     * must ensure that the signal is redirected to another waiting thread, if
+     * there is one.
+     *
+     * @throws InterruptedException if the current thread is interrupted
+     *         (and interruption of thread suspension is supported)
+     */
+    void await() throws InterruptedException;
+
+    /**
+     * Causes the current thread to wait until it is signalled.
+     *
+     * <p>The lock associated with this condition is atomically
+     * released and the current thread becomes disabled for thread scheduling
+     * purposes and lies dormant until <em>one</em> of three things happens:
+     * <ul>
+     * <li>Some other thread invokes the {@link #signal} method for this
+     * {@code Condition} and the current thread happens to be chosen as the
+     * thread to be awakened; or
+     * <li>Some other thread invokes the {@link #signalAll} method for this
+     * {@code Condition}; or
+     * <li>A &quot;<em>spurious wakeup</em>&quot; occurs.
+     * </ul>
+     *
+     * <p>In all cases, before this method can return the current thread must
+     * re-acquire the lock associated with this condition. When the
+     * thread returns it is <em>guaranteed</em> to hold this lock.
+     *
+     * <p>If the current thread's interrupted status is set when it enters
+     * this method, or it is {@linkplain Thread#interrupt interrupted}
+     * while waiting, it will continue to wait until signalled. When it finally
+     * returns from this method its interrupted status will still
+     * be set.
+     *
+     * <p><b>Implementation Considerations</b>
+     *
+     * <p>The current thread is assumed to hold the lock associated with this
+     * {@code Condition} when this method is called.
+     * It is up to the implementation to determine if this is
+     * the case and if not, how to respond. Typically, an exception will be
+     * thrown (such as {@link IllegalMonitorStateException}) and the
+     * implementation must document that fact.
+     */
+    void awaitUninterruptibly();
+
+//    /**
+//     * Causes the current thread to wait until it is signalled or interrupted,
+//     * or the specified waiting time elapses.
+//     *
+//     * <p>The lock associated with this condition is atomically
+//     * released and the current thread becomes disabled for thread scheduling
+//     * purposes and lies dormant until <em>one</em> of five things happens:
+//     * <ul>
+//     * <li>Some other thread invokes the {@link #signal} method for this
+//     * <tt>Condition</tt> and the current thread happens to be chosen as the
+//     * thread to be awakened; or
+//     * <li>Some other thread invokes the {@link #signalAll} method for this
+//     * <tt>Condition</tt>; or
+//     * <li>Some other thread {@link Thread#interrupt interrupts} the current
+//     * thread, and interruption of thread suspension is supported; or
+//     * <li>The specified waiting time elapses; or
+//     * <li>A &quot;<em>spurious wakeup</em>&quot; occurs.
+//     * </ul>
+//     *
+//     * <p>In all cases, before this method can return the current thread must
+//     * re-acquire the lock associated with this condition. When the
+//     * thread returns it is <em>guaranteed</em> to hold this lock.
+//     *
+//     * <p>If the current thread:
+//     * <ul>
+//     * <li>has its interrupted status set on entry to this method; or
+//     * <li>is {@link Thread#interrupt interrupted} while waiting
+//     * and interruption of thread suspension is supported,
+//     * </ul>
+//     * then {@link InterruptedException} is thrown and the current thread's
+//     * interrupted status is cleared. It is not specified, in the first
+//     * case, whether or not the test for interruption occurs before the lock
+//     * is released.
+//     *
+//     * <p>The method returns an estimate of the number of nanoseconds
+//     * remaining to wait given the supplied <tt>nanosTimeout</tt>
+//     * value upon return, or a value less than or equal to zero if it
+//     * timed out. This value can be used to determine whether and how
+//     * long to re-wait in cases where the wait returns but an awaited
+//     * condition still does not hold. Typical uses of this method take
+//     * the following form:
+//     *
+//     * <pre>
+//     * synchronized boolean aMethod(long timeout, TimeUnit unit) {
+//     *   long nanosTimeout = unit.toNanos(timeout);
+//     *   while (!conditionBeingWaitedFor) {
+//     *     if (nanosTimeout &gt; 0)
+//     *         nanosTimeout = theCondition.awaitNanos(nanosTimeout);
+//     *      else
+//     *        return false;
+//     *   }
+//     *   // ...
+//     * }
+//     * </pre>
+//     *
+//     * <p> Design note: This method requires a nanosecond argument so
+//     * as to avoid truncation errors in reporting remaining times.
+//     * Such precision loss would make it difficult for programmers to
+//     * ensure that total waiting times are not systematically shorter
+//     * than specified when re-waits occur.
+//     *
+//     * <p><b>Implementation Considerations</b>
+//     * <p>The current thread is assumed to hold the lock associated with this
+//     * <tt>Condition</tt> when this method is called.
+//     * It is up to the implementation to determine if this is
+//     * the case and if not, how to respond. Typically, an exception will be
+//     * thrown (such as {@link IllegalMonitorStateException}) and the
+//     * implementation must document that fact.
+//     *
+//     * <p>An implementation can favor responding to an interrupt over normal
+//     * method return in response to a signal, or over indicating the elapse
+//     * of the specified waiting time. In either case the implementation
+//     * must ensure that the signal is redirected to another waiting thread, if
+//     * there is one.
+//     *
+//     * @param nanosTimeout the maximum time to wait, in nanoseconds
+//     * @return A value less than or equal to zero if the wait has
+//     * timed out; otherwise an estimate, that
+//     * is strictly less than the <tt>nanosTimeout</tt> argument,
+//     * of the time still remaining when this method returned.
+//     *
+//     * @throws InterruptedException if the current thread is interrupted (and
+//     * interruption of thread suspension is supported).
+//     */
+//    long awaitNanos(long nanosTimeout) throws InterruptedException;
+
+    /**
+     * Causes the current thread to wait until it is signalled or interrupted,
+     * or the specified waiting time elapses. This method is behaviorally
+     * equivalent to:<br>
+     * <pre>
+     *   awaitNanos(unit.toNanos(time)) &gt; 0
+     * </pre>
+     * @param time the maximum time to wait
+     * @param unit the time unit of the {@code time} argument
+     * @return {@code false} if the waiting time detectably elapsed
+     *         before return from the method, else {@code true}
+     * @throws InterruptedException if the current thread is interrupted
+     *         (and interruption of thread suspension is supported)
+     */
+    boolean await(long time, TimeUnit unit) throws InterruptedException;
+
+    /**
+     * Causes the current thread to wait until it is signalled or interrupted,
+     * or the specified deadline elapses.
+     *
+     * <p>The lock associated with this condition is atomically
+     * released and the current thread becomes disabled for thread scheduling
+     * purposes and lies dormant until <em>one</em> of five things happens:
+     * <ul>
+     * <li>Some other thread invokes the {@link #signal} method for this
+     * {@code Condition} and the current thread happens to be chosen as the
+     * thread to be awakened; or
+     * <li>Some other thread invokes the {@link #signalAll} method for this
+     * {@code Condition}; or
+     * <li>Some other thread {@linkplain Thread#interrupt interrupts} the
+     * current thread, and interruption of thread suspension is supported; or
+     * <li>The specified deadline elapses; or
+     * <li>A &quot;<em>spurious wakeup</em>&quot; occurs.
+     * </ul>
+     *
+     * <p>In all cases, before this method can return the current thread must
+     * re-acquire the lock associated with this condition. When the
+     * thread returns it is <em>guaranteed</em> to hold this lock.
+     *
+     *
+     * <p>If the current thread:
+     * <ul>
+     * <li>has its interrupted status set on entry to this method; or
+     * <li>is {@linkplain Thread#interrupt interrupted} while waiting
+     * and interruption of thread suspension is supported,
+     * </ul>
+     * then {@link InterruptedException} is thrown and the current thread's
+     * interrupted status is cleared. It is not specified, in the first
+     * case, whether or not the test for interruption occurs before the lock
+     * is released.
+     *
+     *
+     * <p>The return value indicates whether the deadline has elapsed,
+     * which can be used as follows:
+     * <pre>
+     * synchronized boolean aMethod(Date deadline) {
+     *   boolean stillWaiting = true;
+     *   while (!conditionBeingWaitedFor) {
+     *     if (stillWaiting)
+     *         stillWaiting = theCondition.awaitUntil(deadline);
+     *      else
+     *        return false;
+     *   }
+     *   // ...
+     * }
+     * </pre>
+     *
+     * <p><b>Implementation Considerations</b>
+     *
+     * <p>The current thread is assumed to hold the lock associated with this
+     * {@code Condition} when this method is called.
+     * It is up to the implementation to determine if this is
+     * the case and if not, how to respond. Typically, an exception will be
+     * thrown (such as {@link IllegalMonitorStateException}) and the
+     * implementation must document that fact.
+     *
+     * <p>An implementation can favor responding to an interrupt over normal
+     * method return in response to a signal, or over indicating the passing
+     * of the specified deadline. In either case the implementation
+     * must ensure that the signal is redirected to another waiting thread, if
+     * there is one.
+     *
+     * @param deadline the absolute time to wait until
+     * @return {@code false} if the deadline has elapsed upon return, else
+     *         {@code true}
+     * @throws InterruptedException if the current thread is interrupted
+     *         (and interruption of thread suspension is supported)
+     */
+    boolean awaitUntil(Date deadline) throws InterruptedException;
+
+    /**
+     * Wakes up one waiting thread.
+     *
+     * <p>If any threads are waiting on this condition then one
+     * is selected for waking up. That thread must then re-acquire the
+     * lock before returning from {@code await}.
+     */
+    void signal();
+
+    /**
+     * Wakes up all waiting threads.
+     *
+     * <p>If any threads are waiting on this condition then they are
+     * all woken up. Each thread must re-acquire the lock before it can
+     * return from {@code await}.
+     */
+    void signalAll();
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/locks/FIFOCondVar.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/locks/FIFOCondVar.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/locks/FIFOCondVar.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,146 @@
+/*
+  File: ConditionVariable.java
+  Originally written by Doug Lea and released into the public domain.
+  This may be used for any purposes whatsoever without acknowledgment.
+  Thanks for the assistance and support of Sun Microsystems Labs,
+  and everyone contributing, testing, and using this code.
+  History:
+  Date       Who                What
+  11Jun1998  dl               Create public version
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent.locks;
+
+import java.util.Collection;
+import java.util.Date;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.*;
+
+class FIFOCondVar extends CondVar implements Condition, java.io.Serializable {
+
+    private static final WaitQueue.QueuedSync sync = new WaitQueue.QueuedSync() {
+        public boolean recheck(WaitQueue.WaitNode node) { return false; }
+        public void takeOver(WaitQueue.WaitNode node) {}
+    };
+
+    // wait queue; only accessed when holding the lock
+    private final WaitQueue wq = new FIFOWaitQueue();
+
+    /**
+     * Create a new CondVar that relies on the given mutual exclusion lock.
+     * @param lock A non-reentrant mutual exclusion lock.
+     */
+    FIFOCondVar(ExclusiveLock lock) {
+        super(lock);
+    }
+
+    public void awaitUninterruptibly() {
+        int holdCount = lock.getHoldCount();
+        if (holdCount == 0) {
+            throw new IllegalMonitorStateException();
+        }
+        WaitQueue.WaitNode n = new WaitQueue.WaitNode();
+        wq.insert(n);
+        for (int i=holdCount; i>0; i--) lock.unlock();
+        try {
+            n.doWaitUninterruptibly(sync);
+        }
+        finally {
+            for (int i=holdCount; i>0; i--) lock.lock();
+        }
+    }
+
+    public void await() throws InterruptedException {
+        int holdCount = lock.getHoldCount();
+        if (holdCount == 0) {
+            throw new IllegalMonitorStateException();
+        }
+        if (Thread.interrupted()) throw new InterruptedException();
+        WaitQueue.WaitNode n = new WaitQueue.WaitNode();
+        wq.insert(n);
+        for (int i=holdCount; i>0; i--) lock.unlock();
+        try {
+            n.doWait(sync);
+        }
+        finally {
+            for (int i=holdCount; i>0; i--) lock.lock();
+        }
+    }
+
+    public boolean await(long timeout, TimeUnit unit) throws InterruptedException {
+        int holdCount = lock.getHoldCount();
+        if (holdCount == 0) {
+            throw new IllegalMonitorStateException();
+        }
+        if (Thread.interrupted()) throw new InterruptedException();
+        long nanos = unit.toNanos(timeout);
+        WaitQueue.WaitNode n = new WaitQueue.WaitNode();
+        wq.insert(n);
+        boolean success = false;
+        for (int i=holdCount; i>0; i--) lock.unlock();
+        try {
+            success = n.doTimedWait(sync, nanos);
+        }
+        finally {
+            for (int i=holdCount; i>0; i--) lock.lock();
+        }
+        return success;
+    }
+
+//    public long awaitNanos(long timeout) throws InterruptedException {
+//        throw new UnsupportedOperationException();
+//    }
+//
+    public boolean awaitUntil(Date deadline) throws InterruptedException {
+        if (deadline == null) throw new NullPointerException();
+        long abstime = deadline.getTime();
+        long start = System.currentTimeMillis();
+        long msecs = abstime - start;
+        return await(msecs, TimeUnit.MILLISECONDS);
+    }
+
+    public void signal() {
+        if (!lock.isHeldByCurrentThread()) {
+            throw new IllegalMonitorStateException();
+        }
+        for (;;) {
+            WaitQueue.WaitNode w = wq.extract();
+            if (w == null) return;  // no one to signal
+            if (w.signal(sync)) return; // notify if still waiting, else skip
+        }
+    }
+
+    public void signalAll() {
+        if (!lock.isHeldByCurrentThread()) {
+            throw new IllegalMonitorStateException();
+        }
+        for (;;) {
+            WaitQueue.WaitNode w = wq.extract();
+            if (w == null) return;  // no more to signal
+            w.signal(sync);
+        }
+    }
+
+    protected boolean hasWaiters() {
+        if (!lock.isHeldByCurrentThread()) {
+            throw new IllegalMonitorStateException();
+        }
+        return wq.hasNodes();
+    }
+
+    protected int getWaitQueueLength() {
+        if (!lock.isHeldByCurrentThread()) {
+            throw new IllegalMonitorStateException();
+        }
+        return wq.getLength();
+    }
+
+    protected Collection getWaitingThreads() {
+        if (!lock.isHeldByCurrentThread()) {
+            throw new IllegalMonitorStateException();
+        }
+        return wq.getWaitingThreads();
+    }
+
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/locks/Lock.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/locks/Lock.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/locks/Lock.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,328 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent.locks;
+
+import edu.emory.mathcs.backport.java.util.concurrent.TimeUnit;
+
+/**
+ * {@code Lock} implementations provide more extensive locking
+ * operations than can be obtained using {@code synchronized} methods
+ * and statements.  They allow more flexible structuring, may have
+ * quite different properties, and may support multiple associated
+ * {@link Condition} objects.
+ *
+ * <p>A lock is a tool for controlling access to a shared resource by
+ * multiple threads. Commonly, a lock provides exclusive access to a
+ * shared resource: only one thread at a time can acquire the lock and
+ * all access to the shared resource requires that the lock be
+ * acquired first. However, some locks may allow concurrent access to
+ * a shared resource, such as the read lock of a {@link ReadWriteLock}.
+ *
+ * <p>The use of {@code synchronized} methods or statements provides
+ * access to the implicit monitor lock associated with every object, but
+ * forces all lock acquisition and release to occur in a block-structured way:
+ * when multiple locks are acquired they must be released in the opposite
+ * order, and all locks must be released in the same lexical scope in which
+ * they were acquired.
+ *
+ * <p>While the scoping mechanism for {@code synchronized} methods
+ * and statements makes it much easier to program with monitor locks,
+ * and helps avoid many common programming errors involving locks,
+ * there are occasions where you need to work with locks in a more
+ * flexible way. For example, some algorithms for traversing
+ * concurrently accessed data structures require the use of
+ * &quot;hand-over-hand&quot; or &quot;chain locking&quot;: you
+ * acquire the lock of node A, then node B, then release A and acquire
+ * C, then release B and acquire D and so on.  Implementations of the
+ * {@code Lock} interface enable the use of such techniques by
+ * allowing a lock to be acquired and released in different scopes,
+ * and allowing multiple locks to be acquired and released in any
+ * order.
+ *
+ * <p>With this increased flexibility comes additional
+ * responsibility. The absence of block-structured locking removes the
+ * automatic release of locks that occurs with {@code synchronized}
+ * methods and statements. In most cases, the following idiom
+ * should be used:
+ *
+ * <pre><tt>     Lock l = ...;
+ *     l.lock();
+ *     try {
+ *         // access the resource protected by this lock
+ *     } finally {
+ *         l.unlock();
+ *     }
+ * </tt></pre>
+ *
+ * When locking and unlocking occur in different scopes, care must be
+ * taken to ensure that all code that is executed while the lock is
+ * held is protected by try-finally or try-catch to ensure that the
+ * lock is released when necessary.
+ *
+ * <p>{@code Lock} implementations provide additional functionality
+ * over the use of {@code synchronized} methods and statements by
+ * providing a non-blocking attempt to acquire a lock ({@link
+ * #tryLock()}), an attempt to acquire the lock that can be
+ * interrupted ({@link #lockInterruptibly}, and an attempt to acquire
+ * the lock that can timeout ({@link #tryLock(long, TimeUnit)}).
+ *
+ * <p>A {@code Lock} class can also provide behavior and semantics
+ * that is quite different from that of the implicit monitor lock,
+ * such as guaranteed ordering, non-reentrant usage, or deadlock
+ * detection. If an implementation provides such specialized semantics
+ * then the implementation must document those semantics.
+ *
+ * <p>Note that {@code Lock} instances are just normal objects and can
+ * themselves be used as the target in a {@code synchronized} statement.
+ * Acquiring the
+ * monitor lock of a {@code Lock} instance has no specified relationship
+ * with invoking any of the {@link #lock} methods of that instance.
+ * It is recommended that to avoid confusion you never use {@code Lock}
+ * instances in this way, except within their own implementation.
+ *
+ * <p>Except where noted, passing a {@code null} value for any
+ * parameter will result in a {@link NullPointerException} being
+ * thrown.
+ *
+ * <h3>Memory Synchronization</h3>
+ *
+ * <p>All {@code Lock} implementations <em>must</em> enforce the same
+ * memory synchronization semantics as provided by the built-in monitor
+ * lock, as described in <a href="http://java.sun.com/docs/books/jls/">
+ * The Java Language Specification, Third Edition (17.4 Memory Model)</a>:
+ * <ul>
+ * <li>A successful {@code lock} operation has the same memory
+ * synchronization effects as a successful <em>Lock</em> action.
+ * <li>A successful {@code unlock} operation has the same
+ * memory synchronization effects as a successful <em>Unlock</em> action.
+ * </ul>
+ *
+ * Unsuccessful locking and unlocking operations, and reentrant
+ * locking/unlocking operations, do not require any memory
+ * synchronization effects.
+ *
+ * <h3>Implementation Considerations</h3>
+ *
+ * <p> The three forms of lock acquisition (interruptible,
+ * non-interruptible, and timed) may differ in their performance
+ * characteristics, ordering guarantees, or other implementation
+ * qualities.  Further, the ability to interrupt the <em>ongoing</em>
+ * acquisition of a lock may not be available in a given {@code Lock}
+ * class.  Consequently, an implementation is not required to define
+ * exactly the same guarantees or semantics for all three forms of
+ * lock acquisition, nor is it required to support interruption of an
+ * ongoing lock acquisition.  An implementation is required to clearly
+ * document the semantics and guarantees provided by each of the
+ * locking methods. It must also obey the interruption semantics as
+ * defined in this interface, to the extent that interruption of lock
+ * acquisition is supported: which is either totally, or only on
+ * method entry.
+ *
+ * <p>As interruption generally implies cancellation, and checks for
+ * interruption are often infrequent, an implementation can favor responding
+ * to an interrupt over normal method return. This is true even if it can be
+ * shown that the interrupt occurred after another action may have unblocked
+ * the thread. An implementation should document this behavior.
+ *
+ * @see ReentrantLock
+ * @see Condition
+ * @see ReadWriteLock
+ *
+ * @since 1.5
+ * @author Doug Lea
+ */
+public interface Lock {
+
+    /**
+     * Acquires the lock.
+     *
+     * <p>If the lock is not available then the current thread becomes
+     * disabled for thread scheduling purposes and lies dormant until the
+     * lock has been acquired.
+     *
+     * <p><b>Implementation Considerations</b>
+     *
+     * <p>A {@code Lock} implementation may be able to detect erroneous use
+     * of the lock, such as an invocation that would cause deadlock, and
+     * may throw an (unchecked) exception in such circumstances.  The
+     * circumstances and the exception type must be documented by that
+     * {@code Lock} implementation.
+     */
+    void lock();
+
+    /**
+     * Acquires the lock unless the current thread is
+     * {@linkplain Thread#interrupt interrupted}.
+     *
+     * <p>Acquires the lock if it is available and returns immediately.
+     *
+     * <p>If the lock is not available then the current thread becomes
+     * disabled for thread scheduling purposes and lies dormant until
+     * one of two things happens:
+     *
+     * <ul>
+     * <li>The lock is acquired by the current thread; or
+     * <li>Some other thread {@linkplain Thread#interrupt interrupts} the
+     * current thread, and interruption of lock acquisition is supported.
+     * </ul>
+     *
+     * <p>If the current thread:
+     * <ul>
+     * <li>has its interrupted status set on entry to this method; or
+     * <li>is {@linkplain Thread#interrupt interrupted} while acquiring the
+     * lock, and interruption of lock acquisition is supported,
+     * </ul>
+     * then {@link InterruptedException} is thrown and the current thread's
+     * interrupted status is cleared.
+     *
+     * <p><b>Implementation Considerations</b>
+     *
+     * <p>The ability to interrupt a lock acquisition in some
+     * implementations may not be possible, and if possible may be an
+     * expensive operation.  The programmer should be aware that this
+     * may be the case. An implementation should document when this is
+     * the case.
+     *
+     * <p>An implementation can favor responding to an interrupt over
+     * normal method return.
+     *
+     * <p>A {@code Lock} implementation may be able to detect
+     * erroneous use of the lock, such as an invocation that would
+     * cause deadlock, and may throw an (unchecked) exception in such
+     * circumstances.  The circumstances and the exception type must
+     * be documented by that {@code Lock} implementation.
+     *
+     * @throws InterruptedException if the current thread is
+     *         interrupted while acquiring the lock (and interruption
+     *         of lock acquisition is supported).
+     */
+    void lockInterruptibly() throws InterruptedException;
+
+    /**
+     * Acquires the lock only if it is free at the time of invocation.
+     *
+     * <p>Acquires the lock if it is available and returns immediately
+     * with the value {@code true}.
+     * If the lock is not available then this method will return
+     * immediately with the value {@code false}.
+     *
+     * <p>A typical usage idiom for this method would be:
+     * <pre>
+     *      Lock lock = ...;
+     *      if (lock.tryLock()) {
+     *          try {
+     *              // manipulate protected state
+     *          } finally {
+     *              lock.unlock();
+     *          }
+     *      } else {
+     *          // perform alternative actions
+     *      }
+     * </pre>
+     * This usage ensures that the lock is unlocked if it was acquired, and
+     * doesn't try to unlock if the lock was not acquired.
+     *
+     * @return {@code true} if the lock was acquired and
+     *         {@code false} otherwise
+     */
+    boolean tryLock();
+
+    /**
+     * Acquires the lock if it is free within the given waiting time and the
+     * current thread has not been {@linkplain Thread#interrupt interrupted}.
+     *
+     * <p>If the lock is available this method returns immediately
+     * with the value {@code true}.
+     * If the lock is not available then
+     * the current thread becomes disabled for thread scheduling
+     * purposes and lies dormant until one of three things happens:
+     * <ul>
+     * <li>The lock is acquired by the current thread; or
+     * <li>Some other thread {@linkplain Thread#interrupt interrupts} the
+     * current thread, and interruption of lock acquisition is supported; or
+     * <li>The specified waiting time elapses
+     * </ul>
+     *
+     * <p>If the lock is acquired then the value {@code true} is returned.
+     *
+     * <p>If the current thread:
+     * <ul>
+     * <li>has its interrupted status set on entry to this method; or
+     * <li>is {@linkplain Thread#interrupt interrupted} while acquiring
+     * the lock, and interruption of lock acquisition is supported,
+     * </ul>
+     * then {@link InterruptedException} is thrown and the current thread's
+     * interrupted status is cleared.
+     *
+     * <p>If the specified waiting time elapses then the value {@code false}
+     * is returned.
+     * If the time is
+     * less than or equal to zero, the method will not wait at all.
+     *
+     * <p><b>Implementation Considerations</b>
+     *
+     * <p>The ability to interrupt a lock acquisition in some implementations
+     * may not be possible, and if possible may
+     * be an expensive operation.
+     * The programmer should be aware that this may be the case. An
+     * implementation should document when this is the case.
+     *
+     * <p>An implementation can favor responding to an interrupt over normal
+     * method return, or reporting a timeout.
+     *
+     * <p>A {@code Lock} implementation may be able to detect
+     * erroneous use of the lock, such as an invocation that would cause
+     * deadlock, and may throw an (unchecked) exception in such circumstances.
+     * The circumstances and the exception type must be documented by that
+     * {@code Lock} implementation.
+     *
+     * @param time the maximum time to wait for the lock
+     * @param unit the time unit of the {@code time} argument
+     * @return {@code true} if the lock was acquired and {@code false}
+     *         if the waiting time elapsed before the lock was acquired
+     *
+     * @throws InterruptedException if the current thread is interrupted
+     *         while acquiring the lock (and interruption of lock
+     *         acquisition is supported)
+     */
+    boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
+
+    /**
+     * Releases the lock.
+     *
+     * <p><b>Implementation Considerations</b>
+     *
+     * <p>A {@code Lock} implementation will usually impose
+     * restrictions on which thread can release a lock (typically only the
+     * holder of the lock can release it) and may throw
+     * an (unchecked) exception if the restriction is violated.
+     * Any restrictions and the exception
+     * type must be documented by that {@code Lock} implementation.
+     */
+    void unlock();
+
+    /**
+     * Returns a new {@link Condition} instance that is bound to this
+     * {@code Lock} instance.
+     *
+     * <p>Before waiting on the condition the lock must be held by the
+     * current thread.
+     * A call to {@link Condition#await()} will atomically release the lock
+     * before waiting and re-acquire the lock before the wait returns.
+     *
+     * <p><b>Implementation Considerations</b>
+     *
+     * <p>The exact operation of the {@link Condition} instance depends on
+     * the {@code Lock} implementation and must be documented by that
+     * implementation.
+     *
+     * @return A new {@link Condition} instance for this {@code Lock} instance
+     * @throws UnsupportedOperationException if this {@code Lock}
+     *         implementation does not support conditions
+     */
+    Condition newCondition();
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/locks/ReadWriteLock.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/locks/ReadWriteLock.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/locks/ReadWriteLock.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,104 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent.locks;
+
+/**
+ * A <tt>ReadWriteLock</tt> maintains a pair of associated {@link
+ * Lock locks}, one for read-only operations and one for writing.
+ * The {@link #readLock read lock} may be held simultaneously by
+ * multiple reader threads, so long as there are no writers.  The
+ * {@link #writeLock write lock} is exclusive.
+ *
+ * <p>All <tt>ReadWriteLock</tt> implementations must guarantee that
+ * the memory synchronization effects of <tt>writeLock</tt> operations
+ * (as specified in the {@link Lock} interface) also hold with respect
+ * to the associated <tt>readLock</tt>. That is, a thread successfully
+ * acquiring the read lock will see all updates made upon previous
+ * release of the write lock.
+ *
+ * <p>A read-write lock allows for a greater level of concurrency in
+ * accessing shared data than that permitted by a mutual exclusion lock.
+ * It exploits the fact that while only a single thread at a time (a
+ * <em>writer</em> thread) can modify the shared data, in many cases any
+ * number of threads can concurrently read the data (hence <em>reader</em>
+ * threads).
+ * In theory, the increase in concurrency permitted by the use of a read-write
+ * lock will lead to performance improvements over the use of a mutual
+ * exclusion lock. In practice this increase in concurrency will only be fully
+ * realized on a multi-processor, and then only if the access patterns for
+ * the shared data are suitable.
+ *
+ * <p>Whether or not a read-write lock will improve performance over the use
+ * of a mutual exclusion lock depends on the frequency that the data is
+ * read compared to being modified, the duration of the read and write
+ * operations, and the contention for the data - that is, the number of
+ * threads that will try to read or write the data at the same time.
+ * For example, a collection that is initially populated with data and
+ * thereafter infrequently modified, while being frequently searched
+ * (such as a directory of some kind) is an ideal candidate for the use of
+ * a read-write lock. However, if updates become frequent then the data
+ * spends most of its time being exclusively locked and there is little, if any
+ * increase in concurrency. Further, if the read operations are too short
+ * the overhead of the read-write lock implementation (which is inherently
+ * more complex than a mutual exclusion lock) can dominate the execution
+ * cost, particularly as many read-write lock implementations still serialize
+ * all threads through a small section of code. Ultimately, only profiling
+ * and measurement will establish whether the use of a read-write lock is
+ * suitable for your application.
+ *
+ *
+ * <p>Although the basic operation of a read-write lock is straight-forward,
+ * there are many policy decisions that an implementation must make, which
+ * may affect the effectiveness of the read-write lock in a given application.
+ * Examples of these policies include:
+ * <ul>
+ * <li>Determining whether to grant the read lock or the write lock, when
+ * both readers and writers are waiting, at the time that a writer releases
+ * the write lock. Writer preference is common, as writes are expected to be
+ * short and infrequent. Reader preference is less common as it can lead to
+ * lengthy delays for a write if the readers are frequent and long-lived as
+ * expected. Fair, or &quot;in-order&quot; implementations are also possible.
+ *
+ * <li>Determining whether readers that request the read lock while a
+ * reader is active and a writer is waiting, are granted the read lock.
+ * Preference to the reader can delay the writer indefinitely, while
+ * preference to the writer can reduce the potential for concurrency.
+ *
+ * <li>Determining whether the locks are reentrant: can a thread with the
+ * write lock reacquire it? Can it acquire a read lock while holding the
+ * write lock? Is the read lock itself reentrant?
+ *
+ * <li>Can the write lock be downgraded to a read lock without allowing
+ * an intervening writer? Can a read lock be upgraded to a write lock,
+ * in preference to other waiting readers or writers?
+ *
+ * </ul>
+ * You should consider all of these things when evaluating the suitability
+ * of a given implementation for your application.
+ *
+ * @see ReentrantReadWriteLock
+ * @see Lock
+ * @see ReentrantLock
+ *
+ * @since 1.5
+ * @author Doug Lea
+ */
+public interface ReadWriteLock {
+    /**
+     * Returns the lock used for reading.
+     *
+     * @return the lock used for reading.
+     */
+    Lock readLock();
+
+    /**
+     * Returns the lock used for writing.
+     *
+     * @return the lock used for writing.
+     */
+    Lock writeLock();
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/locks/ReentrantLock.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/locks/ReentrantLock.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/locks/ReentrantLock.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,959 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent.locks;
+
+import java.util.Collection;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.*;
+
+/**
+ * A reentrant mutual exclusion {@link Lock} with the same basic
+ * behavior and semantics as the implicit monitor lock accessed using
+ * {@code synchronized} methods and statements, but with extended
+ * capabilities.
+ *
+ * <p>A {@code ReentrantLock} is <em>owned</em> by the thread last
+ * successfully locking, but not yet unlocking it. A thread invoking
+ * {@code lock} will return, successfully acquiring the lock, when
+ * the lock is not owned by another thread. The method will return
+ * immediately if the current thread already owns the lock. This can
+ * be checked using methods {@link #isHeldByCurrentThread}, and {@link
+ * #getHoldCount}.
+ *
+ * <p>The constructor for this class accepts an optional
+ * <em>fairness</em> parameter.  When set {@code true}, under
+ * contention, locks favor granting access to the longest-waiting
+ * thread.  Otherwise this lock does not guarantee any particular
+ * access order.  Programs using fair locks accessed by many threads
+ * may display lower overall throughput (i.e., are slower; often much
+ * slower) than those using the default setting, but have smaller
+ * variances in times to obtain locks and guarantee lack of
+ * starvation. Note however, that fairness of locks does not guarantee
+ * fairness of thread scheduling. Thus, one of many threads using a
+ * fair lock may obtain it multiple times in succession while other
+ * active threads are not progressing and not currently holding the
+ * lock.
+ * Also note that the untimed {@link #tryLock() tryLock} method does not
+ * honor the fairness setting. It will succeed if the lock
+ * is available even if other threads are waiting.
+ *
+ * <p>It is recommended practice to <em>always</em> immediately
+ * follow a call to {@code lock} with a {@code try} block, most
+ * typically in a before/after construction such as:
+ *
+ * <pre>
+ * class X {
+ *   private final ReentrantLock lock = new ReentrantLock();
+ *   // ...
+ *
+ *   public void m() {
+ *     lock.lock();  // block until condition holds
+ *     try {
+ *       // ... method body
+ *     } finally {
+ *       lock.unlock()
+ *     }
+ *   }
+ * }
+ * </pre>
+ *
+ * <p>In addition to implementing the {@link Lock} interface, this
+ * class defines methods {@code isLocked} and
+ * {@code getLockQueueLength}, as well as some associated
+ * {@code protected} access methods that may be useful for
+ * instrumentation and monitoring.
+ *
+ * <p>Serialization of this class behaves in the same way as built-in
+ * locks: a deserialized lock is in the unlocked state, regardless of
+ * its state when serialized.
+ *
+ * <p>This lock supports a maximum of 2147483647 recursive locks by
+ * the same thread. Attempts to exceed this limit result in
+ * {@link Error} throws from locking methods.
+ *
+ * @since 1.5
+ * @author Doug Lea
+ * @author Dawid Kurzyniec
+ */
+public class ReentrantLock implements Lock, java.io.Serializable,
+                                      CondVar.ExclusiveLock {
+    private static final long serialVersionUID = 7373984872572414699L;
+
+    private final Sync sync;
+
+    /**
+     * Base of synchronization control for this lock. Subclassed
+     * into fair and nonfair versions below.
+     */
+    static abstract class Sync implements java.io.Serializable {
+        private static final long serialVersionUID = -5179523762034025860L;
+
+        protected transient Thread owner_ = null;
+        protected transient int holds_ = 0;
+
+        protected Sync() {}
+
+        /**
+         * Performs {@link Lock#lock}. The main reason for subclassing
+         * is to allow fast path for nonfair version.
+         */
+        public abstract void lock();
+
+        public abstract void lockInterruptibly() throws InterruptedException;
+
+        final void incHolds() {
+            int nextHolds = ++holds_;
+            if (nextHolds < 0)
+                throw new Error("Maximum lock count exceeded");
+            holds_ = nextHolds;
+        }
+
+        public boolean tryLock() {
+            Thread caller = Thread.currentThread();
+            synchronized (this) {
+                if (owner_ == null) {
+                    owner_ = caller;
+                    holds_ = 1;
+                    return true;
+                }
+                else if (caller == owner_) {
+                    incHolds();
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        public abstract boolean tryLock(long nanos) throws InterruptedException;
+
+        public abstract void unlock();
+
+        public synchronized int getHoldCount() {
+            return isHeldByCurrentThread() ? holds_ : 0;
+        }
+
+        public synchronized boolean isHeldByCurrentThread() {
+            return holds_ > 0 && Thread.currentThread() == owner_;
+        }
+
+        public synchronized boolean isLocked() {
+            return owner_ != null;
+        }
+
+        public abstract boolean isFair();
+
+        protected synchronized Thread getOwner() {
+            return owner_;
+        }
+
+        public boolean hasQueuedThreads() {
+            throw new UnsupportedOperationException("Use FAIR version");
+        }
+
+        public int getQueueLength() {
+            throw new UnsupportedOperationException("Use FAIR version");
+        }
+
+        public Collection getQueuedThreads() {
+            throw new UnsupportedOperationException("Use FAIR version");
+        }
+
+        public boolean isQueued(Thread thread) {
+            throw new UnsupportedOperationException("Use FAIR version");
+        }
+    }
+
+    /**
+     * Sync object for non-fair locks
+     */
+    final static class NonfairSync extends Sync {
+        private static final long serialVersionUID = 7316153563782823691L;
+
+        NonfairSync() {}
+
+        /**
+         * Performs lock.  Try immediate barge, backing up to normal
+         * acquire on failure.
+         */
+        public void lock() {
+            Thread caller = Thread.currentThread();
+            synchronized (this) {
+                if (owner_ == null) {
+                    owner_ = caller;
+                    holds_ = 1;
+                    return;
+                }
+                else if (caller == owner_) {
+                    incHolds();
+                    return;
+                }
+                else {
+                    boolean wasInterrupted = Thread.interrupted();
+                    try {
+                        while (true) {
+                            try {
+                                wait();
+                            }
+                            catch (InterruptedException e) {
+                                wasInterrupted = true;
+                                // no need to notify; if we were signalled, we
+                                // will act as signalled, ignoring the
+                                // interruption
+                            }
+                            if (owner_ == null) {
+                                owner_ = caller;
+                                holds_ = 1;
+                                return;
+                            }
+                        }
+                    }
+                    finally {
+                        if (wasInterrupted) Thread.currentThread().interrupt();
+                    }
+                }
+            }
+        }
+
+        public void lockInterruptibly() throws InterruptedException {
+            if (Thread.interrupted()) throw new InterruptedException();
+            Thread caller = Thread.currentThread();
+            synchronized (this) {
+                if (owner_ == null) {
+                    owner_ = caller;
+                    holds_ = 1;
+                    return;
+                }
+                else if (caller == owner_) {
+                    incHolds();
+                    return;
+                }
+                else {
+                    try {
+                        do { wait(); } while (owner_ != null);
+                        owner_ = caller;
+                        holds_ = 1;
+                        return;
+                    }
+                    catch (InterruptedException ex) {
+                        if (owner_ == null) notify();
+                        throw ex;
+                    }
+                }
+            }
+        }
+
+        public boolean tryLock(long nanos) throws InterruptedException {
+            if (Thread.interrupted()) throw new InterruptedException();
+            Thread caller = Thread.currentThread();
+
+            synchronized (this) {
+                if (owner_ == null) {
+                    owner_ = caller;
+                    holds_ = 1;
+                    return true;
+                }
+                else if (caller == owner_) {
+                    incHolds();
+                    return true;
+                }
+                else if (nanos <= 0)
+                    return false;
+                else {
+                    long deadline = Utils.nanoTime() + nanos;
+                    try {
+                        for (; ; ) {
+                            TimeUnit.NANOSECONDS.timedWait(this, nanos);
+                            if (caller == owner_) {
+                                incHolds();
+                                return true;
+                            }
+                            else if (owner_ == null) {
+                                owner_ = caller;
+                                holds_ = 1;
+                                return true;
+                            }
+                            else {
+                                nanos = deadline - Utils.nanoTime();
+                                if (nanos <= 0)
+                                    return false;
+                            }
+                        }
+                    }
+                    catch (InterruptedException ex) {
+                        if (owner_ == null) notify();
+                        throw ex;
+                    }
+                }
+            }
+        }
+
+        public synchronized void unlock() {
+            if (Thread.currentThread() != owner_)
+                throw new IllegalMonitorStateException("Not owner");
+
+            if (--holds_ == 0) {
+                owner_ = null;
+                notify();
+            }
+        }
+
+        public final boolean isFair() {
+            return false;
+        }
+    }
+
+    /**
+     * Sync object for fair locks
+     */
+    final static class FairSync extends Sync implements WaitQueue.QueuedSync {
+        private static final long serialVersionUID = -3000897897090466540L;
+
+        private transient WaitQueue wq_ = new FIFOWaitQueue();
+
+        FairSync() {}
+
+        public synchronized boolean recheck(WaitQueue.WaitNode node) {
+            Thread caller = Thread.currentThread();
+            if (owner_ == null) {
+                owner_ = caller;
+                holds_ = 1;
+                return true;
+            }
+            else if (caller == owner_) {
+                incHolds();
+                return true;
+            }
+            wq_.insert(node);
+            return false;
+        }
+
+        public synchronized void takeOver(WaitQueue.WaitNode node) {
+            // assert (holds_ == 1 && owner_ == Thread.currentThread()
+            owner_ = node.getOwner();
+        }
+
+        public void lock() {
+            Thread caller = Thread.currentThread();
+            synchronized (this) {
+                if (owner_ == null) {
+                    owner_ = caller;
+                    holds_ = 1;
+                    return;
+                }
+                else if (caller == owner_) {
+                    incHolds();
+                    return;
+                }
+            }
+            WaitQueue.WaitNode n = new WaitQueue.WaitNode();
+            n.doWaitUninterruptibly(this);
+        }
+
+        public void lockInterruptibly() throws InterruptedException {
+            if (Thread.interrupted()) throw new InterruptedException();
+            Thread caller = Thread.currentThread();
+            synchronized (this) {
+                if (owner_ == null) {
+                    owner_ = caller;
+                    holds_ = 1;
+                    return;
+                }
+                else if (caller == owner_) {
+                    incHolds();
+                    return;
+                }
+            }
+            WaitQueue.WaitNode n = new WaitQueue.WaitNode();
+            n.doWait(this);
+        }
+
+        public boolean tryLock(long nanos) throws InterruptedException {
+            if (Thread.interrupted()) throw new InterruptedException();
+            Thread caller = Thread.currentThread();
+            synchronized (this) {
+                if (owner_ == null) {
+                    owner_ = caller;
+                    holds_ = 1;
+                    return true;
+                }
+                else if (caller == owner_) {
+                    incHolds();
+                    return true;
+                }
+            }
+            WaitQueue.WaitNode n = new WaitQueue.WaitNode();
+            return n.doTimedWait(this, nanos);
+        }
+
+        protected synchronized WaitQueue.WaitNode getSignallee(Thread caller) {
+            if (caller != owner_)
+                throw new IllegalMonitorStateException("Not owner");
+            // assert (holds_ > 0)
+            if (holds_ >= 2) { // current thread will keep the lock
+                --holds_;
+                return null;
+            }
+            // assert (holds_ == 1)
+            WaitQueue.WaitNode w = wq_.extract();
+            if (w == null) { // if none, clear for new arrivals
+                owner_ = null;
+                holds_ = 0;
+            }
+            return w;
+        }
+
+        public void unlock() {
+            Thread caller = Thread.currentThread();
+            for (;;) {
+                WaitQueue.WaitNode w = getSignallee(caller);
+                if (w == null) return;  // no one to signal
+                if (w.signal(this)) return; // notify if still waiting, else skip
+            }
+        }
+
+        public final boolean isFair() {
+            return true;
+        }
+
+        public synchronized boolean hasQueuedThreads() {
+            return wq_.hasNodes();
+        }
+
+        public synchronized int getQueueLength() {
+            return wq_.getLength();
+        }
+
+        public synchronized Collection getQueuedThreads() {
+            return wq_.getWaitingThreads();
+        }
+
+        public synchronized boolean isQueued(Thread thread) {
+            return wq_.isWaiting(thread);
+        }
+
+        private void readObject(java.io.ObjectInputStream in)
+                throws java.io.IOException, ClassNotFoundException {
+            in.defaultReadObject();
+            synchronized (this) {
+                wq_ = new FIFOWaitQueue();
+            }
+        }
+    }
+
+    /**
+     * Creates an instance of {@code ReentrantLock}.
+     * This is equivalent to using {@code ReentrantLock(false)}.
+     */
+    public ReentrantLock() {
+        sync = new NonfairSync();
+    }
+
+    /**
+     * Creates an instance of {@code ReentrantLock} with the
+     * given fairness policy.
+     *
+     * @param fair {@code true} if this lock should use a fair ordering policy
+     */
+    public ReentrantLock(boolean fair) {
+        sync = (fair)? (Sync)new FairSync() : new NonfairSync();
+    }
+
+
+    /**
+     * Acquires the lock.
+     *
+     * <p>Acquires the lock if it is not held by another thread and returns
+     * immediately, setting the lock hold count to one.
+     *
+     * <p>If the current thread already holds the lock then the hold
+     * count is incremented by one and the method returns immediately.
+     *
+     * <p>If the lock is held by another thread then the
+     * current thread becomes disabled for thread scheduling
+     * purposes and lies dormant until the lock has been acquired,
+     * at which time the lock hold count is set to one.
+     */
+    public void lock() {
+        sync.lock();
+    }
+
+    /**
+     * Acquires the lock unless the current thread is
+     * {@linkplain Thread#interrupt interrupted}.
+     *
+     * <p>Acquires the lock if it is not held by another thread and returns
+     * immediately, setting the lock hold count to one.
+     *
+     * <p>If the current thread already holds this lock then the hold count
+     * is incremented by one and the method returns immediately.
+     *
+     * <p>If the lock is held by another thread then the
+     * current thread becomes disabled for thread scheduling
+     * purposes and lies dormant until one of two things happens:
+     *
+     * <ul>
+     *
+     * <li>The lock is acquired by the current thread; or
+     *
+     * <li>Some other thread {@linkplain Thread#interrupt interrupts} the
+     * current thread.
+     *
+     * </ul>
+     *
+     * <p>If the lock is acquired by the current thread then the lock hold
+     * count is set to one.
+     *
+     * <p>If the current thread:
+     *
+     * <ul>
+     *
+     * <li>has its interrupted status set on entry to this method; or
+     *
+     * <li>is {@linkplain Thread#interrupt interrupted} while acquiring
+     * the lock,
+     *
+     * </ul>
+     *
+     * then {@link InterruptedException} is thrown and the current thread's
+     * interrupted status is cleared.
+     *
+     * <p>In this implementation, as this method is an explicit
+     * interruption point, preference is given to responding to the
+     * interrupt over normal or reentrant acquisition of the lock.
+     *
+     * @throws InterruptedException if the current thread is interrupted
+     */
+    public void lockInterruptibly() throws InterruptedException {
+        sync.lockInterruptibly();
+    }
+
+    /**
+     * Acquires the lock only if it is not held by another thread at the time
+     * of invocation.
+     *
+     * <p>Acquires the lock if it is not held by another thread and
+     * returns immediately with the value {@code true}, setting the
+     * lock hold count to one. Even when this lock has been set to use a
+     * fair ordering policy, a call to {@code tryLock()} <em>will</em>
+     * immediately acquire the lock if it is available, whether or not
+     * other threads are currently waiting for the lock.
+     * This &quot;barging&quot; behavior can be useful in certain
+     * circumstances, even though it breaks fairness. If you want to honor
+     * the fairness setting for this lock, then use
+     * {@link #tryLock(long, TimeUnit) tryLock(0, TimeUnit.SECONDS) }
+     * which is almost equivalent (it also detects interruption).
+     *
+     * <p> If the current thread already holds this lock then the hold
+     * count is incremented by one and the method returns {@code true}.
+     *
+     * <p>If the lock is held by another thread then this method will return
+     * immediately with the value {@code false}.
+     *
+     * @return {@code true} if the lock was free and was acquired by the
+     *         current thread, or the lock was already held by the current
+     *         thread; and {@code false} otherwise
+     */
+    public boolean tryLock() {
+        return sync.tryLock();
+    }
+
+    /**
+     * Acquires the lock if it is not held by another thread within the given
+     * waiting time and the current thread has not been
+     * {@linkplain Thread#interrupt interrupted}.
+     *
+     * <p>Acquires the lock if it is not held by another thread and returns
+     * immediately with the value {@code true}, setting the lock hold count
+     * to one. If this lock has been set to use a fair ordering policy then
+     * an available lock <em>will not</em> be acquired if any other threads
+     * are waiting for the lock. This is in contrast to the {@link #tryLock()}
+     * method. If you want a timed {@code tryLock} that does permit barging on
+     * a fair lock then combine the timed and un-timed forms together:
+     *
+     * <pre>if (lock.tryLock() || lock.tryLock(timeout, unit) ) { ... }
+     * </pre>
+     *
+     * <p>If the current thread
+     * already holds this lock then the hold count is incremented by one and
+     * the method returns {@code true}.
+     *
+     * <p>If the lock is held by another thread then the
+     * current thread becomes disabled for thread scheduling
+     * purposes and lies dormant until one of three things happens:
+     *
+     * <ul>
+     *
+     * <li>The lock is acquired by the current thread; or
+     *
+     * <li>Some other thread {@linkplain Thread#interrupt interrupts}
+     * the current thread; or
+     *
+     * <li>The specified waiting time elapses
+     *
+     * </ul>
+     *
+     * <p>If the lock is acquired then the value {@code true} is returned and
+     * the lock hold count is set to one.
+     *
+     * <p>If the current thread:
+     *
+     * <ul>
+     *
+     * <li>has its interrupted status set on entry to this method; or
+     *
+     * <li>is {@linkplain Thread#interrupt interrupted} while
+     * acquiring the lock,
+     *
+     * </ul>
+     * then {@link InterruptedException} is thrown and the current thread's
+     * interrupted status is cleared.
+     *
+     * <p>If the specified waiting time elapses then the value {@code false}
+     * is returned.  If the time is less than or equal to zero, the method
+     * will not wait at all.
+     *
+     * <p>In this implementation, as this method is an explicit
+     * interruption point, preference is given to responding to the
+     * interrupt over normal or reentrant acquisition of the lock, and
+     * over reporting the elapse of the waiting time.
+     *
+     * @param timeout the time to wait for the lock
+     * @param unit the time unit of the timeout argument
+     * @return {@code true} if the lock was free and was acquired by the
+     *         current thread, or the lock was already held by the current
+     *         thread; and {@code false} if the waiting time elapsed before
+     *         the lock could be acquired
+     * @throws InterruptedException if the current thread is interrupted
+     * @throws NullPointerException if the time unit is null
+     *
+     */
+    public boolean tryLock(long timeout, TimeUnit unit) throws InterruptedException {
+        return sync.tryLock(unit.toNanos(timeout));
+    }
+
+    /**
+     * Attempts to release this lock.
+     *
+     * <p>If the current thread is the holder of this lock then the hold
+     * count is decremented.  If the hold count is now zero then the lock
+     * is released.  If the current thread is not the holder of this
+     * lock then {@link IllegalMonitorStateException} is thrown.
+     *
+     * @throws IllegalMonitorStateException if the current thread does not
+     *         hold this lock
+     */
+    public void unlock() {
+        sync.unlock();
+    }
+
+    /**
+     * Returns a {@link Condition} instance for use with this
+     * {@link Lock} instance.
+     *
+     * <p>The returned {@link Condition} instance supports the same
+     * usages as do the {@link Object} monitor methods ({@link
+     * Object#wait() wait}, {@link Object#notify notify}, and {@link
+     * Object#notifyAll notifyAll}) when used with the built-in
+     * monitor lock.
+     *
+     * <ul>
+     *
+     * <li>If this lock is not held when any of the {@link Condition}
+     * {@linkplain Condition#await() waiting} or {@linkplain
+     * Condition#signal signalling} methods are called, then an {@link
+     * IllegalMonitorStateException} is thrown.
+     *
+     * <li>When the condition {@linkplain Condition#await() waiting}
+     * methods are called the lock is released and, before they
+     * return, the lock is reacquired and the lock hold count restored
+     * to what it was when the method was called.
+     *
+     * <li>If a thread is {@linkplain Thread#interrupt interrupted}
+     * while waiting then the wait will terminate, an {@link
+     * InterruptedException} will be thrown, and the thread's
+     * interrupted status will be cleared.
+     *
+     * <li> Waiting threads are signalled in FIFO order.
+     *
+     * <li>The ordering of lock reacquisition for threads returning
+     * from waiting methods is the same as for threads initially
+     * acquiring the lock, which is in the default case not specified,
+     * but for <em>fair</em> locks favors those threads that have been
+     * waiting the longest.
+     *
+     * </ul>
+     *
+     * @return the Condition object
+     */
+    public Condition newCondition() {
+        return isFair() ? (Condition)new FIFOCondVar(this) : new CondVar(this);
+    }
+
+    /**
+     * Queries the number of holds on this lock by the current thread.
+     *
+     * <p>A thread has a hold on a lock for each lock action that is not
+     * matched by an unlock action.
+     *
+     * <p>The hold count information is typically only used for testing and
+     * debugging purposes. For example, if a certain section of code should
+     * not be entered with the lock already held then we can assert that
+     * fact:
+     *
+     * <pre>
+     * class X {
+     *   ReentrantLock lock = new ReentrantLock();
+     *   // ...
+     *   public void m() {
+     *     assert lock.getHoldCount() == 0;
+     *     lock.lock();
+     *     try {
+     *       // ... method body
+     *     } finally {
+     *       lock.unlock();
+     *     }
+     *   }
+     * }
+     * </pre>
+     *
+     * @return the number of holds on this lock by the current thread,
+     *         or zero if this lock is not held by the current thread
+     */
+    public int getHoldCount() {
+        return sync.getHoldCount();
+    }
+
+    /**
+     * Queries if this lock is held by the current thread.
+     *
+     * <p>Analogous to the {@link Thread#holdsLock} method for built-in
+     * monitor locks, this method is typically used for debugging and
+     * testing. For example, a method that should only be called while
+     * a lock is held can assert that this is the case:
+     *
+     * <pre>
+     * class X {
+     *   ReentrantLock lock = new ReentrantLock();
+     *   // ...
+     *
+     *   public void m() {
+     *       assert lock.isHeldByCurrentThread();
+     *       // ... method body
+     *   }
+     * }
+     * </pre>
+     *
+     * <p>It can also be used to ensure that a reentrant lock is used
+     * in a non-reentrant manner, for example:
+     *
+     * <pre>
+     * class X {
+     *   ReentrantLock lock = new ReentrantLock();
+     *   // ...
+     *
+     *   public void m() {
+     *       assert !lock.isHeldByCurrentThread();
+     *       lock.lock();
+     *       try {
+     *           // ... method body
+     *       } finally {
+     *           lock.unlock();
+     *       }
+     *   }
+     * }
+     * </pre>
+     *
+     * @return {@code true} if current thread holds this lock and
+     *         {@code false} otherwise
+     */
+    public boolean isHeldByCurrentThread() {
+        return sync.isHeldByCurrentThread();
+    }
+
+    /**
+     * Queries if this lock is held by any thread. This method is
+     * designed for use in monitoring of the system state,
+     * not for synchronization control.
+     *
+     * @return {@code true} if any thread holds this lock and
+     *         {@code false} otherwise
+     */
+    public boolean isLocked() {
+        return sync.isLocked();
+    }
+
+    /**
+     * Returns {@code true} if this lock has fairness set true.
+     *
+     * @return {@code true} if this lock has fairness set true
+     */
+    public final boolean isFair() {
+        return sync.isFair();
+    }
+
+    /**
+     * Returns the thread that currently owns this lock, or
+     * {@code null} if not owned. When this method is called by a
+     * thread that is not the owner, the return value reflects a
+     * best-effort approximation of current lock status. For example,
+     * the owner may be momentarily {@code null} even if there are
+     * threads trying to acquire the lock but have not yet done so.
+     * This method is designed to facilitate construction of
+     * subclasses that provide more extensive lock monitoring
+     * facilities.
+     *
+     * @return the owner, or {@code null} if not owned
+     */
+    protected Thread getOwner() {
+        return sync.getOwner();
+    }
+
+    /**
+     * Queries whether any threads are waiting to acquire this lock. Note that
+     * because cancellations may occur at any time, a {@code true}
+     * return does not guarantee that any other thread will ever
+     * acquire this lock.  This method is designed primarily for use in
+     * monitoring of the system state.
+     *
+     * @return {@code true} if there may be other threads waiting to
+     *         acquire the lock
+     */
+    public final boolean hasQueuedThreads() {
+        return sync.hasQueuedThreads();
+    }
+
+
+    /**
+     * Queries whether the given thread is waiting to acquire this
+     * lock. Note that because cancellations may occur at any time, a
+     * {@code true} return does not guarantee that this thread
+     * will ever acquire this lock.  This method is designed primarily for use
+     * in monitoring of the system state.
+     *
+     * @param thread the thread
+     * @return {@code true} if the given thread is queued waiting for this lock
+     * @throws NullPointerException if the thread is null
+     */
+    public final boolean hasQueuedThread(Thread thread) {
+        return sync.isQueued(thread);
+    }
+
+
+    /**
+     * Returns an estimate of the number of threads waiting to
+     * acquire this lock.  The value is only an estimate because the number of
+     * threads may change dynamically while this method traverses
+     * internal data structures.  This method is designed for use in
+     * monitoring of the system state, not for synchronization
+     * control.
+     *
+     * @return the estimated number of threads waiting for this lock
+     */
+    public final int getQueueLength() {
+        return sync.getQueueLength();
+    }
+
+    /**
+     * Returns a collection containing threads that may be waiting to
+     * acquire this lock.  Because the actual set of threads may change
+     * dynamically while constructing this result, the returned
+     * collection is only a best-effort estimate.  The elements of the
+     * returned collection are in no particular order.  This method is
+     * designed to facilitate construction of subclasses that provide
+     * more extensive monitoring facilities.
+     *
+     * @return the collection of threads
+     */
+    protected Collection getQueuedThreads() {
+        return sync.getQueuedThreads();
+    }
+
+    /**
+     * Queries whether any threads are waiting on the given condition
+     * associated with this lock. Note that because timeouts and
+     * interrupts may occur at any time, a {@code true} return does
+     * not guarantee that a future {@code signal} will awaken any
+     * threads.  This method is designed primarily for use in
+     * monitoring of the system state.
+     *
+     * @param condition the condition
+     * @return {@code true} if there are any waiting threads
+     * @throws IllegalMonitorStateException if this lock is not held
+     * @throws IllegalArgumentException if the given condition is
+     *         not associated with this lock
+     * @throws NullPointerException if the condition is null
+     */
+    public boolean hasWaiters(Condition condition) {
+        return asCondVar(condition).hasWaiters();
+    }
+
+    /**
+     * Returns an estimate of the number of threads waiting on the
+     * given condition associated with this lock. Note that because
+     * timeouts and interrupts may occur at any time, the estimate
+     * serves only as an upper bound on the actual number of waiters.
+     * This method is designed for use in monitoring of the system
+     * state, not for synchronization control.
+     *
+     * @param condition the condition
+     * @return the estimated number of waiting threads
+     * @throws IllegalMonitorStateException if this lock is not held
+     * @throws IllegalArgumentException if the given condition is
+     *         not associated with this lock
+     * @throws NullPointerException if the condition is null
+     */
+    public int getWaitQueueLength(Condition condition) {
+        return asCondVar(condition).getWaitQueueLength();
+    }
+
+    /**
+     * Returns a collection containing those threads that may be
+     * waiting on the given condition associated with this lock.
+     * Because the actual set of threads may change dynamically while
+     * constructing this result, the returned collection is only a
+     * best-effort estimate. The elements of the returned collection
+     * are in no particular order.  This method is designed to
+     * facilitate construction of subclasses that provide more
+     * extensive condition monitoring facilities.
+     *
+     * @param condition the condition
+     * @return the collection of threads
+     * @throws IllegalMonitorStateException if this lock is not held
+     * @throws IllegalArgumentException if the given condition is
+     *         not associated with this lock
+     * @throws NullPointerException if the condition is null
+     */
+    protected Collection getWaitingThreads(Condition condition) {
+        return asCondVar(condition).getWaitingThreads();
+    }
+
+    /**
+     * Returns a string identifying this lock, as well as its lock state.
+     * The state, in brackets, includes either the String {@code "Unlocked"}
+     * or the String {@code "Locked by"} followed by the
+     * {@linkplain Thread#getName name} of the owning thread.
+     *
+     * @return a string identifying this lock, as well as its lock state
+     */
+    public String toString() {
+        Thread o = getOwner();
+        return super.toString() + ((o == null) ?
+                                   "[Unlocked]" :
+                                   "[Locked by thread " + o.getName() + "]");
+    }
+
+    private CondVar asCondVar(Condition condition) {
+        if (condition == null)
+            throw new NullPointerException();
+        if (!(condition instanceof CondVar))
+            throw new IllegalArgumentException("not owner");
+        CondVar condVar = (CondVar)condition;
+        if (condVar.lock != this)
+            throw new IllegalArgumentException("not owner");
+        return condVar;
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/locks/ReentrantReadWriteLock.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/locks/ReentrantReadWriteLock.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/locks/ReentrantReadWriteLock.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,1339 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+package edu.emory.mathcs.backport.java.util.concurrent.locks;
+
+import java.util.HashMap;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.*;
+
+/**
+ * An implementation of {@link ReadWriteLock} supporting similar
+ * semantics to {@link ReentrantLock}.
+ * <p>This class has the following properties:
+ *
+ * <ul>
+ * <li><b>Acquisition order</b>
+ *
+ * <p>The order of entry
+ * to the read and write lock is unspecified, subject to reentrancy
+ * constraints.  A nonfair lock that is continously contended may
+ * indefinitely postpone one or more reader or writer threads, but
+ * will normally have higher throughput than a fair lock.
+ * <p>
+ *
+ * DEPARTURE FROM java.util.concurrent: this implementation impose
+ * a writer-preferrence and thus its acquisition order may be different
+ * than in java.util.concurrent.
+ *
+ * <li><b>Reentrancy</b>
+ *
+ * <p>This lock allows both readers and writers to reacquire read or
+ * write locks in the style of a {@link ReentrantLock}. Non-reentrant
+ * readers are not allowed until all write locks held by the writing
+ * thread have been released.
+ *
+ * <p>Additionally, a writer can acquire the read lock, but not
+ * vice-versa.  Among other applications, reentrancy can be useful
+ * when write locks are held during calls or callbacks to methods that
+ * perform reads under read locks.  If a reader tries to acquire the
+ * write lock it will never succeed.
+ *
+ * <li><b>Lock downgrading</b>
+ * <p>Reentrancy also allows downgrading from the write lock to a read lock,
+ * by acquiring the write lock, then the read lock and then releasing the
+ * write lock. However, upgrading from a read lock to the write lock is
+ * <b>not</b> possible.
+ *
+ * <li><b>Interruption of lock acquisition</b>
+ * <p>The read lock and write lock both support interruption during lock
+ * acquisition.
+ *
+ * <li><b>{@link Condition} support</b>
+ * <p>The write lock provides a {@link Condition} implementation that
+ * behaves in the same way, with respect to the write lock, as the
+ * {@link Condition} implementation provided by
+ * {@link ReentrantLock#newCondition} does for {@link ReentrantLock}.
+ * This {@link Condition} can, of course, only be used with the write lock.
+ *
+ * <p>The read lock does not support a {@link Condition} and
+ * {@code readLock().newCondition()} throws
+ * {@code UnsupportedOperationException}.
+ *
+ * <li><b>Instrumentation</b>
+ * <p>This class supports methods to determine whether locks
+ * are held or contended. These methods are designed for monitoring
+ * system state, not for synchronization control.
+ * </ul>
+ *
+ * <p>Serialization of this class behaves in the same way as built-in
+ * locks: a deserialized lock is in the unlocked state, regardless of
+ * its state when serialized.
+ *
+ * <p><b>Sample usages</b>. Here is a code sketch showing how to exploit
+ * reentrancy to perform lock downgrading after updating a cache (exception
+ * handling is elided for simplicity):
+ * <pre>
+ * class CachedData {
+ *   Object data;
+ *   volatile boolean cacheValid;
+ *   ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
+ *
+ *   void processCachedData() {
+ *     rwl.readLock().lock();
+ *     if (!cacheValid) {
+ *        // Must release read lock before acquiring write lock
+ *        rwl.readLock().unlock();
+ *        rwl.writeLock().lock();
+ *        // Recheck state because another thread might have acquired
+ *        //   write lock and changed state before we did.
+ *        if (!cacheValid) {
+ *          data = ...
+ *          cacheValid = true;
+ *        }
+ *        // Downgrade by acquiring read lock before releasing write lock
+ *        rwl.readLock().lock();
+ *        rwl.writeLock().unlock(); // Unlock write, still hold read
+ *     }
+ *
+ *     use(data);
+ *     rwl.readLock().unlock();
+ *   }
+ * }
+ * </pre>
+ *
+ * ReentrantReadWriteLocks can be used to improve concurrency in some
+ * uses of some kinds of Collections. This is typically worthwhile
+ * only when the collections are expected to be large, accessed by
+ * more reader threads than writer threads, and entail operations with
+ * overhead that outweighs synchronization overhead. For example, here
+ * is a class using a TreeMap that is expected to be large and
+ * concurrently accessed.
+ *
+ * <pre>{@code
+ * class RWDictionary {
+ *    private final Map<String, Data> m = new TreeMap<String, Data>();
+ *    private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
+ *    private final Lock r = rwl.readLock();
+ *    private final Lock w = rwl.writeLock();
+ *
+ *    public Data get(String key) {
+ *        r.lock();
+ *        try { return m.get(key); }
+ *        finally { r.unlock(); }
+ *    }
+ *    public String[] allKeys() {
+ *        r.lock();
+ *        try { return m.keySet().toArray(); }
+ *        finally { r.unlock(); }
+ *    }
+ *    public Data put(String key, Data value) {
+ *        w.lock();
+ *        try { return m.put(key, value); }
+ *        finally { w.unlock(); }
+ *    }
+ *    public void clear() {
+ *        w.lock();
+ *        try { m.clear(); }
+ *        finally { w.unlock(); }
+ *    }
+ * }}</pre>
+ *
+ * <h3>Implementation Notes</h3>
+ *
+ * <p>This lock supports a maximum of 65535 recursive write locks
+ * and 65535 read locks. Attempts to exceed these limits result in
+ * {@link Error} throws from locking methods.
+ *
+ * @since 1.5
+ * @author Doug Lea
+ *
+ */
+public class ReentrantReadWriteLock implements ReadWriteLock, java.io.Serializable  {
+    private static final long serialVersionUID = -3463448656717690166L;
+
+    final ReadLock readerLock_ = new ReadLock(this);
+    final WriteLock writerLock_ = new WriteLock(this);
+
+    final Sync sync;
+
+    /**
+     * Creates a new {@code ReentrantReadWriteLock} with
+     * default (nonfair) ordering properties.
+     */
+    public ReentrantReadWriteLock() {
+        this.sync = new NonfairSync();
+    }
+
+    public Lock writeLock() { return writerLock_; }
+    public Lock readLock()  { return readerLock_; }
+
+    /**
+     * Synchronization implementation for ReentrantReadWriteLock.
+     * Subclassed into fair and nonfair versions.
+     */
+    private abstract static class Sync implements java.io.Serializable {
+
+        private static final int NONE   = 0;
+        private static final int READER = 1;
+        private static final int WRITER = 2;
+
+        transient int activeReaders_ = 0;
+        transient Thread activeWriter_ = null;
+        transient int waitingReaders_ = 0;
+        transient int waitingWriters_ = 0;
+
+        /** Number of acquires on write lock by activeWriter_ thread **/
+        transient int writeHolds_ = 0;
+
+        /** Number of acquires on read lock by any reader thread **/
+        transient HashMap readers_ = new HashMap();
+
+        /** cache/reuse the special Integer value one to speed up readlocks **/
+        static final Integer IONE = new Integer(1);
+
+        Sync() {}
+
+        /*
+           Each of these variants is needed to maintain atomicity
+           of wait counts during wait loops. They could be
+           made faster by manually inlining each other. We hope that
+           compilers do this for us though.
+        */
+
+        synchronized boolean startReadFromNewReader() {
+            boolean pass = startRead();
+            if (!pass) ++waitingReaders_;
+            return pass;
+        }
+
+        synchronized boolean startWriteFromNewWriter() {
+            boolean pass = startWrite();
+            if (!pass) ++waitingWriters_;
+            return pass;
+        }
+
+        synchronized boolean startReadFromWaitingReader() {
+            boolean pass = startRead();
+            if (pass) --waitingReaders_;
+            return pass;
+        }
+
+        synchronized boolean startWriteFromWaitingWriter() {
+            boolean pass = startWrite();
+            if (pass) --waitingWriters_;
+            return pass;
+        }
+
+        /*
+           A bunch of small synchronized methods are needed
+           to allow communication from the Lock objects
+           back to this object, that serves as controller
+         */
+
+        synchronized void cancelledWaitingReader() { --waitingReaders_; }
+        synchronized void cancelledWaitingWriter() { --waitingWriters_; }
+
+        boolean allowReader() {
+            return (activeWriter_ == null && waitingWriters_ == 0) ||
+                activeWriter_ == Thread.currentThread();
+        }
+
+        synchronized boolean startRead() {
+            Thread t = Thread.currentThread();
+            Object c = readers_.get(t);
+            if (c != null) { // already held -- just increment hold count
+                readers_.put(t, new Integer( ( (Integer) (c)).intValue() + 1));
+                ++activeReaders_;
+                return true;
+            }
+            else if (allowReader()) {
+                readers_.put(t, IONE);
+                ++activeReaders_;
+                return true;
+            }
+            else
+                return false;
+        }
+
+        synchronized boolean startWrite() {
+            if (activeWriter_ == Thread.currentThread()) { // already held; re-acquire
+                ++writeHolds_;
+                return true;
+            }
+            else if (writeHolds_ == 0) {
+                if (activeReaders_ == 0 ||
+                    (readers_.size() == 1 &&
+                     readers_.get(Thread.currentThread()) != null)) {
+                    activeWriter_ = Thread.currentThread();
+                    writeHolds_ = 1;
+                    return true;
+                }
+                else
+                    return false;
+            }
+            else
+                return false;
+        }
+
+        synchronized int endRead() {
+            Thread t = Thread.currentThread();
+            Object c = readers_.get(t);
+            if (c == null)
+                throw new IllegalThreadStateException();
+            --activeReaders_;
+            if (c != IONE) { // more than one hold; decrement count
+                int h = ( (Integer) (c)).intValue() - 1;
+                Integer ih = (h == 1) ? IONE : new Integer(h);
+                readers_.put(t, ih);
+                return NONE;
+            }
+            else {
+                readers_.remove(t);
+
+                if (writeHolds_ > 0) // a write lock is still held by current thread
+                    return NONE;
+                else if (activeReaders_ == 0 && waitingWriters_ > 0)
+                    return WRITER;
+                else
+                    return NONE;
+            }
+        }
+
+        synchronized int endWrite() {
+            if (activeWriter_ != Thread.currentThread()) {
+                throw new IllegalMonitorStateException();
+            }
+            --writeHolds_;
+            if (writeHolds_ > 0) // still being held
+                return NONE;
+            else {
+                activeWriter_ = null;
+                if (waitingReaders_ > 0 && allowReader())
+                    return READER;
+                else if (waitingWriters_ > 0)
+                    return WRITER;
+                else
+                    return NONE;
+            }
+        }
+
+        synchronized Thread getOwner() {
+            return activeWriter_;
+        }
+
+        synchronized int getReadLockCount() {
+            return activeReaders_;
+        }
+
+        synchronized boolean isWriteLocked() {
+            return activeWriter_ != null;
+        }
+
+        synchronized boolean isWriteLockedByCurrentThread() {
+            return activeWriter_ == Thread.currentThread();
+        }
+
+        synchronized int getWriteHoldCount() {
+            return isWriteLockedByCurrentThread() ? writeHolds_ : 0;
+        }
+
+        synchronized int getReadHoldCount() {
+            if (activeReaders_ == 0) return 0;
+            Thread t = Thread.currentThread();
+            Integer i = (Integer)readers_.get(t);
+            return (i == null) ? 0 : i.intValue();
+        }
+
+        final synchronized boolean hasQueuedThreads() {
+            return waitingWriters_ > 0 || waitingReaders_ > 0;
+        }
+
+        final synchronized int getQueueLength() {
+            return waitingWriters_ + waitingReaders_;
+        }
+
+        private void readObject(java.io.ObjectInputStream in)
+                throws java.io.IOException, ClassNotFoundException {
+            in.defaultReadObject();
+            // readers_ is transient, need to reinitialize. Let's flush the memory
+            // and ensure visibility by synchronizing (all other accesses to
+            // readers_ are also synchronized on "this")
+            synchronized (this) {
+                readers_ = new HashMap();
+            }
+        }
+    }
+
+    /**
+     * Nonfair version of Sync
+     */
+    private static class NonfairSync extends Sync {
+        NonfairSync() {}
+    }
+
+    /**
+     * The lock returned by method {@link ReentrantReadWriteLock#readLock}.
+     */
+    public static class ReadLock implements Lock, java.io.Serializable {
+
+        private static final long serialVersionUID = -5992448646407690164L;
+
+        final ReentrantReadWriteLock lock;
+
+        /**
+         * Constructor for use by subclasses
+         *
+         * @param lock the outer lock object
+         * @throws NullPointerException if the lock is null
+         */
+        protected ReadLock(ReentrantReadWriteLock lock) {
+            if (lock == null) throw new NullPointerException();
+            this.lock = lock;
+        }
+
+        /**
+         * Acquires the read lock.
+         *
+         * <p>Acquires the read lock if the write lock is not held by
+         * another thread and returns immediately.
+         *
+         * <p>If the write lock is held by another thread then
+         * the current thread becomes disabled for thread scheduling
+         * purposes and lies dormant until the read lock has been acquired.
+         */
+        public void lock() {
+            synchronized (this) {
+                if (lock.sync.startReadFromNewReader()) return;
+                boolean wasInterrupted = Thread.interrupted();
+                try {
+                    while (true) {
+                        try {
+                            ReadLock.this.wait();
+                        }
+                        catch (InterruptedException ex) {
+                            wasInterrupted = true;
+                            // no need to propagate the potentially masked
+                            // signal, since readers are always notified all
+                        }
+                        if (lock.sync.startReadFromWaitingReader()) return;
+                    }
+                }
+                finally {
+                    if (wasInterrupted) Thread.currentThread().interrupt();
+                }
+            }
+        }
+
+        /**
+         * Acquires the read lock unless the current thread is
+         * {@linkplain Thread#interrupt interrupted}.
+         *
+         * <p>Acquires the read lock if the write lock is not held
+         * by another thread and returns immediately.
+         *
+         * <p>If the write lock is held by another thread then the
+         * current thread becomes disabled for thread scheduling
+         * purposes and lies dormant until one of two things happens:
+         *
+         * <ul>
+         *
+         * <li>The read lock is acquired by the current thread; or
+         *
+         * <li>Some other thread {@linkplain Thread#interrupt interrupts}
+         * the current thread.
+         *
+         * </ul>
+         *
+         * <p>If the current thread:
+         *
+         * <ul>
+         *
+         * <li>has its interrupted status set on entry to this method; or
+         *
+         * <li>is {@linkplain Thread#interrupt interrupted} while
+         * acquiring the read lock,
+         *
+         * </ul>
+         *
+         * then {@link InterruptedException} is thrown and the current
+         * thread's interrupted status is cleared.
+         *
+         * <p>In this implementation, as this method is an explicit
+         * interruption point, preference is given to responding to
+         * the interrupt over normal or reentrant acquisition of the
+         * lock.
+         *
+         * @throws InterruptedException if the current thread is interrupted
+         */
+        public void lockInterruptibly() throws InterruptedException {
+            if (Thread.interrupted()) throw new InterruptedException();
+            InterruptedException ie = null;
+            synchronized (this) {
+                if (!lock.sync.startReadFromNewReader()) {
+                    for (; ; ) {
+                        try {
+                            ReadLock.this.wait();
+                            if (lock.sync.startReadFromWaitingReader())
+                                return;
+                        }
+                        catch (InterruptedException ex) {
+                            lock.sync.cancelledWaitingReader();
+                            ie = ex;
+                            break;
+                        }
+                    }
+                }
+            }
+            if (ie != null) {
+                // fall through outside synch on interrupt.
+                // This notification is not really needed here,
+                //   but may be in plausible subclasses
+                lock.writerLock_.signalWaiters();
+                throw ie;
+            }
+        }
+
+        /**
+         * Acquires the read lock only if the write lock is not held by
+         * another thread at the time of invocation.
+         *
+         * <p>Acquires the read lock if the write lock is not held by
+         * another thread and returns immediately with the value
+         * {@code true}. Even when this lock has been set to use a
+         * fair ordering policy, a call to {@code tryLock()}
+         * <em>will</em> immediately acquire the read lock if it is
+         * available, whether or not other threads are currently
+         * waiting for the read lock.  This &quot;barging&quot; behavior
+         * can be useful in certain circumstances, even though it
+         * breaks fairness. If you want to honor the fairness setting
+         * for this lock, then use {@link #tryLock(long, TimeUnit)
+         * tryLock(0, TimeUnit.SECONDS) } which is almost equivalent
+         * (it also detects interruption).
+         *
+         * <p>If the write lock is held by another thread then
+         * this method will return immediately with the value
+         * {@code false}.
+         *
+         * @return {@code true} if the read lock was acquired
+         */
+        public boolean tryLock() {
+            return lock.sync.startRead();
+        }
+
+        /**
+         * Acquires the read lock if the write lock is not held by
+         * another thread within the given waiting time and the
+         * current thread has not been {@linkplain Thread#interrupt
+         * interrupted}.
+         *
+         * <p>Acquires the read lock if the write lock is not held by
+         * another thread and returns immediately with the value
+         * {@code true}. If this lock has been set to use a fair
+         * ordering policy then an available lock <em>will not</em> be
+         * acquired if any other threads are waiting for the
+         * lock. This is in contrast to the {@link #tryLock()}
+         * method. If you want a timed {@code tryLock} that does
+         * permit barging on a fair lock then combine the timed and
+         * un-timed forms together:
+         *
+         * <pre>if (lock.tryLock() || lock.tryLock(timeout, unit) ) { ... }
+         * </pre>
+         *
+         * <p>If the write lock is held by another thread then the
+         * current thread becomes disabled for thread scheduling
+         * purposes and lies dormant until one of three things happens:
+         *
+         * <ul>
+         *
+         * <li>The read lock is acquired by the current thread; or
+         *
+         * <li>Some other thread {@linkplain Thread#interrupt interrupts}
+         * the current thread; or
+         *
+         * <li>The specified waiting time elapses.
+         *
+         * </ul>
+         *
+         * <p>If the read lock is acquired then the value {@code true} is
+         * returned.
+         *
+         * <p>If the current thread:
+         *
+         * <ul>
+         *
+         * <li>has its interrupted status set on entry to this method; or
+         *
+         * <li>is {@linkplain Thread#interrupt interrupted} while
+         * acquiring the read lock,
+         *
+         * </ul> then {@link InterruptedException} is thrown and the
+         * current thread's interrupted status is cleared.
+         *
+         * <p>If the specified waiting time elapses then the value
+         * {@code false} is returned.  If the time is less than or
+         * equal to zero, the method will not wait at all.
+         *
+         * <p>In this implementation, as this method is an explicit
+         * interruption point, preference is given to responding to
+         * the interrupt over normal or reentrant acquisition of the
+         * lock, and over reporting the elapse of the waiting time.
+         *
+         * @param timeout the time to wait for the read lock
+         * @param unit the time unit of the timeout argument
+         * @return {@code true} if the read lock was acquired
+         * @throws InterruptedException if the current thread is interrupted
+         * @throws NullPointerException if the time unit is null
+         *
+         */
+        public boolean tryLock(long timeout, TimeUnit unit) throws InterruptedException {
+            if (Thread.interrupted()) throw new InterruptedException();
+            InterruptedException ie = null;
+            long nanos = unit.toNanos(timeout);
+            synchronized (this) {
+                if (nanos <= 0)
+                    return lock.sync.startRead();
+                else if (lock.sync.startReadFromNewReader())
+                    return true;
+                else {
+                    long deadline = Utils.nanoTime() + nanos;
+                    for (; ; ) {
+                        try {
+                            TimeUnit.NANOSECONDS.timedWait(ReadLock.this, nanos);
+                        }
+                        catch (InterruptedException ex) {
+                            lock.sync.cancelledWaitingReader();
+                            ie = ex;
+                            break;
+                        }
+                        if (lock.sync.startReadFromWaitingReader())
+                            return true;
+                        else {
+                            nanos = deadline - Utils.nanoTime();
+                            if (nanos <= 0) {
+                                lock.sync.cancelledWaitingReader();
+                                break;
+                            }
+                        }
+                    }
+                }
+            }
+            // safeguard on interrupt or timeout:
+            lock.writerLock_.signalWaiters();
+            if (ie != null)
+                throw ie;
+            else
+                return false; // timed out
+        }
+
+        /**
+         * Attempts to release this lock.
+         *
+         * <p> If the number of readers is now zero then the lock
+         * is made available for write lock attempts.
+         */
+        public void unlock() {
+            switch (lock.sync.endRead()) {
+                case Sync.NONE: return;
+                case Sync.READER: lock.readerLock_.signalWaiters(); return;
+                case Sync.WRITER: lock.writerLock_.signalWaiters(); return;
+            }
+        }
+
+        /**
+         * Throws {@code UnsupportedOperationException} because
+         * {@code ReadLocks} do not support conditions.
+         *
+         * @throws UnsupportedOperationException always
+         */
+        public Condition newCondition() {
+            throw new UnsupportedOperationException();
+        }
+
+        synchronized void signalWaiters() {
+            notifyAll();
+        }
+
+        /**
+         * Returns a string identifying this lock, as well as its lock state.
+         * The state, in brackets, includes the String {@code "Read locks ="}
+         * followed by the number of held read locks.
+         *
+         * @return a string identifying this lock, as well as its lock state
+         */
+        public String toString() {
+            int r = lock.getReadLockCount();
+            return super.toString() +
+                "[Read locks = " + r + "]";
+        }
+
+    }
+
+    /**
+     * The lock returned by method {@link ReentrantReadWriteLock#writeLock}.
+     */
+    public static class WriteLock implements Lock, CondVar.ExclusiveLock,
+                                             java.io.Serializable {
+
+        private static final long serialVersionUID = -4992448646407690164L;
+        final ReentrantReadWriteLock lock;
+
+        /**
+         * Constructor for use by subclasses
+         *
+         * @param lock the outer lock object
+         * @throws NullPointerException if the lock is null
+         */
+        protected WriteLock(ReentrantReadWriteLock lock) {
+            if (lock == null) throw new NullPointerException();
+            this.lock = lock;
+        }
+
+        /**
+         * Acquires the write lock.
+         *
+         * <p>Acquires the write lock if neither the read nor write lock
+         * are held by another thread
+         * and returns immediately, setting the write lock hold count to
+         * one.
+         *
+         * <p>If the current thread already holds the write lock then the
+         * hold count is incremented by one and the method returns
+         * immediately.
+         *
+         * <p>If the lock is held by another thread then the current
+         * thread becomes disabled for thread scheduling purposes and
+         * lies dormant until the write lock has been acquired, at which
+         * time the write lock hold count is set to one.
+         */
+        public void lock() {
+            synchronized (this) {
+                if (lock.sync.startWriteFromNewWriter()) return;
+                boolean wasInterrupted = Thread.interrupted();
+                try {
+                    while (true) {
+                        try {
+                            WriteLock.this.wait();
+                        }
+                        catch (InterruptedException ex) {
+                            wasInterrupted = true;
+                            // no need to notify; if we were notified,
+                            // we will act as notified, and succeed in
+                            // startWrite and return
+                        }
+                        if (lock.sync.startWriteFromWaitingWriter()) return;
+                    }
+                }
+                finally {
+                    if (wasInterrupted) Thread.currentThread().interrupt();
+                }
+            }
+        }
+
+        /**
+         * Acquires the write lock unless the current thread is
+         * {@linkplain Thread#interrupt interrupted}.
+         *
+         * <p>Acquires the write lock if neither the read nor write lock
+         * are held by another thread
+         * and returns immediately, setting the write lock hold count to
+         * one.
+         *
+         * <p>If the current thread already holds this lock then the
+         * hold count is incremented by one and the method returns
+         * immediately.
+         *
+         * <p>If the lock is held by another thread then the current
+         * thread becomes disabled for thread scheduling purposes and
+         * lies dormant until one of two things happens:
+         *
+         * <ul>
+         *
+         * <li>The write lock is acquired by the current thread; or
+         *
+         * <li>Some other thread {@linkplain Thread#interrupt interrupts}
+         * the current thread.
+         *
+         * </ul>
+         *
+         * <p>If the write lock is acquired by the current thread then the
+         * lock hold count is set to one.
+         *
+         * <p>If the current thread:
+         *
+         * <ul>
+         *
+         * <li>has its interrupted status set on entry to this method;
+         * or
+         *
+         * <li>is {@linkplain Thread#interrupt interrupted} while
+         * acquiring the write lock,
+         *
+         * </ul>
+         *
+         * then {@link InterruptedException} is thrown and the current
+         * thread's interrupted status is cleared.
+         *
+         * <p>In this implementation, as this method is an explicit
+         * interruption point, preference is given to responding to
+         * the interrupt over normal or reentrant acquisition of the
+         * lock.
+         *
+         * @throws InterruptedException if the current thread is interrupted
+         */
+        public void lockInterruptibly() throws InterruptedException {
+            if (Thread.interrupted()) throw new InterruptedException();
+            InterruptedException ie = null;
+            synchronized (this) {
+                if (!lock.sync.startWriteFromNewWriter()) {
+                    for (; ; ) {
+                        try {
+                            WriteLock.this.wait();
+                            if (lock.sync.startWriteFromWaitingWriter())
+                                return;
+                        }
+                        catch (InterruptedException ex) {
+                            lock.sync.cancelledWaitingWriter();
+                            WriteLock.this.notify();
+                            ie = ex;
+                            break;
+                        }
+                    }
+                }
+            }
+            if (ie != null) {
+                // Fall through outside synch on interrupt.
+                //  On exception, we may need to signal readers.
+                //  It is not worth checking here whether it is strictly necessary.
+                lock.readerLock_.signalWaiters();
+                throw ie;
+            }
+        }
+
+        /**
+         * Acquires the write lock only if it is not held by another thread
+         * at the time of invocation.
+         *
+         * <p>Acquires the write lock if neither the read nor write lock
+         * are held by another thread
+         * and returns immediately with the value {@code true},
+         * setting the write lock hold count to one. Even when this lock has
+         * been set to use a fair ordering policy, a call to
+         * {@code tryLock()} <em>will</em> immediately acquire the
+         * lock if it is available, whether or not other threads are
+         * currently waiting for the write lock.  This &quot;barging&quot;
+         * behavior can be useful in certain circumstances, even
+         * though it breaks fairness. If you want to honor the
+         * fairness setting for this lock, then use {@link
+         * #tryLock(long, TimeUnit) tryLock(0, TimeUnit.SECONDS) }
+         * which is almost equivalent (it also detects interruption).
+         *
+         * <p> If the current thread already holds this lock then the
+         * hold count is incremented by one and the method returns
+         * {@code true}.
+         *
+         * <p>If the lock is held by another thread then this method
+         * will return immediately with the value {@code false}.
+         *
+         * @return {@code true} if the lock was free and was acquired
+         * by the current thread, or the write lock was already held
+         * by the current thread; and {@code false} otherwise.
+         */
+        public boolean tryLock() {
+            return lock.sync.startWrite();
+        }
+
+        /**
+         * Acquires the write lock if it is not held by another thread
+         * within the given waiting time and the current thread has
+         * not been {@linkplain Thread#interrupt interrupted}.
+         *
+         * <p>Acquires the write lock if neither the read nor write lock
+         * are held by another thread
+         * and returns immediately with the value {@code true},
+         * setting the write lock hold count to one. If this lock has been
+         * set to use a fair ordering policy then an available lock
+         * <em>will not</em> be acquired if any other threads are
+         * waiting for the write lock. This is in contrast to the {@link
+         * #tryLock()} method. If you want a timed {@code tryLock}
+         * that does permit barging on a fair lock then combine the
+         * timed and un-timed forms together:
+         *
+         * <pre>if (lock.tryLock() || lock.tryLock(timeout, unit) ) { ... }
+         * </pre>
+         *
+         * <p>If the current thread already holds this lock then the
+         * hold count is incremented by one and the method returns
+         * {@code true}.
+         *
+         * <p>If the lock is held by another thread then the current
+         * thread becomes disabled for thread scheduling purposes and
+         * lies dormant until one of three things happens:
+         *
+         * <ul>
+         *
+         * <li>The write lock is acquired by the current thread; or
+         *
+         * <li>Some other thread {@linkplain Thread#interrupt interrupts}
+         * the current thread; or
+         *
+         * <li>The specified waiting time elapses
+         *
+         * </ul>
+         *
+         * <p>If the write lock is acquired then the value {@code true} is
+         * returned and the write lock hold count is set to one.
+         *
+         * <p>If the current thread:
+         *
+         * <ul>
+         *
+         * <li>has its interrupted status set on entry to this method;
+         * or
+         *
+         * <li>is {@linkplain Thread#interrupt interrupted} while
+         * acquiring the write lock,
+         *
+         * </ul>
+         *
+         * then {@link InterruptedException} is thrown and the current
+         * thread's interrupted status is cleared.
+         *
+         * <p>If the specified waiting time elapses then the value
+         * {@code false} is returned.  If the time is less than or
+         * equal to zero, the method will not wait at all.
+         *
+         * <p>In this implementation, as this method is an explicit
+         * interruption point, preference is given to responding to
+         * the interrupt over normal or reentrant acquisition of the
+         * lock, and over reporting the elapse of the waiting time.
+         *
+         * @param timeout the time to wait for the write lock
+         * @param unit the time unit of the timeout argument
+         *
+         * @return {@code true} if the lock was free and was acquired
+         * by the current thread, or the write lock was already held by the
+         * current thread; and {@code false} if the waiting time
+         * elapsed before the lock could be acquired.
+         *
+         * @throws InterruptedException if the current thread is interrupted
+         * @throws NullPointerException if the time unit is null
+         *
+         */
+        public boolean tryLock(long timeout, TimeUnit unit) throws InterruptedException {
+            if (Thread.interrupted()) throw new InterruptedException();
+            InterruptedException ie = null;
+            long nanos = unit.toNanos(timeout);
+            synchronized (this) {
+                if (nanos <= 0)
+                    return lock.sync.startWrite();
+                else if (lock.sync.startWriteFromNewWriter())
+                    return true;
+                else {
+                    long deadline = Utils.nanoTime() + nanos;
+                    for (; ; ) {
+                        try {
+                            TimeUnit.NANOSECONDS.timedWait(WriteLock.this, nanos);
+                        }
+                        catch (InterruptedException ex) {
+                            lock.sync.cancelledWaitingWriter();
+                            WriteLock.this.notify();
+                            ie = ex;
+                            break;
+                        }
+                        if (lock.sync.startWriteFromWaitingWriter())
+                            return true;
+                        else {
+                            nanos = deadline - Utils.nanoTime();
+                            if (nanos <= 0) {
+                                lock.sync.cancelledWaitingWriter();
+                                WriteLock.this.notify();
+                                break;
+                            }
+                        }
+                    }
+                }
+            }
+
+            lock.readerLock_.signalWaiters();
+            if (ie != null)
+                throw ie;
+            else
+                return false; // timed out
+        }
+
+        /**
+         * Attempts to release this lock.
+         *
+         * <p>If the current thread is the holder of this lock then
+         * the hold count is decremented. If the hold count is now
+         * zero then the lock is released.  If the current thread is
+         * not the holder of this lock then {@link
+         * IllegalMonitorStateException} is thrown.
+         *
+         * @throws IllegalMonitorStateException if the current thread does not
+         * hold this lock.
+         */
+        public void unlock() {
+            switch (lock.sync.endWrite()) {
+                case Sync.NONE: return;
+                case Sync.READER: lock.readerLock_.signalWaiters(); return;
+                case Sync.WRITER: lock.writerLock_.signalWaiters(); return;
+            }
+        }
+
+        /**
+         * Returns a {@link Condition} instance for use with this
+         * {@link Lock} instance.
+         * <p>The returned {@link Condition} instance supports the same
+         * usages as do the {@link Object} monitor methods ({@link
+         * Object#wait() wait}, {@link Object#notify notify}, and {@link
+         * Object#notifyAll notifyAll}) when used with the built-in
+         * monitor lock.
+         *
+         * <ul>
+         *
+         * <li>If this write lock is not held when any {@link
+         * Condition} method is called then an {@link
+         * IllegalMonitorStateException} is thrown.  (Read locks are
+         * held independently of write locks, so are not checked or
+         * affected. However it is essentially always an error to
+         * invoke a condition waiting method when the current thread
+         * has also acquired read locks, since other threads that
+         * could unblock it will not be able to acquire the write
+         * lock.)
+         *
+         * <li>When the condition {@linkplain Condition#await() waiting}
+         * methods are called the write lock is released and, before
+         * they return, the write lock is reacquired and the lock hold
+         * count restored to what it was when the method was called.
+         *
+         * <li>If a thread is {@linkplain Thread#interrupt interrupted} while
+         * waiting then the wait will terminate, an {@link
+         * InterruptedException} will be thrown, and the thread's
+         * interrupted status will be cleared.
+         *
+         * <li> Waiting threads are signalled in FIFO order.
+         *
+         * <li>The ordering of lock reacquisition for threads returning
+         * from waiting methods is the same as for threads initially
+         * acquiring the lock, which is in the default case not specified,
+         * but for <em>fair</em> locks favors those threads that have been
+         * waiting the longest.
+         *
+         * </ul>
+         *
+         * @return the Condition object
+         */
+        public Condition newCondition() {
+            return new CondVar(this);
+        }
+
+        synchronized void signalWaiters() {
+            notify();
+        }
+
+        /**
+         * Returns a string identifying this lock, as well as its lock
+         * state.  The state, in brackets includes either the String
+         * {@code "Unlocked"} or the String {@code "Locked by"}
+         * followed by the {@linkplain Thread#getName name} of the owning thread.
+         *
+         * @return a string identifying this lock, as well as its lock state
+         */
+        public String toString() {
+            Thread o = lock.getOwner();
+            return super.toString() + ((o == null) ?
+                                       "[Unlocked]" :
+                                       "[Locked by thread " + o.getName() + "]");
+        }
+
+        /**
+         * Queries if this write lock is held by the current thread.
+         * Identical in effect to {@link
+         * ReentrantReadWriteLock#isWriteLockedByCurrentThread}.
+         *
+         * @return {@code true} if the current thread holds this lock and
+         *	   {@code false} otherwise
+         * @since 1.6
+         */
+        public boolean isHeldByCurrentThread() {
+            return lock.sync.isWriteLockedByCurrentThread();
+        }
+
+        /**
+         * Queries the number of holds on this write lock by the current
+         * thread.  A thread has a hold on a lock for each lock action
+         * that is not matched by an unlock action.  Identical in effect
+         * to {@link ReentrantReadWriteLock#getWriteHoldCount}.
+         *
+         * @return the number of holds on this lock by the current thread,
+         *	   or zero if this lock is not held by the current thread
+         * @since 1.6
+         */
+        public int getHoldCount() {
+            return lock.sync.getWriteHoldCount();
+        }
+
+    }
+
+    // Instrumentation and status
+
+    /**
+     * Returns {@code true} if this lock has fairness set true.
+     *
+     * @return {@code true} if this lock has fairness set true
+     */
+    public final boolean isFair() {
+        return false;
+    }
+
+    /**
+     * Returns the thread that currently owns the write lock, or
+     * {@code null} if not owned. When this method is called by a
+     * thread that is not the owner, the return value reflects a
+     * best-effort approximation of current lock status. For example,
+     * the owner may be momentarily {@code null} even if there are
+     * threads trying to acquire the lock but have not yet done so.
+     * This method is designed to facilitate construction of
+     * subclasses that provide more extensive lock monitoring
+     * facilities.
+     *
+     * @return the owner, or {@code null} if not owned
+     */
+    protected Thread getOwner() {
+        return sync.getOwner();
+    }
+
+    /**
+     * Queries the number of read locks held for this lock. This
+     * method is designed for use in monitoring system state, not for
+     * synchronization control.
+     * @return the number of read locks held.
+     */
+    public int getReadLockCount() {
+        return sync.getReadLockCount();
+    }
+
+    /**
+     * Queries if the write lock is held by any thread. This method is
+     * designed for use in monitoring system state, not for
+     * synchronization control.
+     *
+     * @return {@code true} if any thread holds the write lock and
+     *         {@code false} otherwise
+     */
+    public boolean isWriteLocked() {
+        return sync.isWriteLocked();
+    }
+
+    /**
+     * Queries if the write lock is held by the current thread.
+     *
+     * @return {@code true} if the current thread holds the write lock and
+     *         {@code false} otherwise
+     */
+    public boolean isWriteLockedByCurrentThread() {
+        return sync.isWriteLockedByCurrentThread();
+    }
+
+    /**
+     * Queries the number of reentrant write holds on this lock by the
+     * current thread.  A writer thread has a hold on a lock for
+     * each lock action that is not matched by an unlock action.
+     *
+     * @return the number of holds on the write lock by the current thread,
+     *         or zero if the write lock is not held by the current thread
+     */
+    public int getWriteHoldCount() {
+        return sync.getWriteHoldCount();
+    }
+
+    /**
+     * Queries the number of reentrant read holds on this lock by the
+     * current thread.  A reader thread has a hold on a lock for
+     * each lock action that is not matched by an unlock action.
+     *
+     * @return the number of holds on the read lock by the current thread,
+     *         or zero if the read lock is not held by the current thread
+     * @since 1.6
+     */
+    public int getReadHoldCount() {
+        return sync.getReadHoldCount();
+    }
+
+
+//    /**
+//     * Returns a collection containing threads that may be waiting to
+//     * acquire the write lock.  Because the actual set of threads may
+//     * change dynamically while constructing this result, the returned
+//     * collection is only a best-effort estimate.  The elements of the
+//     * returned collection are in no particular order.  This method is
+//     * designed to facilitate construction of subclasses that provide
+//     * more extensive lock monitoring facilities.
+//     * @return the collection of threads
+//     */
+//    protected Collection getQueuedWriterThreads() {
+//        return sync.getExclusiveQueuedThreads();
+//    }
+//
+//    /**
+//     * Returns a collection containing threads that may be waiting to
+//     * acquire the read lock.  Because the actual set of threads may
+//     * change dynamically while constructing this result, the returned
+//     * collection is only a best-effort estimate.  The elements of the
+//     * returned collection are in no particular order.  This method is
+//     * designed to facilitate construction of subclasses that provide
+//     * more extensive lock monitoring facilities.
+//     * @return the collection of threads
+//     */
+//    protected Collection getQueuedReaderThreads() {
+//        return sync.getSharedQueuedThreads();
+//    }
+//
+    /**
+     * Queries whether any threads are waiting to acquire the read or
+     * write lock. Note that because cancellations may occur at any
+     * time, a {@code true} return does not guarantee that any other
+     * thread will ever acquire a lock.  This method is designed
+     * primarily for use in monitoring of the system state.
+     *
+     * @return {@code true} if there may be other threads waiting to
+     *         acquire the lock
+     */
+    public final boolean hasQueuedThreads() {
+        return sync.hasQueuedThreads();
+    }
+//
+//    /**
+//     * Queries whether the given thread is waiting to acquire either
+//     * the read or write lock. Note that because cancellations may
+//     * occur at any time, a <tt>true</tt> return does not guarantee
+//     * that this thread will ever acquire a lock.  This method is
+//     * designed primarily for use in monitoring of the system state.
+//     *
+//     * @param thread the thread
+//     * @return true if the given thread is queued waiting for this lock.
+//     * @throws NullPointerException if thread is null
+//     */
+//    public final boolean hasQueuedThread(Thread thread) {
+//        return sync.isQueued(thread);
+//    }
+
+    /**
+     * Returns an estimate of the number of threads waiting to acquire
+     * either the read or write lock.  The value is only an estimate
+     * because the number of threads may change dynamically while this
+     * method traverses internal data structures.  This method is
+     * designed for use in monitoring of the system state, not for
+     * synchronization control.
+     *
+     * @return the estimated number of threads waiting for this lock
+     */
+    public final int getQueueLength() {
+        return sync.getQueueLength();
+    }
+
+//    /**
+//     * Returns a collection containing threads that may be waiting to
+//     * acquire either the read or write lock.  Because the actual set
+//     * of threads may change dynamically while constructing this
+//     * result, the returned collection is only a best-effort estimate.
+//     * The elements of the returned collection are in no particular
+//     * order.  This method is designed to facilitate construction of
+//     * subclasses that provide more extensive monitoring facilities.
+//     * @return the collection of threads
+//     */
+//    protected Collection getQueuedThreads() {
+//        return sync.getQueuedThreads();
+//    }
+//
+//    /**
+//     * Queries whether any threads are waiting on the given condition
+//     * associated with the write lock. Note that because timeouts and
+//     * interrupts may occur at any time, a <tt>true</tt> return does
+//     * not guarantee that a future <tt>signal</tt> will awaken any
+//     * threads.  This method is designed primarily for use in
+//     * monitoring of the system state.
+//     * @param condition the condition
+//     * @return <tt>true</tt> if there are any waiting threads.
+//     * @throws IllegalMonitorStateException if this lock
+//     * is not held
+//     * @throws IllegalArgumentException if the given condition is
+//     * not associated with this lock
+//     * @throws NullPointerException if condition null
+//     */
+//    public boolean hasWaiters(Condition condition) {
+//        if (condition == null)
+//            throw new NullPointerException();
+//        if (!(condition instanceof AbstractQueuedSynchronizer.ConditionObject))
+//            throw new IllegalArgumentException("not owner");
+//        return sync.hasWaiters((AbstractQueuedSynchronizer.ConditionObject)condition);
+//    }
+
+//    /**
+//     * Returns an estimate of the number of threads waiting on the
+//     * given condition associated with the write lock. Note that because
+//     * timeouts and interrupts may occur at any time, the estimate
+//     * serves only as an upper bound on the actual number of waiters.
+//     * This method is designed for use in monitoring of the system
+//     * state, not for synchronization control.
+//     * @param condition the condition
+//     * @return the estimated number of waiting threads.
+//     * @throws IllegalMonitorStateException if this lock
+//     * is not held
+//     * @throws IllegalArgumentException if the given condition is
+//     * not associated with this lock
+//     * @throws NullPointerException if condition null
+//     */
+//    public int getWaitQueueLength(Condition condition) {
+//        if (condition == null)
+//            throw new NullPointerException();
+//        if (!(condition instanceof AbstractQueuedSynchronizer.ConditionObject))
+//            throw new IllegalArgumentException("not owner");
+//        return sync.getWaitQueueLength((AbstractQueuedSynchronizer.ConditionObject)condition);
+//    }
+//
+//    /**
+//     * Returns a collection containing those threads that may be
+//     * waiting on the given condition associated with the write lock.
+//     * Because the actual set of threads may change dynamically while
+//     * constructing this result, the returned collection is only a
+//     * best-effort estimate. The elements of the returned collection
+//     * are in no particular order.  This method is designed to
+//     * facilitate construction of subclasses that provide more
+//     * extensive condition monitoring facilities.
+//     * @param condition the condition
+//     * @return the collection of threads
+//     * @throws IllegalMonitorStateException if this lock
+//     * is not held
+//     * @throws IllegalArgumentException if the given condition is
+//     * not associated with this lock
+//     * @throws NullPointerException if condition null
+//     */
+//    protected Collection getWaitingThreads(Condition condition) {
+//        if (condition == null)
+//            throw new NullPointerException();
+//        if (!(condition instanceof AbstractQueuedSynchronizer.ConditionObject))
+//            throw new IllegalArgumentException("not owner");
+//        return sync.getWaitingThreads((AbstractQueuedSynchronizer.ConditionObject)condition);
+//    }
+
+    /**
+     * Returns a string identifying this lock, as well as its lock state.
+     * The state, in brackets, includes the String {@code "Write locks ="}
+     * followed by the number of reentrantly held write locks, and the
+     * String {@code "Read locks ="} followed by the number of held
+     * read locks.
+     *
+     * @return a string identifying this lock, as well as its lock state
+     */
+    public String toString() {
+        return super.toString() +
+            "[Write locks = " + getWriteHoldCount() +
+            ", Read locks = " + getReadLockCount() + "]";
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/locks/package.html
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/locks/package.html	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/locks/package.html	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,45 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html> <head><title>Locks</title></head>
+
+<body>Interfaces and classes providing a framework for locking and waiting
+for conditions that is distinct from built-in synchronization and
+monitors. The framework permits much greater flexibility in the use of
+locks and conditions, at the expense of more awkward syntax.
+
+<p> The {@link edu.emory.mathcs.backport.java.util.concurrent.locks.Lock} interface supports
+locking disciplines that differ in semantics (reentrant, fair, etc),
+and that can be used in non-block-structured contexts including
+hand-over-hand and lock reordering algorithms. The main implementation
+is {@link edu.emory.mathcs.backport.java.util.concurrent.locks.ReentrantLock}.
+
+<p> The {@link edu.emory.mathcs.backport.java.util.concurrent.locks.ReadWriteLock} interface
+similarly defines locks that may be shared among readers but are
+exclusive to writers.  Only a single implementation, {@link
+edu.emory.mathcs.backport.java.util.concurrent.locks.ReentrantReadWriteLock}, is provided, since
+it covers most standard usage contexts. But programmers may create
+their own implementations to cover nonstandard requirements.
+
+<p> The {@link edu.emory.mathcs.backport.java.util.concurrent.locks.Condition} interface
+describes condition variables that may be associated with Locks.
+These are similar in usage to the implicit monitors accessed using
+<tt>Object.wait</tt>, but offer extended capabilities.  In particular,
+multiple <tt>Condition</tt> objects may be associated with a single
+<tt>Lock</tt>.  To avoid compatibility issues, the names of
+<tt>Condition</tt> methods are different than the corresponding
+<tt>Object</tt> versions.
+
+<!--
+<p> The {@link edu.emory.mathcs.backport.java.util.concurrent.locks.AbstractQueuedSynchronizer}
+class serves as a useful superclass for defining locks and other
+synchronizers that rely on queuing blocked threads.  The {@link
+edu.emory.mathcs.backport.java.util.concurrent.locks.AbstractQueuedLongSynchronizer} class
+provides the same functionality but extends support to 64 bits of
+synchronization state. Both extend class {@link
+edu.emory.mathcs.backport.java.util.concurrent.locks.AbstractOwnableSynchronizer}, a simple
+class that helps record the thread currently holding exclusive
+synchronization.  The {@link edu.emory.mathcs.backport.java.util.concurrent.locks.LockSupport}
+class provides lower-level blocking and unblocking support that is
+useful for those developers implementing their own customized lock
+classes.-->
+
+ at since 1.5</body> </html>

Added: branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/package.html
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/package.html	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/edu/emory/mathcs/backport/java/util/concurrent/package.html	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,222 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html> <head>
+<title>Concurrency Utilities</title>
+</head>
+
+<body>
+
+<p> Utility classes commonly useful in concurrent programming.  This
+package includes a few small standardized extensible frameworks, as
+well as some classes that provide useful functionality and are
+otherwise tedious or difficult to implement.  Here are brief
+descriptions of the main components. See also the <tt>locks</tt> and
+<tt>atomic</tt> packages.
+
+<h2>Executors</h2>
+
+<b>Interfaces.</b> {@link edu.emory.mathcs.backport.java.util.concurrent.Executor} is a simple
+standardized interface for defining custom thread-like subsystems,
+including thread pools, asynchronous IO, and lightweight task
+frameworks.  Depending on which concrete Executor class is being used,
+tasks may execute in a newly created thread, an existing
+task-execution thread, or the thread calling <tt>execute()</tt>, and
+may execute sequentially or concurrently.  {@link
+edu.emory.mathcs.backport.java.util.concurrent.ExecutorService} provides a more complete
+asynchronous task execution framework.  An ExecutorService manages
+queuing and scheduling of tasks, and allows controlled shutdown.  The
+{@link edu.emory.mathcs.backport.java.util.concurrent.ScheduledExecutorService} subinterface
+and associated interfaces add support for delayed and periodic task execution.
+ExecutorServices provide methods arranging asynchronous execution of
+any function expressed as {@link edu.emory.mathcs.backport.java.util.concurrent.Callable}, the
+result-bearing analog of {@link java.lang.Runnable}.  A {@link
+edu.emory.mathcs.backport.java.util.concurrent.Future} returns the results of a function, allows
+determination of whether execution has completed, and provides a means to
+cancel execution.  A {@link edu.emory.mathcs.backport.java.util.concurrent.RunnableFuture} is
+a Future that possesses a <tt>run</tt> method that upon execution,
+sets its results.
+
+<p>
+
+<b>Implementations.</b> Classes {@link
+edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor} and {@link
+edu.emory.mathcs.backport.java.util.concurrent.ScheduledThreadPoolExecutor} provide tunable,
+flexible thread pools. The {@link edu.emory.mathcs.backport.java.util.concurrent.Executors}
+class provides factory methods for the most common kinds and
+configurations of Executors, as well as a few utility methods for
+using them. Other utilities based on Executors include the concrete
+class {@link edu.emory.mathcs.backport.java.util.concurrent.FutureTask} providing a common
+extensible implementation of Futures, and {@link
+edu.emory.mathcs.backport.java.util.concurrent.ExecutorCompletionService}, that assists in
+coordinating the processing of groups of asynchronous tasks.
+
+<h2>Queues</h2>
+
+The edu.emory.mathcs.backport.java.util.concurrent {@link
+edu.emory.mathcs.backport.java.util.concurrent.ConcurrentLinkedQueue} class supplies an
+efficient scalable thread-safe non-blocking FIFO queue.  Five
+implementations in edu.emory.mathcs.backport.java.util.concurrent support the extended {@link
+edu.emory.mathcs.backport.java.util.concurrent.BlockingQueue} interface, that defines blocking
+versions of put and take: {@link
+edu.emory.mathcs.backport.java.util.concurrent.LinkedBlockingQueue}, {@link
+edu.emory.mathcs.backport.java.util.concurrent.ArrayBlockingQueue}, {@link
+edu.emory.mathcs.backport.java.util.concurrent.SynchronousQueue}, {@link
+edu.emory.mathcs.backport.java.util.concurrent.PriorityBlockingQueue}, and {@link
+edu.emory.mathcs.backport.java.util.concurrent.DelayQueue}. The different classes cover the most
+common usage contexts for producer-consumer, messaging, parallel
+tasking, and related concurrent designs. The {@link
+edu.emory.mathcs.backport.java.util.concurrent.BlockingDeque} interface extends
+<tt>BlockingQueue</tt> to support both FIFO and LIFO (stack-based)
+operations. Class {@link edu.emory.mathcs.backport.java.util.concurrent.LinkedBlockingDeque}
+provides an implementation.
+
+
+<h2>Timing</h2>
+
+The {@link edu.emory.mathcs.backport.java.util.concurrent.TimeUnit} class provides multiple
+granularities (including nanoseconds) for specifying and controlling
+time-out based operations.  Most classes in the package contain
+operations based on time-outs in addition to indefinite waits.  In all
+cases that time-outs are used, the time-out specifies the minimum time
+that the method should wait before indicating that it
+timed-out.  Implementations make a &quot;best effort&quot; to detect
+time-outs as soon as possible after they occur.  However, an indefinite
+amount of time may elapse between a time-out being detected and a
+thread actually executing again after that time-out.  All methods
+that accept timeout parameters treat values less than or equal to
+zero to mean not to wait at all.  To wait "forever", you can use
+a value of <tt>Long.MAX_VALUE</tt>.
+
+<h2>Synchronizers</h2>
+
+Four classes aid common special-purpose synchronization idioms.
+{@link edu.emory.mathcs.backport.java.util.concurrent.Semaphore} is a classic concurrency tool.
+{@link edu.emory.mathcs.backport.java.util.concurrent.CountDownLatch} is a very simple yet very
+common utility for blocking until a given number of signals, events,
+or conditions hold.  A {@link edu.emory.mathcs.backport.java.util.concurrent.CyclicBarrier} is a
+resettable multiway synchronization point useful in some styles of
+parallel programming. An {@link edu.emory.mathcs.backport.java.util.concurrent.Exchanger} allows
+two threads to exchange objects at a rendezvous point, and is useful
+in several pipeline designs.
+
+<h2>Concurrent Collections</h2>
+
+Besides Queues, this package supplies Collection implementations
+designed for use in multithreaded contexts:
+{@link edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap},
+{@link edu.emory.mathcs.backport.java.util.concurrent.ConcurrentSkipListMap},
+{@link edu.emory.mathcs.backport.java.util.concurrent.ConcurrentSkipListSet},
+{@link edu.emory.mathcs.backport.java.util.concurrent.CopyOnWriteArrayList}, and
+{@link edu.emory.mathcs.backport.java.util.concurrent.CopyOnWriteArraySet}.
+When many threads are expected to access a given collection,
+a <tt>ConcurrentHashMap</tt> is normally preferable to
+a synchronized <tt>HashMap</tt>, and a
+<tt>ConcurrentSkipListMap</tt> is normally preferable
+to a synchronized <tt>TreeMap</tt>. A
+<tt>CopyOnWriteArrayList</tt> is preferable to
+a synchronized <tt>ArrayList</tt> when the expected number of reads
+and traversals greatly outnumber the number of updates to a list.
+
+<p>The "Concurrent" prefix used with some classes in this package is a
+shorthand indicating several differences from similar "synchronized"
+classes. For example <tt>java.util.Hashtable</tt> and
+<tt>Collections.synchronizedMap(new HashMap())</tt> are
+synchronized. But {@link edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap} is
+"concurrent".  A concurrent collection is thread-safe, but not
+governed by a single exclusion lock. In the particular case of
+ConcurrentHashMap, it safely permits any number of concurrent reads as
+well as a tunable number of concurrent writes.  "Synchronized" classes
+can be useful when you need to prevent all access to a collection via
+a single lock, at the expense of poorer scalability. In other cases in
+which multiple threads are expected to access a common collection,
+"concurrent" versions are normally preferable. And unsynchronized
+collections are preferable when either collections are unshared, or
+are accessible only when holding other locks.
+
+<p> Most concurrent Collection implementations (including most Queues)
+also differ from the usual java.util conventions in that their Iterators
+provide <em>weakly consistent</em> rather than fast-fail traversal. A
+weakly consistent iterator is thread-safe, but does not necessarily
+freeze the collection while iterating, so it may (or may not) reflect
+any updates since the iterator was created.
+
+<a name="MemoryVisibility">
+<h2> Memory Consistency Properties </h2>
+
+<a href="http://java.sun.com/docs/books/jls/third_edition/html/memory.html">
+Chapter 17 of the Java Language Specification</a> defines the
+<i>happens-before</i> relation on memory operations such as reads and
+writes of shared variables.  The results of a write by one thread are
+guaranteed to be visible to a read by another thread only if the write
+operation <i>happens-before</i> the read operation.  The
+{@code synchronized} and {@code volatile} constructs, as well as the
+{@code Thread.start()} and {@code Thread.join()} methods, can form
+<i>happens-before</i> relationships. In particular:
+
+<ul>
+  <li>Each action in a thread <i>happens-before</i> every action in that
+  thread that comes later in the program's order.
+
+  <li>An unlock ({@code synchronized} block or method exit) of a
+  monitor <i>happens-before</i> every subsequent lock ({@code synchronized}
+  block or method entry) of that same monitor. And because
+  the <i>happens-before</i> relation is transitive, all actions
+  of a thread prior to unlocking <i>happen-before</i> all actions
+  subsequent to any thread locking that monitor.
+
+  <li>A write to a {@code volatile} field <i>happens-before</i> every
+  subsequent read of that same field. Writes and reads of
+  {@code volatile} fields have similar memory consistency effects
+  as entering and exiting monitors, but do <em>not</em> entail
+  mutual exclusion locking.
+
+  <li>A call to {@code start} on a thread <i>happens-before</i> any action in the
+  started thread.
+
+  <li>All actions in a thread <i>happen-before</i> any other thread
+  successfully returns from a {@code join} on that thread.
+
+</ul>
+
+
+The methods of all classes in {@code edu.emory.mathcs.backport.java.util.concurrent} and its
+subpackages extend these guarantees to higher-level
+synchronization. In particular:
+
+<ul>
+
+  <li>Actions in a thread prior to placing an object into any concurrent
+  collection <i>happen-before</i> actions subsequent to the access or
+  removal of that element from the collection in another thread.
+
+  <li>Actions in a thread prior to the submission of a {@code Runnable}
+  to an {@code Executor} <i>happen-before</i> its execution begins.
+  Similarly for {@code Callables} submitted to an {@code ExecutorService}.
+
+  <li>Actions taken by the asynchronous computation represented by a
+  {@code Future} <i>happen-before</i> actions subsequent to the
+  retrieval of the result via {@code Future.get()} in another thread.
+
+  <li>Actions prior to "releasing" synchronizer methods such as
+  {@code Lock.unlock}, {@code Semaphore.release}, and
+  {@code CountDownLatch.countDown} <i>happen-before</i> actions
+  subsequent to a successful "acquiring" method such as
+  {@code Lock.lock}, {@code Semaphore.acquire},
+  {@code Condition.await}, and {@code CountDownLatch.await} on the
+  same synchronizer object in another thread.
+
+  <li>For each pair of threads that successfully exchange objects via
+  an {@code Exchanger}, actions prior to the {@code exchange()}
+  in each thread <i>happen-before</i> those subsequent to the
+  corresponding {@code exchange()} in another thread.
+
+  <li>Actions prior to calling {@code CyclicBarrier.await}
+  <i>happen-before</i> actions performed by the barrier action, and
+  actions performed by the barrier action <i>happen-before</i> actions
+  subsequent to a successful return from the corresponding {@code await}
+  in other threads.
+
+</ul>
+
+ at since 1.5
+
+</body> </html>

Added: branches/backport-util-concurrent/upstream/2.2/src/sun/misc/Perf.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/src/sun/misc/Perf.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/src/sun/misc/Perf.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,28 @@
+package sun.misc;
+
+/**
+ * Compilation stub for pre-1.4.2 JREs. Thanks to it, the whole backport
+ * package compiles and works with 1.4.2 as well as wih earlier JREs, and takes
+ * advantage of native Perf class when running on 1.4.2 while seamlessly
+ * falling back to System.currentTimeMillis() on previous JREs. This class
+ * should NOT be included in the binary distribution of backport.
+ *
+ * @author Dawid Kurzyniec
+ * @version 1.0
+ */
+public final class Perf {
+
+    private static final Perf perf = new Perf();
+
+    public static Perf getPerf() { return perf; }
+
+    private Perf() {}
+
+    public long highResCounter() {
+        return System.currentTimeMillis();
+    }
+
+    public long highResFrequency() {
+        return 1000L;
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/stripgenerics.pl
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/stripgenerics.pl	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/stripgenerics.pl	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,43 @@
+#!/usr/bin/perl
+
+print $#ARGV;
+print "AAAA";
+
+if ($#ARGV < 1) { die "usage: stripgenerics.pl <infile> <outfile>"; }
+
+open(IF, $ARGV[0]);
+open(OF, ">" . $ARGV[1]);
+
+
+while ($line = <IF>) {
+
+    $line =~ s/ java\.util\./ edu.emory.mathcs.backport.java.util./g;
+
+    if ($line =~ m/^\s*\* \@param <[A-Za-z,.]+> /) {
+        next;
+    }
+   
+    # skip HTML tags
+    if ($line =~ m/^\s*\* /) {
+        print OF $line;
+        next;
+    }
+   
+    $line =~ s/ <[A-Za-z, ]+>//g;
+    $line =~ s/<[A-Za-z, ]+>//g;
+   
+    $line =~ s/<((\? super )?(\? extends )?[A-Za-z .]+,?)+>//g;
+    $line =~ s/<((\? super )?(\? extends )?[\?A-Za-z .]+,?)+>//g;
+
+    $line =~ s/ [A-Z] / Object /g;
+    $line =~ s/\([A-Z] /(Object /g;
+    $line =~ s/\([A-Z]\)//g;
+       
+    $line =~ s/ [A-Z]\[\]/ Object[]/g;
+    $line =~ s/\([A-Z]\[\]/(Object[]/g;
+    
+    print OF $line;
+}
+
+close(OF);
+close(IF);

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/CASLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/CASLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/CASLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,598 @@
+/*
+ * Written by Doug Lea and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+/*
+ * Estimates the difference in time for compareAndSet and CAS-like
+ * operations versus unsynchronized, non-volatile pseudo-CAS when
+ * updating random numbers. These estimates thus give the cost
+ * of atomicity/barriers/exclusion over and above the time to
+ * just compare and conditionally store (int) values, so are
+ * not intended to measure the "raw" cost of a CAS.
+ *
+ * Outputs, in nanoseconds:
+ *  "Atomic CAS"      AtomicInteger.compareAndSet
+ *  "Updater CAS"     CAS first comparing args
+ *  "Volatile"        pseudo-CAS using volatile store if comparison succeeds
+ *  "Mutex"           emulated compare and set done under AQS-based mutex lock
+ *  "Synchronized"    emulated compare and set done under a synchronized block.
+ *
+ * By default, these are printed for 1..#cpus threads, but you can
+ * change the upper bound number of threads by providing the
+ * first argument to this program.
+ *
+ * The last two kinds of runs (mutex and synchronized) are done only
+ * if this program is called with (any) second argument
+ */
+
+
+import edu.emory.mathcs.backport.java.util.concurrent.atomic.AtomicInteger;
+import edu.emory.mathcs.backport.java.util.concurrent.atomic.AtomicLong;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+
+public class CASLoops {
+
+    static final int TRIALS = 2;
+    static final long BASE_SECS_PER_RUN = 4;
+    static final int NCPUS = Runtime.getRuntime().availableProcessors();
+    static int maxThreads = NCPUS;
+
+    static boolean includeLocks = false;
+
+    public static void main(String[] args) throws Exception {
+        if (args.length > 0)
+            maxThreads = Integer.parseInt(args[0]);
+
+        if (args.length > 1)
+            includeLocks = true;
+
+        System.out.println("Warmup...");
+        for (int i = maxThreads; i > 0; --i) {
+            runCalibration(i, 10);
+            oneRun(i, loopIters[i] / 4, false);
+            System.out.print(".");
+        }
+
+        for (int i = 1; i <= maxThreads; ++i)
+            loopIters[i] = 0;
+
+        for (int j = 0; j < 2; ++j) {
+            for (int i = 1; i <= maxThreads; ++i) {
+                runCalibration(i, 1000);
+                oneRun(i, loopIters[i] / 8, false);
+                System.out.print(".");
+            }
+        }
+
+        for (int i = 1; i <= maxThreads; ++i)
+            loopIters[i] = 0;
+
+        for (int j = 0; j < TRIALS; ++j) {
+            System.out.println("Trial " + j);
+            for (int i = 1; i <= maxThreads; ++i) {
+                runCalibration(i, BASE_SECS_PER_RUN * 1000L);
+                oneRun(i, loopIters[i], true);
+            }
+        }
+    }
+
+    static final AtomicLong totalIters = new AtomicLong(0);
+    static final AtomicLong successes = new AtomicLong(0);
+    static final AtomicInteger sum = new AtomicInteger(0);
+
+    static final LoopHelpers.MarsagliaRandom rng = new LoopHelpers.MarsagliaRandom();
+
+    static final long[] loopIters = new long[maxThreads > 16 ? maxThreads+1 : 16+1];
+
+    static final class NonAtomicInteger {
+        volatile int readBarrier;
+        int value;
+
+        NonAtomicInteger() {}
+        int get() {
+            int junk = readBarrier;
+            return value;
+        }
+        boolean compareAndSet(int cmp, int val) {
+            if (value == cmp) {
+                value = val;
+                return true;
+            }
+            return false;
+        }
+        void set(int val) { value = val; }
+    }
+
+//    static final class UpdaterAtomicInteger {
+//        volatile int value;
+//
+//        static final AtomicIntegerFieldUpdater<UpdaterAtomicInteger>
+//                valueUpdater = AtomicIntegerFieldUpdater.newUpdater
+//                (UpdaterAtomicInteger.class, "value");
+//
+//
+//        UpdaterAtomicInteger() {}
+//        int get() {
+//            return value;
+//        }
+//        boolean compareAndSet(int cmp, int val) {
+//            return valueUpdater.compareAndSet(this, cmp, val);
+//        }
+//
+//        void set(int val) { value = val; }
+//    }
+//
+    static final class VolatileInteger {
+        volatile int value;
+
+        VolatileInteger() {}
+        int get() {
+            return value;
+        }
+        boolean compareAndSet(int cmp, int val) {
+            if (value == cmp) {
+                value = val;
+                return true;
+            }
+            return false;
+        }
+        void set(int val) { value = val; }
+    }
+
+    static final class SynchedInteger {
+        int value;
+
+        SynchedInteger() {}
+        int get() {
+            return value;
+        }
+        synchronized boolean compareAndSet(int cmp, int val) {
+            if (value == cmp) {
+                value = val;
+                return true;
+            }
+            return false;
+        }
+        synchronized void set(int val) { value = val; }
+    }
+
+
+    static final class LockedInteger extends ReentrantLock {
+        int value;
+        LockedInteger() {}
+
+        int get() {
+            return value;
+        }
+        boolean compareAndSet(int cmp, int val) {
+            lock();
+            try {
+                if (value == cmp) {
+                    value = val;
+                    return true;
+                }
+                return false;
+            } finally {
+                unlock();
+            }
+        }
+        void set(int val) {
+            lock();
+            try {
+                value = val;
+            } finally {
+                unlock();
+            }
+        }
+    }
+
+    // All these versions are copy-paste-hacked to avoid
+    // contamination with virtual call resolution etc.
+
+    // Use fixed-length unrollable inner loops to reduce safepoint checks
+    static final int innerPerOuter = 16;
+
+    static final class NonAtomicLoop implements Runnable {
+        final long iters;
+        final NonAtomicInteger obj;
+        final CyclicBarrier barrier;
+        NonAtomicLoop(long iters, NonAtomicInteger obj, CyclicBarrier b) {
+            this.iters = iters;
+            this.obj = obj;
+            this.barrier = b;
+            obj.set(rng.next());
+        }
+
+        public void run() {
+            try {
+                barrier.await();
+                long i = iters;
+                int y = 0;
+                int succ = 0;
+                while (i > 0) {
+                    for (int k = 0; k < innerPerOuter; ++k) {
+                        int x = obj.get();
+                        int z = y + LoopHelpers.compute6(x);
+                        if (obj.compareAndSet(x, z))
+                            ++succ;
+                        y = LoopHelpers.compute7(z);
+                    }
+                    i -= innerPerOuter;
+                }
+                sum.getAndAdd(obj.get());
+                successes.getAndAdd(succ);
+                barrier.await();
+            }
+            catch (Exception ie) {
+                return;
+            }
+        }
+    }
+
+    static final class AtomicLoop implements Runnable {
+        final long iters;
+        final AtomicInteger obj;
+        final CyclicBarrier barrier;
+        AtomicLoop(long iters, AtomicInteger obj, CyclicBarrier b) {
+            this.iters = iters;
+            this.obj = obj;
+            this.barrier = b;
+            obj.set(rng.next());
+        }
+
+        public void run() {
+            try {
+                barrier.await();
+                long i = iters;
+                int y = 0;
+                int succ = 0;
+                while (i > 0) {
+                    for (int k = 0; k < innerPerOuter; ++k) {
+                        int x = obj.get();
+                        int z = y + LoopHelpers.compute6(x);
+                        if (obj.compareAndSet(x, z))
+                            ++succ;
+                        y = LoopHelpers.compute7(z);
+                    }
+                    i -= innerPerOuter;
+                }
+                sum.getAndAdd(obj.get());
+                successes.getAndAdd(succ);
+                barrier.await();
+            }
+            catch (Exception ie) {
+                return;
+            }
+        }
+    }
+
+//    static final class UpdaterAtomicLoop implements Runnable {
+//        final long iters;
+//        final UpdaterAtomicInteger obj;
+//        final CyclicBarrier barrier;
+//        UpdaterAtomicLoop(long iters, UpdaterAtomicInteger obj, CyclicBarrier b) {
+//            this.iters = iters;
+//            this.obj = obj;
+//            this.barrier = b;
+//            obj.set(rng.next());
+//        }
+//
+//        public void run() {
+//            try {
+//                barrier.await();
+//                long i = iters;
+//                int y = 0;
+//                int succ = 0;
+//                while (i > 0) {
+//                    for (int k = 0; k < innerPerOuter; ++k) {
+//                        int x = obj.get();
+//                        int z = y + LoopHelpers.compute6(x);
+//                        if (obj.compareAndSet(x, z))
+//                            ++succ;
+//                        y = LoopHelpers.compute7(z);
+//                    }
+//                    i -= innerPerOuter;
+//                }
+//                sum.getAndAdd(obj.get());
+//                successes.getAndAdd(succ);
+//                barrier.await();
+//            }
+//            catch (Exception ie) {
+//                return;
+//            }
+//        }
+//    }
+
+    static final class VolatileLoop implements Runnable {
+        final long iters;
+        final VolatileInteger obj;
+        final CyclicBarrier barrier;
+        VolatileLoop(long iters, VolatileInteger obj, CyclicBarrier b) {
+            this.iters = iters;
+            this.obj = obj;
+            this.barrier = b;
+            obj.set(rng.next());
+        }
+
+        public void run() {
+            try {
+                barrier.await();
+                long i = iters;
+                int y = 0;
+                int succ = 0;
+                while (i > 0) {
+                    for (int k = 0; k < innerPerOuter; ++k) {
+                        int x = obj.get();
+                        int z = y + LoopHelpers.compute6(x);
+                        if (obj.compareAndSet(x, z))
+                            ++succ;
+                        y = LoopHelpers.compute7(z);
+                    }
+                    i -= innerPerOuter;
+                }
+                sum.getAndAdd(obj.get());
+                successes.getAndAdd(succ);
+                barrier.await();
+            }
+            catch (Exception ie) {
+                return;
+            }
+        }
+    }
+
+    static final class SynchedLoop implements Runnable {
+        final long iters;
+        final SynchedInteger obj;
+        final CyclicBarrier barrier;
+        SynchedLoop(long iters, SynchedInteger obj, CyclicBarrier b) {
+            this.iters = iters;
+            this.obj = obj;
+            this.barrier = b;
+            obj.set(rng.next());
+        }
+
+        public void run() {
+            try {
+                barrier.await();
+                long i = iters;
+                int y = 0;
+                int succ = 0;
+                while (i > 0) {
+                    for (int k = 0; k < innerPerOuter; ++k) {
+                        int x = obj.get();
+                        int z = y + LoopHelpers.compute6(x);
+                        if (obj.compareAndSet(x, z))
+                            ++succ;
+                        y = LoopHelpers.compute7(z);
+                    }
+                    i -= innerPerOuter;
+                }
+                sum.getAndAdd(obj.get());
+                successes.getAndAdd(succ);
+                barrier.await();
+            }
+            catch (Exception ie) {
+                return;
+            }
+        }
+    }
+
+    static final class LockedLoop implements Runnable {
+        final long iters;
+        final LockedInteger obj;
+        final CyclicBarrier barrier;
+        LockedLoop(long iters, LockedInteger obj, CyclicBarrier b) {
+            this.iters = iters;
+            this.obj = obj;
+            this.barrier = b;
+            obj.set(rng.next());
+        }
+
+        public void run() {
+            try {
+                barrier.await();
+                long i = iters;
+                int y = 0;
+                int succ = 0;
+                while (i > 0) {
+                    for (int k = 0; k < innerPerOuter; ++k) {
+                        int x = obj.get();
+                        int z = y + LoopHelpers.compute6(x);
+                        if (obj.compareAndSet(x, z))
+                            ++succ;
+                        y = LoopHelpers.compute7(z);
+                    }
+                    i -= innerPerOuter;
+                }
+                sum.getAndAdd(obj.get());
+                successes.getAndAdd(succ);
+                barrier.await();
+            }
+            catch (Exception ie) {
+                return;
+            }
+        }
+    }
+
+    static final int loopsPerTimeCheck = 2048;
+
+    static final class NACalibrationLoop implements Runnable {
+        final long endTime;
+        final NonAtomicInteger obj;
+        final CyclicBarrier barrier;
+        NACalibrationLoop(long endTime, NonAtomicInteger obj, CyclicBarrier b) {
+            this.endTime = endTime;
+            this.obj = obj;
+            this.barrier = b;
+            obj.set(rng.next());
+        }
+
+        public void run() {
+            try {
+                barrier.await();
+                long iters = 0;
+                int y = 0;
+                int succ = 0;
+                do {
+                    int i = loopsPerTimeCheck;
+                    while (i > 0) {
+                        for (int k = 0; k < innerPerOuter; ++k) {
+                            int x = obj.get();
+                            int z = y + LoopHelpers.compute6(x);
+                            if (obj.compareAndSet(x, z))
+                                ++succ;
+                            y = LoopHelpers.compute7(z);
+                        }
+                        i -= innerPerOuter;
+                    }
+                    iters += loopsPerTimeCheck;
+                } while (System.currentTimeMillis() < endTime);
+                totalIters.getAndAdd(iters);
+                sum.getAndAdd(obj.get());
+                successes.getAndAdd(succ);
+                barrier.await();
+            }
+            catch (Exception ie) {
+                return;
+            }
+        }
+    }
+
+    static void runCalibration(int n, long nms) throws Exception {
+        long now = System.currentTimeMillis();
+        long endTime = now + nms;
+        CyclicBarrier b = new CyclicBarrier(n+1);
+        totalIters.set(0);
+        NonAtomicInteger a = new NonAtomicInteger();
+        for (int j = 0; j < n; ++j)
+            new Thread(new NACalibrationLoop(endTime, a, b)).start();
+        b.await();
+        b.await();
+        long ipt = totalIters.get() / n;
+        if (ipt > loopIters[n])
+            loopIters[n] = ipt;
+        if (sum.get() == 0) System.out.print(" ");
+    }
+
+    static long runNonAtomic(int n, long iters) throws Exception {
+        LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
+        CyclicBarrier b = new CyclicBarrier(n+1, timer);
+        NonAtomicInteger a = new NonAtomicInteger();
+        for (int j = 0; j < n; ++j)
+            new Thread(new NonAtomicLoop(iters, a, b)).start();
+        b.await();
+        b.await();
+        if (sum.get() == 0) System.out.print(" ");
+        return timer.getTime();
+    }
+
+//    static long runUpdaterAtomic(int n, long iters) throws Exception {
+//        LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
+//        CyclicBarrier b = new CyclicBarrier(n+1, timer);
+//        UpdaterAtomicInteger a = new UpdaterAtomicInteger();
+//        for (int j = 0; j < n; ++j)
+//            new Thread(new UpdaterAtomicLoop(iters, a, b)).start();
+//        b.await();
+//        b.await();
+//        if (sum.get() == 0) System.out.print(" ");
+//        return timer.getTime();
+//    }
+//
+    static long runAtomic(int n, long iters) throws Exception {
+        LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
+        CyclicBarrier b = new CyclicBarrier(n+1, timer);
+        AtomicInteger a = new AtomicInteger();
+        for (int j = 0; j < n; ++j)
+            new Thread(new AtomicLoop(iters, a, b)).start();
+        b.await();
+        b.await();
+        if (sum.get() == 0) System.out.print(" ");
+        return timer.getTime();
+    }
+
+    static long runVolatile(int n, long iters) throws Exception {
+        LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
+        CyclicBarrier b = new CyclicBarrier(n+1, timer);
+        VolatileInteger a = new VolatileInteger();
+        for (int j = 0; j < n; ++j)
+            new Thread(new VolatileLoop(iters, a, b)).start();
+        b.await();
+        b.await();
+        if (sum.get() == 0) System.out.print(" ");
+        return timer.getTime();
+    }
+
+
+    static long runSynched(int n, long iters) throws Exception {
+        LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
+        CyclicBarrier b = new CyclicBarrier(n+1, timer);
+        SynchedInteger a = new SynchedInteger();
+        for (int j = 0; j < n; ++j)
+            new Thread(new SynchedLoop(iters, a, b)).start();
+        b.await();
+        b.await();
+        if (sum.get() == 0) System.out.print(" ");
+        return timer.getTime();
+    }
+
+    static long runLocked(int n, long iters) throws Exception {
+        LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
+        CyclicBarrier b = new CyclicBarrier(n+1, timer);
+        LockedInteger a = new LockedInteger();
+        for (int j = 0; j < n; ++j)
+            new Thread(new LockedLoop(iters, a, b)).start();
+        b.await();
+        b.await();
+        if (sum.get() == 0) System.out.print(" ");
+        return timer.getTime();
+    }
+
+    static void report(String tag, long runtime, long basetime,
+                       int nthreads, long iters) {
+        System.out.print(tag);
+        long t = (runtime - basetime) / iters;
+        if (nthreads > NCPUS)
+            t = t * NCPUS / nthreads;
+        System.out.print(LoopHelpers.rightJustify(t));
+        double secs = (double)(runtime) / 1000000000.0;
+        System.out.println("\t " + secs + "s run time");
+    }
+
+
+    static void oneRun(int i, long iters, boolean print) throws Exception {
+        if (print)
+            System.out.println("threads : " + i +
+                               " base iters per thread per run : " +
+                               LoopHelpers.rightJustify(loopIters[i]));
+        long ntime = runNonAtomic(i,  iters);
+        if (print)
+            report("Base        : ", ntime, ntime, i, iters);
+        Thread.sleep(100L);
+        long atime = runAtomic(i, iters);
+        if (print)
+            report("Atomic CAS  : ", atime, ntime, i, iters);
+        Thread.sleep(100L);
+//        long gtime = runUpdaterAtomic(i, iters);
+//        if (print)
+//            report("Updater CAS : ", gtime, ntime, i, iters);
+//        Thread.sleep(100L);
+        long vtime = runVolatile(i, iters);
+        if (print)
+            report("Volatile    : ", vtime, ntime, i, iters);
+
+        Thread.sleep(100L);
+        if (!includeLocks) return;
+        long mtime = runLocked(i, iters);
+        if (print)
+            report("Mutex       : ", mtime, ntime, i, iters);
+        Thread.sleep(100L);
+        long stime = runSynched(i, iters);
+        if (print)
+            report("Synchronized: ", stime, ntime, i, iters);
+        Thread.sleep(100L);
+    }
+
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/CachedThreadPoolLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/CachedThreadPoolLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/CachedThreadPoolLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,110 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain. Use, modify, and
+ * redistribute this code in any way without acknowledgement.
+ */
+
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.atomic.*;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.Utils;
+
+public class CachedThreadPoolLoops {
+    static final AtomicInteger remaining = new AtomicInteger();
+    static final int maxIters = 1000000;
+
+    public static void main(String[] args) throws Exception {
+        int maxThreads = 100;
+
+        if (args.length > 0)
+            maxThreads = Integer.parseInt(args[0]);
+
+        System.out.print("Warmup:");
+        for (int j = 0; j < 2; ++j) {
+            int k = 1;
+            for (int i = 1; i <= maxThreads;) {
+                System.out.print(" " + i);
+                oneTest(i, 10000, false);
+                Thread.sleep(100);
+                if (i == k) {
+                    k = i << 1;
+                    i = i + (i >>> 1);
+                }
+                else
+                    i = k;
+            }
+        }
+        System.out.println();
+
+        int k = 1;
+        for (int i = 1; i <= maxThreads;) {
+            System.out.println("Threads:" + i);
+            oneTest(i, maxIters, true);
+            Thread.sleep(100);
+            if (i == k) {
+                k = i << 1;
+                i = i + (i >>> 1);
+            }
+            else
+                i = k;
+        }
+   }
+
+    static void oneTest(int nThreads, int iters, boolean print) throws Exception {
+        if (print) System.out.print("SynchronousQueue        ");
+        oneRun(new SynchronousQueue(false), nThreads, iters, print);
+        if (print) System.out.print("SynchronousQueue(fair)  ");
+        oneRun(new SynchronousQueue(true), nThreads, iters, print);
+    }
+
+    static final class Task implements Runnable {
+        final ThreadPoolExecutor pool;
+        final CountDownLatch done;
+        Task(ThreadPoolExecutor p, CountDownLatch d) {
+            pool = p;
+            done = d;
+        }
+        public void run() {
+            done.countDown();
+            remaining.incrementAndGet();
+            int n;
+            while (!Thread.interrupted() &&
+                   (n = remaining.get()) > 0 &&
+                   done.getCount() > 0) {
+                if (remaining.compareAndSet(n, n-1)) {
+                    try {
+                        pool.execute(this);
+                    }
+                    catch (RuntimeException ex) {
+                        System.out.print("*");
+                        while (done.getCount() > 0) done.countDown();
+                        return;
+                    }
+                }
+            }
+        }
+    }
+
+    static void oneRun(BlockingQueue q, int nThreads, int iters, boolean print) throws Exception {
+
+        ThreadPoolExecutor pool =
+            new ThreadPoolExecutor(nThreads+1, Integer.MAX_VALUE,
+                                   1L, TimeUnit.SECONDS, q);
+
+        CountDownLatch done = new CountDownLatch(iters);
+        remaining.set(nThreads-1);
+        pool.prestartAllCoreThreads();
+        Task t = new Task(pool, done);
+        long start = Utils.nanoTime();
+        pool.execute(t);
+        done.await();
+        long time = Utils.nanoTime() - start;
+        if (print)
+            System.out.println("\t: " + LoopHelpers.rightJustify(time / iters) + " ns per task");
+        q.clear();
+        Thread.sleep(100);
+        pool.shutdown();
+        Thread.sleep(100);
+        pool.shutdownNow();
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/CancelledFutureLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/CancelledFutureLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/CancelledFutureLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,113 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+/*
+ * @test
+ * @summary Checks for responsiveness of futures to cancellation.
+ * Runs under
+ * the assumption that ITERS computations require more than TIMEOUT
+ * msecs to complete.
+ */
+
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain. Use, modify, and
+ * redistribute this code in any way without acknowledgement.
+ */
+
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.*;
+
+public final class CancelledFutureLoops {
+    static final ExecutorService pool = Executors.newCachedThreadPool();
+    static final LoopHelpers.SimpleRandom rng = new LoopHelpers.SimpleRandom();
+    static boolean print = false;
+    static final int ITERS = 10000000;
+    static final long TIMEOUT = 100;
+
+    public static void main(String[] args) throws Exception {
+        int maxThreads = 100;
+        if (args.length > 0)
+            maxThreads = Integer.parseInt(args[0]);
+
+        print = true;
+
+        for (int i = 2; i <= maxThreads; i += (i+1) >>> 1) {
+            System.out.print("Threads: " + i);
+            new FutureLoop(i).test();
+            Thread.sleep(TIMEOUT);
+        }
+        pool.shutdown();
+    }
+
+    static final class FutureLoop implements Callable {
+        private int v = rng.next();
+        private final ReentrantLock lock = new ReentrantLock();
+        private final LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
+        private final CyclicBarrier barrier;
+        private final int nthreads;
+        FutureLoop(int nthreads) {
+            this.nthreads = nthreads;
+            barrier = new CyclicBarrier(nthreads+1, timer);
+        }
+
+        final void test() throws Exception {
+            Future[] futures = new Future[nthreads];
+            for (int i = 0; i < nthreads; ++i)
+                futures[i] = pool.submit(this);
+
+            barrier.await();
+            Thread.sleep(TIMEOUT);
+            boolean tooLate = false;
+            for (int i = 1; i < nthreads; ++i) {
+                if (!futures[i].cancel(true))
+                    tooLate = true;
+                // Unbunch some of the cancels
+                if ( (i & 3) == 0)
+                    Thread.sleep(1 + rng.next() % 10);
+            }
+
+            Object f0 = futures[0].get();
+            if (!tooLate) {
+                for (int i = 1; i < nthreads; ++i) {
+                    if (!futures[i].isDone() || !futures[i].isCancelled())
+                        throw new Error("Only one thread should complete");
+                }
+            }
+            else
+                System.out.print("(cancelled too late) ");
+
+            long endTime = Utils.nanoTime();
+            long time = endTime - timer.startTime;
+            if (print) {
+                double secs = (double)(time) / 1000000000.0;
+                System.out.println("\t " + secs + "s run time");
+            }
+
+        }
+
+        public final Object call() throws Exception {
+            barrier.await();
+            int sum = v;
+            int x = 0;
+            int n = ITERS;
+            while (n-- > 0) {
+                lock.lockInterruptibly();
+                try {
+                    v = x = LoopHelpers.compute1(v);
+                }
+                finally {
+                    lock.unlock();
+                }
+                sum += LoopHelpers.compute2(LoopHelpers.compute2(x));
+            }
+            return new Integer(sum);
+        }
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/CancelledLockLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/CancelledLockLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/CancelledLockLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,136 @@
+/*
+ * @test
+ * @summary tests lockInterruptibly
+ * Checks for responsiveness of locks to interrupts. Runs under that
+ * assumption that ITERS_VALUE computations require more than TIMEOUT
+ * msecs to complete.
+ */
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain. Use, modify, and
+ * redistribute this code in any way without acknowledgement.
+ */
+
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Random;
+
+public final class CancelledLockLoops {
+    static final Random rng = new Random();
+    static boolean print = false;
+    static final int ITERS = 10000000;
+    static final long TIMEOUT = 100;
+
+    public static void main(String[] args) throws Exception {
+        int maxThreads = 100;
+        if (args.length > 0)
+            maxThreads = Integer.parseInt(args[0]);
+
+        print = true;
+
+        for (int i = 2; i <= maxThreads; i += (i+1) >>> 1) {
+            System.out.print("Threads: " + i);
+            try {
+                new ReentrantLockLoop(i).test();
+            }
+            catch(BrokenBarrierException bb) {
+                // OK, ignore
+            }
+        }
+    }
+
+    static final class ReentrantLockLoop implements Runnable {
+        private int v = rng.nextInt();
+        private int completed;
+        private volatile int result = 17;
+        private final ReentrantLock lock = new ReentrantLock();
+        private final LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
+        private final CyclicBarrier barrier;
+        private final int nthreads;
+        ReentrantLockLoop(int nthreads) {
+            this.nthreads = nthreads;
+            barrier = new CyclicBarrier(nthreads+1, timer);
+        }
+
+        final void test() throws Exception {
+            Thread[] threads = new Thread[nthreads];
+            for (int i = 0; i < threads.length; ++i)
+                threads[i] = new Thread(this);
+            for (int i = 0; i < threads.length; ++i)
+                threads[i].start();
+            Thread[] cancels = (Thread[]) (threads.clone());
+            Collections.shuffle(Arrays.asList(cancels), rng);
+            barrier.await();
+            Thread.sleep(TIMEOUT);
+            for (int i = 0; i < cancels.length-2; ++i) {
+                cancels[i].interrupt();
+                // make sure all OK even when cancellations spaced out
+                if ( (i & 3) == 0)
+                    Thread.sleep(1 + rng.nextInt(10));
+            }
+            barrier.await();
+            if (print) {
+                long time = timer.getTime();
+                double secs = (double)(time) / 1000000000.0;
+                System.out.println("\t " + secs + "s run time");
+            }
+
+            int c;
+            lock.lock();
+            try {
+                c = completed;
+            }
+            finally {
+                lock.unlock();
+            }
+            if (completed != 2)
+                throw new Error("Completed != 2");
+            int r = result;
+            if (r == 0) // avoid overoptimization
+                System.out.println("useless result: " + r);
+        }
+
+        public final void run() {
+            try {
+                barrier.await();
+                int sum = v;
+                int x = 0;
+                int n = ITERS;
+                boolean done = false;
+                do {
+                    try {
+                        lock.lockInterruptibly();
+                    }
+                    catch (InterruptedException ie) {
+                        break;
+                    }
+                    try {
+                        v = x = LoopHelpers.compute1(v);
+                    }
+                    finally {
+                        lock.unlock();
+                    }
+                    sum += LoopHelpers.compute2(x);
+                } while (n-- > 0);
+                if (n <= 0) {
+                    lock.lock();
+                    try {
+                        ++completed;
+                    }
+                    finally {
+                        lock.unlock();
+                    }
+                }
+                barrier.await();
+                result += sum;
+            }
+            catch (Exception ex) {
+                //                ex.printStackTrace();
+                return;
+            }
+        }
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/CancelledProducerConsumerLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/CancelledProducerConsumerLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/CancelledProducerConsumerLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,169 @@
+/*
+ * @test %I% %E%
+ * @bug 4486658
+ * @compile -source 1.5 CancelledProducerConsumerLoops.java
+ * @run main/timeout=7000 CancelledProducerConsumerLoops
+ * @summary Checks for responsiveness of blocking queues to cancellation.
+ * Runs under the assumption that ITERS computations require more than
+ * TIMEOUT msecs to complete.
+ */
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain. Use, modify, and
+ * redistribute this code in any way without acknowledgement.
+ */
+
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.Utils;
+
+public class CancelledProducerConsumerLoops {
+    static final int CAPACITY =      100;
+    static final long TIMEOUT = 100;
+
+    static final ExecutorService pool = Executors.newCachedThreadPool();
+    static boolean print = false;
+
+    public static void main(String[] args) throws Exception {
+        int maxPairs = 8;
+        int iters = 1000000;
+
+        if (args.length > 0)
+            maxPairs = Integer.parseInt(args[0]);
+
+        print = true;
+
+        for (int i = 1; i <= maxPairs; i += (i+1) >>> 1) {
+            System.out.println("Pairs:" + i);
+            try {
+                oneTest(i, iters);
+            }
+            catch(BrokenBarrierException bb) {
+                // OK, ignore
+            }
+            Thread.sleep(100);
+        }
+        pool.shutdown();
+   }
+
+    static void oneRun(BlockingQueue q, int npairs, int iters) throws Exception {
+        LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
+        CyclicBarrier barrier = new CyclicBarrier(npairs * 2 + 1, timer);
+        Future[] prods = new Future[npairs];
+        Future[] cons = new Future[npairs];
+
+        for (int i = 0; i < npairs; ++i) {
+            prods[i] = pool.submit(new Producer(q, barrier, iters));
+            cons[i] = pool.submit(new Consumer(q, barrier, iters));
+        }
+        barrier.await();
+        Thread.sleep(TIMEOUT);
+        boolean tooLate = false;
+
+        for (int i = 1; i < npairs; ++i) {
+            if (!prods[i].cancel(true))
+                tooLate = true;
+            if (!cons[i].cancel(true))
+                tooLate = true;
+        }
+
+        Object p0 = prods[0].get();
+        Object c0 = cons[0].get();
+
+        if (!tooLate) {
+            for (int i = 1; i < npairs; ++i) {
+                if (!prods[i].isDone() || !prods[i].isCancelled())
+                    throw new Error("Only one producer thread should complete");
+                if (!cons[i].isDone() || !cons[i].isCancelled())
+                    throw new Error("Only one consumer thread should complete");
+            }
+        }
+        else
+            System.out.print("(cancelled too late) ");
+
+        long endTime = Utils.nanoTime();
+        long time = endTime - timer.startTime;
+        if (print) {
+            double secs = (double)(time) / 1000000000.0;
+            System.out.println("\t " + secs + "s run time");
+        }
+    }
+
+    static void oneTest(int pairs, int iters) throws Exception {
+
+        if (print)
+            System.out.print("ArrayBlockingQueue      ");
+        oneRun(new ArrayBlockingQueue(CAPACITY), pairs, iters);
+
+        if (print)
+            System.out.print("LinkedBlockingQueue     ");
+        oneRun(new LinkedBlockingQueue(CAPACITY), pairs, iters);
+
+
+        if (print)
+            System.out.print("SynchronousQueue        ");
+        oneRun(new SynchronousQueue(), pairs, iters / 8);
+
+
+        if (print)
+            System.out.print("SynchronousQueue(fair)  ");
+        oneRun(new SynchronousQueue(true), pairs, iters / 8);
+
+        /* Can legitimately run out of memory before cancellation
+        if (print)
+            System.out.print("PriorityBlockingQueue   ");
+        oneRun(new PriorityBlockingQueue(ITERS / 2 * pairs), pairs, iters / 4);
+        */
+    }
+
+    static abstract class Stage implements Callable {
+        final BlockingQueue queue;
+        final CyclicBarrier barrier;
+        final int iters;
+        Stage (BlockingQueue q, CyclicBarrier b, int iters) {
+            queue = q;
+            barrier = b;
+            this.iters = iters;
+        }
+    }
+
+    static class Producer extends Stage {
+        Producer(BlockingQueue q, CyclicBarrier b, int iters) {
+            super(q, b, iters);
+        }
+
+        public Object call() throws Exception {
+            barrier.await();
+            int s = 0;
+            int l = 4321;
+            for (int i = 0; i < iters; ++i) {
+                l = LoopHelpers.compute1(l);
+                s += LoopHelpers.compute2(l);
+                if (!queue.offer(new Integer(l), 1, TimeUnit.SECONDS))
+                    break;
+            }
+            return new Integer(s);
+        }
+    }
+
+    static class Consumer extends Stage {
+        Consumer(BlockingQueue q, CyclicBarrier b, int iters) {
+            super(q, b, iters);
+        }
+
+        public Object call() throws Exception {
+            barrier.await();
+            int l = 0;
+            int s = 0;
+            for (int i = 0; i < iters; ++i) {
+                Integer x = (Integer)queue.poll(1, TimeUnit.SECONDS);
+                if (x == null)
+                    break;
+                l = LoopHelpers.compute1(x.intValue());
+                s += l;
+            }
+            return new Integer(s);
+        }
+    }
+
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/CheckedLockLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/CheckedLockLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/CheckedLockLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,436 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+/*
+ * @test
+ * @summary basic safety and liveness of ReentrantLocks, and other locks based on them
+ */
+
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import edu.emory.mathcs.backport.java.util.*;
+
+public final class CheckedLockLoops {
+    static final ExecutorService pool = Executors.newCachedThreadPool();
+    static final LoopHelpers.SimpleRandom rng = new LoopHelpers.SimpleRandom();
+    static boolean print = false;
+    static boolean doBuiltin = true;
+
+    public static void main(String[] args) throws Exception {
+        int maxThreads = 100;
+        int iters = 2000000;
+        if (args.length > 0)
+            maxThreads = Integer.parseInt(args[0]);
+        rng.setSeed(3122688L);
+        warmup(iters);
+        runTest(maxThreads, iters);
+        pool.shutdown();
+    }
+
+    static void runTest(int maxThreads, int iters) throws Exception {
+        print = true;
+        int k = 1;
+        for (int i = 1; i <= maxThreads;) {
+            System.out.println("Threads:" + i);
+            oneTest(i, iters / i);
+            if (i == k) {
+                k = i << 1;
+                i = i + (i >>> 1);
+            }
+            else
+                i = k;
+        }
+    }
+
+    static void warmup(int iters) throws Exception {
+        print = false;
+        System.out.println("Warmup...");
+        oneTest(1, iters);
+        oneTest(2, iters / 2);
+    }
+
+    static void oneTest(int nthreads, int iters) throws Exception {
+        int fairIters = (nthreads <= 1)? iters : iters/20;
+        int v = rng.next();
+
+        if (print)
+            System.out.print("NoLock (1 thread)     ");
+        new NoLockLoop().test(v, 1, iters * nthreads);
+        Thread.sleep(10);
+
+        if (print)
+            System.out.print("ReentrantLock         ");
+        new ReentrantLockLoop().test(v, nthreads, iters);
+        Thread.sleep(10);
+
+        if (print)
+            System.out.print("FairReentrantLock     ");
+        new FairReentrantLockLoop().test(v, nthreads, fairIters);
+        Thread.sleep(10);
+
+        if (doBuiltin) {
+            if (print)
+                System.out.print("builtin lock          ");
+            new BuiltinLockLoop().test(v, nthreads, fairIters);
+            Thread.sleep(10);
+        }
+
+//        if (print)
+//            System.out.print("Mutex                 ");
+//        new MutexLoop().test(v, nthreads, iters);
+//        Thread.sleep(10);
+//
+//        if (print)
+//            System.out.print("LongMutex             ");
+//        new LongMutexLoop().test(v, nthreads, iters);
+//        Thread.sleep(10);
+//
+        if (print)
+            System.out.print("Semaphore             ");
+        new SemaphoreLoop().test(v, nthreads, iters);
+        Thread.sleep(10);
+
+        if (print)
+            System.out.print("FairSemaphore         ");
+        new FairSemaphoreLoop().test(v, nthreads, fairIters);
+        Thread.sleep(10);
+
+        if (print)
+            System.out.print("ReentrantWriteLock    ");
+        new ReentrantWriteLockLoop().test(v, nthreads, iters);
+        Thread.sleep(10);
+
+//        if (print)
+//            System.out.print("FairRWriteLock         ");
+//        new FairReentrantWriteLockLoop().test(v, nthreads, fairIters);
+//        Thread.sleep(10);
+//
+        if (print)
+            System.out.print("ReentrantReadWriteLock");
+        new ReentrantReadWriteLockLoop().test(v, nthreads, iters);
+        Thread.sleep(10);
+
+//        if (print)
+//            System.out.print("FairRReadWriteLock     ");
+//        new FairReentrantReadWriteLockLoop().test(v, nthreads, fairIters);
+//        Thread.sleep(10);
+    }
+
+    static abstract class LockLoop implements Runnable {
+        int value;
+        int checkValue;
+        int iters;
+        volatile int result;
+        volatile int failures;
+        final LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
+        CyclicBarrier barrier;
+
+        final int setValue(int v) {
+            checkValue = v ^ 0x55555555;
+            value = v;
+            return v;
+        }
+
+        final int getValue() {
+            int v = value;
+            if (checkValue != ~(v ^ 0xAAAAAAAA))
+                ++failures;
+            return v;
+        }
+
+        final void test(int initialValue, int nthreads, int iters) throws Exception {
+            setValue(initialValue);
+            this.iters = iters;
+            barrier = new CyclicBarrier(nthreads+1, timer);
+            for (int i = 0; i < nthreads; ++i)
+                pool.execute(this);
+            barrier.await();
+            barrier.await();
+            long time = timer.getTime();
+            if (print) {
+                long tpi = time / (iters * nthreads);
+                System.out.print("\t" + LoopHelpers.rightJustify(tpi) + " ns per update");
+                System.out.println();
+            }
+
+            if (result == 0) // avoid overoptimization
+                System.out.println("useless result: " + result);
+            if (failures != 0)
+                throw new Error("lock protection failure");
+        }
+
+        abstract int loop(int n);
+        public final void run() {
+            try {
+                barrier.await();
+                result += loop(iters);
+                barrier.await();
+            }
+            catch (Exception ie) {
+                return;
+            }
+        }
+
+    }
+
+    private static class NoLockLoop extends LockLoop {
+        private volatile int readBarrier;
+        final int loop(int n) {
+            int sum = 0;
+            int x = 0;;
+            while (n-- > 0) {
+                int r1 = readBarrier;
+                x = setValue(LoopHelpers.compute1(getValue()));
+                int r2 = readBarrier;
+                if (r1 == r2 && x == r1)
+                    ++readBarrier;
+                sum += LoopHelpers.compute2(x);
+            }
+            return sum;
+        }
+    }
+
+    private static class BuiltinLockLoop extends LockLoop {
+        final int loop(int n) {
+            int sum = 0;
+            int x = 0;;
+            while (n-- > 0) {
+                synchronized(this) {
+                    x = setValue(LoopHelpers.compute1(getValue()));
+                }
+                sum += LoopHelpers.compute2(x);
+            }
+            return sum;
+        }
+    }
+
+    private static class ReentrantLockLoop extends LockLoop {
+        final private ReentrantLock lock = new ReentrantLock();
+        final int loop(int n) {
+            final ReentrantLock lock = this.lock;
+            int sum = 0;
+            int x = 0;
+            while (n-- > 0) {
+                lock.lock();
+                try {
+                    x = setValue(LoopHelpers.compute1(getValue()));
+                }
+                finally {
+                    lock.unlock();
+                }
+                sum += LoopHelpers.compute2(x);
+            }
+            return sum;
+        }
+    }
+
+//    private static class MutexLoop extends LockLoop {
+//        final private Mutex lock = new Mutex();
+//        final int loop(int n) {
+//            final Mutex lock = this.lock;
+//            int sum = 0;
+//            int x = 0;
+//            while (n-- > 0) {
+//                lock.lock();
+//                try {
+//                    x = setValue(LoopHelpers.compute1(getValue()));
+//                }
+//                finally {
+//                    lock.unlock();
+//                }
+//                sum += LoopHelpers.compute2(x);
+//            }
+//            return sum;
+//        }
+//    }
+//
+//    private static class LongMutexLoop extends LockLoop {
+//        final private LongMutex lock = new LongMutex();
+//        final int loop(int n) {
+//            final LongMutex lock = this.lock;
+//            int sum = 0;
+//            int x = 0;
+//            while (n-- > 0) {
+//                lock.lock();
+//                try {
+//                    x = setValue(LoopHelpers.compute1(getValue()));
+//                }
+//                finally {
+//                    lock.unlock();
+//                }
+//                sum += LoopHelpers.compute2(x);
+//            }
+//            return sum;
+//        }
+//    }
+//
+    private static class FairReentrantLockLoop extends LockLoop {
+        final private ReentrantLock lock = new ReentrantLock(true);
+        final int loop(int n) {
+            final ReentrantLock lock = this.lock;
+            int sum = 0;
+            int x = 0;
+            while (n-- > 0) {
+                lock.lock();
+                try {
+                    x = setValue(LoopHelpers.compute1(getValue()));
+                }
+                finally {
+                    lock.unlock();
+                }
+                sum += LoopHelpers.compute2(x);
+            }
+            return sum;
+        }
+    }
+
+    private static class ReentrantWriteLockLoop extends LockLoop {
+        final private Lock lock = new ReentrantReadWriteLock().writeLock();
+        final int loop(int n) {
+            final Lock lock = this.lock;
+            int sum = 0;
+            int x = 0;
+            while (n-- > 0) {
+                lock.lock();
+                try {
+                    x = setValue(LoopHelpers.compute1(getValue()));
+                }
+                finally {
+                    lock.unlock();
+                }
+                sum += LoopHelpers.compute2(x);
+            }
+            return sum;
+        }
+    }
+
+//    private static class FairReentrantWriteLockLoop extends LockLoop {
+//        final Lock lock = new ReentrantReadWriteLock(true).writeLock();
+//        final int loop(int n) {
+//            final Lock lock = this.lock;
+//            int sum = 0;
+//            int x = 0;
+//            while (n-- > 0) {
+//                lock.lock();
+//                try {
+//                    x = setValue(LoopHelpers.compute1(getValue()));
+//                }
+//                finally {
+//                    lock.unlock();
+//                }
+//                sum += LoopHelpers.compute2(x);
+//            }
+//            return sum;
+//        }
+//    }
+//
+    private static class SemaphoreLoop extends LockLoop {
+        final private Semaphore sem = new Semaphore(1, false);
+        final int loop(int n) {
+            final Semaphore sem = this.sem;
+            int sum = 0;
+            int x = 0;
+            while (n-- > 0) {
+                sem.acquireUninterruptibly();
+                try {
+                    x = setValue(LoopHelpers.compute1(getValue()));
+                }
+                finally {
+                    sem.release();
+                }
+                sum += LoopHelpers.compute2(x);
+            }
+            return sum;
+        }
+    }
+    private static class FairSemaphoreLoop extends LockLoop {
+        final private Semaphore sem = new Semaphore(1, true);
+        final int loop(int n) {
+            final Semaphore sem = this.sem;
+            int sum = 0;
+            int x = 0;
+            while (n-- > 0) {
+                sem.acquireUninterruptibly();
+                try {
+                    x = setValue(LoopHelpers.compute1(getValue()));
+                }
+                finally {
+                    sem.release();
+                }
+                sum += LoopHelpers.compute2(x);
+            }
+            return sum;
+        }
+    }
+
+    private static class ReentrantReadWriteLockLoop extends LockLoop {
+        final private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        final int loop(int n) {
+            final Lock rlock = lock.readLock();
+            final Lock wlock = lock.writeLock();
+            int sum = 0;
+            int x = 0;
+            while (n-- > 0) {
+                if ((n & 16) != 0) {
+                    rlock.lock();
+                    try {
+                        x = LoopHelpers.compute1(getValue());
+                        x = LoopHelpers.compute2(x);
+                    }
+                    finally {
+                        rlock.unlock();
+                    }
+                }
+                else {
+                    wlock.lock();
+                    try {
+                        setValue(x);
+                    }
+                    finally {
+                        wlock.unlock();
+                    }
+                    sum += LoopHelpers.compute2(x);
+                }
+            }
+            return sum;
+        }
+
+    }
+
+
+//    private static class FairReentrantReadWriteLockLoop extends LockLoop {
+//        final private ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);
+//        final int loop(int n) {
+//            final Lock rlock = lock.readLock();
+//            final Lock wlock = lock.writeLock();
+//            int sum = 0;
+//            int x = 0;
+//            while (n-- > 0) {
+//                if ((n & 16) != 0) {
+//                    rlock.lock();
+//                    try {
+//                        x = LoopHelpers.compute1(getValue());
+//                        x = LoopHelpers.compute2(x);
+//                    }
+//                    finally {
+//                        rlock.unlock();
+//                    }
+//                }
+//                else {
+//                    wlock.lock();
+//                    try {
+//                        setValue(x);
+//                    }
+//                    finally {
+//                        wlock.unlock();
+//                    }
+//                    sum += LoopHelpers.compute2(x);
+//                }
+//            }
+//            return sum;
+//        }
+//
+//    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/CollectionLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/CollectionLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/CollectionLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,197 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain. Use, modify, and
+ * redistribute this code in any way without acknowledgement.
+ */
+
+
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import java.util.Collection;
+import java.util.Random;
+
+public class CollectionLoops {
+    static int pinsert     = 100;
+    static int premove     = 1;
+    static int maxThreads  = 48;
+    static int removesPerMaxRandom;
+    static int insertsPerMaxRandom;
+    static volatile int checkSum = 0;
+    static boolean print = false;
+
+    static final ExecutorService pool = Executors.newCachedThreadPool();
+
+    public static void main(String[] args) throws Exception {
+        int nkeys       = 10000;
+        int nops        = 100000;
+
+        Class collectionClass = null;
+        if (args.length > 0) {
+            try {
+                collectionClass = Class.forName(args[0]);
+            } catch(ClassNotFoundException e) {
+                throw new RuntimeException("Class " + args[0] + " not found.");
+            }
+        }
+
+        if (args.length > 1)
+            maxThreads = Integer.parseInt(args[1]);
+
+        if (args.length > 2)
+            nkeys = Integer.parseInt(args[2]);
+
+        if (args.length > 3)
+            pinsert = Integer.parseInt(args[3]);
+
+        if (args.length > 4)
+            premove = Integer.parseInt(args[4]);
+
+        if (args.length > 5)
+            nops = Integer.parseInt(args[5]);
+
+        // normalize probabilities wrt random number generator
+        removesPerMaxRandom = (int)(((double)premove/100.0 * 0x7FFFFFFFL));
+        insertsPerMaxRandom = (int)(((double)pinsert/100.0 * 0x7FFFFFFFL));
+
+        System.out.print("Class: " + collectionClass.getName());
+        System.out.print(" threads: " + maxThreads);
+        System.out.print(" size: " + nkeys);
+        System.out.print(" ins: " + pinsert);
+        System.out.print(" rem: " + premove);
+        System.out.print(" ops: " + nops);
+        System.out.println();
+
+        // warmup
+        test(1, 100, 100, collectionClass);
+        test(2, 100, 100, collectionClass);
+        test(4, 100, 100, collectionClass);
+        print = true;
+
+        int k = 1;
+        int warmups = 2;
+        for (int i = 1; i <= maxThreads;) {
+            Thread.sleep(100);
+            test(i, nkeys, nops, collectionClass);
+            if (warmups > 0)
+                --warmups;
+            else if (i == k) {
+                k = i << 1;
+                i = i + (i >>> 1);
+            }
+            else if (i == 1 && k == 2) {
+                i = k;
+                warmups = 1;
+            }
+            else
+                i = k;
+        }
+        pool.shutdown();
+    }
+
+    static Integer[] makeKeys(int n) {
+        LoopHelpers.SimpleRandom rng = new LoopHelpers.SimpleRandom();
+        Integer[] key = new Integer[n];
+        for (int i = 0; i < key.length; ++i)
+            key[i] = new Integer(rng.next());
+        return key;
+    }
+
+    static void shuffleKeys(Integer[] key) {
+        Random rng = new Random();
+        for (int i = key.length; i > 1; --i) {
+            int j = rng.nextInt(i);
+            Integer tmp = key[j];
+            key[j] = key[i-1];
+            key[i-1] = tmp;
+        }
+    }
+
+    static void test(int i, int nk, int nops, Class collectionClass) throws Exception {
+        if (print)
+            System.out.print("Threads: " + i + "\t:");
+        Collection collection = (Collection)collectionClass.newInstance();
+        Integer[] key = makeKeys(nk);
+        // Uncomment to start with a non-empty table
+        for (int j = 0; j < nk; j += 2)
+            collection.add(key[j]);
+        shuffleKeys(key);
+        LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
+        CyclicBarrier barrier = new CyclicBarrier(i+1, timer);
+        for (int t = 0; t < i; ++t)
+            pool.execute(new Runner(t, collection, key, barrier, nops));
+        barrier.await();
+        barrier.await();
+        long time = timer.getTime();
+        long tpo = time / (i * (long)nops);
+        if (print)
+            System.out.print(LoopHelpers.rightJustify(tpo) + " ns per op");
+        double secs = (double)(time) / 1000000000.0;
+        if (print)
+            System.out.print("\t " + secs + "s run time");
+        if (checkSum == 0) System.out.print(" ");
+        if (print)
+            System.out.println();
+        collection.clear();
+    }
+
+    static class Runner implements Runnable {
+        final Collection collection;
+        final Integer[] key;
+        final LoopHelpers.SimpleRandom rng;
+        final CyclicBarrier barrier;
+        int position;
+        int total;
+        int nops;
+
+        Runner(int id, Collection collection, Integer[] key,  CyclicBarrier barrier, int nops) {
+            this.collection = collection;
+            this.key = key;
+            this.barrier = barrier;
+            this.nops = nops;
+            position = key.length / (id + 1);
+            rng = new LoopHelpers.SimpleRandom((id + 1) * 8862213513L);
+            rng.next();
+        }
+
+        public void run() {
+            try {
+                barrier.await();
+                int p = position;
+                int ops = nops;
+                Collection c = collection;
+                while (ops > 0) {
+                    int r = rng.next();
+                    p += (r & 7) - 3;
+                    while (p >= key.length) p -= key.length;
+                    while (p < 0) p += key.length;
+
+                    Integer k = key[p];
+                    if (c.contains(k)) {
+                        if (r < removesPerMaxRandom) {
+                            if (c.remove(k)) {
+                                p = Math.abs(total % key.length);
+                                ops -= 2;
+                                continue;
+                            }
+                        }
+                    }
+                    else if (r < insertsPerMaxRandom) {
+                        ++p;
+                        ops -= 2;
+                        c.add(k);
+                        continue;
+                    }
+
+                    total += LoopHelpers.compute6(k.intValue());
+                    --ops;
+                }
+                checkSum += total;
+                barrier.await();
+            }
+            catch (Exception ex) {
+                throw new RuntimeException(ex);
+            }
+        }
+    }
+}
+

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/CollectionWordLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/CollectionWordLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/CollectionWordLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,188 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+import java.io.*;
+import java.util.Collection;
+
+public class CollectionWordLoops {
+
+    static final String[] WORDS_FILES = {
+        "kw.txt",
+        "class.txt",
+    };
+
+    static final int MAX_WORDS = 500000;
+    static final int pinsert   = 80;
+    static final int premove   = 2;
+    static final int NOPS      = 100000;
+    static final int numTests  = 2;
+
+    public static void main(String[] args) {
+        Class collectionClass = null;
+        try {
+            collectionClass = Class.forName(args[0]);
+        } catch(ClassNotFoundException e) {
+            throw new RuntimeException("Class " + args[0] + " not found.");
+        }
+
+        System.out.println("Testing " + collectionClass.getName());
+
+        for (int s = 0; s < WORDS_FILES.length; ++s)
+            tests(collectionClass, numTests, s);
+
+        for (int s = WORDS_FILES.length-1; s >= 0; --s)
+            tests(collectionClass, numTests, s);
+
+    }
+
+    static void tests(Class collectionClass, int numTests, int sizeIndex) {
+        try {
+            String[] key = readWords(sizeIndex);
+            int size = key.length;
+
+            System.out.print("n = " +LoopHelpers.rightJustify(size) +" : ");
+            long least = Long.MAX_VALUE;
+
+            for (int i = 0; i < numTests; ++i) {
+                Collection m = newCollection(collectionClass);
+                long t = doTest(collectionClass.getName(), m, key);
+                if (t < least) least = t;
+                m.clear();
+                m = null;
+            }
+
+            long nano = Math.round(1000000.0 * (least) / NOPS);
+            System.out.println(LoopHelpers.rightJustify(nano) + " ns per op");
+        } catch (IOException ignore) {
+            return; // skip test if can't read file
+        }
+    }
+
+
+    static Collection newCollection(Class cl) {
+        try {
+            Collection m = (Collection)cl.newInstance();
+            return m;
+        } catch(Exception e) {
+            throw new RuntimeException("Can't instantiate " + cl + ": " + e);
+        }
+    }
+
+    static void pause() {
+        try { Thread.sleep(100); } catch(InterruptedException ie) { return; }
+    }
+
+    static String[] readWords(int sizeIndex) throws IOException {
+        String[] l = new String[MAX_WORDS];
+        String[] array = null;
+        try {
+            FileReader fr = new FileReader(WORDS_FILES[sizeIndex]);
+            BufferedReader reader = new BufferedReader(fr);
+            int k = 0;
+            for (;;) {
+                String s = reader.readLine();
+                if (s == null) break;
+                l[k++] = s;
+            }
+            array = new String[k];
+            for (int i = 0; i < k; ++i) {
+                array[i] = l[i];
+                l[i] = null;
+            }
+            l = null;
+            reader.close();
+        }
+        catch (IOException ex) {
+            System.out.println("Can't read words file:" + ex);
+            throw ex;
+        }
+        return array;
+    }
+
+    static long doTest(String name,
+                       final Collection m,
+                       final String[] key) {
+
+        //    System.out.print(name + "\t");
+        Runner runner = new Runner(m, key);
+        long startTime = System.currentTimeMillis();
+        runner.run();
+        long afterRun = System.currentTimeMillis();
+        long runTime =  (afterRun - startTime);
+        int np = runner.total;
+        if (runner.total == runner.hashCode())
+            System.out.println("Useless Number" + runner.total);
+        int sz = runner.maxsz;
+        if (sz == runner.hashCode())
+            System.out.println("Useless Number" + sz);
+        //        System.out.print(" m = " + sz);
+        return runTime;
+    }
+
+
+    static class Runner implements Runnable {
+        final Collection collection;
+        final String[] key;
+        LoopHelpers.SimpleRandom rng = new LoopHelpers.SimpleRandom();
+        final int pctrem;
+        final int pctins;
+        int nputs = 0;
+        int npgets = 0;
+        int nagets = 0;
+        int nremoves = 0;
+        volatile int total;
+        int maxsz;
+
+        Runner(Collection m, String[] k) {
+            collection = m; key = k;
+            pctrem = (int)(((long)premove * (long)(Integer.MAX_VALUE/2)) / 50);
+            pctins = (int)(((long)pinsert * (long)(Integer.MAX_VALUE/2)) / 50);
+        }
+
+
+        int oneStep(int j) {
+            int n = key.length;
+            int r = rng.next() & 0x7FFFFFFF;
+            int jinc = (r & 7);
+            j += jinc - 3;
+            if (j >= n) j -= n;
+            if (j < 0) j += n;
+
+            int l = n / 4 + j;
+            if (l >= n) l -= n;
+
+            String k = key[j];
+
+            if (!collection.contains(k)) {
+                ++nagets;
+                if (r < pctins) {
+                    collection.add(k);
+                    ++nputs;
+                    int csz = nputs - nremoves;
+                    if (csz > maxsz) maxsz = csz;
+                }
+            }
+            else {
+                ++npgets;
+                if (r < pctrem) {
+                    collection.remove(k);
+                    ++nremoves;
+                    j += ((r >>> 8) & 7) +  n / 2;
+                    if (j >= n) j -= n;
+                }
+            }
+            return j;
+        }
+
+        public void run() {
+            int j = key.length / 2;
+            for (int i = 0; i < NOPS; ++i) {
+                j = oneStep(j);
+            }
+            total = nputs + npgets + nagets + nremoves;
+        }
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/ConcurrentDequeLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/ConcurrentDequeLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/ConcurrentDequeLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,154 @@
+/*
+ * @test %I% %E%
+ * @bug 4486658
+ * @compile -source 1.5 ConcurrentDequeLoops.java
+ * @run main/timeout=230 ConcurrentDequeLoops
+ * @summary Checks that a set of threads can repeatedly get and modify items
+ */
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain. Use, modify, and
+ * redistribute this code in any way without acknowledgement.
+ */
+
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.atomic.*;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.*;
+import java.util.ArrayList;
+
+public class ConcurrentDequeLoops {
+    static final ExecutorService pool = Executors.newCachedThreadPool();
+    static AtomicInteger totalItems;
+    static boolean print = false;
+
+    public static void main(String[] args) throws Exception {
+        int maxStages = 8;
+        int items = 1000000;
+
+        Class klass = null;
+        if (args.length > 0) {
+            try {
+                klass = Class.forName(args[0]);
+            } catch(ClassNotFoundException e) {
+                throw new RuntimeException("Class " + args[0] + " not found.");
+            }
+        }
+        else
+            throw new Error();
+
+        if (args.length > 1)
+            maxStages = Integer.parseInt(args[1]);
+
+        System.out.print("Class: " + klass.getName());
+        System.out.println(" stages: " + maxStages);
+
+        print = false;
+        System.out.println("Warmup...");
+        oneRun(klass, 1, items);
+        Thread.sleep(100);
+        oneRun(klass, 1, items);
+        Thread.sleep(100);
+        print = true;
+
+        int k = 1;
+        for (int i = 1; i <= maxStages;) {
+            oneRun(klass, i, items);
+            if (i == k) {
+                k = i << 1;
+                i = i + (i >>> 1);
+            }
+            else
+                i = k;
+        }
+        pool.shutdown();
+   }
+
+    static class Stage implements Callable {
+        final Deque queue;
+        final CyclicBarrier barrier;
+        final LoopHelpers.SimpleRandom rng = new LoopHelpers.SimpleRandom();
+        int items;
+        Stage (Deque q, CyclicBarrier b, int items) {
+            queue = q;
+            barrier = b;
+            this.items = items;
+        }
+
+        public Object call() {
+            // Repeatedly take something from queue if possible,
+            // transform it, and put back in.
+            try {
+                barrier.await();
+                int l = (int)Utils.nanoTime();
+                int takes = 0;
+                for (;;) {
+                    Integer item;
+                    int rnd = rng.next();
+                    if ((rnd & 1) == 0)
+                        item = (Integer)queue.pollFirst();
+                    else
+                        item = (Integer)queue.pollLast();
+                    if (item != null) {
+                        ++takes;
+                        l += LoopHelpers.compute2(item.intValue());
+                    }
+                    else if (takes != 0) {
+                        totalItems.getAndAdd(-takes);
+                        takes = 0;
+                    }
+                    else if (totalItems.get() <= 0)
+                        break;
+                    l = LoopHelpers.compute1(l);
+                    if (items > 0) {
+                        --items;
+                        Integer res = new Integer(l);
+                        if ((rnd & 16) == 0)
+                            queue.addFirst(res);
+                        else
+                            queue.addLast(res);
+                    }
+                    else { // spinwait
+                        for (int k = 1 + (l & 15); k != 0; --k)
+                            l = LoopHelpers.compute1(LoopHelpers.compute2(l));
+                        if ((l & 3) == 3) {
+                            Thread.sleep(1);
+                        }
+                    }
+                }
+                return new Integer(l);
+            }
+            catch (Exception ie) {
+                ie.printStackTrace();
+                throw new Error("Call loop failed");
+            }
+        }
+    }
+
+    static void oneRun(Class klass, int n, int items) throws Exception {
+        Deque q = (Deque)klass.newInstance();
+        LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
+        CyclicBarrier barrier = new CyclicBarrier(n + 1, timer);
+        totalItems = new AtomicInteger(n * items);
+        ArrayList results = new ArrayList(n);
+        for (int i = 0; i < n; ++i)
+            results.add(pool.submit(new Stage(q, barrier, items)));
+
+        if (print)
+            System.out.print("Threads: " + n + "\t:");
+        barrier.await();
+        int total = 0;
+        for (int i = 0; i < n; ++i) {
+            Future f = (Future)results.get(i);
+            Integer r = (Integer)f.get();
+            total += r.intValue();
+        }
+        long endTime = Utils.nanoTime();
+        long time = endTime - timer.startTime;
+        if (print)
+            System.out.println(LoopHelpers.rightJustify(time / (items * n)) + " ns per item");
+        if (total == 0) // avoid overoptimization
+            System.out.println("useless result: " + total);
+
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/ConcurrentHashSet.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/ConcurrentHashSet.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/ConcurrentHashSet.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,67 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+// A set wrapper over CHM for testing
+
+import java.util.AbstractSet;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Set;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import java.io.*;
+
+public class ConcurrentHashSet extends AbstractSet
+    implements Set, Serializable {
+
+    private final ConcurrentHashMap m;  // The backing map
+    private transient Set keySet;  // Its keySet
+
+    public ConcurrentHashSet() {
+        m = new ConcurrentHashMap();
+        keySet = m.keySet();
+    }
+    public ConcurrentHashSet(int initialCapacity) {
+        m = new ConcurrentHashMap(initialCapacity);
+        keySet = m.keySet();
+    }
+    public ConcurrentHashSet(int initialCapacity, float loadFactor,
+                             int concurrencyLevel) {
+        m = new ConcurrentHashMap(initialCapacity, loadFactor,
+                                              concurrencyLevel);
+        keySet = m.keySet();
+    }
+
+    public int size()                   { return m.size(); }
+    public boolean isEmpty()            { return m.isEmpty(); }
+    public boolean contains(Object o)   { return m.containsKey(o); }
+    public Iterator iterator()          { return keySet.iterator(); }
+    public Object[] toArray()           { return keySet.toArray(); }
+    public Object[] toArray(Object[] a) { return keySet.toArray(a); }
+    public boolean add(Object e) {
+        return m.put(e, Boolean.TRUE) == null;
+    }
+    public boolean remove(Object o)   { return m.remove(o) != null; }
+
+    public boolean removeAll(Collection c) {
+        return keySet.removeAll(c);
+    }
+    public boolean retainAll(Collection c) {
+        return keySet.retainAll(c);
+    }
+    public void clear()               { m.clear(); }
+    public boolean equals(Object o)   { return keySet.equals(o); }
+    public int hashCode()             { return keySet.hashCode(); }
+
+    private static final long serialVersionUID = 2454657854757543876L;
+
+    private void readObject(java.io.ObjectInputStream s)
+        throws IOException, ClassNotFoundException
+    {
+        s.defaultReadObject();
+        keySet = m.keySet();
+    }
+}
+

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/ConcurrentQueueLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/ConcurrentQueueLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/ConcurrentQueueLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,157 @@
+/*
+ * @test %I% %E%
+ * @bug 4486658
+ * @compile -source 1.5 ConcurrentQueueLoops.java
+ * @run main/timeout=230 ConcurrentQueueLoops
+ * @summary Checks that a set of threads can repeatedly get and modify items
+ */
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain. Use, modify, and
+ * redistribute this code in any way without acknowledgement.
+ */
+
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import edu.emory.mathcs.backport.java.util.concurrent.atomic.*;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.Utils;
+import edu.emory.mathcs.backport.java.util.Queue;
+import java.util.ArrayList;
+
+public class ConcurrentQueueLoops {
+    static final ExecutorService pool = Executors.newCachedThreadPool();
+    static boolean print = false;
+    static final Integer zero = new Integer(0);
+    static final Integer one = new Integer(1);
+    static int workMask;
+    static final long RUN_TIME_NANOS = 5 * 1000L * 1000L * 1000L;
+    static final int BATCH_SIZE = 8;
+
+    public static void main(String[] args) throws Exception {
+        int maxStages = 100;
+        int work = 1024;
+        Class klass = null;
+        if (args.length > 0) {
+            try {
+                klass = Class.forName(args[0]);
+            } catch(ClassNotFoundException e) {
+                throw new RuntimeException("Class " + args[0] + " not found.");
+            }
+        }
+
+        if (args.length > 1)
+            maxStages = Integer.parseInt(args[1]);
+
+        if (args.length > 2)
+            work = Integer.parseInt(args[2]);
+
+        workMask = work - 1;
+        System.out.print("Class: " + klass.getName());
+        System.out.print(" stages: " + maxStages);
+        System.out.println(" work: " + work);
+
+        print = false;
+        System.out.println("Warmup...");
+        //        oneRun(klass, 4);
+        //
+        Thread.sleep(100);
+        oneRun(klass, 1);
+        Thread.sleep(100);
+        print = true;
+
+        int k = 1;
+        for (int i = 1; i <= maxStages;) {
+            oneRun(klass, i);
+            if (i == k) {
+                k = i << 1;
+                i = i + (i >>> 1);
+            }
+            else
+                i = k;
+        }
+        pool.shutdown();
+   }
+
+    static final class Stage implements Callable {
+        final Queue queue;
+        final CyclicBarrier barrier;
+        final int nthreads;
+        Stage (Queue q, CyclicBarrier b, int nthreads) {
+            queue = q;
+            barrier = b;
+            this.nthreads = nthreads;
+        }
+
+        static int compute(int l) {
+            if (l == 0)
+                return (int)Utils.nanoTime();
+            int nn =  (l >>> 7) & workMask;
+            while (nn-- > 0)
+                l = LoopHelpers.compute6(l);
+            return l;
+        }
+
+        public Object call() {
+            try {
+                barrier.await();
+                long now = Utils.nanoTime();
+                long stopTime = now + RUN_TIME_NANOS;
+                int l = (int)now;
+                int takes = 0;
+                int misses = 0;
+                int lmask = 1;
+                for (;;) {
+                    l = compute(l);
+                    Integer item = (Integer)queue.poll();
+                    if (item != null) {
+                        ++takes;
+                        if (item == one)
+                            l = LoopHelpers.compute6(l);
+                    } else if ((misses++ & 255) == 0 &&
+                               Utils.nanoTime() >= stopTime) {
+                        return new Integer(takes);
+                    } else {
+                        for (int i = 0; i < BATCH_SIZE; ++i) {
+                            queue.offer(((l & lmask)== 0)? zero : one);
+                            if ((lmask <<= 1) == 0) lmask = 1;
+                            if (i != 0) l = compute(l);
+                        }
+                    }
+                }
+            }
+            catch (Exception ie) {
+                ie.printStackTrace();
+                throw new Error("Call loop failed");
+            }
+        }
+    }
+
+    static void oneRun(Class klass, int n) throws Exception {
+        Queue q = (Queue)klass.newInstance();
+        LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
+        CyclicBarrier barrier = new CyclicBarrier(n + 1, timer);
+        ArrayList results = new ArrayList(n);
+        for (int i = 0; i < n; ++i)
+            results.add(pool.submit(new Stage(q, barrier, n)));
+
+        if (print)
+            System.out.print("Threads: " + n + "\t:");
+        barrier.await();
+        int total = 0;
+        for (int i = 0; i < n; ++i) {
+            Future f = (Future)results.get(i);
+            Integer r = (Integer)f.get();
+            total += r.intValue();
+        }
+        long endTime = Utils.nanoTime();
+        long time = endTime - timer.startTime;
+        long ips = 1000000000L * total / time;
+
+        if (print)
+            System.out.print(LoopHelpers.rightJustify(ips) + " items per sec");
+        if (print)
+            System.out.println();
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/ContextSwitchTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/ContextSwitchTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/ContextSwitchTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,64 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import edu.emory.mathcs.backport.java.util.concurrent.atomic.*;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.Utils;
+
+public final class ContextSwitchTest {
+//    final static int iters = 1000000;
+//    static AtomicReference turn = new AtomicReference();
+//    public static void main(String[] args) throws Exception {
+//        test();
+//        test();
+//        test();
+//    }
+//
+//    static void test() throws Exception {
+//        MyThread a = new MyThread();
+//        MyThread b = new MyThread();
+//        a.other = b;
+//        b.other = a;
+//        turn.set(a);
+//        long startTime = Utils.nanoTime();
+//        a.start();
+//        b.start();
+//        a.join();
+//        b.join();
+//        long endTime = Utils.nanoTime();
+//        int np = a.nparks + b.nparks;
+//        System.out.println("Average time: " +
+//                           ((endTime - startTime) / np) +
+//                           "ns");
+//    }
+//
+//    static final class MyThread extends Thread {
+//        volatile Thread other;
+//        volatile int nparks;
+//
+//        public void run() {
+//            final AtomicReference t = turn;
+//            final Thread other = this.other;
+//            if (turn == null || other == null)
+//                throw new NullPointerException();
+//            int p = 0;
+//            for (int i = 0; i < iters; ++i) {
+//                while (!t.compareAndSet(other, this)) {
+//                    LockSupport.park();
+//                    ++p;
+//                }
+//                LockSupport.unpark(other);
+//            }
+//            LockSupport.unpark(other);
+//            nparks = p;
+//            System.out.println("parks: " + p);
+//
+//        }
+//    }
+}
+
+

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/CountedMapLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/CountedMapLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/CountedMapLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,192 @@
+/*
+ * @test
+ * @synopsis Exercise multithreaded maps, byt default ConcurrentHashMap
+ * Multithreaded hash table test.  Each thread does a random walk
+ * though elements of "key" array. On each iteration, it checks if
+ * table includes key.  If absent, with probablility pinsert it
+ * inserts it, and if present, with probablility premove it removes
+ * it.  (pinsert and premove are expressed as percentages to simplify
+ * parsing from command line.)
+ */
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain. Use, modify, and
+ * redistribute this code in any way without acknowledgement.
+ */
+
+
+import java.util.Map;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.atomic.*;
+
+public class CountedMapLoops {
+    static int nkeys       = 100000;
+    static int pinsert     = 60;
+    static int premove     = 2;
+    static int maxThreads  = 100;
+    static int nops        = 2000000;
+    static int removesPerMaxRandom;
+    static int insertsPerMaxRandom;
+
+    static final ExecutorService pool = Executors.newCachedThreadPool();
+
+    public static void main(String[] args) throws Exception {
+
+        Class mapClass = null;
+        if (args.length > 0) {
+            try {
+                mapClass = Class.forName(args[0]);
+            } catch(ClassNotFoundException e) {
+                throw new RuntimeException("Class " + args[0] + " not found.");
+            }
+        }
+        else
+            mapClass = edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap.class;
+
+        if (args.length > 1)
+            maxThreads = Integer.parseInt(args[1]);
+
+        if (args.length > 2)
+            nkeys = Integer.parseInt(args[2]);
+
+        if (args.length > 3)
+            pinsert = Integer.parseInt(args[3]);
+
+        if (args.length > 4)
+            premove = Integer.parseInt(args[4]);
+
+        if (args.length > 5)
+            nops = Integer.parseInt(args[5]);
+
+        // normalize probabilities wrt random number generator
+        removesPerMaxRandom = (int)(((double)premove/100.0 * 0x7FFFFFFFL));
+        insertsPerMaxRandom = (int)(((double)pinsert/100.0 * 0x7FFFFFFFL));
+
+        System.out.print("Class: " + mapClass.getName());
+        System.out.print(" threads: " + maxThreads);
+        System.out.print(" size: " + nkeys);
+        System.out.print(" ins: " + pinsert);
+        System.out.print(" rem: " + premove);
+        System.out.print(" ops: " + nops);
+        System.out.println();
+
+        final LoopHelpers.SimpleRandom rng = new LoopHelpers.SimpleRandom();
+        Integer[] key = new Integer[nkeys];
+        for (int i = 0; i < key.length; ++i)
+            key[i] = new Integer(rng.next());
+
+        AtomicInteger counter;
+        // warmup
+        System.out.println("Warmup...");
+        for (int k = 0; k < 2; ++k) {
+            Map map = (Map)mapClass.newInstance();
+            counter = new AtomicInteger(0);
+            LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
+            CyclicBarrier barrier = new CyclicBarrier(1, timer);
+            new Runner(map, key, barrier, counter).run();
+            int size = map.size();
+            if (size != counter.get()) throw new Error();
+            map.clear();
+            map = null;
+            Thread.sleep(100);
+        }
+        System.gc();
+
+        int k = 1;
+        for (int i = 1; i <= maxThreads;) {
+            System.out.print("Threads: " + i + "\t:");
+            Map map = (Map)mapClass.newInstance();
+            counter = new AtomicInteger(0);
+            LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
+            CyclicBarrier barrier = new CyclicBarrier(i+1, timer);
+            for (int t = 0; t < i; ++t)
+                pool.execute(new Runner(map, key, barrier, counter));
+            barrier.await();
+            barrier.await();
+            long time = timer.getTime();
+            long tpo = time / (i * (long)nops);
+            System.out.print(LoopHelpers.rightJustify(tpo) + " ns per op");
+            double secs = (double)(time) / 1000000000.0;
+            System.out.println("\t " + secs + "s run time");
+            int size = map.size();
+            if (size != counter.get()) throw new Error();
+            map.clear();
+            map = null;
+            //            System.gc();
+            Thread.sleep(100);
+            if (i == k) {
+                k = i << 1;
+                i = i + (i >>> 1);
+            }
+            else
+                i = k;
+        }
+        pool.shutdown();
+    }
+
+    static class Runner implements Runnable {
+        final Map map;
+        final Integer[] key;
+        final LoopHelpers.SimpleRandom rng = new LoopHelpers.SimpleRandom();
+        final CyclicBarrier barrier;
+        final AtomicInteger counter;
+        int position;
+        int total;
+
+        Runner(Map map, Integer[] key,
+               CyclicBarrier barrier, AtomicInteger counter) {
+            this.map = map;
+            this.key = key;
+            this.barrier = barrier;
+            this.counter = counter;
+            position = key.length / 2;
+        }
+
+        int step() {
+            // random-walk around key positions,  bunching accesses
+            int r = rng.next();
+            position += (r & 7) - 3;
+            while (position >= key.length) position -= key.length;
+            while (position < 0) position += key.length;
+
+            Integer k = key[position];
+            Integer x = (Integer)map.get(k);
+
+            if (x != null) {
+                //                if (x.intValue() != k.intValue())
+                //                    throw new Error("bad mapping: " + x + " to " + k);
+
+                if (r < removesPerMaxRandom) {
+                    if (map.remove(k) != null) {
+                        counter.getAndDecrement();
+                        position = total % key.length; // move from position
+                        return 2;
+                    }
+                }
+            }
+            else if (r < insertsPerMaxRandom) {
+                if (map.put(k, k) == null)
+                    counter.getAndIncrement();
+                return 2;
+            }
+
+            //            total += LoopHelpers.compute1(k.intValue());
+            total += r;
+            return 1;
+        }
+
+        public void run() {
+            try {
+                barrier.await();
+                int ops = nops;
+                while (ops > 0)
+                    ops -= step();
+                barrier.await();
+            }
+            catch (Exception ex) {
+                ex.printStackTrace();
+            }
+        }
+    }
+}
+

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/DequeBash.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/DequeBash.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/DequeBash.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,411 @@
+/*
+ * Written by Josh Bloch of Google Inc. and released to the public domain,
+ * as explained at http://creativecommons.org/licenses/publicdomain.
+ */
+
+import edu.emory.mathcs.backport.java.util.*;
+import java.io.*;
+import java.util.Collection;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+import java.util.List;
+import java.util.Collections;
+
+/**
+ * Interface-based Deque tester.  This test currently makes three
+ * assumptions about the implementation under test:
+ *
+ *   1) It has no size limitation.
+ *   2) It implements Serializable.
+ *   3) It has a conventional (Collection) constructor.
+ *
+ * All of these assumptions could be relaxed.
+ */
+public class DequeBash {
+    static int seed = 7;
+    static int nextTail =  0;
+    static int nextHead = -1;
+    static int size() { return nextTail - nextHead - 1; }
+
+
+    static int random(int bound) {
+        int x = seed;
+        int t = (x % 127773) * 16807 - (x / 127773) * 2836;
+        seed = (t > 0)? t : t + 0x7fffffff;
+        return (t & 0x7fffffff) % bound;
+    }
+
+    static int random() {
+        int x = seed;
+        int t = (x % 127773) * 16807 - (x / 127773) * 2836;
+        seed = (t > 0)? t : t + 0x7fffffff;
+        return (t & 0x7fffffff);
+    }
+
+    public static void main(String args[]) throws Exception {
+        Class cls = Class.forName(args[0]);
+        int n = 1000000;
+
+        for (int j = 0; j < 3; ++j) {
+            Deque deque = (Deque) cls.newInstance();
+            nextTail =  0;
+            nextHead = -1;
+            long start = System.currentTimeMillis();
+            mainTest(deque, n);
+            long end = System.currentTimeMillis();
+            System.out.println("Time: " + (end - start) + "ms");
+            if (deque.isEmpty()) System.out.print(" ");
+        }
+
+    }
+
+    static void mainTest(Deque deque, int n) throws Exception {
+        /*
+         * Perform a random sequence of operations, keeping contiguous
+         * sequence of integers on the deque.
+         */
+        for (int i = 0; i < n; i++) {
+            sizeTests(deque);
+            randomOp(deque);
+
+            // Test iterator occasionally
+            if ((i & 1023) == 0) {
+                testIter(deque);
+                testDescendingIter(deque);
+            }
+
+            // Test serialization and copying
+            if ((i & 4095) == 0) {
+                testEqual(deque, (Deque)deepCopy(deque));
+                testEqual(deque, (Deque) deque.getClass().
+                          getConstructor(new Class[] {Collection.class}).
+                          newInstance(new Object[] {deque}));
+            }
+
+            // Test fancy removal stuff once in a blue moon
+            if ((i & 8191) == 0)
+                testRemove(deque);
+
+         }
+
+        // Stupid tests for clear, toString
+        deque.clear();
+        testEmpty(deque);
+        Collection c = Arrays.asList(new Integer[] {new Integer(1),
+                                                    new Integer(2),
+                                                    new Integer(3)});
+        deque.addAll(c);
+        if (!deque.toString().equals("[1, 2, 3]"))
+            throw new Exception("Deque.toString():  " + deque.toString());
+    }
+
+    static void testIter(Deque deque) throws Exception {
+        int next = nextHead + 1;
+        int count = 0;
+        for (Iterator itr = deque.iterator(); itr.hasNext();) {
+            int j = ((Integer)itr.next()).intValue();
+            if (j != next++)
+                throw new Exception("Element "+ j + " != " + (next-1));
+            count++;
+        }
+        if (count != size())
+            throw new Exception("Count " + count + " != " + size());
+    }
+
+    static void testDescendingIter(Deque deque) throws Exception {
+        int next = deque.size() + nextHead;
+        int count = 0;
+        for (Iterator it = deque.descendingIterator(); it.hasNext();) {
+            int j = ((Integer)it.next()).intValue();
+            if (j != next--)
+                throw new Exception("Element "+ j + " != " + (next-1));
+            count++;
+        }
+        if (count != size())
+            throw new Exception("Count " + count + " != " + size());
+    }
+
+    static void sizeTests(Deque deque) throws Exception {
+        if (deque.size() != size())
+            throw new Exception("Size: " + deque.size() +
+                                ", expecting " + size());
+        if (deque.isEmpty() != (size() == 0))
+            throw new Exception(
+                                "IsEmpty " + deque.isEmpty() + ", size " + size());
+        // Check head and tail
+        if (size() == 0)
+            testEmpty(deque);
+        else
+            nonEmptyTest(deque);
+
+    }
+
+    static void nonEmptyTest(Deque deque) throws Exception {
+        if (((Integer)deque.getFirst()).intValue() != nextHead + 1)
+            throw new Exception("getFirst got: " +
+                                deque.getFirst() + " expecting " + (nextHead + 1));
+        if (((Integer)deque.element()).intValue() != nextHead + 1)
+            throw new Exception("element got: " + deque.element() +
+                                " expecting " + (nextHead + 1));
+        if (((Integer)deque.peekFirst()).intValue() != nextHead + 1)
+            throw new Exception("peekFirst got: "+deque.peekFirst() +
+                                " expecting " + (nextHead + 1));
+        if (((Integer)deque.peek()).intValue() != nextHead + 1)
+            throw new Exception("peek got: " +  deque.peek() +
+                                " expecting " + (nextHead + 1));
+
+        if (((Integer)deque.peekLast()).intValue() != nextTail - 1)
+            throw new Exception("peekLast got: " + deque.peekLast() +
+                                " expecting " + (nextTail - 1));
+        if (((Integer)deque.getLast()).intValue() != nextTail - 1)
+            throw new Exception("getLast got: " +
+                                deque.getLast() + " expecting " + (nextTail - 1));
+    }
+
+
+    static void randomOp(Deque deque) throws Exception {
+
+        // Perform a random operation
+        switch(random() & 3) {
+        case 0:
+            switch(random() & 3) {
+            case 0: deque.addLast(new Integer(nextTail++));   break;
+            case 1: deque.offerLast(new Integer(nextTail++)); break;
+            case 2: deque.offer(new Integer(nextTail++));     break;
+            case 3: deque.add(new Integer(nextTail++));       break;
+            default: throw new Exception("How'd we get here");
+            }
+            break;
+        case 1:
+            if (size() == 0) {
+                int result = 666;
+                boolean threw = false;
+                try {
+                    switch(random(3)) {
+                    case 0: result = ((Integer)deque.removeFirst()).intValue(); break;
+                    case 1: result = ((Integer)deque.remove()).intValue();      break;
+                    case 2: result = ((Integer)deque.pop()).intValue();         break;
+                    default: throw new Exception("How'd we get here");
+                    }
+                } catch(NoSuchElementException e) {
+                    threw = true;
+                }
+                if (!threw)
+                    throw new Exception("Remove-no exception: " + result);
+            } else { // deque nonempty
+                int result = -1;
+                switch(random(5)) {
+                case 0: result = ((Integer)deque.removeFirst()).intValue(); break;
+                case 1: result = ((Integer)deque.remove()).intValue();      break;
+                case 2: result = ((Integer)deque.pop()).intValue();         break;
+                case 3: result = ((Integer)deque.pollFirst()).intValue();   break;
+                case 4: result = ((Integer)deque.poll()).intValue();        break;
+                default: throw new Exception("How'd we get here");
+                }
+                if (result != ++nextHead)
+                    throw new Exception(
+                                        "Removed "+ result + " expecting "+(nextHead - 1));
+            }
+            break;
+        case 2:
+            switch(random(3)) {
+            case 0: deque.addFirst(new Integer(nextHead--));   break;
+            case 1: deque.offerFirst(new Integer(nextHead--)); break;
+            case 2: deque.push(new Integer(nextHead--));       break;
+            default: throw new Exception("How'd we get here");
+            }
+            break;
+        case 3:
+            if (size() == 0) {
+                int result = -1;
+                boolean threw = false;
+                try {
+                    result = ((Integer)deque.removeLast()).intValue();
+                } catch(NoSuchElementException e) {
+                    threw = true;
+                }
+                if (!threw)
+                    throw new Exception("Remove-no exception: " + result);
+            } else { // deque nonempty
+                int result = ((random() & 1) == 0?
+                              ((Integer)deque.removeLast()).intValue() :
+                              ((Integer)deque.pollLast()).intValue());
+                if (result != --nextTail)
+                    throw new Exception(
+                                        "Removed "+ result + " expecting "+(nextTail + 1));
+            }
+            break;
+        default:
+            throw new Exception("How'd we get here");
+        }
+    }
+
+
+    private static void testEqual(Deque d1, Deque d2)
+        throws Exception
+    {
+        if (d1.size() != d2.size())
+            throw new Exception("Size " + d1.size() + " != " + d2.size());
+        Iterator it = d2.iterator();
+        for(Iterator itr = d1.iterator(); itr.hasNext();) {
+            int i = ((Integer)itr.next()).intValue();
+            int j = ((Integer)it.next()).intValue();
+            if (j != i)
+                throw new Exception("Element " + j + " != " + i);
+        }
+
+        for(Iterator itr = d1.iterator(); itr.hasNext();) {
+            int i = ((Integer)itr.next()).intValue();
+            if (!d2.contains(new Integer(i)))
+                throw new Exception("d2 doesn't contain " + i);
+        }
+        for(Iterator itr = d2.iterator(); itr.hasNext();) {
+            int i = ((Integer)itr.next()).intValue();
+            if (!d1.contains(new Integer(i)))
+                throw new Exception("d2 doesn't contain " + i);
+        }
+
+        if (d1.contains(new Integer(Integer.MIN_VALUE)))
+            throw new Exception("d2 contains Integer.MIN_VALUE");
+        if (d2.contains(new Integer(Integer.MIN_VALUE)))
+            throw new Exception("d2 contains Integer.MIN_VALUE");
+        if (d1.contains(null))
+            throw new Exception("d1 contains null");
+        if (d2.contains(null))
+            throw new Exception("d2 contains null");
+
+        if (!d1.containsAll(d2))
+            throw new Exception("d1 doesn't contain all of d2");
+        if (!d2.containsAll(d1))
+            throw new Exception("d2 doesn't contain all of d1");
+        Collection c = Collections.singleton(new Integer(Integer.MIN_VALUE));
+        if (d1.containsAll(c))
+            throw new Exception("d1 contains all of {Integer.MIN_VALUE }");
+        if (d2.containsAll(c))
+            throw new Exception("d2 contains all of {Integer.MIN_VALUE }");
+    }
+
+    private static Object deepCopy(Object o) {
+        try {
+            ByteArrayOutputStream bos = new ByteArrayOutputStream();
+            ObjectOutputStream oos = new ObjectOutputStream(bos);
+            oos.writeObject(o);
+            oos.flush();
+            ByteArrayInputStream bin = new ByteArrayInputStream(
+                bos.toByteArray());
+            ObjectInputStream ois = new ObjectInputStream(bin);
+            return  ois.readObject();
+        } catch(Exception e) {
+            throw new IllegalArgumentException(e.toString());
+        }
+    }
+
+    private static void testRemove(Deque deque) throws Exception {
+        Deque copy = null;
+        switch(random() & 1) {
+          case 0:
+            copy = (Deque) deque.getClass().
+                getConstructor(new Class[] {Collection.class}).
+                newInstance(new Object[] {deque});
+            break;
+          case 1:
+            copy = (Deque)deepCopy(deque);
+            break;
+          default:
+            throw new Exception("How'd we get here");
+        }
+
+        int numRemoved = 0;
+        for (Iterator it = copy.iterator(); it.hasNext(); ) {
+            if ((((Integer)it.next()).intValue() & 1) == 0) {
+                it.remove();
+                numRemoved++;
+            }
+        }
+
+        if (copy.size() + numRemoved != size())
+            throw new Exception((copy.size() + numRemoved) + " != " + size());
+        for (Iterator itr = copy.iterator(); itr.hasNext();) {
+            int i = ((Integer)itr.next()).intValue();
+            if ((i & 1) == 0)
+                throw new Exception("Even number still present: " + i);
+        }
+
+        List elements = Arrays.asList(copy.toArray(new Integer[0]));
+        Collections.shuffle(elements);
+        for (Iterator itr = elements.iterator(); itr.hasNext();) {
+            int e = ((Integer)itr.next()).intValue();
+            if (!copy.contains(new Integer(e)))
+                throw new Exception(e + " missing.");
+
+            boolean removed = false;
+            switch(random(3)) {
+                case 0:  removed = copy.remove(new Integer(e));                break;
+                case 1:  removed = copy.removeFirstOccurrence(new Integer(e)); break;
+                case 2:  removed = copy.removeLastOccurrence(new Integer(e));  break;
+                default: throw new Exception("How'd we get here");
+            }
+            if (!removed)
+                throw new Exception(e + " not removed.");
+
+            if (copy.contains(new Integer(e)))
+                throw new Exception(e + " present after removal.");
+        }
+
+        testEmpty(copy);
+
+        copy = (Deque) deque.getClass().
+            getConstructor(new Class[] {Collection.class}).
+            newInstance(new Object[] {deque});
+        copy.retainAll(deque);
+        testEqual(deque, copy);
+        copy.removeAll(deque);
+        testEmpty(copy);
+    }
+
+    static boolean checkedThrows;
+
+    private static void testEmpty(Deque deque) throws Exception {
+        if (!deque.isEmpty())
+            throw new Exception("Deque isn't empty");
+        if (deque.size() != 0)
+            throw new Exception("Deque size isn't zero");
+        if (!(deque.pollFirst() == null))
+            throw new Exception("pollFirst lies");
+        if (!(deque.poll() == null))
+            throw new Exception("poll lies");
+        if (!(deque.peekFirst() == null))
+            throw new Exception("peekFirst lies");
+        if (!(deque.peek() == null))
+            throw new Exception("peek lies");
+        if (!(deque.pollLast() == null))
+            throw new Exception("pollLast lies");
+        if (!(deque.peekLast() == null))
+            throw new Exception("peekLast lies");
+
+        if (!checkedThrows) {
+            checkedThrows = true;
+            boolean threw = false;
+            int result = 666;
+            try {
+                result = ((random() & 1) == 0?
+                          ((Integer)deque.getFirst()).intValue() :
+                          ((Integer)deque.element()).intValue());
+            } catch(NoSuchElementException e) {
+                threw = true;
+            }
+            if (!threw)
+                throw new Exception("getFirst-no exception: "+result);
+            threw = false;
+            try {
+                result = ((Integer)deque.getLast()).intValue();
+            } catch(NoSuchElementException e) {
+                threw = true;
+            }
+            if (!threw)
+                throw new Exception("getLast-no exception: "+result);
+        }
+
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/ExchangeLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/ExchangeLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/ExchangeLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,147 @@
+/*
+ * Written by Bill Scherer and Doug Lea with assistance from members
+ * of JCP JSR-166 Expert Group and released to the public domain. Use,
+ * modify, and redistribute this code in any way without
+ * acknowledgement.
+ */
+
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+
+import edu.emory.mathcs.backport.java.util.concurrent.atomic.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.Utils;
+
+public class ExchangeLoops {
+    static final int NCPUS = Runtime.getRuntime().availableProcessors();
+
+    static final int  DEFAULT_THREADS = NCPUS + 2;
+    static final long DEFAULT_TRIAL_MILLIS   = 10000;
+
+    public static void main(String[] args) throws Exception {
+        int maxThreads = DEFAULT_THREADS;
+        long trialMillis = DEFAULT_TRIAL_MILLIS;
+        int nReps = 3;
+
+        // Parse and check args
+        int argc = 0;
+        while (argc < args.length) {
+            String option = args[argc++];
+            if (option.equals("-t"))
+                trialMillis = Integer.parseInt(args[argc]);
+            else if (option.equals("-r"))
+                nReps = Integer.parseInt(args[argc]);
+            else
+                maxThreads = Integer.parseInt(option);
+            argc++;
+        }
+
+	// Display runtime parameters
+	System.out.print("ExchangeTest");
+	System.out.print(" -t " + trialMillis);
+        System.out.print(" -r " + nReps);
+	System.out.print(" max threads " + maxThreads);
+	System.out.println();
+        long warmupTime = 2000;
+        long sleepTime = 100;
+        int nw = maxThreads >= 3? 3 : 2;
+
+        System.out.println("Warmups..");
+        oneRun(3, warmupTime);
+        Thread.sleep(sleepTime);
+
+        for (int i = maxThreads; i >= 2; i -= 1) {
+            oneRun(i, warmupTime++);
+            //            System.gc();
+            Thread.sleep(sleepTime);
+        }
+
+        /*
+        for (int i = maxThreads; i >= 2; i -= 1) {
+            oneRun(i, warmupTime++);
+        }
+        */
+
+        for (int j = 0; j < nReps; ++j) {
+            System.out.println("Trial: " + j);
+            for (int i = 2; i <= maxThreads; i += 2) {
+                oneRun(i, trialMillis);
+                //                System.gc();
+                Thread.sleep(sleepTime);
+            }
+            for (int i = maxThreads; i >= 2; i -= 2) {
+                oneRun(i, trialMillis);
+                //                System.gc();
+                Thread.sleep(sleepTime);
+            }
+            Thread.sleep(sleepTime);
+        }
+
+
+    }
+
+    static void oneRun(int nThreads, long trialMillis) throws Exception {
+        System.out.println(nThreads + " threads");
+        Exchanger x = new Exchanger();
+        Runner[] runners = new Runner[nThreads];
+        Thread[] threads = new Thread[nThreads];
+        for (int i = 0; i < nThreads; ++i) {
+            runners[i] = new Runner(x);
+            threads[i] = new Thread(runners[i]);
+            //            int h = System.identityHashCode(threads[i]);
+            //            h ^= h << 1;
+            //            h ^= h >>> 3;
+            //            h ^= h << 10;
+            //            System.out.printf("%10x\n", h);
+        }
+
+        long startTime = Utils.nanoTime();
+        for (int i = 0; i < nThreads; ++i) {
+            threads[i].start();
+        }
+        Thread.sleep(trialMillis);
+        for (int i = 0; i < nThreads; ++i)
+            threads[i].interrupt();
+        long elapsed = Utils.nanoTime() - startTime;
+        for (int i = 0; i < nThreads; ++i)
+            threads[i].join();
+        int iters = 1;
+        //        System.out.println();
+        for (int i = 0; i < nThreads; ++i) {
+            int ipr = runners[i].iters;
+            //            System.out.println(ipr);
+            iters += ipr;
+        }
+        long rate = iters * 1000L * 1000L * 1000L / elapsed;
+        long npt = elapsed / iters;
+        System.out.println(elapsed / (1000L * 1000L) + "ms");
+        System.out.println(rate + " it/s ");
+        System.out.println(npt + " ns/it");
+        System.out.println();
+        //        x.printStats();
+    }
+
+    static final class Runner implements Runnable {
+        final Exchanger exchanger;
+        final Object mine = new Integer(2688);
+        volatile int iters;
+        Runner(Exchanger x) { this.exchanger = x; }
+
+        public void run() {
+            Exchanger x = exchanger;
+            Object m = mine;
+            int i = 0;
+            try {
+                for (;;) {
+                    Object e = x.exchange(m);
+                    if (e == null || e == m)
+                        throw new Error();
+                    m = e;
+                    ++i;
+                }
+            } catch (InterruptedException ie) {
+                iters = i;
+            }
+        }
+    }
+}
+

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/ExecutorCompletionServiceLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/ExecutorCompletionServiceLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/ExecutorCompletionServiceLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,89 @@
+/*
+ * @test %I% %E%
+ * @bug 166
+ * @compile -source 1.5 ExecutorCompletionServiceLoops.java
+ * @run main/timeout=3600 ExecutorCompletionServiceLoops
+ * @summary  Exercise ExecutorCompletionServiceLoops
+ */
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain. Use, modify, and
+ * redistribute this code in any way without acknowledgement.
+ */
+
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.*;
+
+public class ExecutorCompletionServiceLoops {
+    static final int POOLSIZE =      100;
+    static final ExecutorService pool =
+        Executors.newFixedThreadPool(POOLSIZE);
+    static final ExecutorCompletionService ecs =
+        new ExecutorCompletionService(pool);
+    static boolean print = false;
+
+    public static void main(String[] args) throws Exception {
+        int max = 8;
+        int base = 10000;
+
+        if (args.length > 0)
+            max = Integer.parseInt(args[0]);
+
+        System.out.println("Warmup...");
+        oneTest( base );
+        Thread.sleep(100);
+        print = true;
+
+        for (int i = 1; i <= max; i += (i+1) >>> 1) {
+            System.out.print("n: " + i * base);
+            oneTest(i * base );
+            Thread.sleep(100);
+        }
+        pool.shutdown();
+   }
+
+    static class Task implements Callable {
+        public Object call() {
+            int l = System.identityHashCode(this);
+            l = LoopHelpers.compute2(l);
+            int s = LoopHelpers.compute1(l);
+            l = LoopHelpers.compute2(l);
+            s += LoopHelpers.compute1(l);
+            return new Integer(s);
+        }
+    }
+
+    static class Producer implements Runnable {
+        final ExecutorCompletionService cs;
+        final int iters;
+        Producer(ExecutorCompletionService ecs, int i) {
+            cs = ecs;
+            iters = i;
+        }
+        public void run() {
+            for (int i = 0; i < iters; ++i)
+                ecs.submit(new Task());
+        }
+    }
+
+    static void oneTest(int iters) throws Exception {
+        long startTime = Utils.nanoTime();
+        new Thread(new Producer(ecs, iters)).start();
+
+        int r = 0;
+        for (int i = 0; i < iters; ++i)
+            r += ((Integer)ecs.take().get()).intValue();
+
+        long elapsed = Utils.nanoTime() - startTime;
+        long tpi = elapsed/ iters;
+
+        if (print)
+            System.out.println("\t: " + LoopHelpers.rightJustify(tpi) + " ns per task");
+
+        if (r == 0) // avoid overoptimization
+            System.out.println("useless result: " + r);
+
+
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/FinalLongTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/FinalLongTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/FinalLongTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,105 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+public class FinalLongTest {
+    static int npairs = 2;
+    static int iters = 10000000;
+    static  int LEN = 2;
+    static final Long[] nums = new Long[LEN];
+    static volatile boolean done;
+    static volatile long total;
+    static Long n0 = new Long(21);
+    static Long n1 = new Long(22);
+    static Long n2 = new Long(23);
+    static Long n3 = new Long(23);
+    
+
+    public static void main(String[] args) {
+        for (int i = 0; i < LEN; ++i)
+            nums[i] = new Long(i+1);
+        Thread[] ps = new Thread[npairs];
+        Thread[] as = new Reader[npairs];
+        for (int i = 0; i < npairs; ++i) {
+            ps[i] = new Writer();
+            as[i] = new Reader();
+        }
+        for (int i = 0; i < as.length; ++i) {
+            ps[i].start();
+            as[i].start();
+        }
+    }
+
+    static long nextRandom(long seed) { 
+        return (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1);
+    }
+
+    static long initialSeed(Object x) {
+        return (System.currentTimeMillis() + x.hashCode()) | 1;
+    }
+
+    static class Writer extends Thread {
+        public void run() {
+            long s = initialSeed(this);
+            int n = iters / 2;
+            Long[] ns = nums;
+
+            while (n-- > 0) {
+                //                int k = (int)(s & (LEN-1));
+                //                if (k < 0 || k >= LEN) k = 1;
+                //                int l = (k+1) & (LEN-1);
+                //                if (l < 0 || l >= LEN) l = 0;
+                //                int k = (s & 1) == 0? 0 : 1;
+                //                int l = (k == 0)? 1 : 0;
+                if ((s & (LEN-1)) == 0) {
+                    n3 = n1;
+                    n0 = new Long(s);
+                    n2 = n1;
+                    n1 = new Long(s);
+                }
+                else {
+                    n3 = n0;
+                    n1 = new Long(s);
+                    n2 = n0;
+                    n0 = new Long(s);
+                }
+                s = nextRandom(s);
+                if (s == 0) s = initialSeed(this);
+            }
+            done = true;
+            total += s;
+        }
+    }
+
+    static class Reader extends Thread {
+        public void run() {
+            int n = iters;
+            long s = initialSeed(this);
+            while (s != 0 && n > 0) {
+                long nexts; // = nums[(int)(s & (LEN-1))].longValue();
+                if ((s & (LEN-1)) == 0)
+                    nexts = n0.longValue();
+                else
+                    nexts = n1.longValue();
+                if (nexts != 0) {
+                    if ((s & 4) == 0)
+                        nexts = n2.longValue();
+                    else
+                        nexts = n3.longValue();
+                }
+
+                if (nexts != s) 
+                    --n;
+                else if (done)
+                    break;
+                s = nexts;
+            }
+            done = true;
+            total += s;
+            if (s == 0) 
+                throw new Error("Saw uninitialized value");
+        }
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/FinalLongTest142.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/FinalLongTest142.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/FinalLongTest142.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,75 @@
+/*
+ * @test %I% %E%
+ * @bug 5041458 
+ * @compile FinalLongTest.java
+ * @run main FinalLongTest
+ * @summary Detects reads of uninitialized final value field of Long class
+ */
+
+public class FinalLongTest142 {
+    static int npairs = 2;
+    static int iters = 500000000;
+    static final int LEN = 4;
+    static final Long[] nums = new Long[LEN];
+    static volatile boolean done;
+    static volatile long total;
+
+    public static void main(String[] args) {
+        for (int i = 0; i < LEN; ++i)
+            nums[i] = new Long(i+1);
+        Thread[] ps = new Thread[npairs];
+        Thread[] as = new Reader[npairs];
+        for (int i = 0; i < npairs; ++i) {
+            ps[i] = new Writer();
+            as[i] = new Reader();
+        }
+        for (int i = 0; i < as.length; ++i) {
+            ps[i].start();
+            as[i].start();
+        }
+    }
+
+    static long nextRandom(long seed) { 
+        return (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1);
+    }
+
+    static long initialSeed(Object x) {
+        return (System.currentTimeMillis() + x.hashCode()) | 1;
+    }
+
+    static class Writer extends Thread {
+        public void run() {
+            long s = initialSeed(this);
+            int n = iters / 2;
+            while (!done && n-- > 0) {
+                int k = (int)(s & (LEN-1));
+                int l = (k+1) & (LEN-1);
+                nums[k] = new Long(s);
+                nums[l] = new Long(s);
+                s = nextRandom(s);
+                if (s == 0) s = initialSeed(this);
+            }
+            done = true;
+            total += s;
+        }
+    }
+
+    static class Reader extends Thread {
+        public void run() {
+            int n = iters;
+            long s = initialSeed(this);
+            while (s != 0 && n > 0) {
+                long nexts = nums[(int)(s & (LEN-1))].longValue();
+                if (nexts != s) 
+                    --n;
+                else if (done)
+                    break;
+                s = nexts;
+            }
+            done = true;
+            total += s;
+            if (s == 0) 
+                throw new Error("Saw uninitialized value");
+        }
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/Finals.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/Finals.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/Finals.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,73 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+public class Finals {
+    static int npairs = 2;
+    static int iters = 10000000;
+    static final int LEN = 4;
+    static final Long[] nums = new Long[LEN];
+    static volatile boolean done;
+    static volatile long total;
+
+    public static void main(String[] args) {
+        for (int i = 0; i < LEN; ++i)
+            nums[i] = new Long(i+1);
+        Thread[] ps = new Thread[npairs];
+        Thread[] as = new Reader[npairs];
+        for (int i = 0; i < npairs; ++i) {
+            ps[i] = new Writer();
+            as[i] = new Reader();
+        }
+        for (int i = 0; i < as.length; ++i) {
+            ps[i].start();
+            as[i].start();
+        }
+    }
+
+    static long nextRandom(long seed) { 
+        return (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1);
+    }
+
+    static long initialSeed(Object x) {
+        return (System.currentTimeMillis() + x.hashCode()) | 1;
+    }
+
+    static class Writer extends Thread {
+        public void run() {
+            long s = initialSeed(this);
+            int n = iters;
+            while (!done && n-- > 0) {
+                int k = (int)(s & (LEN-1));
+                int l = (k+1) & (LEN-1);
+                nums[k] = new Long(s);
+                nums[l] = new Long(s);
+                s = nextRandom(s);
+                if (s == 0) s = initialSeed(this);
+            }
+            done = true;
+            total += s;
+        }
+    }
+
+    static class Reader extends Thread {
+        public void run() {
+            int n = iters;
+            long s = initialSeed(this);
+            while (s != 0 && n > 0) {
+                long nexts = nums[(int)(s & (LEN-1))].longValue();
+                if (nexts != s) 
+                    --n;
+                else if (done)
+                    break;
+                s = nexts;
+            }
+            done = true;
+            total += s;
+            if (s == 0) 
+                throw new Error("Saw uninitialized value");
+        }
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/IntMapCheck.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/IntMapCheck.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/IntMapCheck.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,587 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+/**
+ * @test
+ * @synopsis Times and checks basic map operations
+ */
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.*;
+import java.io.*;
+import java.util.Map;
+import java.util.Hashtable;
+import java.util.Set;
+import java.util.Iterator;
+import java.util.Random;
+import java.util.IdentityHashMap;
+import java.util.Enumeration;
+
+public class IntMapCheck {
+    static int absentSize;
+    static int absentMask;
+    static Integer[] absent;
+    static final Integer MISSING = new Integer(Integer.MIN_VALUE);
+    static TestTimer timer = new TestTimer();
+
+    static void reallyAssert(boolean b) {
+        if (!b) throw new Error("Failed Assertion");
+    }
+
+    public static void main(String[] args) throws Exception {
+        Class mapClass = edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap.class;
+        int numTests = 50;
+        int size = 50000;
+
+        if (args.length > 0) {
+            try {
+                mapClass = Class.forName(args[0]);
+            } catch(ClassNotFoundException e) {
+                throw new RuntimeException("Class " + args[0] + " not found.");
+            }
+        }
+
+
+        if (args.length > 1)
+            numTests = Integer.parseInt(args[1]);
+
+        if (args.length > 2)
+            size = Integer.parseInt(args[2]);
+
+        boolean doSerializeTest = args.length > 3;
+
+        System.out.println("Testing " + mapClass.getName() + " trials: " + numTests + " size: " + size);
+
+        absentSize = 4;
+        while (absentSize <= size) absentSize <<= 1;
+        absentMask = absentSize-1;
+        absent = new Integer[absentSize];
+        for (int i = 0; i < absentSize; ++i)
+            absent[i] = new Integer(2 * (i - 1) + 1);
+
+        Integer[] key = new Integer[size];
+        for (int i = 0; i < size; ++i)
+            key[i] = new Integer(2 * i);
+
+        for (int rep = 0; rep < numTests; ++rep) {
+            shuffle(absent);
+            runTest(newMap(mapClass), key);
+        }
+
+        TestTimer.printStats();
+
+
+        if (doSerializeTest)
+            stest(newMap(mapClass), size);
+    }
+
+    static Map newMap(Class cl) {
+        try {
+            Map m = (Map)cl.newInstance();
+            return m;
+        } catch(Exception e) {
+            throw new RuntimeException("Can't instantiate " + cl + ": " + e);
+        }
+    }
+
+
+    static void runTest(Map s, Integer[] key) {
+        shuffle(key);
+        int size = key.length;
+        long startTime = Utils.nanoTime();
+        test(s, key);
+        long time = Utils.nanoTime() - startTime;
+    }
+
+
+    static void t1(String nm, int n, Map s, Integer[] key, int expect) {
+        int sum = 0;
+        int iters = 4;
+        timer.start(nm, n * iters);
+        for (int j = 0; j < iters; ++j) {
+            for (int i = 0; i < n; i++) {
+                if (s.get(key[i]) != null) ++sum;
+            }
+        }
+        timer.finish();
+        reallyAssert (sum == expect * iters);
+    }
+
+    static void t2(String nm, int n, Map s, Integer[] key, int expect) {
+        int sum = 0;
+        timer.start(nm, n);
+        for (int i = 0; i < n; i++) {
+            if (s.remove(key[i]) != null) ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == expect);
+    }
+
+    static void t3(String nm, int n, Map s, Integer[] key, int expect) {
+        int sum = 0;
+        timer.start(nm, n);
+        for (int i = 0; i < n; i++) {
+            Integer k = key[i];
+            Integer v = absent[i & absentMask];
+            if (s.put(k, v) == null) ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == expect);
+    }
+
+    static void t4(String nm, int n, Map s, Integer[] key, int expect) {
+        int sum = 0;
+        timer.start(nm, n);
+        for (int i = 0; i < n; i++) {
+            if (s.containsKey(key[i])) ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == expect);
+    }
+
+    static void t5(String nm, int n, Map s, Integer[] key, int expect) {
+        int sum = 0;
+        timer.start(nm, n/2);
+        for (int i = n-2; i >= 0; i-=2) {
+            if (s.remove(key[i]) != null) ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == expect);
+    }
+
+    static void t6(String nm, int n, Map s, Integer[] k1, Integer[] k2) {
+        int sum = 0;
+        timer.start(nm, n * 2);
+        for (int i = 0; i < n; i++) {
+            if (s.get(k1[i]) != null) ++sum;
+            if (s.get(k2[i & absentMask]) != null) ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == n);
+    }
+
+    static void t7(String nm, int n, Map s, Integer[] k1, Integer[] k2) {
+        int sum = 0;
+        timer.start(nm, n * 2);
+        for (int i = 0; i < n; i++) {
+            if (s.containsKey(k1[i])) ++sum;
+            if (s.containsKey(k2[i & absentMask])) ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == n);
+    }
+
+    static void t8(String nm, int n, Map s, Integer[] key, int expect) {
+        int sum = 0;
+        timer.start(nm, n);
+        for (int i = 0; i < n; i++) {
+            if (s.get(key[i]) != null) ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == expect);
+    }
+
+
+    static void t9(Map s) {
+        int sum = 0;
+        int iters = 20;
+        timer.start("ContainsValue (/n)     ", iters * s.size());
+        int step = absentSize / iters;
+        for (int i = 0; i < absentSize; i += step)
+            if (s.containsValue(absent[i])) ++sum;
+        timer.finish();
+        reallyAssert (sum != 0);
+    }
+
+
+    static void ktest(Map s, int size, Integer[] key) {
+        timer.start("ContainsKey            ", size);
+        Set ks = s.keySet();
+        int sum = 0;
+        for (int i = 0; i < size; i++) {
+            if (ks.contains(key[i])) ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == size);
+    }
+
+
+    static void ittest1(Map s, int size) {
+        int sum = 0;
+        timer.start("Iter Key               ", size);
+        for (Iterator it = s.keySet().iterator(); it.hasNext(); ) {
+            if(it.next() != MISSING)
+                ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == size);
+    }
+
+    static void ittest2(Map s, int size) {
+        int sum = 0;
+        timer.start("Iter Value             ", size);
+        for (Iterator it = s.values().iterator(); it.hasNext(); ) {
+            if(it.next() != MISSING)
+                ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == size);
+    }
+    static void ittest3(Map s, int size) {
+        int sum = 0;
+        timer.start("Iter Entry             ", size);
+        for (Iterator it = s.entrySet().iterator(); it.hasNext(); ) {
+            if(it.next() != MISSING)
+                ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == size);
+    }
+
+    static void ittest4(Map s, int size, int pos) {
+        IdentityHashMap seen = new IdentityHashMap(size);
+        reallyAssert (s.size() == size);
+        int sum = 0;
+        timer.start("Iter XEntry            ", size);
+        Iterator it = s.entrySet().iterator();
+        Integer k = null;
+        Integer v = null;
+        for (int i = 0; i < size-pos; ++i) {
+            Map.Entry x = (Map.Entry)(it.next());
+            k = (Integer)x.getKey();
+            v = (Integer)x.getValue();
+            seen.put(k, k);
+            if (v != MISSING)
+                ++sum;
+        }
+        reallyAssert (s.containsKey(k));
+        it.remove();
+        reallyAssert (!s.containsKey(k));
+        while (it.hasNext()) {
+            Map.Entry x = (Map.Entry)(it.next());
+            Integer k2 = (Integer)x.getKey();
+            seen.put(k2, k2);
+            if (k2 != MISSING)
+                ++sum;
+        }
+
+        reallyAssert (s.size() == size-1);
+        s.put(k, v);
+        reallyAssert (seen.size() == size);
+        timer.finish();
+        reallyAssert (sum == size);
+        reallyAssert (s.size() == size);
+    }
+
+
+    static void ittest(Map s, int size) {
+        ittest1(s, size);
+        ittest2(s, size);
+        ittest3(s, size);
+        //        for (int i = 0; i < size-1; ++i)
+        //            ittest4(s, size, i);
+    }
+
+    static void entest1(Hashtable ht, int size) {
+        int sum = 0;
+
+        timer.start("Iter Enumeration Key   ", size);
+        for (Enumeration en = ht.keys(); en.hasMoreElements(); ) {
+            if (en.nextElement() != MISSING)
+                ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == size);
+    }
+
+    static void entest2(Hashtable ht, int size) {
+        int sum = 0;
+        timer.start("Iter Enumeration Value ", size);
+        for (Enumeration en = ht.elements(); en.hasMoreElements(); ) {
+            if (en.nextElement() != MISSING)
+                ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == size);
+    }
+
+
+    static void entest3(Hashtable ht, int size) {
+        int sum = 0;
+
+        timer.start("Iterf Enumeration Key  ", size);
+        Enumeration en = ht.keys();
+        for (int i = 0; i < size; ++i) {
+            if (en.nextElement() != MISSING)
+                ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == size);
+    }
+
+    static void entest4(Hashtable ht, int size) {
+        int sum = 0;
+        timer.start("Iterf Enumeration Value", size);
+        Enumeration en = ht.elements();
+        for (int i = 0; i < size; ++i) {
+            if (en.nextElement() != MISSING)
+                ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == size);
+    }
+
+    static void entest(Map s, int size) {
+        if (s instanceof Hashtable) {
+            Hashtable ht = (Hashtable)s;
+            //            entest3(ht, size);
+            //            entest4(ht, size);
+            entest1(ht, size);
+            entest2(ht, size);
+            entest1(ht, size);
+            entest2(ht, size);
+            entest1(ht, size);
+            entest2(ht, size);
+        }
+    }
+
+    static void rtest(Map s, int size) {
+        timer.start("Remove (iterator)      ", size);
+        for (Iterator it = s.keySet().iterator(); it.hasNext(); ) {
+            it.next();
+            it.remove();
+        }
+        timer.finish();
+    }
+
+    static void rvtest(Map s, int size) {
+        timer.start("Remove (iterator)      ", size);
+        for (Iterator it = s.values().iterator(); it.hasNext(); ) {
+            it.next();
+            it.remove();
+        }
+        timer.finish();
+    }
+
+
+    static void dtest(Map s, int size, Integer[] key) {
+        timer.start("Put (putAll)           ", size * 2);
+        Map s2 = null;
+        try {
+            s2 = (Map) (s.getClass().newInstance());
+            s2.putAll(s);
+        }
+        catch (Exception e) { e.printStackTrace(); return; }
+        timer.finish();
+
+        timer.start("Iter Equals            ", size * 2);
+        boolean eqt = s2.equals(s) && s.equals(s2);
+        reallyAssert (eqt);
+        timer.finish();
+
+        timer.start("Iter HashCode          ", size * 2);
+        int shc = s.hashCode();
+        int s2hc = s2.hashCode();
+        reallyAssert (shc == s2hc);
+        timer.finish();
+
+        timer.start("Put (present)          ", size);
+        s2.putAll(s);
+        timer.finish();
+
+        timer.start("Iter EntrySet contains ", size * 2);
+        Set es2 = s2.entrySet();
+        int sum = 0;
+        for (Iterator i1 = s.entrySet().iterator(); i1.hasNext(); ) {
+            Object entry = i1.next();
+            if (es2.contains(entry)) ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == size);
+
+        t6("Get                    ", size, s2, key, absent);
+
+        Integer hold = (Integer)s2.get(key[size-1]);
+        s2.put(key[size-1], absent[0]);
+        timer.start("Iter Equals            ", size * 2);
+        eqt = s2.equals(s) && s.equals(s2);
+        reallyAssert (!eqt);
+        timer.finish();
+
+        timer.start("Iter HashCode          ", size * 2);
+        int s1h = s.hashCode();
+        int s2h = s2.hashCode();
+        reallyAssert (s1h != s2h);
+        timer.finish();
+
+        s2.put(key[size-1], hold);
+        timer.start("Remove (iterator)      ", size * 2);
+        Iterator s2i = s2.entrySet().iterator();
+        Set es = s.entrySet();
+        while (s2i.hasNext())
+            reallyAssert(es.remove(s2i.next()));
+        timer.finish();
+
+        if (!s.isEmpty()) System.out.println(s);
+        reallyAssert (s.isEmpty());
+
+        timer.start("Clear                  ", size);
+        s2.clear();
+        timer.finish();
+        reallyAssert (s2.isEmpty() && s.isEmpty());
+    }
+
+    static void stest(Map s, int size) throws Exception {
+        if (!(s instanceof Serializable))
+            return;
+        System.out.print("Serialize              : ");
+
+        for (int i = 0; i < size; i++) {
+            s.put(new Integer(i), new Integer(1));
+        }
+
+        long startTime = Utils.nanoTime();
+
+        FileOutputStream fs = new FileOutputStream("IntMapCheck.dat");
+        ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(fs));
+        out.writeObject(s);
+        out.close();
+
+        FileInputStream is = new FileInputStream("IntMapCheck.dat");
+        ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(is));
+        Map m = (Map)in.readObject();
+
+        long endTime = Utils.nanoTime();
+        long time = endTime - startTime;
+
+        System.out.print(time + "ms");
+
+        if (s instanceof IdentityHashMap) return;
+        reallyAssert (s.equals(m));
+    }
+
+
+    static void test(Map s, Integer[] key) {
+        int size = key.length;
+
+        t3("Put (absent)           ", size, s, key, size);
+        t3("Put (present)          ", size, s, key, 0);
+        t7("ContainsKey            ", size, s, key, absent);
+        t4("ContainsKey            ", size, s, key, size);
+        ktest(s, size, key);
+        t4("ContainsKey            ", absentSize, s, absent, 0);
+        t6("Get                    ", size, s, key, absent);
+        t1("Get (present)          ", size, s, key, size);
+        t1("Get (absent)           ", absentSize, s, absent, 0);
+        t2("Remove (absent)        ", absentSize, s, absent, 0);
+        t5("Remove (present)       ", size, s, key, size / 2);
+        t3("Put (half present)     ", size, s, key, size / 2);
+
+        ittest(s, size);
+        entest(s, size);
+        t9(s);
+        rtest(s, size);
+
+        t4("ContainsKey            ", size, s, key, 0);
+        t2("Remove (absent)        ", size, s, key, 0);
+        t3("Put (presized)         ", size, s, key, size);
+        dtest(s, size, key);
+    }
+
+    static class TestTimer {
+        private String name;
+        private long numOps;
+        private long startTime;
+        private String cname;
+
+        static final java.util.TreeMap accum = new java.util.TreeMap();
+
+        static void printStats() {
+            for (Iterator it = accum.entrySet().iterator(); it.hasNext(); ) {
+                Map.Entry e = (Map.Entry)(it.next());
+                Stats stats = ((Stats)(e.getValue()));
+                long n = stats.number;
+                double t;
+                if (n > 0)
+                    t = stats.sum / n;
+                else
+                    t = stats.least;
+                long nano = Math.round(1000000.0 * t);
+                System.out.println(e.getKey() + ": " + nano);
+            }
+        }
+
+        void start(String name, long numOps) {
+            this.name = name;
+            this.cname = classify();
+            this.numOps = numOps;
+            startTime = Utils.nanoTime();
+        }
+
+
+        String classify() {
+            if (name.startsWith("Get"))
+                return "Get                    ";
+            else if (name.startsWith("Put"))
+                return "Put                    ";
+            else if (name.startsWith("Remove"))
+                return "Remove                 ";
+            else if (name.startsWith("Iter"))
+                return "Iter                   ";
+            else
+                return null;
+        }
+
+        void finish() {
+            long endTime = Utils.nanoTime();
+            long time = endTime - startTime;
+            double timePerOp = (((double)time)/numOps) / 1000000;
+
+            Object st = accum.get(name);
+            if (st == null)
+                accum.put(name, new Stats(timePerOp));
+            else {
+                Stats stats = (Stats) st;
+                stats.sum += timePerOp;
+                stats.number++;
+                if (timePerOp < stats.least) stats.least = timePerOp;
+            }
+
+            if (cname != null) {
+                st = accum.get(cname);
+                if (st == null)
+                    accum.put(cname, new Stats(timePerOp));
+                else {
+                    Stats stats = (Stats) st;
+                    stats.sum += timePerOp;
+                    stats.number++;
+                    if (timePerOp < stats.least) stats.least = timePerOp;
+                }
+            }
+
+        }
+
+    }
+
+    static class Stats {
+        double sum = 0;
+        double least;
+        long number = 0;
+        Stats(double t) { least = t; }
+    }
+
+    static Random rng = new Random();
+
+    static void shuffle(Integer[] keys) {
+        int size = keys.length;
+        for (int i=size; i>1; i--) {
+            int r = rng.nextInt(i);
+            Integer t = keys[i-1];
+            keys[i-1] = keys[r];
+            keys[r] = t;
+        }
+    }
+
+}
+

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/IteratorLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/IteratorLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/IteratorLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,123 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.Utils;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.ArrayList;
+
+/**
+ * Estimates time per iteration of collection iterators.  Preloads
+ * most elements, but adds about 1/8 of them dynamically to preclude
+ * overly clever optimizations. The array of collections has
+ * approximately exponentially different lengths, so check both short
+ * and long iterators.  Reports include times for adds and other
+ * checks, so overestimate times per iteration.
+ */
+
+public final class IteratorLoops {
+    static final int DEFAULT_SIZE = 16384;
+    static final int DEFAULT_TRIALS = 4;
+    static final int NC = 16; // number of collections must be power of 2
+    static volatile long mismatches = 0;
+    static int randomSeed = 3122688;
+
+    public static void main(String[] args) throws Exception {
+        Class klass = Class.forName(args[0]);
+        int n = (args.length <= 1)? DEFAULT_SIZE : Integer.parseInt(args[1]);
+        int t = (args.length <= 2)? DEFAULT_TRIALS : Integer.parseInt(args[2]);
+
+        System.out.print("Class: " + klass.getName());
+        System.out.print(" ~iters: " + (long)n * (long)n);
+        System.out.print(" trials: " + t);
+        System.out.println();
+
+        Collection[] colls =
+            (Collection[])new Collection[NC];
+
+        for (int k = 0; k < colls.length; ++k)
+            colls[k] = (Collection)klass.newInstance();
+
+        for (int i = 0; i < t; ++i)
+            new IteratorLoops(colls).oneRun(n);
+
+        if (mismatches != 0)
+            throw new Error("Bad checksum :" + mismatches);
+    }
+
+    private int elementCount;
+    private final Collection[] cs;
+
+    IteratorLoops(Collection[] colls) {
+        cs = colls;
+        elementCount = 0;
+    }
+
+    void oneRun(int n) {
+        preload(n);
+        long startTime = Utils.nanoTime();
+        long count = traversals(n);
+        double elapsed = (double)(Utils.nanoTime() - startTime);
+        double npi = elapsed / count;
+        double secs = elapsed / 1000000000;
+        System.out.print("" + npi + " ns/iter  " + secs + "s run time\n");
+    }
+
+    long traversals(int n) {
+        long count = 0;
+        long check = 0;
+	for (int i = 0; i < n; i++) {
+            check += elementCount;
+            count += counts();
+            maybeAdd();
+        }
+        if (count != check)
+            mismatches = count;
+        return count;
+    }
+
+    int counts() {
+        int count = 0;
+        for (int k = 0; k < cs.length; ++k) {
+            for (Iterator it = cs[k].iterator(); it.hasNext();) {
+                if (it.next() != null)
+                    ++count;
+            }
+        }
+        return count;
+    }
+
+    void maybeAdd() {
+        int r = randomSeed;
+        r ^= r << 6;
+        r ^= r >>> 21;
+        r ^= r << 7;
+        randomSeed = r;
+        if ((r >>> 29) == 0)
+            cs[r & (cs.length-1)].add(new Integer(elementCount++));
+    }
+
+    void preload(int n) {
+        for (int i = 0; i < cs.length; ++i)
+            cs[i].clear();
+        int k = (n - n / 8) / 2;
+        ArrayList al = new ArrayList(k+1);
+        for (int i = 0; i < cs.length; ++i) {
+            if (k > 0) {
+                for (int j = 0; j < k; ++j)
+                    al.add(new Integer(elementCount++));
+                cs[i].addAll(al);
+                al.clear();
+            }
+            k >>>= 1;
+        }
+        // let GC settle down
+        try { Thread.sleep(500); } catch(Exception ex) { return; }
+    }
+
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/LastKeyOfSubMap.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/LastKeyOfSubMap.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/LastKeyOfSubMap.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,43 @@
+// from bug report 5018354
+import edu.emory.mathcs.backport.java.util.*;
+import java.util.Comparator;
+import java.util.SortedMap;
+
+public class LastKeyOfSubMap {
+    private static final Comparator NULL_AT_END = new Comparator() {
+            /**
+             * Allows for nulls.  Null is greater than anything non-null.
+             */
+            public int compare(Object pObj1, Object pObj2) {
+                if (pObj1 == null && pObj2 == null) return 0;
+                if (pObj1 == null && pObj2 != null) return 1;
+                if (pObj1 != null && pObj2 == null) return -1;
+                return ((Comparable) pObj1).compareTo(pObj2);
+            }
+        };
+
+
+    public static void main(String[] pArgs) {
+        SortedMap m1 = new TreeMap(NULL_AT_END);
+        m1.put("a", "a");
+        m1.put("b", "b");
+        m1.put("c", "c");
+        m1.put(null, "d");
+
+        SortedMap m2 = new TreeMap(m1);
+
+        System.out.println(m1.lastKey());
+        System.out.println(m1.get(m1.lastKey()));
+        Object m1lk = m1.remove(m1.lastKey());
+        if (m1lk == null)
+            throw new Error("bad remove of last key");
+
+        m2 = m2.tailMap("b");
+
+        System.out.println(m2.lastKey());
+        System.out.println(m2.get(m2.lastKey()));
+        Object m2lk = m2.remove(m2.lastKey());
+        if (m2lk == null)
+            throw new Error("bad remove of last key");
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/ListBash.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/ListBash.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/ListBash.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,298 @@
+/*
+ * Written by Josh Bloch and Doug Lea with assistance from members of
+ * JCP JSR-166 Expert Group and released to the public domain, as
+ * explained at http://creativecommons.org/licenses/publicdomain
+ */
+
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.Utils;
+import java.util.Random;
+import java.util.List;
+import java.util.Iterator;
+import java.util.ListIterator;
+import java.util.Arrays;
+
+public class ListBash {
+    static boolean canRemove = true;
+    static final Random rnd = new Random();
+    static int numItr;
+    static int listSize;
+    static boolean synch;
+    static Class cl;
+
+    public static void main(String[] args) {
+        numItr = Integer.parseInt(args[1]);
+        listSize = Integer.parseInt(args[2]);
+        cl = null;
+
+        try {
+            cl = Class.forName(args[0]);
+        } catch(ClassNotFoundException e) {
+            fail("Class " + args[0] + " not found.");
+        }
+
+        synch = (args.length>3);
+        oneRun();
+        oneRun();
+        oneRun();
+    }
+
+    static void oneRun() {
+        long startTime = Utils.nanoTime();
+        for (int i=0; i<numItr; i++) {
+            elementLoop();
+        }
+        List s = newList(cl, synch);
+        for (int i=0; i<listSize; i++)
+            s.add(new Integer(i));
+        if (s.size() != listSize)
+            fail("Size of [0..n-1] != n");
+        evenOdd(s);
+        sublists(s);
+        arrays();
+        long elapsed = Utils.nanoTime() - startTime;
+        System.out.println("Time: " + (elapsed/1000000000.0) + "s");
+    }
+
+
+
+    static void elementLoop() {
+        List s1 = newList(cl, synch);
+        AddRandoms(s1, listSize);
+
+        List s2 = newList(cl, synch);
+        AddRandoms(s2, listSize);
+
+        sets(s1, s2);
+
+        s1.clear();
+        if (s1.size() != 0)
+            fail("Clear didn't reduce size to zero.");
+
+        s1.addAll(0, s2);
+        if (!(s1.equals(s2) && s2.equals(s1)))
+            fail("addAll(int, Collection) doesn't work.");
+        // Reverse List
+        for (int j=0, n=s1.size(); j<n; j++)
+            s1.set(j, s1.set(n-j-1, s1.get(j)));
+        // Reverse it again
+        for (int j=0, n=s1.size(); j<n; j++)
+            s1.set(j, s1.set(n-j-1, s1.get(j)));
+        if (!(s1.equals(s2) && s2.equals(s1)))
+            fail("set(int, Object) doesn't work");
+        sums(s1, s2);
+    }
+
+    static void sums(List s1, List s2) {
+        int sum = 0;
+        for (int k = 0; k < listSize; ++k) {
+            sum += ((Integer)s1.get(k)).intValue();
+            sum -= ((Integer)s2.get(k)).intValue();
+        }
+        for (int k = 0; k < listSize; ++k) {
+            sum += ((Integer)s1.get(k)).intValue();
+            s1.set(k, new Integer(sum));
+            sum -= ((Integer)s2.get(k)).intValue();
+            s1.set(k, new Integer(-sum));
+        }
+        for (int k = 0; k < listSize; ++k) {
+            sum += ((Integer)s1.get(k)).intValue();
+            sum -= ((Integer)s2.get(k)).intValue();
+        }
+        if (sum == 0) System.out.print(" ");
+    }
+
+    static void sets(List s1, List s2) {
+        List intersection = clone(s1, cl,synch);intersection.retainAll(s2);
+        List diff1 = clone(s1, cl, synch); diff1.removeAll(s2);
+        List diff2 = clone(s2, cl, synch); diff2.removeAll(s1);
+        List union = clone(s1, cl, synch); union.addAll(s2);
+
+        if (diff1.removeAll(diff2))
+            fail("List algebra identity 2 failed");
+        if (diff1.removeAll(intersection))
+            fail("List algebra identity 3 failed");
+        if (diff2.removeAll(diff1))
+            fail("List algebra identity 4 failed");
+        if (diff2.removeAll(intersection))
+            fail("List algebra identity 5 failed");
+        if (intersection.removeAll(diff1))
+            fail("List algebra identity 6 failed");
+        if (intersection.removeAll(diff1))
+            fail("List algebra identity 7 failed");
+
+        intersection.addAll(diff1); intersection.addAll(diff2);
+        if (!(intersection.containsAll(union) &&
+              union.containsAll(intersection)))
+            fail("List algebra identity 1 failed");
+
+        Iterator e = union.iterator();
+        while (e.hasNext())
+            intersection.remove(e.next());
+        if (!intersection.isEmpty())
+            fail("Copy nonempty after deleting all elements.");
+
+        e = union.iterator();
+        while (e.hasNext()) {
+            Object o = e.next();
+            if (!union.contains(o))
+                fail("List doesn't contain one of its elements.");
+            if (canRemove) {
+                try { e.remove();
+                } catch (UnsupportedOperationException uoe) {
+                    canRemove = false;
+                }
+            }
+        }
+        if (canRemove && !union.isEmpty())
+            fail("List nonempty after deleting all elements.");
+    }
+
+    static void evenOdd(List s) {
+        List even = clone(s, cl, synch);
+        List odd = clone(s, cl, synch);
+        List all;
+        Iterator it;
+
+        if (!canRemove)
+            all = clone(s, cl, synch);
+        else {
+            it = even.iterator();
+            while(it.hasNext())
+                if(((Integer)it.next()).intValue() % 2 == 1)
+                    it.remove();
+            it = even.iterator();
+            while(it.hasNext())
+                if(((Integer)it.next()).intValue() % 2 == 1)
+                    fail("Failed to remove all odd nubmers.");
+
+            for (int i=0; i<(listSize/2); i++)
+                odd.remove(i);
+            for (int i=0; i<(listSize/2); i++) {
+                int ii = ((Integer)odd.get(i)).intValue();
+                if(ii % 2 != 1)
+                    fail("Failed to remove all even nubmers. " + ii);
+            }
+
+            all = clone(odd, cl, synch);
+            for (int i=0; i<(listSize/2); i++)
+                all.add(2*i, even.get(i));
+            if (!all.equals(s))
+                fail("Failed to reconstruct ints from odds and evens.");
+
+            all = clone(odd,  cl, synch);
+            ListIterator itAll = all.listIterator(all.size());
+            ListIterator itEven = even.listIterator(even.size());
+            while (itEven.hasPrevious()) {
+                itAll.previous();
+                itAll.add(itEven.previous());
+                itAll.previous(); // ???
+            }
+            itAll = all.listIterator();
+            while (itAll.hasNext()) {
+                Integer i = (Integer)itAll.next();
+                itAll.set(new Integer(i.intValue()));
+            }
+            itAll = all.listIterator();
+            it = s.iterator();
+            while(it.hasNext())
+                if(it.next()==itAll.next())
+                    fail("Iterator.set failed to change value.");
+        }
+        if (!all.equals(s))
+            fail("Failed to reconstruct ints with ListIterator.");
+    }
+
+    static void sublists(List s) {
+        List all = clone(s, cl, synch);
+        Iterator it = all.listIterator();
+        int i=0;
+        while (it.hasNext()) {
+            Object o = it.next();
+            if (all.indexOf(o) != all.lastIndexOf(o))
+                fail("Apparent duplicate detected.");
+            if (all.subList(i,   all.size()).indexOf(o) != 0) {
+                System.out.println("s0: " + all.subList(i,   all.size()).indexOf(o));
+                fail("subList/indexOf is screwy.");
+            }
+            if (all.subList(i+1, all.size()).indexOf(o) != -1) {
+                System.out.println("s-1: " + all.subList(i+1, all.size()).indexOf(o));
+                fail("subList/indexOf is screwy.");
+            }
+            if (all.subList(0,i+1).lastIndexOf(o) != i) {
+                System.out.println("si" + all.subList(0,i+1).lastIndexOf(o));
+                fail("subList/lastIndexOf is screwy.");
+            }
+            i++;
+        }
+    }
+
+    static void arrays() {
+        List l = newList(cl, synch);
+        AddRandoms(l, listSize);
+        Integer[] ia = (Integer[]) l.toArray(new Integer[0]);
+        if (!l.equals(Arrays.asList(ia)))
+            fail("toArray(Object[]) is hosed (1)");
+        ia = new Integer[listSize];
+        Integer[] ib = (Integer[]) l.toArray(ia);
+        if (ia != ib || !l.equals(Arrays.asList(ia)))
+            fail("toArray(Object[]) is hosed (2)");
+        ia = new Integer[listSize+1];
+        ia[listSize] = new Integer(69);
+        ib = (Integer[]) l.toArray(ia);
+        if (ia != ib || ia[listSize] != null
+            || !l.equals(Arrays.asList(ia).subList(0, listSize)))
+            fail("toArray(Object[]) is hosed (3)");
+    }
+
+    // Done inefficiently so as to exercise toArray
+    static List clone(List s, Class cl, boolean synch) {
+        List a = Arrays.asList(s.toArray());
+        if (s.hashCode() != a.hashCode())
+            fail("Incorrect hashCode computation.");
+
+        List clone = newList(cl, synch);
+        clone.addAll(a);
+        if (!s.equals(clone))
+            fail("List not equal to copy.");
+        if (!s.containsAll(clone))
+            fail("List does not contain copy.");
+        if (!clone.containsAll(s))
+            fail("Copy does not contain list.");
+
+        return (List)clone;
+    }
+
+    static List newList(Class cl, boolean synch) {
+        try {
+            List s = (List)cl.newInstance();
+            if (synch)
+                s = Collections.synchronizedList(s);
+            if (!s.isEmpty())
+                fail("New instance non empty.");
+            return s;
+        } catch(Throwable t) {
+            fail("Can't instantiate " + cl + ": " + t);
+        }
+        return null; //Shut up compiler.
+    }
+
+    static void AddRandoms(List s, int n) {
+        for (int i=0; i<n; i++) {
+            int r = rnd.nextInt() % n;
+            Integer e = new Integer(r < 0 ? -r : r);
+
+            int preSize = s.size();
+            if (!s.add(e))
+                fail ("Add failed.");
+            int postSize = s.size();
+            if (postSize-preSize != 1)
+                fail ("Add didn't increase size by 1.");
+        }
+    }
+
+    static void fail(String s) {
+        System.out.println(s);
+        System.exit(1);
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/LockLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/LockLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/LockLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,383 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+/*
+ * A simple test program. Feel free to play.
+ */
+
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import edu.emory.mathcs.backport.java.util.*;
+
+public final class LockLoops {
+    static final ExecutorService pool = Executors.newCachedThreadPool();
+    static final LoopHelpers.SimpleRandom rng = new LoopHelpers.SimpleRandom();
+    static boolean print = false;
+    static boolean doBuiltin = true;
+    static boolean doReadWrite = true;
+    static boolean doSemaphore = true;
+    static boolean doFair =  true;
+
+    public static void main(String[] args) throws Exception {
+        int maxThreads = 100;
+        int iters = 1000000;
+        int replications = 1;
+
+        if (args.length > 0)
+            maxThreads = Integer.parseInt(args[0]);
+
+        if (args.length > 1)
+            iters = Integer.parseInt(args[1]);
+
+        if (args.length > 2)
+            replications = Integer.parseInt(args[2]);
+
+        rng.setSeed(3122688L);
+
+        print = false;
+        System.out.println("Warmup...");
+        oneTest(3, 10000);
+        Thread.sleep(1000);
+        oneTest(2, 10000);
+        Thread.sleep(100);
+        oneTest(1, 100000);
+        Thread.sleep(100);
+        oneTest(1, 100000);
+        Thread.sleep(1000);
+        print = true;
+
+        for (int i = 1; i <= maxThreads; ++i) {
+            for (int j = 0; j < replications; ++j) {
+                System.out.println("Threads:" + i);
+                oneTest(i, iters / i);
+                Thread.sleep(100);
+            }
+        }
+        pool.shutdown();
+    }
+
+    static void oneTest(int nthreads, int iters) throws Exception {
+        int v = rng.next();
+
+        if (print)
+            System.out.print("No shared vars        ");
+        new NoLockLoop().test(v, nthreads, iters * 10);
+        Thread.sleep(10);
+
+        if (print)
+            System.out.print("No Lock + volatile    ");
+        new NoLockVolatileLoop().test(v, nthreads, iters);
+        Thread.sleep(10);
+
+        if (doBuiltin) {
+            if (print)
+                System.out.print("builtin lock          ");
+            new BuiltinLockLoop().test(v, nthreads, iters);
+            Thread.sleep(10);
+        }
+
+        if (print)
+            System.out.print("ReentrantLock         ");
+        new ReentrantLockLoop().test(v, nthreads, iters);
+        Thread.sleep(10);
+
+        if (doReadWrite) {
+            if (print)
+                System.out.print("ReentrantWriteLock    ");
+            new ReentrantWriteLockLoop().test(v, nthreads, iters);
+            Thread.sleep(10);
+
+            if (print)
+                System.out.print("ReentrantReadWriteLock");
+            new ReentrantReadWriteLockLoop().test(v, nthreads, iters);
+            Thread.sleep(10);
+
+        }
+
+        if (doSemaphore) {
+            if (print)
+                System.out.print("Semaphore             ");
+            new SemaphoreLoop().test(v, nthreads, iters);
+            Thread.sleep(10);
+
+            if (print)
+                System.out.print("FairSemaphore         ");
+            new FairSemaphoreLoop().test(v, nthreads, iters);
+            Thread.sleep(10);
+
+        }
+
+        if (doFair) {
+            if (print)
+                System.out.print("FairReentrantLock     ");
+            new FairReentrantLockLoop().test(v, nthreads, iters);
+            Thread.sleep(10);
+
+            if (doReadWrite) {
+//                if (print)
+//                    System.out.print("FairRWriteLock         ");
+//                new FairReentrantWriteLockLoop().test(v, nthreads, iters);
+//                Thread.sleep(10);
+
+//                if (print)
+//                    System.out.print("FairRReadWriteLock     ");
+//                new FairReentrantReadWriteLockLoop().test(v, nthreads, iters);
+//                Thread.sleep(10);
+            }
+
+        }
+
+    }
+
+    static abstract class LockLoop implements Runnable {
+        int v;
+        int iters;
+        volatile int result;
+        final LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
+        CyclicBarrier barrier;
+
+        final void test(int initialValue, int nthreads, int iters) throws Exception {
+            v = initialValue;
+            this.iters = iters;
+            barrier = new CyclicBarrier(nthreads+1, timer);
+            for (int i = 0; i < nthreads; ++i)
+                pool.execute(this);
+            barrier.await();
+            barrier.await();
+            long time = timer.getTime();
+            if (print) {
+                long tpi = time / (iters * nthreads);
+                System.out.print("\t" + LoopHelpers.rightJustify(tpi) + " ns per update");
+                //                double secs = (double)(time) / 1000000000.0;
+                //                System.out.print("\t " + secs + "s run time");
+                System.out.println();
+            }
+
+            if (result == 0) // avoid overoptimization
+                System.out.println("useless result: " + result);
+        }
+        abstract int loop(int n);
+        public final void run() {
+            try {
+                barrier.await();
+                result += loop(iters);
+                barrier.await();
+            }
+            catch (Exception ie) {
+                return;
+            }
+        }
+
+    }
+
+    private static class BuiltinLockLoop extends LockLoop {
+        final int loop(int n) {
+            int sum = 0;
+            while (n-- > 0) {
+                synchronized(this) {
+                    v = LoopHelpers.compute1(v);
+                }
+                sum += LoopHelpers.compute2(v);
+            }
+            return sum;
+        }
+    }
+
+    private static class NoLockLoop extends LockLoop {
+        final int loop(int n) {
+            int sum = 0;
+            int y = v;
+            while (n-- > 0) {
+                y = LoopHelpers.compute1(y);
+                sum += LoopHelpers.compute2(y);
+            }
+            return sum;
+        }
+    }
+
+    private static class NoLockVolatileLoop extends LockLoop {
+        volatile private int vv;
+        final int loop(int n) {
+            int sum = 0;
+            while (n-- > 0) {
+                int y = LoopHelpers.compute1(vv);
+                vv = y;
+                sum += LoopHelpers.compute2(y);
+            }
+            return sum;
+        }
+    }
+
+    private static class ReentrantLockLoop extends LockLoop {
+        final private ReentrantLock lock = new ReentrantLock();
+        final int loop(int n) {
+            int sum = 0;
+            while (n-- > 0) {
+                lock.lock();
+                try {
+                    v = LoopHelpers.compute1(v);
+                }
+                finally {
+                    lock.unlock();
+                }
+                sum += LoopHelpers.compute2(v);
+            }
+            return sum;
+        }
+    }
+
+    private static class FairReentrantLockLoop extends LockLoop {
+        final private ReentrantLock lock = new ReentrantLock(true);
+        final int loop(int n) {
+            int sum = 0;
+            while (n-- > 0) {
+                lock.lock();
+                try {
+                    v = LoopHelpers.compute1(v);
+                }
+                finally {
+                    lock.unlock();
+                }
+                sum += LoopHelpers.compute2(v);
+            }
+            return sum;
+        }
+    }
+
+    private static class ReentrantWriteLockLoop extends LockLoop {
+        final private Lock lock = new ReentrantReadWriteLock().writeLock();
+        final int loop(int n) {
+            int sum = 0;
+            while (n-- > 0) {
+                lock.lock();
+                try {
+                    v = LoopHelpers.compute1(v);
+                }
+                finally {
+                    lock.unlock();
+                }
+                sum += LoopHelpers.compute2(v);
+            }
+            return sum;
+        }
+    }
+
+    private static class ReentrantReadWriteLockLoop extends LockLoop {
+        final private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        final int loop(int n) {
+            int sum = 0;
+            while (n-- > 0) {
+                int x;
+                lock.readLock().lock();
+                try {
+                    x = LoopHelpers.compute1(v);
+                }
+                finally {
+                    lock.readLock().unlock();
+                }
+                lock.writeLock().lock();
+                try {
+                    v = x;
+                }
+                finally {
+                    lock.writeLock().unlock();
+                }
+                sum += LoopHelpers.compute2(v);
+            }
+            return sum;
+        }
+    }
+
+//    private static class FairReentrantWriteLockLoop extends LockLoop {
+//        final Lock lock = new ReentrantReadWriteLock(true).writeLock();
+//        final int loop(int n) {
+//            int sum = 0;
+//            while (n-- > 0) {
+//                lock.lock();
+//                try {
+//                    v = LoopHelpers.compute1(v);
+//                }
+//                finally {
+//                    lock.unlock();
+//                }
+//                sum += LoopHelpers.compute2(v);
+//            }
+//            return sum;
+//        }
+//    }
+//
+    private static class SemaphoreLoop extends LockLoop {
+        final private Semaphore sem = new Semaphore(1, false);
+        final int loop(int n) {
+            int sum = 0;
+            try {
+                while (n-- > 0) {
+                    sem.acquire();
+                    try {
+                        v = LoopHelpers.compute1(v);
+                    }
+                    finally {
+                        sem.release();
+                    }
+                    sum += LoopHelpers.compute2(v);
+                }
+            }
+            catch (InterruptedException ie) {
+                return sum;
+            }
+            return sum;
+        }
+    }
+    private static class FairSemaphoreLoop extends LockLoop {
+        final private Semaphore sem = new Semaphore(1, true);
+        final int loop(int n) {
+            int sum = 0;
+            try {
+                while (n-- > 0) {
+                    sem.acquire();
+                    try {
+                        v = LoopHelpers.compute1(v);
+                    }
+                    finally {
+                        sem.release();
+                    }
+                    sum += LoopHelpers.compute2(v);
+                }
+            }
+            catch (InterruptedException ie) {
+                return sum;
+            }
+            return sum;
+        }
+    }
+
+//    private static class FairReentrantReadWriteLockLoop extends LockLoop {
+//        final private ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);
+//        final int loop(int n) {
+//            int sum = 0;
+//            while (n-- > 0) {
+//                int x;
+//                lock.readLock().lock();
+//                try {
+//                    x = LoopHelpers.compute1(v);
+//                }
+//                finally {
+//                    lock.readLock().unlock();
+//                }
+//                lock.writeLock().lock();
+//                try {
+//                    v = x;
+//                }
+//                finally {
+//                    lock.writeLock().unlock();
+//                }
+//                sum += LoopHelpers.compute2(v);
+//            }
+//            return sum;
+//        }
+//    }
+//
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/LockOncePerThreadLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/LockOncePerThreadLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/LockOncePerThreadLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,99 @@
+/*
+ * @test
+ * @summary Checks for missed signals by locking and unlocking each of an array of locks once per thread
+ */
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain. Use, modify, and
+ * redistribute this code in any way without acknowledgement.
+ */
+
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import edu.emory.mathcs.backport.java.util.*;
+
+public final class LockOncePerThreadLoops {
+    static final ExecutorService pool = Executors.newCachedThreadPool();
+    static final LoopHelpers.SimpleRandom rng = new LoopHelpers.SimpleRandom();
+    static boolean print = false;
+    static int nlocks = 500000;
+    static int nthreads = 100;
+    static int replications = 20;
+
+    public static void main(String[] args) throws Exception {
+        if (args.length > 0) 
+            replications = Integer.parseInt(args[0]);
+
+        if (args.length > 1) 
+            nlocks = Integer.parseInt(args[1]);
+
+        print = true;
+
+        for (int i = 0; i < replications; ++i) {
+            System.out.print("Iteration: " + i);
+            new ReentrantLockLoop().test();
+            Thread.sleep(100);
+        }
+        pool.shutdown();
+    }
+
+    static final class ReentrantLockLoop implements Runnable {
+        private int v = rng.next();
+        private volatile int result = 17;
+        final ReentrantLock[]locks = new ReentrantLock[nlocks];
+
+        private final ReentrantLock lock = new ReentrantLock();
+        private final LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
+        private final CyclicBarrier barrier;
+        ReentrantLockLoop() {
+            barrier = new CyclicBarrier(nthreads+1, timer);
+            for (int i = 0; i < nlocks; ++i)
+                locks[i] = new ReentrantLock();
+        }
+
+        final void test() throws Exception {
+            for (int i = 0; i < nthreads; ++i) 
+                pool.execute(this);
+            barrier.await();
+            barrier.await();
+            if (print) {
+                long time = timer.getTime();
+                double secs = (double)(time) / 1000000000.0;
+                System.out.println("\t " + secs + "s run time");
+            }
+
+            int r = result;
+            if (r == 0) // avoid overoptimization
+                System.out.println("useless result: " + r);
+        }
+
+        public final void run() {
+            try {
+                barrier.await(); 
+                int sum = v;
+                int x = 0;
+                for (int i = 0; i < locks.length; ++i) {
+                    locks[i].lock();
+                    try {
+                            v = x += ~(v - i);
+                    }
+                    finally {
+                        locks[i].unlock();
+                    }
+                    // Once in a while, do something more expensive
+                    if ((~i & 255) == 0) {
+                        sum += LoopHelpers.compute1(LoopHelpers.compute2(x));
+                    }
+                    else
+                        sum += sum ^ x;
+                }
+                barrier.await();
+                result += sum;
+            }
+            catch (Exception ie) { 
+                return; 
+            }
+        }
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/LoopHelpers.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/LoopHelpers.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/LoopHelpers.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,202 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+/**
+ * Misc utilities in JSR166 performance tests
+ */
+
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.atomic.*;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.Utils;
+
+class LoopHelpers {
+
+    static final SimpleRandom staticRNG = new SimpleRandom();
+
+    // Some mindless computation to do between synchronizations...
+
+    /**
+     * generates 32 bit pseudo-random numbers.
+     * Adapted from http://www.snippets.org
+     */
+    public static int compute1(int x) {
+        int lo = 16807 * (x & 0xFFFF);
+        int hi = 16807 * (x >>> 16);
+        lo += (hi & 0x7FFF) << 16;
+        if ((lo & 0x80000000) != 0) {
+            lo &= 0x7fffffff;
+            ++lo;
+        }
+        lo += hi >>> 15;
+        if (lo == 0 || (lo & 0x80000000) != 0) {
+            lo &= 0x7fffffff;
+            ++lo;
+        }
+        return lo;
+    }
+
+    /**
+     *  Computes a linear congruential random number a random number
+     *  of times.
+     */
+    public static int compute2(int x) {
+        int loops = (x >>> 4) & 7;
+        while (loops-- > 0) {
+            x = (x * 2147483647) % 16807;
+        }
+        return x;
+    }
+
+    /**
+     * Yet another random number generator
+     */
+    public static int compute3(int x) {
+        int t = (x % 127773) * 16807 - (x / 127773) * 2836;
+        return (t > 0)? t : t + 0x7fffffff;
+    }
+
+    /**
+     * Yet another random number generator
+     */
+    public static int compute4(int x) {
+        return x * 134775813 + 1;
+    }
+
+
+    /**
+     * Yet another random number generator
+     */
+    public static int compute5(int x) {
+        return 36969 * (x & 65535) + (x >> 16);
+    }
+
+    /**
+     * Marsaglia xorshift (1, 3, 10)
+     */
+    public static int compute6(int seed) {
+        seed ^= seed << 1;
+        seed ^= seed >>> 3;
+        seed ^= (seed << 10);
+        return seed;
+    }
+
+    /**
+     * Marsaglia xorshift (6, 21, 7)
+     */
+    public static int compute7(int y) {
+        y ^= y << 6;
+        y ^= y >>> 21;
+        y ^= (y << 7);
+        return y;
+    }
+
+
+    /**
+     * Marsaglia xorshift for longs
+     */
+    public static long compute8(long x) {
+        x ^= x << 13;
+        x ^= x >>> 7;
+        x ^= (x << 17);
+        return x;
+    }
+
+    public static final class XorShift32Random {
+        static final AtomicInteger seq = new AtomicInteger(8862213);
+        int x = -1831433054;
+        public XorShift32Random(int seed) { x = seed;  }
+        public XorShift32Random() {
+            this((int)Utils.nanoTime() + seq.getAndAdd(129));
+        }
+        public int next() {
+            x ^= x << 6;
+            x ^= x >>> 21;
+            x ^= (x << 7);
+            return x;
+        }
+    }
+
+
+    /** Multiplication-free RNG from Marsaglia "Xorshift RNGs" paper */
+    public static final class MarsagliaRandom {
+        static final AtomicInteger seq = new AtomicInteger(3122688);
+        int x;
+        int y = 842502087;
+        int z = -715159705;
+        int w = 273326509;
+        public MarsagliaRandom(int seed) { x = seed; }
+        public MarsagliaRandom() {
+            this((int)Utils.nanoTime() + seq.getAndAdd(129));
+        }
+        public int next() {
+            int t = x ^ (x << 11);
+            x = y;
+            y = z;
+            z = w;
+            return w = (w ^ (w >>> 19) ^ (t ^ (t >>> 8)));
+        }
+    }
+
+    /**
+     * Unsynchronized version of java.util.Random algorithm.
+     */
+    public static final class SimpleRandom {
+        private final static long multiplier = 0x5DEECE66DL;
+        private final static long addend = 0xBL;
+        private final static long mask = (1L << 48) - 1;
+        static final AtomicLong seq = new AtomicLong( -715159705);
+        private long seed;
+
+        SimpleRandom(long s) {
+            seed = s;
+        }
+
+        SimpleRandom() {
+            seed = Utils.nanoTime() + seq.getAndAdd(129);
+        }
+
+        public void setSeed(long s) {
+            seed = s;
+        }
+
+        public int next() {
+            long nextseed = (seed * multiplier + addend) & mask;
+            seed = nextseed;
+            return ((int)(nextseed >>> 17)) & 0x7FFFFFFF;
+        }
+    }
+
+    public static class BarrierTimer implements Runnable {
+        volatile boolean started;
+        volatile long startTime;
+        volatile long endTime;
+        public void run() {
+            long t = Utils.nanoTime();
+            if (!started) {
+                started = true;
+                startTime = t;
+            } else
+                endTime = t;
+        }
+        public void clear() {
+            started = false;
+        }
+        public long getTime() {
+            return endTime - startTime;
+        }
+    }
+
+    public static String rightJustify(long n) {
+        // There's probably a better way to do this...
+        String field = "         ";
+        String num = Long.toString(n);
+        if (num.length() >= field.length())
+            return num;
+        StringBuffer b = new StringBuffer(field);
+        b.replace(b.length()-num.length(), b.length(), num);
+        return b.toString();
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/MapCheck.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/MapCheck.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/MapCheck.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,600 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+/**
+ * @test
+ * @synopsis Times and checks basic map operations
+ */
+import edu.emory.mathcs.backport.java.util.*;
+import java.io.*;
+import java.util.Map;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.Random;
+import java.util.IdentityHashMap;
+import java.util.Enumeration;
+
+public class MapCheck {
+
+    static final int absentSize = 1 << 17;
+    static final int absentMask = absentSize - 1;
+    static Object[] absent = new Object[absentSize];
+
+    static final Object MISSING = new Object();
+
+    static TestTimer timer = new TestTimer();
+
+    static void reallyAssert(boolean b) {
+        if (!b) throw new Error("Failed Assertion");
+    }
+
+    public static void main(String[] args) throws Exception {
+        Class mapClass = edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap.class;
+        int numTests = 50;
+        int size = 50000;
+
+        if (args.length > 0) {
+            try {
+                mapClass = Class.forName(args[0]);
+            } catch(ClassNotFoundException e) {
+                throw new RuntimeException("Class " + args[0] + " not found.");
+            }
+        }
+
+
+        if (args.length > 1)
+            numTests = Integer.parseInt(args[1]);
+
+        if (args.length > 2)
+            size = Integer.parseInt(args[2]);
+
+        boolean doSerializeTest = args.length > 3;
+
+        System.out.println("Testing " + mapClass.getName() + " trials: " + numTests + " size: " + size);
+
+        for (int i = 0; i < absentSize; ++i) absent[i] = new Object();
+
+        Object[] key = new Object[size];
+        for (int i = 0; i < size; ++i) key[i] = new Object();
+
+        forceMem(size * 8);
+
+        for (int rep = 0; rep < numTests; ++rep) {
+            runTest(newMap(mapClass), key);
+        }
+
+        TestTimer.printStats();
+
+
+        if (doSerializeTest)
+            stest(newMap(mapClass), size);
+    }
+
+    static Map newMap(Class cl) {
+        try {
+            Map m = (Map)cl.newInstance();
+            return m;
+        } catch(Exception e) {
+            throw new RuntimeException("Can't instantiate " + cl + ": " + e);
+        }
+    }
+
+
+    static void runTest(Map s, Object[] key) {
+        shuffle(key);
+        int size = key.length;
+        long startTime = System.currentTimeMillis();
+        test(s, key);
+        long time = System.currentTimeMillis() - startTime;
+    }
+
+    static void forceMem(int n) {
+        // force enough memory
+        Long[] junk = new Long[n];
+        for (int i = 0; i < junk.length; ++i) junk[i] = new Long(i);
+        int sum = 0;
+        for (int i = 0; i < junk.length; ++i)
+            sum += (int)(junk[i].longValue() + i);
+        if (sum == 0) System.out.println("Useless number = " + sum);
+        junk = null;
+        //        System.gc();
+    }
+
+
+    static void t1(String nm, int n, Map s, Object[] key, int expect) {
+        int sum = 0;
+        int iters = 4;
+        timer.start(nm, n * iters);
+        for (int j = 0; j < iters; ++j) {
+            for (int i = 0; i < n; i++) {
+                if (s.get(key[i]) != null) ++sum;
+            }
+        }
+        timer.finish();
+        reallyAssert (sum == expect * iters);
+    }
+
+    static void t2(String nm, int n, Map s, Object[] key, int expect) {
+        int sum = 0;
+        timer.start(nm, n);
+        for (int i = 0; i < n; i++) {
+            if (s.remove(key[i]) != null) ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == expect);
+    }
+
+    static void t3(String nm, int n, Map s, Object[] key, int expect) {
+        int sum = 0;
+        timer.start(nm, n);
+        for (int i = 0; i < n; i++) {
+            if (s.put(key[i], absent[i & absentMask]) == null) ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == expect);
+    }
+
+    static void t4(String nm, int n, Map s, Object[] key, int expect) {
+        int sum = 0;
+        timer.start(nm, n);
+        for (int i = 0; i < n; i++) {
+            if (s.containsKey(key[i])) ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == expect);
+    }
+
+    static void t5(String nm, int n, Map s, Object[] key, int expect) {
+        int sum = 0;
+        timer.start(nm, n/2);
+        for (int i = n-2; i >= 0; i-=2) {
+            if (s.remove(key[i]) != null) ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == expect);
+    }
+
+    static void t6(String nm, int n, Map s, Object[] k1, Object[] k2) {
+        int sum = 0;
+        timer.start(nm, n * 2);
+        for (int i = 0; i < n; i++) {
+            if (s.get(k1[i]) != null) ++sum;
+            if (s.get(k2[i & absentMask]) != null) ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == n);
+    }
+
+    static void t7(String nm, int n, Map s, Object[] k1, Object[] k2) {
+        int sum = 0;
+        timer.start(nm, n * 2);
+        for (int i = 0; i < n; i++) {
+            if (s.containsKey(k1[i])) ++sum;
+            if (s.containsKey(k2[i & absentMask])) ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == n);
+    }
+
+    static void t8(String nm, int n, Map s, Object[] key, int expect) {
+        int sum = 0;
+        timer.start(nm, n);
+        for (int i = 0; i < n; i++) {
+            if (s.get(key[i]) != null) ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == expect);
+    }
+
+
+    static void t9(Map s) {
+        int sum = 0;
+        int iters = 20;
+        timer.start("ContainsValue (/n)     ", iters * s.size());
+        int step = absentSize / iters;
+        for (int i = 0; i < absentSize; i += step)
+            if (s.containsValue(absent[i])) ++sum;
+        timer.finish();
+        reallyAssert (sum != 0);
+    }
+
+
+    static void ktest(Map s, int size, Object[] key) {
+        timer.start("ContainsKey            ", size);
+        Set ks = s.keySet();
+        int sum = 0;
+        for (int i = 0; i < size; i++) {
+            if (ks.contains(key[i])) ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == size);
+    }
+
+
+    static void ittest1(Map s, int size) {
+        int sum = 0;
+        timer.start("Iter Key               ", size);
+        for (Iterator it = s.keySet().iterator(); it.hasNext(); ) {
+            if(it.next() != MISSING)
+                ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == size);
+    }
+
+    static void ittest2(Map s, int size) {
+        int sum = 0;
+        timer.start("Iter Value             ", size);
+        for (Iterator it = s.values().iterator(); it.hasNext(); ) {
+            if(it.next() != MISSING)
+                ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == size);
+    }
+    static void ittest3(Map s, int size) {
+        int sum = 0;
+        int hsum = 0;
+        timer.start("Iter Entry             ", size);
+        for (Iterator it = s.entrySet().iterator(); it.hasNext(); ) {
+            Map.Entry e = (Map.Entry)it.next();
+            if(e != MISSING) {
+                hsum += System.identityHashCode(e.getKey());
+                hsum += System.identityHashCode(e.getValue());
+                hsum >>>= 1;
+                ++sum;
+            }
+        }
+        timer.finish();
+        reallyAssert(size == 0 || hsum >= 0);
+        reallyAssert (sum == size);
+    }
+
+    static void ittest4(Map s, int size, int pos) {
+        IdentityHashMap seen = new IdentityHashMap(size);
+        reallyAssert (s.size() == size);
+        int sum = 0;
+        timer.start("Iter XEntry            ", size);
+        Iterator it = s.entrySet().iterator();
+        Object k = null;
+        Object v = null;
+        for (int i = 0; i < size-pos; ++i) {
+            Map.Entry x = (Map.Entry)(it.next());
+            k = x.getKey();
+            v = x.getValue();
+            seen.put(k, k);
+            if (x != MISSING)
+                ++sum;
+        }
+        reallyAssert (s.containsKey(k));
+        it.remove();
+        reallyAssert (!s.containsKey(k));
+        while (it.hasNext()) {
+            Map.Entry x = (Map.Entry)(it.next());
+            Object k2 = x.getKey();
+            seen.put(k2, k2);
+            if (x != MISSING)
+                ++sum;
+        }
+
+        reallyAssert (s.size() == size-1);
+        s.put(k, v);
+        reallyAssert (seen.size() == size);
+        timer.finish();
+        reallyAssert (sum == size);
+        reallyAssert (s.size() == size);
+    }
+
+
+    static void ittest(Map s, int size) {
+        ittest1(s, size);
+        ittest2(s, size);
+        ittest3(s, size);
+        //        for (int i = 0; i < size-1; ++i)
+        //            ittest4(s, size, i);
+    }
+
+    static void entest1(Hashtable ht, int size) {
+        int sum = 0;
+
+        timer.start("Iter Enumeration Key   ", size);
+        for (Enumeration en = ht.keys(); en.hasMoreElements(); ) {
+            if (en.nextElement() != MISSING)
+                ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == size);
+    }
+
+    static void entest2(Hashtable ht, int size) {
+        int sum = 0;
+        timer.start("Iter Enumeration Value ", size);
+        for (Enumeration en = ht.elements(); en.hasMoreElements(); ) {
+            if (en.nextElement() != MISSING)
+                ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == size);
+    }
+
+
+    static void entest3(Hashtable ht, int size) {
+        int sum = 0;
+
+        timer.start("Iterf Enumeration Key  ", size);
+        Enumeration en = ht.keys();
+        for (int i = 0; i < size; ++i) {
+            if (en.nextElement() != MISSING)
+                ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == size);
+    }
+
+    static void entest4(Hashtable ht, int size) {
+        int sum = 0;
+        timer.start("Iterf Enumeration Value", size);
+        Enumeration en = ht.elements();
+        for (int i = 0; i < size; ++i) {
+            if (en.nextElement() != MISSING)
+                ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == size);
+    }
+
+    static void entest(Map s, int size) {
+        if (s instanceof Hashtable) {
+            Hashtable ht = (Hashtable)s;
+            //            entest3(ht, size);
+            //            entest4(ht, size);
+            entest1(ht, size);
+            entest2(ht, size);
+            entest1(ht, size);
+            entest2(ht, size);
+            entest1(ht, size);
+            entest2(ht, size);
+        }
+    }
+
+    static void rtest(Map s, int size) {
+        timer.start("Remove (iterator)      ", size);
+        for (Iterator it = s.keySet().iterator(); it.hasNext(); ) {
+            it.next();
+            it.remove();
+        }
+        timer.finish();
+    }
+
+    static void rvtest(Map s, int size) {
+        timer.start("Remove (iterator)      ", size);
+        for (Iterator it = s.values().iterator(); it.hasNext(); ) {
+            it.next();
+            it.remove();
+        }
+        timer.finish();
+    }
+
+
+    static void dtest(Map s, int size, Object[] key) {
+        timer.start("Put (putAll)           ", size * 2);
+        Map s2 = null;
+        try {
+            s2 = (Map) (s.getClass().newInstance());
+            s2.putAll(s);
+        }
+        catch (Exception e) { e.printStackTrace(); return; }
+        timer.finish();
+
+        timer.start("Iter Equals            ", size * 2);
+        boolean eqt = s2.equals(s) && s.equals(s2);
+        reallyAssert (eqt);
+        timer.finish();
+
+        timer.start("Iter HashCode          ", size * 2);
+        int shc = s.hashCode();
+        int s2hc = s2.hashCode();
+        reallyAssert (shc == s2hc);
+        timer.finish();
+
+        timer.start("Put (present)          ", size);
+        s2.putAll(s);
+        timer.finish();
+
+        timer.start("Iter EntrySet contains ", size * 2);
+        Set es2 = s2.entrySet();
+        int sum = 0;
+        for (Iterator i1 = s.entrySet().iterator(); i1.hasNext(); ) {
+            Object entry = i1.next();
+            if (es2.contains(entry)) ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == size);
+
+        t6("Get                    ", size, s2, key, absent);
+
+        Object hold = s2.get(key[size-1]);
+        s2.put(key[size-1], absent[0]);
+        timer.start("Iter Equals            ", size * 2);
+        eqt = s2.equals(s) && s.equals(s2);
+        reallyAssert (!eqt);
+        timer.finish();
+
+        timer.start("Iter HashCode          ", size * 2);
+        int s1h = s.hashCode();
+        int s2h = s2.hashCode();
+        reallyAssert (s1h != s2h);
+        timer.finish();
+
+        s2.put(key[size-1], hold);
+        timer.start("Remove (iterator)      ", size * 2);
+        Iterator s2i = s2.entrySet().iterator();
+        Set es = s.entrySet();
+        while (s2i.hasNext())
+            es.remove(s2i.next());
+        timer.finish();
+
+        reallyAssert (s.isEmpty());
+
+        timer.start("Clear                  ", size);
+        s2.clear();
+        timer.finish();
+        reallyAssert (s2.isEmpty() && s.isEmpty());
+    }
+
+    static void stest(Map s, int size) throws Exception {
+        if (!(s instanceof Serializable))
+            return;
+        System.out.print("Serialize              : ");
+
+        for (int i = 0; i < size; i++) {
+            s.put(new Integer(i), Boolean.TRUE);
+        }
+
+        long startTime = System.currentTimeMillis();
+
+        FileOutputStream fs = new FileOutputStream("MapCheck.dat");
+        ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(fs));
+        out.writeObject(s);
+        out.close();
+
+        FileInputStream is = new FileInputStream("MapCheck.dat");
+        ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(is));
+        Map m = (Map)in.readObject();
+
+        long endTime = System.currentTimeMillis();
+        long time = endTime - startTime;
+
+        System.out.print(time + "ms");
+
+        if (s instanceof IdentityHashMap) return;
+        reallyAssert (s.equals(m));
+    }
+
+
+    static void test(Map s, Object[] key) {
+        int size = key.length;
+
+        t3("Put (absent)           ", size, s, key, size);
+        t3("Put (present)          ", size, s, key, 0);
+        t7("ContainsKey            ", size, s, key, absent);
+        t4("ContainsKey            ", size, s, key, size);
+        ktest(s, size, key);
+        t4("ContainsKey            ", absentSize, s, absent, 0);
+        t6("Get                    ", size, s, key, absent);
+        t1("Get (present)          ", size, s, key, size);
+        t1("Get (absent)           ", absentSize, s, absent, 0);
+        t2("Remove (absent)        ", absentSize, s, absent, 0);
+        t5("Remove (present)       ", size, s, key, size / 2);
+        t3("Put (half present)     ", size, s, key, size / 2);
+
+        ittest(s, size);
+        entest(s, size);
+        t9(s);
+        rtest(s, size);
+
+        t4("ContainsKey            ", size, s, key, 0);
+        t2("Remove (absent)        ", size, s, key, 0);
+        t3("Put (presized)         ", size, s, key, size);
+        dtest(s, size, key);
+    }
+
+    static class TestTimer {
+        private String name;
+        private long numOps;
+        private long startTime;
+        private String cname;
+
+        static final java.util.TreeMap accum = new java.util.TreeMap();
+
+        static void printStats() {
+            for (Iterator it = accum.entrySet().iterator(); it.hasNext(); ) {
+                Map.Entry e = (Map.Entry)(it.next());
+                Stats stats = ((Stats)(e.getValue()));
+                int n = stats.number;
+                double t;
+                if (n > 0)
+                    t = stats.sum / n;
+                else
+                    t = stats.least;
+                long nano = Math.round(1000000.0 * t);
+                System.out.println(e.getKey() + ": " + nano);
+            }
+        }
+
+        void start(String name, long numOps) {
+            this.name = name;
+            this.cname = classify();
+            this.numOps = numOps;
+            startTime = System.currentTimeMillis();
+        }
+
+
+        String classify() {
+            if (name.startsWith("Get"))
+                return "Get                    ";
+            else if (name.startsWith("Put"))
+                return "Put                    ";
+            else if (name.startsWith("Remove"))
+                return "Remove                 ";
+            else if (name.startsWith("Iter"))
+                return "Iter                   ";
+            else
+                return null;
+        }
+
+        void finish() {
+            long endTime = System.currentTimeMillis();
+            long time = endTime - startTime;
+            double timePerOp = ((double)time)/numOps;
+
+            Object st = accum.get(name);
+            if (st == null)
+                accum.put(name, new Stats(timePerOp));
+            else {
+                Stats stats = (Stats) st;
+                stats.sum += timePerOp;
+                stats.number++;
+                if (timePerOp < stats.least) stats.least = timePerOp;
+            }
+
+            if (cname != null) {
+                st = accum.get(cname);
+                if (st == null)
+                    accum.put(cname, new Stats(timePerOp));
+                else {
+                    Stats stats = (Stats) st;
+                    stats.sum += timePerOp;
+                    stats.number++;
+                    if (timePerOp < stats.least) stats.least = timePerOp;
+                }
+            }
+
+        }
+
+    }
+
+    static class Stats {
+        double sum = 0;
+        double least;
+        int number = 0;
+        Stats(double t) { least = t; }
+    }
+
+    static Random rng = new Random();
+
+    static void shuffle(Object[] keys) {
+        int size = keys.length;
+        for (int i=size; i>1; i--) {
+            int r = rng.nextInt(i);
+            Object t = keys[i-1];
+            keys[i-1] = keys[r];
+            keys[r] = t;
+        }
+    }
+
+}
+

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/MapLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/MapLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/MapLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,197 @@
+/*
+ * @test
+ * @synopsis Exercise multithreaded maps, by default
+ * ConcurrentHashMap.  Each thread does a random walk though elements
+ * of "key" array. On each iteration, it checks if table includes key.
+ * If absent, with probablility pinsert it inserts it, and if present,
+ * with probablility premove it removes it.  (pinsert and premove are
+ * expressed as percentages to simplify parsing from command line.)
+ */
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain. Use, modify, and
+ * redistribute this code in any way without acknowledgement.
+ */
+
+
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import java.util.Map;
+import java.util.Random;
+
+public class MapLoops {
+    static int nkeys       = 1000;
+    static int pinsert     = 60;
+    static int premove     = 2;
+    static int maxThreads  = 100;
+    static int nops        = 1000000;
+    static int removesPerMaxRandom;
+    static int insertsPerMaxRandom;
+
+    static final ExecutorService pool = Executors.newCachedThreadPool();
+
+    public static void main(String[] args) throws Exception {
+
+        Class mapClass = null;
+        if (args.length > 0) {
+            try {
+                mapClass = Class.forName(args[0]);
+            } catch(ClassNotFoundException e) {
+                throw new RuntimeException("Class " + args[0] + " not found.");
+            }
+        }
+        else
+            mapClass = edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap.class;
+
+        if (args.length > 1)
+            maxThreads = Integer.parseInt(args[1]);
+
+        if (args.length > 2)
+            nkeys = Integer.parseInt(args[2]);
+
+        if (args.length > 3)
+            pinsert = Integer.parseInt(args[3]);
+
+        if (args.length > 4)
+            premove = Integer.parseInt(args[4]);
+
+        if (args.length > 5)
+            nops = Integer.parseInt(args[5]);
+
+        // normalize probabilities wrt random number generator
+        removesPerMaxRandom = (int)(((double)premove/100.0 * 0x7FFFFFFFL));
+        insertsPerMaxRandom = (int)(((double)pinsert/100.0 * 0x7FFFFFFFL));
+
+        System.out.print("Class: " + mapClass.getName());
+        System.out.print(" threads: " + maxThreads);
+        System.out.print(" size: " + nkeys);
+        System.out.print(" ins: " + pinsert);
+        System.out.print(" rem: " + premove);
+        System.out.print(" ops: " + nops);
+        System.out.println();
+
+        int k = 1;
+        int warmups = 2;
+        for (int i = 1; i <= maxThreads;) {
+            Thread.sleep(100);
+            test(i, nkeys, mapClass);
+            if (warmups > 0)
+                --warmups;
+            else if (i == k) {
+                k = i << 1;
+                i = i + (i >>> 1);
+            }
+            else if (i == 1 && k == 2) {
+                i = k;
+                warmups = 1;
+            }
+            else
+                i = k;
+        }
+        pool.shutdown();
+    }
+
+    static Integer[] makeKeys(int n) {
+        LoopHelpers.SimpleRandom rng = new LoopHelpers.SimpleRandom();
+        Integer[] key = new Integer[n];
+        for (int i = 0; i < key.length; ++i)
+            key[i] = new Integer(rng.next());
+        return key;
+    }
+
+    static void shuffleKeys(Integer[] key) {
+        Random rng = new Random();
+        for (int i = key.length; i > 1; --i) {
+            int j = rng.nextInt(i);
+            Integer tmp = key[j];
+            key[j] = key[i-1];
+            key[i-1] = tmp;
+        }
+    }
+
+    static void test(int i, int nkeys, Class mapClass) throws Exception {
+        System.out.print("Threads: " + i + "\t:");
+        Map map = (Map)mapClass.newInstance();
+        Integer[] key = makeKeys(nkeys);
+        // Uncomment to start with a non-empty table
+        //        for (int j = 0; j < nkeys; j += 4) // start 1/4 occupied
+        //            map.put(key[j], key[j]);
+        shuffleKeys(key);
+        LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
+        CyclicBarrier barrier = new CyclicBarrier(i+1, timer);
+        for (int t = 0; t < i; ++t)
+            pool.execute(new Runner(t, map, key, barrier));
+        barrier.await();
+        barrier.await();
+        long time = timer.getTime();
+        long tpo = time / (i * (long)nops);
+        System.out.print(LoopHelpers.rightJustify(tpo) + " ns per op");
+        double secs = (double)(time) / 1000000000.0;
+        System.out.println("\t " + secs + "s run time");
+        map.clear();
+    }
+
+    static class Runner implements Runnable {
+        final Map map;
+        final Integer[] key;
+        final LoopHelpers.SimpleRandom rng;
+        final CyclicBarrier barrier;
+        int position;
+        int total;
+
+        Runner(int id, Map map, Integer[] key,  CyclicBarrier barrier) {
+            this.map = map;
+            this.key = key;
+            this.barrier = barrier;
+            position = key.length / 2;
+            rng = new LoopHelpers.SimpleRandom((id + 1) * 8862213513L);
+            rng.next();
+        }
+
+        int step() {
+            // random-walk around key positions,  bunching accesses
+            int r = rng.next();
+            position += (r & 7) - 3;
+            while (position >= key.length) position -= key.length;
+            while (position < 0) position += key.length;
+
+            Integer k = key[position];
+            Integer x = (Integer)map.get(k);
+
+            if (x != null) {
+                if (x.intValue() != k.intValue())
+                    throw new Error("bad mapping: " + x + " to " + k);
+
+                if (r < removesPerMaxRandom) {
+                    if (map.remove(k) != null) {
+                        position = total % key.length; // move from position
+                        return 2;
+                    }
+                }
+            }
+            else if (r < insertsPerMaxRandom) {
+                ++position;
+                map.put(k, k);
+                return 2;
+            }
+
+            // Uncomment to add a little computation between accesses
+            //            total += LoopHelpers.compute1(k.intValue());
+            total += r;
+            return 1;
+        }
+
+        public void run() {
+            try {
+                barrier.await();
+                int ops = nops;
+                while (ops > 0)
+                    ops -= step();
+                barrier.await();
+            }
+            catch (Exception ex) {
+                ex.printStackTrace();
+            }
+        }
+    }
+}
+

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/MapWordLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/MapWordLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/MapWordLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,193 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+import edu.emory.mathcs.backport.java.util.*;
+import java.io.*;
+import java.util.Map;
+
+public class MapWordLoops {
+
+    static final String[] WORDS_FILES = {
+        "kw.txt",
+        "class.txt",
+        "dir.txt",
+        "ids.txt",
+    };
+
+    static final int MAX_WORDS = 500000;
+    static final int pinsert   = 60;
+    static final int premove   = 1;
+    static final int NOPS      = 5000000;
+    static final int numTests = 3;
+
+    public static void main(String[] args) {
+        Class mapClass = null;
+        try {
+            mapClass = Class.forName(args[0]);
+        } catch(ClassNotFoundException e) {
+            throw new RuntimeException("Class " + args[0] + " not found.");
+        }
+
+        System.out.println("Testing " + mapClass.getName());
+
+        for (int s = 0; s < WORDS_FILES.length; ++s)
+            tests(mapClass, numTests, s);
+
+        for (int s = WORDS_FILES.length-1; s >= 0; --s)
+            tests(mapClass, numTests, s);
+
+    }
+
+    static void tests(Class mapClass, int numTests, int sizeIndex) {
+        try {
+            String[] key = readWords(sizeIndex);
+            int size = key.length;
+
+            System.out.print("n = " +LoopHelpers.rightJustify(size) +" : ");
+            long least = Long.MAX_VALUE;
+
+            for (int i = 0; i < numTests; ++i) {
+                Map m = newMap(mapClass);
+                long t = doTest(i, mapClass.getName(), m, key);
+                if (t < least) least = t;
+                m.clear();
+                m = null;
+            }
+
+            long nano = Math.round(1000000.0 * (least) / NOPS);
+            System.out.println(LoopHelpers.rightJustify(nano) + " ns per op");
+        } catch (IOException ignore) {
+            return; // skip test if can't read file
+        }
+    }
+
+
+    static Map newMap(Class cl) {
+        try {
+            Map m = (Map)cl.newInstance();
+            return m;
+        } catch(Exception e) {
+            throw new RuntimeException("Can't instantiate " + cl + ": " + e);
+        }
+    }
+
+    static void pause() {
+        try { Thread.sleep(100); } catch(InterruptedException ie) { return; }
+    }
+
+    static String[] readWords(int sizeIndex) throws IOException {
+        String[] l = new String[MAX_WORDS];
+        String[] array = null;
+        try {
+            FileReader fr = new FileReader(WORDS_FILES[sizeIndex]);
+            BufferedReader reader = new BufferedReader(fr);
+            int k = 0;
+            for (;;) {
+                String s = reader.readLine();
+                if (s == null) break;
+                l[k++] = s;
+            }
+            array = new String[k];
+            for (int i = 0; i < k; ++i) {
+                array[i] = l[i];
+                l[i] = null;
+            }
+            l = null;
+            reader.close();
+        }
+        catch (IOException ex) {
+            System.out.println("Can't read words file:" + ex);
+            throw ex;
+        }
+        return array;
+    }
+
+    static long doTest(int id, String name,
+                       final Map m,
+                       final String[] key) {
+
+        //    System.out.print(name + "\t");
+        Runner runner = new Runner(id, m, key);
+        long startTime = System.currentTimeMillis();
+        runner.run();
+        long afterRun = System.currentTimeMillis();
+        long runTime =  (afterRun - startTime);
+        int np = runner.total;
+        if (runner.total == runner.hashCode())
+            System.out.println("Useless Number" + runner.total);
+        int sz = runner.maxsz;
+        if (sz == runner.hashCode())
+            System.out.println("Useless Number" + sz);
+        //        System.out.print(" m = " + sz);
+        return runTime;
+    }
+
+
+    static class Runner implements Runnable {
+        final Map map;
+        final String[] key;
+        LoopHelpers.SimpleRandom rng;
+        final int pctrem;
+        final int pctins;
+        int nputs = 0;
+        int npgets = 0;
+        int nagets = 0;
+        int nremoves = 0;
+        volatile int total;
+        int maxsz;
+
+        Runner(int id, Map m, String[] k) {
+            map = m; key = k;
+            pctrem = (int)(((long)premove * (long)(Integer.MAX_VALUE/2)) / 50);
+            pctins = (int)(((long)pinsert * (long)(Integer.MAX_VALUE/2)) / 50);
+            rng = new LoopHelpers.SimpleRandom((id + 1) * 8862213513L);
+        }
+
+
+        int oneStep(int j) {
+            int n = key.length;
+            int r = rng.next() & 0x7FFFFFFF;
+            int jinc = (r & 7);
+            j += jinc - 3;
+            if (j >= n) j -= n;
+            if (j < 0) j += n;
+
+            int l = n / 4 + j;
+            if (l >= n) l -= n;
+
+            String k = key[j];
+            String x = (String)map.get(k);
+
+            if (x == null) {
+                ++nagets;
+                if (r < pctins) {
+                    map.put(k, key[l]);
+                    ++nputs;
+                    int csz = nputs - nremoves;
+                    if (csz > maxsz) maxsz = csz;
+                }
+            }
+            else {
+                if (k== x) ++npgets;
+                if (r < pctrem) {
+                    map.remove(k);
+                    ++nremoves;
+                    j += ((r >>> 8) & 7) +  n / 2;
+                    if (j >= n) j -= n;
+                }
+            }
+            return j;
+        }
+
+        public void run() {
+            int j = key.length / 2;
+            for (int i = 0; i < NOPS; ++i) {
+                j = oneStep(j);
+            }
+            total = nputs + npgets + nagets + nremoves;
+        }
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/MultipleProducersSingleConsumerLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/MultipleProducersSingleConsumerLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/MultipleProducersSingleConsumerLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,158 @@
+/*
+ * @test
+ * @synopsis  multiple producers and single consumer using blocking queues
+ */
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain. Use, modify, and
+ * redistribute this code in any way without acknowledgement.
+ */
+
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+
+public class MultipleProducersSingleConsumerLoops {
+    static final int CAPACITY =      100;
+    static final ExecutorService pool = Executors.newCachedThreadPool();
+    static boolean print = false;
+    static int producerSum;
+    static int consumerSum;
+
+    static synchronized void addProducerSum(int x) {
+        producerSum += x;
+    }
+
+    static synchronized void addConsumerSum(int x) {
+        consumerSum += x;
+    }
+
+    static synchronized void checkSum() {
+        if (producerSum != consumerSum)
+            throw new Error("CheckSum mismatch");
+    }
+
+    public static void main(String[] args) throws Exception {
+        int maxProducers = 100;
+        int iters = 100000;
+
+        if (args.length > 0)
+            maxProducers = Integer.parseInt(args[0]);
+
+        print = false;
+        System.out.println("Warmup...");
+        oneTest(1, 10000);
+        Thread.sleep(100);
+        oneTest(2, 10000);
+        Thread.sleep(100);
+        print = true;
+
+        for (int i = 1; i <= maxProducers; i += (i+1) >>> 1) {
+            System.out.println("Producers:" + i);
+            oneTest(i, iters);
+            Thread.sleep(100);
+        }
+        pool.shutdown();
+   }
+
+    static void oneTest(int producers, int iters) throws Exception {
+        if (print)
+            System.out.print("ArrayBlockingQueue      ");
+        oneRun(new ArrayBlockingQueue(CAPACITY), producers, iters);
+
+        if (print)
+            System.out.print("LinkedBlockingQueue     ");
+        oneRun(new LinkedBlockingQueue(CAPACITY), producers, iters);
+
+        // Don't run PBQ since can legitimately run out of memory
+        //        if (print)
+        //            System.out.print("PriorityBlockingQueue   ");
+        //        oneRun(new PriorityBlockingQueue(), producers, iters);
+
+        if (print)
+            System.out.print("SynchronousQueue        ");
+        oneRun(new SynchronousQueue(), producers, iters);
+
+        if (print)
+            System.out.print("SynchronousQueue(fair)  ");
+        oneRun(new SynchronousQueue(true), producers, iters);
+
+        if (print)
+            System.out.print("ArrayBlockingQueue(fair)");
+        oneRun(new ArrayBlockingQueue(CAPACITY, true), producers, iters/10);
+    }
+
+    static abstract class Stage implements Runnable {
+        final int iters;
+        final BlockingQueue queue;
+        final CyclicBarrier barrier;
+        Stage (BlockingQueue q, CyclicBarrier b, int iters) {
+            queue = q;
+            barrier = b;
+            this.iters = iters;
+        }
+    }
+
+    static class Producer extends Stage {
+        Producer(BlockingQueue q, CyclicBarrier b, int iters) {
+            super(q, b, iters);
+        }
+
+        public void run() {
+            try {
+                barrier.await();
+                int s = 0;
+                int l = hashCode();
+                for (int i = 0; i < iters; ++i) {
+                    l = LoopHelpers.compute1(l);
+                    l = LoopHelpers.compute2(l);
+                    queue.put(new Integer(l));
+                    s += l;
+                }
+                addProducerSum(s);
+                barrier.await();
+            }
+            catch (Exception ie) {
+                ie.printStackTrace();
+                return;
+            }
+        }
+    }
+
+    static class Consumer extends Stage {
+        Consumer(BlockingQueue q, CyclicBarrier b, int iters) {
+            super(q, b, iters);
+        }
+
+        public void run() {
+            try {
+                barrier.await();
+                int s = 0;
+                for (int i = 0; i < iters; ++i) {
+                    s += ((Integer)queue.take()).intValue();
+                }
+                addConsumerSum(s);
+                barrier.await();
+            }
+            catch (Exception ie) {
+                ie.printStackTrace();
+                return;
+            }
+        }
+
+    }
+
+    static void oneRun(BlockingQueue q, int nproducers, int iters) throws Exception {
+        LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
+        CyclicBarrier barrier = new CyclicBarrier(nproducers + 2, timer);
+        for (int i = 0; i < nproducers; ++i) {
+            pool.execute(new Producer(q, barrier, iters));
+        }
+        pool.execute(new Consumer(q, barrier, iters * nproducers));
+        barrier.await();
+        barrier.await();
+        long time = timer.getTime();
+        checkSum();
+        if (print)
+            System.out.println("\t: " + LoopHelpers.rightJustify(time / (iters * nproducers)) + " ns per transfer");
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/Mutex.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/Mutex.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/Mutex.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,46 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import edu.emory.mathcs.backport.java.util.concurrent.atomic.*;
+import java.io.*;
+
+/**
+ * A sample user extension of AbstractQueuedSynchronizer.
+ */
+public final class Mutex {//extends AbstractQueuedSynchronizer implements Lock, java.io.Serializable {
+//    public boolean isHeldExclusively() { return getState() == 1; }
+//
+//    public boolean tryAcquire(int acquires) {
+//        return compareAndSetState(0, 1);
+//    }
+//
+//    public boolean tryRelease(int releases) {
+//        setState(0);
+//        return true;
+//    }
+//    public Condition newCondition() { return new ConditionObject(); }
+//
+//    private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException {
+//        s.defaultReadObject();
+//        setState(0); // reset to unlocked state
+//    }
+//
+//    public void lock() {
+//        acquire(1);
+//    }
+//    public boolean tryLock() {
+//        return tryAcquire(1);
+//    }
+//    public void lockInterruptibly() throws InterruptedException {
+//        acquireInterruptibly(1);
+//    }
+//    public boolean tryLock(long timeout, TimeUnit unit) throws InterruptedException {
+//        return tryAcquireNanos(1, unit.toNanos(timeout));
+//    }
+//    public void unlock() { release(1); }
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/NavigableMapCheck.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/NavigableMapCheck.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/NavigableMapCheck.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,525 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+/**
+ * @test
+ * @synopsis Times and checks basic map operations
+ */
+import edu.emory.mathcs.backport.java.util.*;
+import java.io.*;
+import java.util.Random;
+import java.util.Map;
+import java.util.Iterator;
+import java.util.Set;
+
+public class NavigableMapCheck {
+
+    static int absentSize;
+    static int absentMask;
+    static Integer[] absent;
+
+    static final Integer MISSING = new Integer(Integer.MIN_VALUE);
+
+    static TestTimer timer = new TestTimer();
+
+    static void reallyAssert(boolean b) {
+        if (!b) throw new Error("Failed Assertion");
+    }
+
+    public static void main(String[] args) throws Exception {
+        Class mapClass = null;
+        int numTests = 50;
+        int size = 50000;
+
+        if (args.length > 0) {
+            try {
+                mapClass = Class.forName(args[0]);
+            } catch(ClassNotFoundException e) {
+                throw new RuntimeException("Class " + args[0] + " not found.");
+            }
+        }
+
+
+        if (args.length > 1)
+            numTests = Integer.parseInt(args[1]);
+
+        if (args.length > 2)
+            size = Integer.parseInt(args[2]);
+
+        System.out.println("Testing " + mapClass.getName() + " trials: " + numTests + " size: " + size);
+
+
+        absentSize = 8;
+        while (absentSize < size) absentSize <<= 1;
+        absentMask = absentSize - 1;
+        absent = new Integer[absentSize];
+
+        for (int i = 0; i < absentSize; ++i)
+            absent[i] = new Integer(i * 2);
+
+        Integer[] key = new Integer[size];
+        for (int i = 0; i < size; ++i)
+            key[i] = new Integer(i * 2 + 1);
+
+
+        for (int rep = 0; rep < numTests; ++rep) {
+            runTest(newMap(mapClass), key);
+        }
+
+        TestTimer.printStats();
+
+    }
+
+    static NavigableMap newMap(Class cl) {
+        try {
+            NavigableMap m = (NavigableMap)cl.newInstance();
+            return m;
+        } catch(Exception e) {
+            throw new RuntimeException("Can't instantiate " + cl + ": " + e);
+        }
+    }
+
+
+    static void runTest(NavigableMap s, Integer[] key) {
+        shuffle(key);
+        int size = key.length;
+        long startTime = System.currentTimeMillis();
+        test(s, key);
+        long time = System.currentTimeMillis() - startTime;
+    }
+
+    static void t1(String nm, int n, NavigableMap s, Integer[] key, int expect) {
+        int sum = 0;
+        int iters = 4;
+        timer.start(nm, n * iters);
+        for (int j = 0; j < iters; ++j) {
+            for (int i = 0; i < n; i++) {
+                if (s.get(key[i]) != null) ++sum;
+            }
+        }
+        timer.finish();
+        reallyAssert (sum == expect * iters);
+    }
+
+    static void t2(String nm, int n, NavigableMap s, Integer[] key, int expect) {
+        int sum = 0;
+        timer.start(nm, n);
+        for (int i = 0; i < n; i++) {
+            if (s.remove(key[i]) != null) ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == expect);
+    }
+
+    static void t3(String nm, int n, NavigableMap s, Integer[] key, int expect) {
+        int sum = 0;
+        timer.start(nm, n);
+        for (int i = 0; i < n; i++) {
+            if (s.put(key[i], absent[i & absentMask]) == null) ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == expect);
+    }
+
+    static void t4(String nm, int n, NavigableMap s, Integer[] key, int expect) {
+        int sum = 0;
+        timer.start(nm, n);
+        for (int i = 0; i < n; i++) {
+            if (s.containsKey(key[i])) ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == expect);
+    }
+
+    static void t5(String nm, int n, NavigableMap s, Integer[] key, int expect) {
+        int sum = 0;
+        timer.start(nm, n/2);
+        for (int i = n-2; i >= 0; i-=2) {
+            if (s.remove(key[i]) != null) ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == expect);
+    }
+
+    static void t6(String nm, int n, NavigableMap s, Integer[] k1, Integer[] k2) {
+        int sum = 0;
+        timer.start(nm, n * 2);
+        for (int i = 0; i < n; i++) {
+            if (s.get(k1[i]) != null) ++sum;
+            if (s.get(k2[i & absentMask]) != null) ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == n);
+    }
+
+    static void t7(String nm, int n, NavigableMap s, Integer[] k1, Integer[] k2) {
+        int sum = 0;
+        timer.start(nm, n * 2);
+        for (int i = 0; i < n; i++) {
+            if (s.containsKey(k1[i])) ++sum;
+            if (s.containsKey(k2[i & absentMask])) ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == n);
+    }
+
+    static void t8(String nm, int n, NavigableMap s, Integer[] key, int expect) {
+        int sum = 0;
+        timer.start(nm, n);
+        for (int i = 0; i < n; i++) {
+            if (s.get(key[i]) != null) ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == expect);
+    }
+
+
+    static void t9(NavigableMap s) {
+        int sum = 0;
+        int iters = 20;
+        timer.start("ContainsValue (/n)     ", iters * s.size());
+        int step = absentSize / iters;
+        for (int i = 0; i < absentSize; i += step)
+            if (s.containsValue(absent[i])) ++sum;
+        timer.finish();
+        reallyAssert (sum != 0);
+    }
+
+    static void higherTest(NavigableMap s) {
+        int sum = 0;
+        int iters = s.size();
+        timer.start("Higher                 ", iters);
+        Map.Entry e = s.firstEntry();
+        while (e != null) {
+            ++sum;
+            e = s.higherEntry(e.getKey());
+        }
+        timer.finish();
+        reallyAssert (sum == iters);
+    }
+
+    static void lowerTest(NavigableMap s) {
+        int sum = 0;
+        int iters = s.size();
+        timer.start("Lower                  ", iters);
+        Map.Entry e = s.firstEntry();
+        while (e != null) {
+            ++sum;
+            e = s.higherEntry(e.getKey());
+        }
+        timer.finish();
+        reallyAssert (sum == iters);
+    }
+
+    static void ceilingTest(NavigableMap s) {
+        int sum = 0;
+        int iters = s.size();
+        if (iters > absentSize) iters = absentSize;
+        timer.start("Ceiling                ", iters);
+        for (int i = 0; i < iters; ++i) {
+            Map.Entry e = s.ceilingEntry(absent[i]);
+            if (e != null)
+                ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == iters);
+    }
+
+    static void floorTest(NavigableMap s) {
+        int sum = 0;
+        int iters = s.size();
+        if (iters > absentSize) iters = absentSize;
+        timer.start("Floor                  ", iters);
+        for (int i = 1; i < iters; ++i) {
+            Map.Entry e = s.floorEntry(absent[i]);
+            if (e != null)
+                ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == iters-1);
+    }
+
+
+    static void ktest(NavigableMap s, int size, Integer[] key) {
+        timer.start("ContainsKey            ", size);
+        Set ks = s.keySet();
+        int sum = 0;
+        for (int i = 0; i < size; i++) {
+            if (ks.contains(key[i])) ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == size);
+    }
+
+
+    static void ittest1(NavigableMap s, int size) {
+        int sum = 0;
+        timer.start("Iter Key               ", size);
+        for (Iterator it = s.keySet().iterator(); it.hasNext(); ) {
+            if(it.next() != MISSING)
+                ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == size);
+    }
+
+    static void ittest2(NavigableMap s, int size) {
+        int sum = 0;
+        timer.start("Iter Value             ", size);
+        for (Iterator it = s.values().iterator(); it.hasNext(); ) {
+            if(it.next() != MISSING)
+                ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == size);
+    }
+    static void ittest3(NavigableMap s, int size) {
+        int sum = 0;
+        timer.start("Iter Entry             ", size);
+        for (Iterator it = s.entrySet().iterator(); it.hasNext(); ) {
+            if(it.next() != MISSING)
+                ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == size);
+    }
+
+    static void ittest(NavigableMap s, int size) {
+        ittest1(s, size);
+        ittest2(s, size);
+        ittest3(s, size);
+    }
+
+    static void rittest1(NavigableMap s, int size) {
+        int sum = 0;
+        timer.start("Desc Iter Key          ", size);
+        for (Iterator it = s.descendingKeySet().iterator(); it.hasNext(); ) {
+            if(it.next() != MISSING)
+                ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == size);
+    }
+
+    static void rittest(NavigableMap s, int size) {
+        rittest1(s, size);
+//        rittest2(s, size);
+    }
+
+
+    static void rtest(NavigableMap s, int size) {
+        timer.start("Remove (iterator)      ", size);
+        for (Iterator it = s.keySet().iterator(); it.hasNext(); ) {
+            it.next();
+            it.remove();
+        }
+        timer.finish();
+    }
+
+    static void rvtest(NavigableMap s, int size) {
+        timer.start("Remove (iterator)      ", size);
+        for (Iterator it = s.values().iterator(); it.hasNext(); ) {
+            it.next();
+            it.remove();
+        }
+        timer.finish();
+    }
+
+
+    static void dtest(NavigableMap s, int size, Integer[] key) {
+        timer.start("Put (putAll)           ", size * 2);
+        NavigableMap s2 = null;
+        try {
+            s2 = (NavigableMap) (s.getClass().newInstance());
+            s2.putAll(s);
+        }
+        catch (Exception e) { e.printStackTrace(); return; }
+        timer.finish();
+
+        timer.start("Iter Equals            ", size * 2);
+        boolean eqt = s2.equals(s) && s.equals(s2);
+        reallyAssert (eqt);
+        timer.finish();
+
+        timer.start("Iter HashCode          ", size * 2);
+        int shc = s.hashCode();
+        int s2hc = s2.hashCode();
+        reallyAssert (shc == s2hc);
+        timer.finish();
+
+        timer.start("Put (present)          ", size);
+        s2.putAll(s);
+        timer.finish();
+
+        timer.start("Iter EntrySet contains ", size * 2);
+        Set es2 = s2.entrySet();
+        int sum = 0;
+        for (Iterator i1 = s.entrySet().iterator(); i1.hasNext(); ) {
+            Object entry = i1.next();
+            if (es2.contains(entry)) ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == size);
+
+        t6("Get                    ", size, s2, key, absent);
+
+        Object hold = s2.get(key[size-1]);
+        s2.put(key[size-1], absent[0]);
+        timer.start("Iter Equals            ", size * 2);
+        eqt = s2.equals(s) && s.equals(s2);
+        reallyAssert (!eqt);
+        timer.finish();
+
+        timer.start("Iter HashCode          ", size * 2);
+        int s1h = s.hashCode();
+        int s2h = s2.hashCode();
+        reallyAssert (s1h != s2h);
+        timer.finish();
+
+        s2.put(key[size-1], hold);
+        timer.start("Remove (iterator)      ", size * 2);
+        Iterator s2i = s2.entrySet().iterator();
+        Set es = s.entrySet();
+        while (s2i.hasNext())
+            es.remove(s2i.next());
+        timer.finish();
+
+        reallyAssert (s.isEmpty());
+
+        timer.start("Clear                  ", size);
+        s2.clear();
+        timer.finish();
+        reallyAssert (s2.isEmpty() && s.isEmpty());
+    }
+
+
+
+    static void test(NavigableMap s, Integer[] key) {
+        int size = key.length;
+
+        t3("Put (absent)           ", size, s, key, size);
+        t3("Put (present)          ", size, s, key, 0);
+        t7("ContainsKey            ", size, s, key, absent);
+        t4("ContainsKey            ", size, s, key, size);
+        ktest(s, size, key);
+        t4("ContainsKey            ", absentSize, s, absent, 0);
+        t6("Get                    ", size, s, key, absent);
+        t1("Get (present)          ", size, s, key, size);
+        t1("Get (absent)           ", absentSize, s, absent, 0);
+        t2("Remove (absent)        ", absentSize, s, absent, 0);
+        t5("Remove (present)       ", size, s, key, size / 2);
+        t3("Put (half present)     ", size, s, key, size / 2);
+
+        ittest(s, size);
+        rittest(s, size);
+        higherTest(s);
+        ceilingTest(s);
+        floorTest(s);
+        lowerTest(s);
+        t9(s);
+        rtest(s, size);
+
+        t4("ContainsKey            ", size, s, key, 0);
+        t2("Remove (absent)        ", size, s, key, 0);
+        t3("Put (presized)         ", size, s, key, size);
+        dtest(s, size, key);
+    }
+
+    static class TestTimer {
+        private String name;
+        private long numOps;
+        private long startTime;
+        private String cname;
+
+        static final java.util.TreeMap accum = new java.util.TreeMap();
+
+        static void printStats() {
+            for (Iterator it = accum.entrySet().iterator(); it.hasNext(); ) {
+                Map.Entry e = (Map.Entry)(it.next());
+                Stats stats = ((Stats)(e.getValue()));
+                int n = stats.number;
+                double t;
+                if (n > 0)
+                    t = stats.sum / n;
+                else
+                    t = stats.least;
+                long nano = Math.round(1000000.0 * t);
+                System.out.println(e.getKey() + ": " + nano);
+            }
+        }
+
+        void start(String name, long numOps) {
+            this.name = name;
+            this.cname = classify();
+            this.numOps = numOps;
+            startTime = System.currentTimeMillis();
+        }
+
+
+        String classify() {
+            if (name.startsWith("Get"))
+                return "Get                    ";
+            else if (name.startsWith("Put"))
+                return "Put                    ";
+            else if (name.startsWith("Remove"))
+                return "Remove                 ";
+            else if (name.startsWith("Iter"))
+                return "Iter                   ";
+            else
+                return null;
+        }
+
+        void finish() {
+            long endTime = System.currentTimeMillis();
+            long time = endTime - startTime;
+            double timePerOp = ((double)time)/numOps;
+
+            Object st = accum.get(name);
+            if (st == null)
+                accum.put(name, new Stats(timePerOp));
+            else {
+                Stats stats = (Stats) st;
+                stats.sum += timePerOp;
+                stats.number++;
+                if (timePerOp < stats.least) stats.least = timePerOp;
+            }
+
+            if (cname != null) {
+                st = accum.get(cname);
+                if (st == null)
+                    accum.put(cname, new Stats(timePerOp));
+                else {
+                    Stats stats = (Stats) st;
+                    stats.sum += timePerOp;
+                    stats.number++;
+                    if (timePerOp < stats.least) stats.least = timePerOp;
+                }
+            }
+
+        }
+
+    }
+
+    static class Stats {
+        double sum = 0;
+        double least;
+        int number = 0;
+        Stats(double t) { least = t; }
+    }
+
+    static Random rng = new Random();
+
+    static void shuffle(Integer[] keys) {
+        int size = keys.length;
+        for (int i=size; i>1; i--) {
+            int r = rng.nextInt(i);
+            Integer t = keys[i-1];
+            keys[i-1] = keys[r];
+            keys[r] = t;
+        }
+    }
+
+}
+

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/NavigableSetCheck.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/NavigableSetCheck.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/NavigableSetCheck.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,462 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+/**
+ * @test
+ * @synopsis Times and checks basic set operations
+ */
+import edu.emory.mathcs.backport.java.util.*;
+import java.io.*;
+import java.util.Random;
+import java.util.Iterator;
+import java.util.Map;
+
+public class NavigableSetCheck {
+
+    static int absentSize;
+    static int absentMask;
+    static Integer[] absent;
+
+    static final Integer MISSING = new Integer(Integer.MIN_VALUE);
+
+    static TestTimer timer = new TestTimer();
+
+    static void reallyAssert(boolean b) {
+        if (!b) throw new Error("Failed Assertion");
+    }
+
+    public static void main(String[] args) throws Exception {
+        Class setClass = null;
+        int numTests = 50;
+        int size = 50000;
+
+        if (args.length > 0) {
+            try {
+                setClass = Class.forName(args[0]);
+            } catch(ClassNotFoundException e) {
+                throw new RuntimeException("Class " + args[0] + " not found.");
+            }
+        }
+
+
+        if (args.length > 1)
+            numTests = Integer.parseInt(args[1]);
+
+        if (args.length > 2)
+            size = Integer.parseInt(args[2]);
+
+        System.out.println("Testing " + setClass.getName() + " trials: " + numTests + " size: " + size);
+
+
+        absentSize = 8;
+        while (absentSize < size) absentSize <<= 1;
+        absentMask = absentSize - 1;
+        absent = new Integer[absentSize];
+
+        for (int i = 0; i < absentSize; ++i)
+            absent[i] = new Integer(i * 2);
+
+        Integer[] key = new Integer[size];
+        for (int i = 0; i < size; ++i)
+            key[i] = new Integer(i * 2 + 1);
+
+
+        for (int rep = 0; rep < numTests; ++rep) {
+            runTest(newSet(setClass), key);
+        }
+
+        TestTimer.printStats();
+
+    }
+
+    static NavigableSet newSet(Class cl) {
+        try {
+            NavigableSet m = (NavigableSet)cl.newInstance();
+            return m;
+        } catch(Exception e) {
+            throw new RuntimeException("Can't instantiate " + cl + ": " + e);
+        }
+    }
+
+
+    static void runTest(NavigableSet s, Integer[] key) {
+        shuffle(key);
+        int size = key.length;
+        long startTime = System.currentTimeMillis();
+        test(s, key);
+        long time = System.currentTimeMillis() - startTime;
+    }
+
+    static void t1(String nm, int n, NavigableSet s, Integer[] key, int expect) {
+        int sum = 0;
+        int iters = 4;
+        timer.start(nm, n * iters);
+        for (int j = 0; j < iters; ++j) {
+            for (int i = 0; i < n; i++) {
+                if (s.contains(key[i])) ++sum;
+            }
+        }
+        timer.finish();
+        reallyAssert (sum == expect * iters);
+    }
+
+    static void t2(String nm, int n, NavigableSet s, Integer[] key, int expect) {
+        int sum = 0;
+        timer.start(nm, n);
+        for (int i = 0; i < n; i++) {
+            if (s.remove(key[i])) ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == expect);
+    }
+
+    static void t3(String nm, int n, NavigableSet s, Integer[] key, int expect) {
+        int sum = 0;
+        timer.start(nm, n);
+        for (int i = 0; i < n; i++) {
+            if (s.add(key[i])) ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == expect);
+    }
+
+    static void t4(String nm, int n, NavigableSet s, Integer[] key, int expect) {
+        int sum = 0;
+        timer.start(nm, n);
+        for (int i = 0; i < n; i++) {
+            if (s.contains(key[i])) ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == expect);
+    }
+
+    static void t5(String nm, int n, NavigableSet s, Integer[] key, int expect) {
+        int sum = 0;
+        timer.start(nm, n/2);
+        for (int i = n-2; i >= 0; i-=2) {
+            if (s.remove(key[i])) ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == expect);
+    }
+
+    static void t6(String nm, int n, NavigableSet s, Integer[] k1, Integer[] k2) {
+        int sum = 0;
+        timer.start(nm, n * 2);
+        for (int i = 0; i < n; i++) {
+            if (s.contains(k1[i])) ++sum;
+            if (s.contains(k2[i & absentMask])) ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == n);
+    }
+
+    static void t7(String nm, int n, NavigableSet s, Integer[] k1, Integer[] k2) {
+        int sum = 0;
+        timer.start(nm, n * 2);
+        for (int i = 0; i < n; i++) {
+            if (s.contains(k1[i])) ++sum;
+            if (s.contains(k2[i & absentMask])) ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == n);
+    }
+
+    static void t8(String nm, int n, NavigableSet s, Integer[] key, int expect) {
+        int sum = 0;
+        timer.start(nm, n);
+        for (int i = 0; i < n; i++) {
+            if (s.contains(key[i])) ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == expect);
+    }
+
+
+    static void higherTest(NavigableSet s) {
+        int sum = 0;
+        int iters = s.size();
+        timer.start("Higher                 ", iters);
+        Object e = s.first();
+        while (e != null) {
+            ++sum;
+            e = s.higher(e);
+        }
+        timer.finish();
+        reallyAssert (sum == iters);
+    }
+
+    static void lowerTest(NavigableSet s) {
+        int sum = 0;
+        int iters = s.size();
+        timer.start("Lower                  ", iters);
+        Object e = s.first();
+        while (e != null) {
+            ++sum;
+            e = s.higher(e);
+        }
+        timer.finish();
+        reallyAssert (sum == iters);
+    }
+
+    static void ceilingTest(NavigableSet s) {
+        int sum = 0;
+        int iters = s.size();
+        if (iters > absentSize) iters = absentSize;
+        timer.start("Ceiling                ", iters);
+        for (int i = 0; i < iters; ++i) {
+            Object e = s.ceiling(absent[i]);
+            if (e != null)
+                ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == iters);
+    }
+
+    static void floorTest(NavigableSet s) {
+        int sum = 0;
+        int iters = s.size();
+        if (iters > absentSize) iters = absentSize;
+        timer.start("Floor                  ", iters);
+        for (int i = 1; i < iters; ++i) {
+            Object e = s.floor(absent[i]);
+            if (e != null)
+                ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == iters-1);
+    }
+
+
+    static void ktest(NavigableSet s, int size, Integer[] key) {
+        timer.start("Contains               ", size);
+        int sum = 0;
+        for (int i = 0; i < size; i++) {
+            if (s.contains(key[i])) ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == size);
+    }
+
+
+    static void ittest1(NavigableSet s, int size) {
+        int sum = 0;
+        timer.start("Iter Key               ", size);
+        for (Iterator it = s.iterator(); it.hasNext(); ) {
+            if(it.next() != MISSING)
+                ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == size);
+    }
+
+    static void ittest(NavigableSet s, int size) {
+        ittest1(s, size);
+    }
+
+    static void rittest1(NavigableSet s, int size) {
+        int sum = 0;
+        timer.start("Desc Iter Key          ", size);
+        for (Iterator it = s.descendingIterator(); it.hasNext(); ) {
+            if(it.next() != MISSING)
+                ++sum;
+        }
+        timer.finish();
+        reallyAssert (sum == size);
+    }
+
+    static void rittest(NavigableSet s, int size) {
+        rittest1(s, size);
+    }
+
+
+    static void rtest(NavigableSet s, int size) {
+        timer.start("Remove (iterator)      ", size);
+        for (Iterator it = s.iterator(); it.hasNext(); ) {
+            it.next();
+            it.remove();
+        }
+        timer.finish();
+    }
+
+
+
+    static void dtest(NavigableSet s, int size, Integer[] key) {
+        timer.start("Add (addAll)           ", size * 2);
+        NavigableSet s2 = null;
+        try {
+            s2 = (NavigableSet) (s.getClass().newInstance());
+            s2.addAll(s);
+        }
+        catch (Exception e) { e.printStackTrace(); return; }
+        timer.finish();
+
+        timer.start("Iter Equals            ", size * 2);
+        boolean eqt = s2.equals(s) && s.equals(s2);
+        reallyAssert (eqt);
+        timer.finish();
+
+        timer.start("Iter HashCode          ", size * 2);
+        int shc = s.hashCode();
+        int s2hc = s2.hashCode();
+        reallyAssert (shc == s2hc);
+        timer.finish();
+
+        timer.start("Add (present)          ", size);
+        s2.addAll(s);
+        timer.finish();
+
+        t6("Contains               ", size, s2, key, absent);
+
+        boolean as2 = s2.add(absent[absentSize-1]);
+        reallyAssert(as2);
+        timer.start("Iter Equals            ", size * 2);
+        eqt = s2.equals(s) && s.equals(s2);
+        if (as2)
+            reallyAssert (!eqt);
+        timer.finish();
+
+        timer.start("Iter HashCode          ", size * 2);
+        int s1h = s.hashCode();
+        int s2h = s2.hashCode();
+        if (as2)
+            reallyAssert (s1h != s2h);
+        timer.finish();
+
+        timer.start("Clear                  ", size);
+        s.clear();
+        s2.clear();
+        timer.finish();
+        reallyAssert (s2.isEmpty() && s.isEmpty());
+    }
+
+
+
+    static void test(NavigableSet s, Integer[] key) {
+        int size = key.length;
+
+        t3("Add (absent)           ", size, s, key, size);
+        t3("Add (present)          ", size, s, key, 0);
+        t7("ContainsKey            ", size, s, key, absent);
+        t4("ContainsKey            ", size, s, key, size);
+        ktest(s, size, key);
+        t4("Contains               ", absentSize, s, absent, 0);
+        t6("Contains               ", size, s, key, absent);
+        t1("Contains (present)     ", size, s, key, size);
+        t1("Contains (absent)      ", absentSize, s, absent, 0);
+        t2("Remove (absent)        ", absentSize, s, absent, 0);
+        t5("Remove (present)       ", size, s, key, size / 2);
+        t3("Add (half present)     ", size, s, key, size / 2);
+
+        ittest(s, size);
+        rittest(s, size);
+        higherTest(s);
+        ceilingTest(s);
+        floorTest(s);
+        lowerTest(s);
+        rtest(s, size);
+
+        t4("Contains               ", size, s, key, 0);
+        t2("Remove (absent)        ", size, s, key, 0);
+        t3("Add (presized)         ", size, s, key, size);
+        dtest(s, size, key);
+    }
+
+    static class TestTimer {
+        private String name;
+        private long numOps;
+        private long startTime;
+        private String cname;
+
+        static final java.util.TreeMap accum = new java.util.TreeMap();
+
+        static void printStats() {
+            for (Iterator it = accum.entrySet().iterator(); it.hasNext(); ) {
+                Map.Entry e = (Map.Entry)(it.next());
+                Stats stats = ((Stats)(e.getValue()));
+                int n = stats.number;
+                double t;
+                if (n > 0)
+                    t = stats.sum / n;
+                else
+                    t = stats.least;
+                long nano = Math.round(1000000.0 * t);
+                System.out.println(e.getKey() + ": " + nano);
+            }
+        }
+
+        void start(String name, long numOps) {
+            this.name = name;
+            this.cname = classify();
+            this.numOps = numOps;
+            startTime = System.currentTimeMillis();
+        }
+
+
+        String classify() {
+            if (name.startsWith("Contains"))
+                return "Contains               ";
+            else if (name.startsWith("Add"))
+                return "Add                    ";
+            else if (name.startsWith("Remove"))
+                return "Remove                 ";
+            else if (name.startsWith("Iter"))
+                return "Iter                   ";
+            else
+                return null;
+        }
+
+        void finish() {
+            long endTime = System.currentTimeMillis();
+            long time = endTime - startTime;
+            double timePerOp = ((double)time)/numOps;
+
+            Object st = accum.get(name);
+            if (st == null)
+                accum.put(name, new Stats(timePerOp));
+            else {
+                Stats stats = (Stats) st;
+                stats.sum += timePerOp;
+                stats.number++;
+                if (timePerOp < stats.least) stats.least = timePerOp;
+            }
+
+            if (cname != null) {
+                st = accum.get(cname);
+                if (st == null)
+                    accum.put(cname, new Stats(timePerOp));
+                else {
+                    Stats stats = (Stats) st;
+                    stats.sum += timePerOp;
+                    stats.number++;
+                    if (timePerOp < stats.least) stats.least = timePerOp;
+                }
+            }
+
+        }
+
+    }
+
+    static class Stats {
+        double sum = 0;
+        double least;
+        int number = 0;
+        Stats(double t) { least = t; }
+    }
+
+    static Random rng = new Random();
+
+    static void shuffle(Integer[] keys) {
+        int size = keys.length;
+        for (int i=size; i>1; i--) {
+            int r = rng.nextInt(i);
+            Integer t = keys[i-1];
+            keys[i-1] = keys[r];
+            keys[r] = t;
+        }
+    }
+
+}
+

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/NoopLockLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/NoopLockLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/NoopLockLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,100 @@
+/*
+ * @test
+ * @synopsis multiple threads using a single builtin lock
+ */
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain. Use, modify, and
+ * redistribute this code in any way without acknowledgement.
+ */
+
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import edu.emory.mathcs.backport.java.util.*;
+
+public final class NoopLockLoops {
+    static final ExecutorService pool = Executors.newCachedThreadPool();
+    static final LoopHelpers.SimpleRandom rng = new LoopHelpers.SimpleRandom();
+    static boolean print = false;
+    static int iters = 20000000;
+
+    public static void main(String[] args) throws Exception {
+        int maxThreads = 100;
+        if (args.length > 0) 
+            maxThreads = Integer.parseInt(args[0]);
+
+        new ReentrantLockLoop(1).test();
+        new ReentrantLockLoop(1).test();
+        print = true;
+
+        int k = 1;
+        for (int i = 1; i <= maxThreads;) {
+            System.out.print("Threads: " + i);
+            new ReentrantLockLoop(i).test();
+            Thread.sleep(100);
+            if (i == k) {
+                k = i << 1;
+                i = i + (i >>> 1);
+            } 
+            else 
+                i = k;
+        }
+        pool.shutdown();
+    }
+
+    static final class ReentrantLockLoop implements Runnable {
+        private int v = rng.next();
+        private volatile int result = 17;
+        private final LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
+        private final CyclicBarrier barrier;
+        private final int nthreads;
+        private volatile int readBarrier;
+        ReentrantLockLoop(int nthreads) {
+            this.nthreads = nthreads;
+            barrier = new CyclicBarrier(nthreads+1, timer);
+        }
+
+        final void test() throws Exception {
+            for (int i = 0; i < nthreads; ++i) 
+                pool.execute(this);
+            barrier.await();
+            barrier.await();
+            if (print) {
+                long time = timer.getTime();
+                long tpi = time / ((long)iters * nthreads);
+                System.out.print("\t" + LoopHelpers.rightJustify(tpi) + " ns per lock");
+                double secs = (double)(time) / 1000000000.0;
+                System.out.println("\t " + secs + "s run time");
+            }
+
+            int r = result;
+            if (r == 0) // avoid overoptimization
+                System.out.println("useless result: " + r);
+        }
+
+        public final void run() {
+            try {
+                barrier.await(); 
+                int sum = v + 1;
+                int x = sum + 1;
+                int n = iters;
+                while (n-- > 0) {
+                    synchronized(this) {
+                        x = LoopHelpers.compute4(x);
+                    }
+                    sum += x;
+                    if ((x += readBarrier) == 0)
+                        ++readBarrier;
+
+                }
+                barrier.await();
+                result += sum;
+            }
+            catch (Exception ie) { 
+                return; 
+            }
+        }
+    }
+
+}
+

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/NoopMutex.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/NoopMutex.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/NoopMutex.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,17 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+import edu.emory.mathcs.backport.java.util.concurrent.atomic.*;
+
+class NoopMutex {
+    public static void main(String[] args) throws Exception {
+        AtomicInteger lock = new AtomicInteger();
+        for (int i = 100000000; i > 0; --i) {
+            lock.compareAndSet(0,1);
+            lock.set(0);
+        }
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/NoopNoLockLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/NoopNoLockLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/NoopNoLockLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,99 @@
+/*
+ * @test
+ * @synopsis multiple threads using a single builtin lock
+ */
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain. Use, modify, and
+ * redistribute this code in any way without acknowledgement.
+ */
+
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import edu.emory.mathcs.backport.java.util.concurrent.atomic.*;
+import edu.emory.mathcs.backport.java.util.*;
+
+public final class NoopNoLockLoops {
+    static final ExecutorService pool = Executors.newCachedThreadPool();
+    static final LoopHelpers.SimpleRandom rng = new LoopHelpers.SimpleRandom();
+    static boolean print = false;
+    static int iters = 20000000;
+
+    public static void main(String[] args) throws Exception {
+        int maxThreads = 100;
+        if (args.length > 0) 
+            maxThreads = Integer.parseInt(args[0]);
+
+        new ReentrantLockLoop(1).test();
+        new ReentrantLockLoop(1).test();
+        print = true;
+
+        int k = 1;
+        for (int i = 1; i <= maxThreads;) {
+            System.out.print("Threads: " + i);
+            new ReentrantLockLoop(i).test();
+            Thread.sleep(100);
+            if (i == k) {
+                k = i << 1;
+                i = i + (i >>> 1);
+            } 
+            else 
+                i = k;
+        }
+        pool.shutdown();
+    }
+
+    static final class ReentrantLockLoop implements Runnable {
+        private int v = rng.next();
+        private volatile int result = 17;
+        private final LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
+        private final CyclicBarrier barrier;
+        private final int nthreads;
+        private volatile int readBarrier;
+        ReentrantLockLoop(int nthreads) {
+            this.nthreads = nthreads;
+            barrier = new CyclicBarrier(nthreads+1, timer);
+        }
+
+        final void test() throws Exception {
+            for (int i = 0; i < nthreads; ++i) 
+                pool.execute(this);
+            barrier.await();
+            barrier.await();
+            if (print) {
+                long time = timer.getTime();
+                long tpi = time / ((long)iters * nthreads);
+                System.out.print("\t" + LoopHelpers.rightJustify(tpi) + " ns per lock");
+                double secs = (double)(time) / 1000000000.0;
+                System.out.println("\t " + secs + "s run time");
+            }
+
+            int r = result;
+            if (r == 0) // avoid overoptimization
+                System.out.println("useless result: " + r);
+        }
+
+        public final void run() {
+            try {
+                barrier.await(); 
+                int sum = v + 1;
+                int x = sum + 1;
+                int n = iters;
+                while (n-- > 0) {
+                    x = LoopHelpers.compute4(x);
+                    sum += x;
+                    if ((x += readBarrier) == 0)
+                        ++readBarrier;
+
+                }
+                barrier.await();
+                result += sum;
+            }
+            catch (Exception ie) { 
+                return; 
+            }
+        }
+    }
+
+}
+

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/NoopSpinLockLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/NoopSpinLockLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/NoopSpinLockLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,103 @@
+/*
+ * @test
+ * @synopsis multiple threads using a single builtin lock
+ */
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain. Use, modify, and
+ * redistribute this code in any way without acknowledgement.
+ */
+
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import edu.emory.mathcs.backport.java.util.concurrent.atomic.*;
+import edu.emory.mathcs.backport.java.util.*;
+
+public final class NoopSpinLockLoops {
+    static final ExecutorService pool = Executors.newCachedThreadPool();
+    static final LoopHelpers.SimpleRandom rng = new LoopHelpers.SimpleRandom();
+    static boolean print = false;
+    static int iters = 20000000;
+
+    public static void main(String[] args) throws Exception {
+        int maxThreads = 100;
+        if (args.length > 0) 
+            maxThreads = Integer.parseInt(args[0]);
+
+        new ReentrantLockLoop(1).test();
+        new ReentrantLockLoop(1).test();
+        print = true;
+
+        int k = 1;
+        for (int i = 1; i <= maxThreads;) {
+            System.out.print("Threads: " + i);
+            new ReentrantLockLoop(i).test();
+            Thread.sleep(100);
+            if (i == k) {
+                k = i << 1;
+                i = i + (i >>> 1);
+            } 
+            else 
+                i = k;
+        }
+        pool.shutdown();
+    }
+
+    static final class ReentrantLockLoop implements Runnable {
+        private int v = rng.next();
+        private volatile int result = 17;
+        private final LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
+        private final CyclicBarrier barrier;
+        private final int nthreads;
+        private volatile int readBarrier;
+        private final AtomicInteger spinlock = new AtomicInteger();
+        ReentrantLockLoop(int nthreads) {
+            this.nthreads = nthreads;
+            barrier = new CyclicBarrier(nthreads+1, timer);
+        }
+
+        final void test() throws Exception {
+            for (int i = 0; i < nthreads; ++i) 
+                pool.execute(this);
+            barrier.await();
+            barrier.await();
+            if (print) {
+                long time = timer.getTime();
+                long tpi = time / ((long)iters * nthreads);
+                System.out.print("\t" + LoopHelpers.rightJustify(tpi) + " ns per lock");
+                double secs = (double)(time) / 1000000000.0;
+                System.out.println("\t " + secs + "s run time");
+            }
+
+            int r = result;
+            if (r == 0) // avoid overoptimization
+                System.out.println("useless result: " + r);
+        }
+
+        public final void run() {
+            final AtomicInteger lock = this.spinlock;
+            try {
+                barrier.await(); 
+                int sum = v + 1;
+                int x = sum + 1;
+                int n = iters;
+                while (n-- > 0) {
+                    while (!lock.compareAndSet(0, 1)) ;
+                    x = LoopHelpers.compute4(x);
+                    lock.set(0);
+                    if ((x += readBarrier) == 0)
+                        ++readBarrier;
+
+                    sum += x;
+                }
+                barrier.await();
+                result += sum;
+            }
+            catch (Exception ie) { 
+                return; 
+            }
+        }
+    }
+
+}
+

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/PriorityQueueSort.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/PriorityQueueSort.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/PriorityQueueSort.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,76 @@
+/*
+ * Written by Josh Bloch and Doug Lea with assistance from members of
+ * JCP JSR-166 Expert Group and released to the public domain, as
+ * explained at http://creativecommons.org/licenses/publicdomain
+ */
+/*
+ * @test
+ * @synopsis Checks that a priority queue returns elements in sorted order across various operations
+ */
+
+import edu.emory.mathcs.backport.java.util.PriorityQueue;
+import java.util.Comparator;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Iterator;
+import edu.emory.mathcs.backport.java.util.Collections;
+import edu.emory.mathcs.backport.java.util.Queue;
+
+public class PriorityQueueSort {
+
+    static class MyComparator implements Comparator {
+        public int compare(Object x, Object y) {
+            int i = ((Integer)x).intValue();
+            int j = ((Integer)y).intValue();
+            if (i < j) return -1;
+            if (i > j) return 1;
+            return 0;
+        }
+    }
+
+    public static void main(String[] args) {
+        int n = 100000;
+        if (args.length > 0)
+            n = Integer.parseInt(args[0]);
+
+        List sorted = new ArrayList(n);
+        for (int i = 0; i < n; i++)
+            sorted.add(new Integer(i));
+        List shuffled = new ArrayList(sorted);
+        Collections.shuffle(shuffled);
+
+        Queue pq = new PriorityQueue(n, new MyComparator());
+        for (Iterator i = shuffled.iterator(); i.hasNext(); )
+            pq.add(i.next());
+
+        List recons = new ArrayList();
+        while (!pq.isEmpty())
+            recons.add(pq.remove());
+        if (!recons.equals(sorted))
+            throw new RuntimeException("Sort test failed");
+
+        recons.clear();
+        pq = new PriorityQueue(shuffled);
+        while (!pq.isEmpty())
+            recons.add(pq.remove());
+        if (!recons.equals(sorted))
+            throw new RuntimeException("Sort test failed");
+
+        // Remove all odd elements from queue
+        pq = new PriorityQueue(shuffled);
+        for (Iterator i = pq.iterator(); i.hasNext(); )
+            if ((((Integer)i.next()).intValue() & 1) == 1)
+                i.remove();
+        recons.clear();
+        while (!pq.isEmpty())
+            recons.add(pq.remove());
+
+        for (Iterator i = sorted.iterator(); i.hasNext(); )
+            if ((((Integer)i.next()).intValue() & 1) == 1)
+                i.remove();
+
+        if (!recons.equals(sorted))
+            throw new RuntimeException("Iterator remove test failed.");
+    }
+}
+

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/ProducerConsumerLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/ProducerConsumerLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/ProducerConsumerLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,173 @@
+/*
+ * @test
+ * @synopsis  multiple producers and consumers using blocking queues
+ */
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain. Use, modify, and
+ * redistribute this code in any way without acknowledgement.
+ */
+
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+
+public class ProducerConsumerLoops {
+    static final int CAPACITY =      100;
+
+    static final ExecutorService pool = Executors.newCachedThreadPool();
+    static boolean print = false;
+    static int producerSum;
+    static int consumerSum;
+    static synchronized void addProducerSum(int x) {
+        producerSum += x;
+    }
+
+    static synchronized void addConsumerSum(int x) {
+        consumerSum += x;
+    }
+
+    static synchronized void checkSum() {
+        if (producerSum != consumerSum)
+            throw new Error("CheckSum mismatch");
+    }
+
+    public static void main(String[] args) throws Exception {
+        int maxPairs = 100;
+        int iters = 100000;
+
+        if (args.length > 0)
+            maxPairs = Integer.parseInt(args[0]);
+
+        print = false;
+        System.out.println("Warmup...");
+        oneTest(1, 10000);
+        Thread.sleep(100);
+        oneTest(2, 10000);
+        Thread.sleep(100);
+        oneTest(2, 10000);
+        Thread.sleep(100);
+        print = true;
+
+        int k = 1;
+        for (int i = 1; i <= maxPairs;) {
+            System.out.println("Pairs:" + i);
+            oneTest(i, iters);
+            Thread.sleep(100);
+            if (i == k) {
+                k = i << 1;
+                i = i + (i >>> 1);
+            }
+            else
+                i = k;
+        }
+        pool.shutdown();
+   }
+
+    static void oneTest(int pairs, int iters) throws Exception {
+        int fairIters = iters/20;
+        if (print)
+            System.out.print("ArrayBlockingQueue      ");
+        oneRun(new ArrayBlockingQueue(CAPACITY), pairs, iters);
+
+        if (print)
+            System.out.print("LinkedBlockingQueue     ");
+        oneRun(new LinkedBlockingQueue(CAPACITY), pairs, iters);
+
+        if (print)
+            System.out.print("LinkedBlockingDeque     ");
+        oneRun(new LinkedBlockingDeque(CAPACITY), pairs, iters);
+
+        if (print)
+            System.out.print("SynchronousQueue        ");
+        oneRun(new SynchronousQueue(), pairs, iters);
+
+        if (print)
+            System.out.print("SynchronousQueue(fair)  ");
+        oneRun(new SynchronousQueue(true), pairs, fairIters);
+
+        if (print)
+            System.out.print("PriorityBlockingQueue   ");
+        oneRun(new PriorityBlockingQueue(), pairs, fairIters);
+
+        if (print)
+            System.out.print("ArrayBlockingQueue(fair)");
+        oneRun(new ArrayBlockingQueue(CAPACITY, true), pairs, fairIters);
+
+    }
+
+    static abstract class Stage implements Runnable {
+        final int iters;
+        final BlockingQueue queue;
+        final CyclicBarrier barrier;
+        Stage (BlockingQueue q, CyclicBarrier b, int iters) {
+            queue = q;
+            barrier = b;
+            this.iters = iters;
+        }
+    }
+
+    static class Producer extends Stage {
+        Producer(BlockingQueue q, CyclicBarrier b, int iters) {
+            super(q, b, iters);
+        }
+
+        public void run() {
+            try {
+                barrier.await();
+                int s = 0;
+                int l = hashCode();
+                for (int i = 0; i < iters; ++i) {
+                    l = LoopHelpers.compute4(l);
+                    queue.put(new Integer(l));
+                    s += LoopHelpers.compute4(l);
+                }
+                addProducerSum(s);
+                barrier.await();
+            }
+            catch (Exception ie) {
+                ie.printStackTrace();
+                return;
+            }
+        }
+    }
+
+    static class Consumer extends Stage {
+        Consumer(BlockingQueue q, CyclicBarrier b, int iters) {
+            super(q, b, iters);
+        }
+
+        public void run() {
+            try {
+                barrier.await();
+                int l = 0;
+                int s = 0;
+                for (int i = 0; i < iters; ++i) {
+                    l = LoopHelpers.compute4(((Integer)queue.take()).intValue());
+                    s += l;
+                }
+                addConsumerSum(s);
+                barrier.await();
+            }
+            catch (Exception ie) {
+                ie.printStackTrace();
+                return;
+            }
+        }
+
+    }
+
+    static void oneRun(BlockingQueue q, int npairs, int iters) throws Exception {
+        LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
+        CyclicBarrier barrier = new CyclicBarrier(npairs * 2 + 1, timer);
+        for (int i = 0; i < npairs; ++i) {
+            pool.execute(new Producer(q, barrier, iters));
+            pool.execute(new Consumer(q, barrier, iters));
+        }
+        barrier.await();
+        barrier.await();
+        long time = timer.getTime();
+        checkSum();
+        if (print)
+            System.out.println("\t: " + LoopHelpers.rightJustify(time / (iters * npairs)) + " ns per transfer");
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/RLIBar.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/RLIBar.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/RLIBar.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,259 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+// Adapted from code that was in turn
+// Derived from SocketPerformanceTest.java - BugID: 4763450
+//
+// 
+
+import java.io.*;
+import java.net.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+
+public class RLIBar {
+
+    static int batchLimit ; 
+    static int mseq ; 
+    static int nReady ; 
+    static int ExThreads ; 
+    static int ASum ; 
+    static final ReentrantLock Gate = new ReentrantLock () ; 
+    static final Condition GateCond = Gate.newCondition () ; 
+
+    static final ReentrantLock HoldQ = new ReentrantLock () ;
+    static final Condition HoldQCond = HoldQ.newCondition() ;
+    static boolean Hold = false ; 
+    static int HoldPop ; 
+    static int HoldLimit ; 
+
+    static private boolean HoldCheck () { 
+        try {  
+            HoldQ.lock(); 
+            try { 
+                if (!Hold) return false;
+                else {
+                    ++HoldPop ; 
+                    if (HoldPop >= HoldLimit) { 
+                        System.out.print ("Holding ") ; 
+                        Thread.sleep (1000) ; 
+                        System.out.println () ; 
+                        Hold = false ; 
+                        HoldQCond.signalAll () ; 
+                    } 
+                    else
+                        while (Hold) 
+                            HoldQCond.await() ; 
+                    
+                    if (--HoldPop == 0) HoldQCond.signalAll () ; 
+                    return true;
+                }
+            }
+            finally { 
+                HoldQ.unlock(); 
+            }
+        } catch (Exception Ex) { 
+            System.out.println ("Unexpected exception in Hold: " + Ex) ; 
+            return false;
+        }
+    }
+
+    private static class Server {
+        private int nClients;
+        final ReentrantLock thisLock = new ReentrantLock();
+        final Condition thisCond = thisLock.newCondition(); 
+		
+        Server (int nClients) {
+            this.nClients = nClients;
+            try {
+                for (int i = 0; i < nClients; ++i) {
+                    final int fix = i ; 
+                    new Thread() { public void run () { runServer(fix); }}.start();
+                }
+            } catch (Exception e) {
+                System.err.println(e) ; 
+            }
+        }
+
+        // the total number of messages received by all server threads
+        // on this server
+        int msgsReceived = 0;
+
+        // incremented each time we get a complete batch of requests
+        private int currentBatch = 0;
+
+        // the number of requests received since the last time currentBatch
+        // was incremented
+        private int currentBatchSize = 0;
+
+        private void runServer (int id) {
+            int msg ; 
+            boolean held = false;
+            final ReentrantLock thisLock = this.thisLock;
+            final Condition thisCond = this.thisCond; 
+
+            try {
+
+                // Startup barrier - rendezvous - wait for all threads. 
+                // Forces all threads to park on their LWPs, ensuring
+                // proper provisioning on T1.  
+                // Alternately, use THR_BOUND threads 
+                Gate.lock(); try {  
+                    ++nReady ; 
+                    if (nReady == ExThreads ) { 
+                        GateCond.signalAll () ; 
+                    }
+                    while (nReady != ExThreads ) 
+                        GateCond.await() ; 
+                } finally { Gate.unlock(); }
+
+                for (;;) {
+                    //                    if (!held && currentBatchSize == 0) held = HoldCheck () ;
+                    msg = (++ mseq) ^ id ;
+                    thisLock.lock(); 
+                    try {
+                        ASum += msg ; 
+                        ++msgsReceived;
+                        int myBatch = currentBatch;
+                        if (++currentBatchSize >= batchLimit) {
+                            // this batch is full, start a new one ...
+                            ++currentBatch;
+                            currentBatchSize = 0;
+                            // and wake up everyone in this one
+                            thisCond.signalAll () ; 
+                        }
+                        // Wait until our batch is complete
+                        while (myBatch == currentBatch)
+                            thisCond.await(); 
+                    } 
+                    finally { 
+                        thisLock.unlock(); 
+                    }
+                }
+            } catch (Exception e) {
+                System.err.println("Server thread: exception "  + e) ;
+                e.printStackTrace();
+            }
+        }
+
+
+    }
+
+    public static void main (String[] args) throws Exception {
+        int nServers = 10 ;
+        int nClients = 10 ;
+        int samplePeriod = 10000;
+        int nSamples = 5;
+
+        int nextArg = 0;
+        while (nextArg < args.length) {
+            String arg = args[nextArg++];
+            if (arg.equals("-nc"))
+                nClients = Integer.parseInt(args[nextArg++]);
+            else if (arg.equals("-ns"))
+                nServers = Integer.parseInt(args[nextArg++]);
+            else if (arg.equals("-batch"))
+                batchLimit = Integer.parseInt(args[nextArg++]);
+            else if (arg.equals("-sample"))
+                samplePeriod = Integer.parseInt(args[nextArg++]);
+            else if (arg.equals("-np"))
+                nSamples = Integer.parseInt(args[nextArg++]);
+            else { 
+                System.err.println ("Argument error:" + arg) ; 
+                System.exit (1) ; 
+            }	
+        }
+        if (nClients <= 0 || nServers <= 0 || samplePeriod <= 0 || batchLimit > nClients) {
+            System.err.println ("Argument error") ; 
+            System.exit (1) ; 
+        }
+
+        // default batch size is 2/3 the number of clients
+        // (for no particular reason)
+        if (false && batchLimit <= 0)
+            batchLimit = (2 * nClients + 1) / 3;
+
+        ExThreads = nServers * nClients ; 	// expected # of threads
+        HoldLimit = ExThreads ; 
+
+        // start up all threads
+        Server[] servers = new Server[nServers];
+        for (int i = 0; i < nServers; ++i) {
+            servers[i] = new Server(nClients);
+        }
+
+        // Wait for consensus 
+        try {
+            Gate.lock(); try { 
+                while (nReady != ExThreads ) GateCond.await() ; 
+            } finally { Gate.unlock(); }
+        } catch (Exception ex) { 
+            System.out.println (ex); 
+        }
+        System.out.println (
+                            nReady + " Ready: nc=" + nClients + " ns=" + nServers + " batch=" + batchLimit) ; 
+
+        // Start sampling ...
+        // Methodological problem: all the mutator threads
+        // can starve the compiler threads, resulting in skewed scores.
+        // In theory, over time, the scores will improve as the compiler
+        // threads are granted CPU cycles, but in practice a "warm up" phase
+        // might be good idea to help C2.  For this reason I've implemented 
+        // the "Hold" facility.  
+
+        long lastNumMsgs = 0;
+        long sampleStart = System.currentTimeMillis();
+        for (int j = 0; j < nSamples; ++j) {
+            // when this sample period is supposed to end
+            long sampleEnd = sampleStart + samplePeriod;
+            for (;;) {
+                long now = System.currentTimeMillis();
+                if (now >= sampleEnd) {
+                    // when it really did end
+                    sampleEnd = now;
+                    break;
+                }
+                Thread.sleep(sampleEnd - now);
+            }
+
+            if (false && j == 2) { 
+                System.out.print ("Hold activated ...") ; 
+                HoldQ.lock(); 
+                try  { 
+                    Hold = true ; 
+                    while (Hold) HoldQCond.await() ; 
+                } 
+                finally { 
+                    HoldQ.unlock(); 
+                }
+            }
+
+
+
+            // there's no synchronization here, so the total i get is
+            // approximate, but that's OK since any i miss for this
+            // sample will get credited to the next sample, and on average
+            // we'll be right
+            long numMsgs = 0;
+            for (int i = 0; i < nServers; ++i)
+                numMsgs += servers[i].msgsReceived;
+            long deltaMsgs = numMsgs - lastNumMsgs;
+            long deltaT = sampleEnd - sampleStart;
+            if (true || j != 2) { 	// Don't report results if we issued a hold ...
+                System.out.print(
+                                 "Sample period = " + deltaT + " ms; "
+                                 + "New msgs rcvd = " + deltaMsgs + "; "
+                                 + "Throughput = " + (deltaMsgs*1000 / deltaT) + " msg/sec\n");
+                //                for (int i = 0; i < nServers; ++i)
+                //                    servers[i].thisLock.dump();
+            }
+            sampleStart = sampleEnd;
+            lastNumMsgs = numMsgs;
+        }
+        System.exit(0);
+    }
+}
+
+

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/RLJBar.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/RLJBar.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/RLJBar.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,162 @@
+// Yet another contended object monitor throughput test
+// adapted from bug reports
+
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import java.util.Map;
+
+class Producer extends Thread
+{
+    //  private static Hashtable buddiesOnline = new Hashtable();
+  private static Map buddiesOnline = new ConcurrentHashMap();
+  public Producer (String name) { super(name); }
+
+  public void run()
+    {
+      Object key = null ;
+      final ReentrantLock dr = RLJBar.DeathRow;
+      final ReentrantLock bar = RLJBar.bar;
+      final ReentrantLock end = RLJBar.End;
+      final Condition endCondition = RLJBar.EndCondition;
+      if (RLJBar.OneKey) key = new Integer(0) ; 	// per-thread v. per iteration
+
+      // The barrier has a number of interesting effects:
+      // 1.	It enforces full LWP provisioning on T1.
+      //		(nearly all workers park concurrently).
+      // 2.	It gives the C2 compiler thread(s) a chance to run.
+      //		By transiently quiescing the workings the C2 threads
+      //		might avoid starvation.
+      //
+
+      try {
+          bar.lock();
+          try {
+              ++RLJBar.nUp ;
+              if (RLJBar.nUp == RLJBar.nThreads) {
+                  if (RLJBar.quiesce != 0) {
+                      RLJBar.barCondition.await(RLJBar.quiesce * 1000000, TimeUnit.NANOSECONDS) ;
+                  }
+                  RLJBar.epoch = System.currentTimeMillis () ;
+                  RLJBar.barCondition.signalAll () ;
+                  //                  System.out.print ("Consensus ") ;
+              }
+              if (RLJBar.UseBar) {
+                  while (RLJBar.nUp != RLJBar.nThreads) {
+                      RLJBar.barCondition.await () ;
+                  }
+              }
+          }
+          finally {
+              bar.unlock();
+          }
+      } catch (Exception ex) {
+        System.out.println ("Exception in barrier: " + ex) ;
+      }
+
+      // Main execution time ... the code being timed ...
+      // HashTable.get() is highly contended (serial).
+      for (int loop = 1; loop < 100000 ;loop++) {
+        if (!RLJBar.OneKey) key = new Integer(0) ;
+        buddiesOnline.get(key);
+      }
+
+      // Mutator epilog:
+      // The following code determines if the test will/wont include (measure)
+      // thread death time.
+
+      end.lock();
+      try {
+        ++RLJBar.nDead ;
+        if (RLJBar.nDead == RLJBar.nUp) {
+            //          System.out.print((System.currentTimeMillis()-RLJBar.epoch) + " ms") ;
+          endCondition.signalAll() ;
+        }
+      }
+      finally {
+          end.unlock();
+      }
+      dr.lock();
+      dr.unlock();
+    }
+}
+
+
+public class RLJBar				// ProdConsTest
+{
+
+    public static final int ITERS = 10;
+  public static boolean OneKey = false ; 			// alloc once or once per iteration
+
+  public static boolean UseBar = false ;
+  public static int nThreads = 100 ;
+  public static int nUp = 0 ;
+  public static int nDead = 0 ;
+  public static ReentrantLock bar = new ReentrantLock() ;
+  public static Condition barCondition = bar.newCondition() ;
+  public static long epoch ;
+  public static ReentrantLock DeathRow = new ReentrantLock () ;
+  public static ReentrantLock End = new ReentrantLock () ;
+  public static int quiesce = 0 ;
+  public static Condition EndCondition = End.newCondition();
+
+  public static void main (String[] args)    {
+      int argix = 0 ;
+      if (argix < args.length && args[argix].equals("-o")) {
+          ++argix ;
+          OneKey = true ;
+          System.out.println ("OneKey") ;
+      }
+      if (argix < args.length && args[argix].equals ("-b")) {
+          ++argix ;
+          UseBar = true ;
+          System.out.println ("UseBar") ;
+      }
+      if (argix < args.length && args[argix].equals ("-q")) {
+          ++argix ;
+          if (argix < args.length) {
+              quiesce = Integer.parseInt (args[argix++]) ;
+              System.out.println ("Quiesce " + quiesce + " msecs") ;
+          }
+      }
+      for (int k = 0; k < ITERS; ++k)
+          oneRun();
+  }
+
+    public static void oneRun() {
+        DeathRow = new ReentrantLock () ;
+        End = new ReentrantLock () ;
+        EndCondition = End.newCondition();
+
+        nDead = nUp = 0 ;
+        long cyBase = System.currentTimeMillis () ;
+        DeathRow.lock();
+        try {
+            for (int i = 1; i <= nThreads ; i++) {
+                new Producer("Producer" + i).start();
+            }
+            try {
+                End.lock();
+                try {
+                    while (nDead != nThreads)
+                        EndCondition.await() ;
+                }
+                finally {
+                    End.unlock();
+                }
+            } catch (Exception ex) {
+                System.out.println ("Exception in End: " + ex) ;
+            }
+        }
+        finally {
+            DeathRow.unlock();
+        }
+        System.out.println ("Outer time: " + (System.currentTimeMillis()-cyBase)) ;
+
+        // Let workers quiesce/exit.
+        try { Thread.sleep (1000) ; } catch (Exception ex) {} ;
+    }
+}
+
+
+

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/RLMap.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/RLMap.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/RLMap.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,85 @@
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import java.util.Map;
+import java.util.Set;
+import java.util.Collection;
+
+
+/**
+ * This is an incomplete implementation of a wrapper class
+ * that places read-write locks around unsynchronized Maps.
+ * Exists as a sample input for MapLoops test.
+ */
+
+public class RLMap implements Map {
+    private final Map m;
+    private final ReentrantLock rl = new ReentrantLock();
+
+    public RLMap(Map m) {
+        if (m == null)
+            throw new NullPointerException();
+        this.m = m;
+    }
+
+    public RLMap() {
+        this(new TreeMap()); // use TreeMap by default
+    }
+
+    public int size() {
+        rl.lock(); try {return m.size();} finally { rl.unlock(); }
+    }
+    public boolean isEmpty(){
+        rl.lock(); try {return m.isEmpty();} finally { rl.unlock(); }
+    }
+
+    public Object get(Object key) {
+        rl.lock(); try {return m.get(key);} finally { rl.unlock(); }
+    }
+
+    public boolean containsKey(Object key) {
+        rl.lock(); try {return m.containsKey(key);} finally { rl.unlock(); }
+    }
+    public boolean containsValue(Object value){
+        rl.lock(); try {return m.containsValue(value);} finally { rl.unlock(); }
+    }
+
+
+    public Set keySet() { // Not implemented
+        return m.keySet();
+    }
+
+    public Set entrySet() { // Not implemented
+        return m.entrySet();
+    }
+
+    public Collection values() { // Not implemented
+        return m.values();
+    }
+
+    public boolean equals(Object o) {
+        rl.lock(); try {return m.equals(o);} finally { rl.unlock(); }
+    }
+    public int hashCode() {
+        rl.lock(); try {return m.hashCode();} finally { rl.unlock(); }
+    }
+    public String toString() {
+        rl.lock(); try {return m.toString();} finally { rl.unlock(); }
+    }
+
+
+
+    public Object put(Object key, Object value) {
+        rl.lock(); try {return m.put(key, value);} finally { rl.unlock(); }
+    }
+    public Object remove(Object key) {
+        rl.lock(); try {return m.remove(key);} finally { rl.unlock(); }
+    }
+    public void putAll(Map map) {
+        rl.lock(); try {m.putAll(map);} finally { rl.unlock(); }
+    }
+    public void clear() {
+        rl.lock(); try {m.clear();} finally { rl.unlock(); }
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/RWCollection.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/RWCollection.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/RWCollection.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,105 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.ArrayList;
+
+
+/**
+ * This is an incomplete implementation of a wrapper class
+ * that places read-write locks around unsynchronized Collections.
+ * Exists as a sample input for CollectionLoops test.
+ */
+
+public final class RWCollection implements Collection {
+    private final Collection c;
+    private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
+
+    public RWCollection(Collection c) {
+        if (c == null)
+            throw new NullPointerException();
+        this.c = c;
+    }
+
+    public RWCollection() {
+        this(new ArrayList());
+    }
+
+    public final int size() {
+        final ReentrantReadWriteLock.ReadLock l =  (ReentrantReadWriteLock.ReadLock)rwl.readLock();
+        l.lock(); try {return c.size();} finally { l.unlock(); }
+    }
+    public final boolean isEmpty(){
+        final ReentrantReadWriteLock.ReadLock l =  (ReentrantReadWriteLock.ReadLock)rwl.readLock();
+        l.lock(); try {return c.isEmpty();} finally { l.unlock(); }
+    }
+
+    public final boolean contains(Object o) {
+        final ReentrantReadWriteLock.ReadLock l =  (ReentrantReadWriteLock.ReadLock)rwl.readLock();
+        l.lock(); try {return c.contains(o);} finally { l.unlock(); }
+    }
+
+    public final boolean equals(Object o) {
+        final ReentrantReadWriteLock.ReadLock l =  (ReentrantReadWriteLock.ReadLock)rwl.readLock();
+        l.lock(); try {return c.equals(o);} finally { l.unlock(); }
+    }
+    public final int hashCode() {
+        final ReentrantReadWriteLock.ReadLock l =  (ReentrantReadWriteLock.ReadLock)rwl.readLock();
+        l.lock(); try {return c.hashCode();} finally { l.unlock(); }
+    }
+    public final String toString() {
+        final ReentrantReadWriteLock.ReadLock l =  (ReentrantReadWriteLock.ReadLock)rwl.readLock();
+        l.lock(); try {return c.toString();} finally { l.unlock(); }
+    }
+
+    public final Iterator iterator() {
+        final ReentrantReadWriteLock.ReadLock l =  (ReentrantReadWriteLock.ReadLock)rwl.readLock();
+        l.lock(); try {return c.iterator();} finally { l.unlock(); }
+    }
+
+    public final Object[] toArray() {
+        final ReentrantReadWriteLock.ReadLock l =  (ReentrantReadWriteLock.ReadLock)rwl.readLock();
+        l.lock(); try  {return c.toArray();} finally { l.unlock(); }
+    }
+    public final Object[] toArray(Object[] a) {
+        final ReentrantReadWriteLock.ReadLock l =  (ReentrantReadWriteLock.ReadLock)rwl.readLock();
+        l.lock(); try  {return c.toArray(a);} finally { l.unlock(); }
+    }
+
+    public final boolean add(Object e) {
+        final ReentrantReadWriteLock.WriteLock l =  (ReentrantReadWriteLock.WriteLock)rwl.writeLock();
+        l.lock(); try  {return c.add(e);} finally { l.unlock(); }
+    }
+    public final boolean remove(Object o) {
+        final ReentrantReadWriteLock.WriteLock l =  (ReentrantReadWriteLock.WriteLock)rwl.writeLock();
+        l.lock(); try  {return c.remove(o);} finally { l.unlock(); }
+    }
+
+    public final boolean containsAll(Collection coll) {
+        final ReentrantReadWriteLock.WriteLock l =  (ReentrantReadWriteLock.WriteLock)rwl.writeLock();
+        l.lock(); try  {return c.containsAll(coll);} finally { l.unlock(); }
+    }
+    public final boolean addAll(Collection coll) {
+        final ReentrantReadWriteLock.WriteLock l =  (ReentrantReadWriteLock.WriteLock)rwl.writeLock();
+        l.lock(); try  {return c.addAll(coll);} finally { l.unlock(); }
+    }
+    public final boolean removeAll(Collection coll) {
+        final ReentrantReadWriteLock.WriteLock l =  (ReentrantReadWriteLock.WriteLock)rwl.writeLock();
+        l.lock(); try  {return c.removeAll(coll);} finally { l.unlock(); }
+    }
+    public final boolean retainAll(Collection coll) {
+        final ReentrantReadWriteLock.WriteLock l =  (ReentrantReadWriteLock.WriteLock)rwl.writeLock();
+        l.lock(); try  {return c.retainAll(coll);} finally { l.unlock(); }
+    }
+    public final void clear() {
+        final ReentrantReadWriteLock.WriteLock l =  (ReentrantReadWriteLock.WriteLock)rwl.writeLock();
+        l.lock(); try  {c.clear();} finally { l.unlock(); }
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/RWMap.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/RWMap.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/RWMap.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,90 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import java.util.Map;
+import java.util.Set;
+import java.util.Collection;
+
+
+/**
+ * This is an incomplete implementation of a wrapper class
+ * that places read-write locks around unsynchronized Maps.
+ * Exists as a sample input for MapLoops test.
+ */
+
+public class RWMap implements Map {
+    private final Map m;
+    private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
+
+    public RWMap(Map m) {
+        if (m == null)
+            throw new NullPointerException();
+        this.m = m;
+    }
+
+    public RWMap() {
+        this(new TreeMap()); // use TreeMap by default
+    }
+
+    public int size() {
+        rwl.readLock().lock(); try {return m.size();} finally { rwl.readLock().unlock(); }
+    }
+    public boolean isEmpty(){
+        rwl.readLock().lock(); try {return m.isEmpty();} finally { rwl.readLock().unlock(); }
+    }
+
+    public Object get(Object key) {
+        rwl.readLock().lock(); try {return m.get(key);} finally { rwl.readLock().unlock(); }
+    }
+
+    public boolean containsKey(Object key) {
+        rwl.readLock().lock(); try {return m.containsKey(key);} finally { rwl.readLock().unlock(); }
+    }
+    public boolean containsValue(Object value){
+        rwl.readLock().lock(); try {return m.containsValue(value);} finally { rwl.readLock().unlock(); }
+    }
+
+
+    public Set keySet() { // Not implemented
+        return m.keySet();
+    }
+
+    public Set entrySet() { // Not implemented
+        return m.entrySet();
+    }
+
+    public Collection values() { // Not implemented
+        return m.values();
+    }
+
+    public boolean equals(Object o) {
+        rwl.readLock().lock(); try {return m.equals(o);} finally { rwl.readLock().unlock(); }
+    }
+    public int hashCode() {
+        rwl.readLock().lock(); try {return m.hashCode();} finally { rwl.readLock().unlock(); }
+    }
+    public String toString() {
+        rwl.readLock().lock(); try {return m.toString();} finally { rwl.readLock().unlock(); }
+    }
+
+
+
+    public Object put(Object key, Object value) {
+        rwl.writeLock().lock(); try {return m.put(key, value);} finally { rwl.writeLock().unlock(); }
+    }
+    public Object remove(Object key) {
+        rwl.writeLock().lock(); try {return m.remove(key);} finally { rwl.writeLock().unlock(); }
+    }
+    public void putAll(Map map) {
+        rwl.writeLock().lock(); try {m.putAll(map);} finally { rwl.writeLock().unlock(); }
+    }
+    public void clear() {
+        rwl.writeLock().lock(); try {m.clear();} finally { rwl.writeLock().unlock(); }
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/ReadHoldingWriteLock.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/ReadHoldingWriteLock.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/ReadHoldingWriteLock.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,147 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+
+class ReadHoldingWriteLock {
+
+    public static void main(String[] args) throws Exception {
+        ReadHoldingWriteLock t = new ReadHoldingWriteLock();
+        t.testReadAfterWriteLock();
+        t.testReadHoldingWriteLock();
+        t.testReadHoldingWriteLock2();
+//        t.testReadHoldingWriteLockFair();
+//        t.testReadHoldingWriteLockFair2();
+    }
+
+    static final long SHORT_DELAY_MS = 50;
+    static final long MEDIUM_DELAY_MS = 200;
+
+    void assertTrue(boolean b) {
+        if (!b) throw new Error();
+    }
+
+    /**
+     * Readlocks succeed after a writing thread unlocks
+     */
+    public void testReadAfterWriteLock() throws Exception {
+        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        lock.writeLock().lock();
+        Thread t1 = new Thread(new Runnable() {
+                public void run() {
+                    lock.readLock().lock();
+                    lock.readLock().unlock();
+                }
+            });
+        Thread t2 = new Thread(new Runnable() {
+                public void run() {
+                    lock.readLock().lock();
+                    lock.readLock().unlock();
+                }
+            });
+
+        t1.start();
+        t2.start();
+        Thread.sleep(SHORT_DELAY_MS);
+        lock.writeLock().unlock();
+        t1.join(MEDIUM_DELAY_MS);
+        t2.join(MEDIUM_DELAY_MS);
+        assertTrue(!t1.isAlive());
+        assertTrue(!t2.isAlive());
+
+    }
+
+    /**
+     * Read trylock succeeds if write locked by current thread
+     */
+    public void testReadHoldingWriteLock()throws Exception {
+        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        lock.writeLock().lock();
+        assertTrue(lock.readLock().tryLock());
+        lock.readLock().unlock();
+        lock.writeLock().unlock();
+    }
+
+    /**
+     * Read lock succeeds if write locked by current thread even if
+     * other threads are waiting
+     */
+    public void testReadHoldingWriteLock2() throws Exception{
+        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        lock.writeLock().lock();
+        Thread t1 = new Thread(new Runnable() {
+                public void run() {
+                    lock.readLock().lock();
+                    lock.readLock().unlock();
+                }
+            });
+        Thread t2 = new Thread(new Runnable() {
+                public void run() {
+                    lock.readLock().lock();
+                    lock.readLock().unlock();
+                }
+            });
+
+        t1.start();
+        t2.start();
+        lock.readLock().lock();
+        lock.readLock().unlock();
+        Thread.sleep(SHORT_DELAY_MS);
+        lock.readLock().lock();
+        lock.readLock().unlock();
+        lock.writeLock().unlock();
+        t1.join(MEDIUM_DELAY_MS);
+        t2.join(MEDIUM_DELAY_MS);
+        assertTrue(!t1.isAlive());
+        assertTrue(!t2.isAlive());
+    }
+
+//    /**
+//     * Fair Read trylock succeeds if write locked by current thread
+//     */
+//    public void testReadHoldingWriteLockFair() throws Exception{
+//	final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);
+//	lock.writeLock().lock();
+//        assertTrue(lock.readLock().tryLock());
+//        lock.readLock().unlock();
+//        lock.writeLock().unlock();
+//    }
+//
+//    /**
+//     * Fair Read lock succeeds if write locked by current thread even if
+//     * other threads are waiting
+//     */
+//    public void testReadHoldingWriteLockFair2() throws Exception {
+//	final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);
+//	lock.writeLock().lock();
+//	Thread t1 = new Thread(new Runnable() {
+//                public void run() {
+//                    lock.readLock().lock();
+//                    lock.readLock().unlock();
+//		}
+//	    });
+//	Thread t2 = new Thread(new Runnable() {
+//                public void run() {
+//                    lock.readLock().lock();
+//                    lock.readLock().unlock();
+//		}
+//	    });
+//
+//        t1.start();
+//        t2.start();
+//        lock.readLock().lock();
+//        lock.readLock().unlock();
+//        Thread.sleep(SHORT_DELAY_MS);
+//        lock.readLock().lock();
+//        lock.readLock().unlock();
+//        lock.writeLock().unlock();
+//        t1.join(MEDIUM_DELAY_MS);
+//        t2.join(MEDIUM_DELAY_MS);
+//        assertTrue(!t1.isAlive());
+//        assertTrue(!t2.isAlive());
+//
+//
+//    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/SCollection.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/SCollection.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/SCollection.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,89 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.ArrayList;
+
+
+/**
+ * This is an incomplete implementation of a wrapper class
+ * that places read-write locks around unsynchronized Collections.
+ * Exists as a sample input for CollectionLoops test.
+ */
+
+public final class SCollection implements Collection {
+    private final Collection c;
+    private final ReentrantLock l = new ReentrantLock();
+
+    public SCollection(Collection c) {
+        if (c == null)
+            throw new NullPointerException();
+        this.c = c;
+    }
+
+    public SCollection() {
+        this(new ArrayList());
+    }
+
+    public final int size() {
+        l.lock(); try {return c.size();} finally { l.unlock(); }
+    }
+    public final boolean isEmpty(){
+        l.lock(); try {return c.isEmpty();} finally { l.unlock(); }
+    }
+
+    public final boolean contains(Object o) {
+        l.lock(); try {return c.contains(o);} finally { l.unlock(); }
+    }
+
+    public final boolean equals(Object o) {
+        l.lock(); try {return c.equals(o);} finally { l.unlock(); }
+    }
+    public final int hashCode() {
+        l.lock(); try {return c.hashCode();} finally { l.unlock(); }
+    }
+    public final String toString() {
+        l.lock(); try {return c.toString();} finally { l.unlock(); }
+    }
+
+    public final Iterator iterator() {
+        l.lock(); try {return c.iterator();} finally { l.unlock(); }
+    }
+
+    public final Object[] toArray() {
+        l.lock(); try  {return c.toArray();} finally { l.unlock(); }
+    }
+    public final Object[] toArray(Object[] a) {
+        l.lock(); try  {return c.toArray(a);} finally { l.unlock(); }
+    }
+
+    public final boolean add(Object e) {
+        l.lock(); try  {return c.add(e);} finally { l.unlock(); }
+    }
+    public final boolean remove(Object o) {
+        l.lock(); try  {return c.remove(o);} finally { l.unlock(); }
+    }
+
+    public final boolean containsAll(Collection coll) {
+        l.lock(); try  {return c.containsAll(coll);} finally { l.unlock(); }
+    }
+    public final boolean addAll(Collection coll) {
+        l.lock(); try  {return c.addAll(coll);} finally { l.unlock(); }
+    }
+    public final boolean removeAll(Collection coll) {
+        l.lock(); try  {return c.removeAll(coll);} finally { l.unlock(); }
+    }
+    public final boolean retainAll(Collection coll) {
+        l.lock(); try  {return c.retainAll(coll);} finally { l.unlock(); }
+    }
+    public final void clear() {
+        l.lock(); try  {c.clear();} finally { l.unlock(); }
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/SMap.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/SMap.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/SMap.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,88 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import java.util.Map;
+import java.util.Set;
+import java.util.Collection;
+
+
+/**
+ * This is an incomplete implementation of a wrapper class
+ * that places read-write locks around unsynchronized Maps.
+ * Exists as a sample input for MapLoops test.
+ */
+
+public class SMap implements Map {
+    private final Map m;
+    public SMap(Map m) {
+        if (m == null)
+            throw new NullPointerException();
+        this.m = m;
+    }
+
+    public SMap() {
+        this(new TreeMap()); // use TreeMap by default
+    }
+
+    public synchronized int size() {
+        return m.size();
+    }
+    public synchronized boolean isEmpty(){
+        return m.isEmpty();
+    }
+
+    public synchronized Object get(Object key) {
+        return m.get(key);
+    }
+
+    public synchronized boolean containsKey(Object key) {
+        return m.containsKey(key);
+    }
+    public synchronized boolean containsValue(Object value){
+        return m.containsValue(value);
+    }
+
+
+    public synchronized Set keySet() { // Not implemented
+        return m.keySet();
+    }
+
+    public synchronized Set entrySet() { // Not implemented
+        return m.entrySet();
+    }
+
+    public synchronized Collection values() { // Not implemented
+        return m.values();
+    }
+
+    public synchronized boolean equals(Object o) {
+        return m.equals(o);
+    }
+    public synchronized int hashCode() {
+        return m.hashCode();
+    }
+    public synchronized String toString() {
+        return m.toString();
+    }
+
+
+
+    public synchronized Object put(Object key, Object value) {
+        return m.put(key, value);
+    }
+    public synchronized Object remove(Object key) {
+        return m.remove(key);
+    }
+    public synchronized void putAll(Map map) {
+        m.putAll(map);
+    }
+    public synchronized void clear() {
+        m.clear();
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/SetBash.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/SetBash.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/SetBash.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,136 @@
+/*
+ * Written by Doug Lea and Josh Bloch with assistance from members of
+ * JCP JSR-166 Expert Group and released to the public domain, as
+ * explained at http://creativecommons.org/licenses/publicdomain
+ */
+
+import java.util.Set;
+import java.util.Iterator;
+import java.util.Random;
+import java.util.Arrays;
+import java.util.Collections;
+
+public class SetBash {
+    static Random rnd = new Random();
+
+    public static void main(String[] args) {
+        int numItr = Integer.parseInt(args[1]);
+        int setSize = Integer.parseInt(args[2]);
+        Class cl = null;
+
+        try {
+            cl = Class.forName(args[0]);
+        } catch(ClassNotFoundException e) {
+            fail("Class " + args[0] + " not found.");
+        }
+
+        boolean synch = (args.length>3);
+
+        for (int i=0; i<numItr; i++) {
+            Set s1 = newSet(cl, synch);
+            AddRandoms(s1, setSize);
+
+            Set s2 = newSet(cl, synch);
+            AddRandoms(s2, setSize);
+
+            Set intersection = clone(s1, cl, synch);
+            intersection.retainAll(s2);
+            Set diff1 = clone(s1, cl, synch); diff1.removeAll(s2);
+            Set diff2 = clone(s2, cl, synch); diff2.removeAll(s1);
+            Set union = clone(s1, cl, synch); union.addAll(s2);
+
+            if (diff1.removeAll(diff2))
+                fail("Set algebra identity 2 failed");
+            if (diff1.removeAll(intersection))
+                fail("Set algebra identity 3 failed");
+            if (diff2.removeAll(diff1))
+                fail("Set algebra identity 4 failed");
+            if (diff2.removeAll(intersection))
+                fail("Set algebra identity 5 failed");
+            if (intersection.removeAll(diff1))
+                fail("Set algebra identity 6 failed");
+            if (intersection.removeAll(diff1))
+                fail("Set algebra identity 7 failed");
+
+            intersection.addAll(diff1); intersection.addAll(diff2);
+            if (!intersection.equals(union))
+                fail("Set algebra identity 1 failed");
+
+            Iterator e = union.iterator();
+            while (e.hasNext())
+                if (!intersection.remove(e.next()))
+                    fail("Couldn't remove element from copy.");
+            if (!intersection.isEmpty())
+                fail("Copy nonempty after deleting all elements.");
+
+            e = union.iterator();
+            while (e.hasNext()) {
+                Object o = e.next();
+                if (!union.contains(o))
+                    fail("Set doesn't contain one of its elements.");
+                e.remove();
+                if (union.contains(o))
+                    fail("Set contains element after deletion.");
+            }
+            if (!union.isEmpty())
+                fail("Set nonempty after deleting all elements.");
+
+            s1.clear();
+            if (!s1.isEmpty())
+                fail("Set nonempty after clear.");
+        }
+        System.out.println("Success.");
+    }
+
+    // Done inefficiently so as to exercise toArray
+    static Set clone(Set s, Class cl, boolean synch) {
+        Set clone = newSet(cl, synch);
+        clone.addAll(Arrays.asList(s.toArray()));
+        if (!s.equals(clone))
+            fail("Set not equal to copy.");
+        if (!s.containsAll(clone))
+            fail("Set does not contain copy.");
+        if (!clone.containsAll(s))
+            fail("Copy does not contain set.");
+        return clone;
+    }
+
+    static Set newSet(Class cl, boolean synch) {
+        try {
+            Set s = (Set)cl.newInstance();
+            if (synch)
+                s = Collections.synchronizedSet(s);
+            if (!s.isEmpty())
+                fail("New instance non empty.");
+            return s;
+        } catch(Throwable t) {
+            fail("Can't instantiate " + cl + ": " + t);
+        }
+        return null; //Shut up compiler.
+    }
+
+    static void AddRandoms(Set s, int n) {
+        for (int i=0; i<n; i++) {
+            int r = rnd.nextInt() % n;
+            Integer e = new Integer(r < 0 ? -r : r);
+
+            int preSize = s.size();
+            boolean prePresent = s.contains(e);
+            boolean added = s.add(e);
+            if (!s.contains(e))
+                fail ("Element not present after addition.");
+            if (added == prePresent)
+                fail ("added == alreadyPresent");
+            int postSize = s.size();
+            if (added && preSize == postSize)
+                fail ("Add returned true, but size didn't change.");
+            if (!added && preSize != postSize)
+                fail ("Add returned false, but size changed.");
+        }
+    }
+
+    static void fail(String s) {
+        System.out.println(s);
+        System.exit(1);
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/SimpleFairReentrantLockLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/SimpleFairReentrantLockLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/SimpleFairReentrantLockLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,109 @@
+/*
+ * @test
+ * @synopsis multiple threads using a single lock
+ */
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain. Use, modify, and
+ * redistribute this code in any way without acknowledgement.
+ */
+
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import edu.emory.mathcs.backport.java.util.*;
+
+public final class SimpleFairReentrantLockLoops {
+    static final ExecutorService pool = Executors.newCachedThreadPool();
+    static final LoopHelpers.SimpleRandom rng = new LoopHelpers.SimpleRandom();
+    static boolean print = false;
+    static int iters = 2000000;
+
+    public static void main(String[] args) throws Exception {
+        int maxThreads = 100;
+        if (args.length > 0)
+            maxThreads = Integer.parseInt(args[0]);
+
+        new ReentrantLockLoop(1).test();
+        new ReentrantLockLoop(1).test();
+        print = true;
+
+        int k = 1;
+        for (int i = 1; i <= maxThreads;) {
+            System.out.print("Threads: " + i);
+            new ReentrantLockLoop(i).test();
+            Thread.sleep(100);
+            if (i == k) {
+                k = i << 1;
+                i = i + (i >>> 1);
+            }
+            else
+                i = k;
+        }
+        pool.shutdown();
+    }
+
+    static final class ReentrantLockLoop implements Runnable {
+        private int v = rng.next();
+        private volatile int result = 17;
+        private final ReentrantLock lock = new ReentrantLock(true);
+        private final LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
+        private final CyclicBarrier barrier;
+        private final int nthreads;
+        private volatile int readBarrier;
+        ReentrantLockLoop(int nthreads) {
+            this.nthreads = nthreads;
+            barrier = new CyclicBarrier(nthreads+1, timer);
+        }
+
+        final void test() throws Exception {
+            for (int i = 0; i < nthreads; ++i)
+                pool.execute(this);
+            barrier.await();
+            barrier.await();
+            if (print) {
+                long time = timer.getTime();
+                long tpi = time / ((long)iters * nthreads);
+                System.out.print("\t" + LoopHelpers.rightJustify(tpi) + " ns per lock");
+                double secs = (double)(time) / 1000000000.0;
+                System.out.println("\t " + secs + "s run time");
+            }
+
+            int r = result;
+            if (r == 0) // avoid overoptimization
+                System.out.println("useless result: " + r);
+        }
+
+        public final void run() {
+            final ReentrantLock lock = this.lock;
+            try {
+                barrier.await();
+                int sum = v + 1;
+                int x = 0;
+                int n = iters;
+                while (n-- > 0) {
+                    lock.lock();
+                    int k = (sum & 3);
+                    if (k > 0) {
+                        x = v;
+                        while (k-- > 0)
+                            x = LoopHelpers.compute6(x);
+                        v = x;
+                    }
+                    else x = sum + 1;
+                    lock.unlock();
+                    if ((x += readBarrier) == 0)
+                        ++readBarrier;
+                    for (int l = x & 7; l > 0; --l)
+                        sum += LoopHelpers.compute6(sum);
+                }
+                barrier.await();
+                result += sum;
+            }
+            catch (Exception ie) {
+                return;
+            }
+        }
+    }
+
+}
+

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/SimpleLockLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/SimpleLockLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/SimpleLockLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,107 @@
+/*
+ * @test
+ * @synopsis multiple threads using a single builtin lock
+ */
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain. Use, modify, and
+ * redistribute this code in any way without acknowledgement.
+ */
+
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import edu.emory.mathcs.backport.java.util.*;
+
+public final class SimpleLockLoops {
+    static final ExecutorService pool = Executors.newCachedThreadPool();
+    static final LoopHelpers.SimpleRandom rng = new LoopHelpers.SimpleRandom();
+    static boolean print = false;
+    static int iters = 2000000;
+
+    public static void main(String[] args) throws Exception {
+        int maxThreads = 100;
+        if (args.length > 0)
+            maxThreads = Integer.parseInt(args[0]);
+
+        new ReentrantLockLoop(1).test();
+        new ReentrantLockLoop(1).test();
+        print = true;
+
+        int k = 1;
+        for (int i = 1; i <= maxThreads;) {
+            System.out.print("Threads: " + i);
+            new ReentrantLockLoop(i).test();
+            Thread.sleep(100);
+            if (i == k) {
+                k = i << 1;
+                i = i + (i >>> 1);
+            }
+            else
+                i = k;
+        }
+        pool.shutdown();
+    }
+
+    static final class ReentrantLockLoop implements Runnable {
+        private int v = rng.next();
+        private volatile int result = 17;
+        private final LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
+        private final CyclicBarrier barrier;
+        private final int nthreads;
+        private volatile int readBarrier;
+        ReentrantLockLoop(int nthreads) {
+            this.nthreads = nthreads;
+            barrier = new CyclicBarrier(nthreads+1, timer);
+        }
+
+        final void test() throws Exception {
+            for (int i = 0; i < nthreads; ++i)
+                pool.execute(this);
+            barrier.await();
+            barrier.await();
+            if (print) {
+                long time = timer.getTime();
+                long tpi = time / ((long)iters * nthreads);
+                System.out.print("\t" + LoopHelpers.rightJustify(tpi) + " ns per lock");
+                double secs = (double)(time) / 1000000000.0;
+                System.out.println("\t " + secs + "s run time");
+            }
+
+            int r = result;
+            if (r == 0) // avoid overoptimization
+                System.out.println("useless result: " + r);
+        }
+
+        public final void run() {
+            try {
+                barrier.await();
+                int sum = v + 1;
+                int x = 0;
+                int n = iters;
+                while (n-- > 0) {
+                    synchronized(this) {
+                        int k = (sum & 3);
+                        if (k > 0) {
+                            x = v;
+                            while (k-- > 0)
+                                x = LoopHelpers.compute6(x);
+                            v = x;
+                        }
+                        else x = sum + 1;
+                    }
+                    if ((x += readBarrier) == 0)
+                        ++readBarrier;
+                    for (int l = x & 7; l > 0; --l)
+                        sum += LoopHelpers.compute6(sum);
+                }
+                barrier.await();
+                result += sum;
+            }
+            catch (Exception ie) {
+                return;
+            }
+        }
+    }
+
+}
+

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/SimpleLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/SimpleLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/SimpleLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,102 @@
+/*
+ * @test
+ * @synopsis multiple threads using a single lock
+ */
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain. Use, modify, and
+ * redistribute this code in any way without acknowledgement.
+ */
+
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import edu.emory.mathcs.backport.java.util.*;
+
+public final class SimpleLoops {
+    static final ExecutorService pool = Executors.newCachedThreadPool();
+    static final LoopHelpers.SimpleRandom rng = new LoopHelpers.SimpleRandom();
+    static boolean print = false;
+    static int iters = 10000000;
+
+    public static void main(String[] args) throws Exception {
+        int maxThreads = 100;
+        if (args.length > 0) 
+            maxThreads = Integer.parseInt(args[0]);
+
+        print = true;
+
+        int k = 1;
+        for (int i = 1; i <= maxThreads;) {
+            System.out.print("Threads: " + 1);
+            new Loop(1).test();
+            Thread.sleep(100);
+            if (i == k) {
+                k = i << 1;
+                i = i + (i >>> 1);
+            } 
+            else 
+                i = k;
+        }
+        pool.shutdown();
+    }
+
+    static final class Loop implements Runnable {
+        private int v = rng.next();
+        private volatile int result = 17;
+        private final LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
+        private final CyclicBarrier barrier;
+        private final int nthreads;
+        private volatile int readBarrier;
+        Loop(int nthreads) {
+            this.nthreads = nthreads;
+            barrier = new CyclicBarrier(nthreads+1, timer);
+        }
+
+        final void test() throws Exception {
+            for (int i = 0; i < nthreads; ++i) 
+                pool.execute(this);
+            barrier.await();
+            barrier.await();
+            if (print) {
+                long time = timer.getTime();
+                long tpi = time / ((long)iters * nthreads);
+                System.out.print("\t" + LoopHelpers.rightJustify(tpi) + " ns per lock");
+                double secs = (double)(time) / 1000000000.0;
+                System.out.println("\t " + secs + "s run time");
+            }
+
+            int r = result;
+            if (r == 0) // avoid overoptimization
+                System.out.println("useless result: " + r);
+        }
+
+        public final void run() {
+            try {
+                barrier.await(); 
+                int sum = v + 1;
+                int x = 0;
+                int n = iters;
+                while (n-- > 0) {
+                    int k = (sum & 3);
+                    if (k > 0) {
+                        x = v;
+                        while (k-- > 0)
+                            x = LoopHelpers.compute1(x);
+                        v = x;
+                    }
+                    else x = sum + 1;
+                    if ((x += readBarrier) == 0)
+                        ++readBarrier;
+                    for (int l = x & 7; l > 0; --l)
+                        sum += LoopHelpers.compute1(sum);
+                } 
+                barrier.await();
+                result += sum;
+            }
+            catch (Exception ie) { 
+                return; 
+            }
+        }
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/SimpleMutexLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/SimpleMutexLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/SimpleMutexLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,108 @@
+/*
+ * @test
+ * @synopsis multiple threads using a single lock
+ */
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain. Use, modify, and
+ * redistribute this code in any way without acknowledgement.
+ */
+
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import edu.emory.mathcs.backport.java.util.*;
+
+public final class SimpleMutexLoops {
+    static final ExecutorService pool = Executors.newCachedThreadPool();
+    static final LoopHelpers.SimpleRandom rng = new LoopHelpers.SimpleRandom();
+    static boolean print = false;
+    static int iters = 2000000;
+
+    public static void main(String[] args) throws Exception {
+        int maxThreads = 100;
+        if (args.length > 0)
+            maxThreads = Integer.parseInt(args[0]);
+
+//        new MutexLoop(1).test();
+//        new MutexLoop(1).test();
+        print = true;
+
+        int k = 1;
+        for (int i = 1; i <= maxThreads;) {
+            System.out.print("Threads: " + i);
+//            new MutexLoop(i).test();
+            Thread.sleep(100);
+            if (i == k) {
+                k = i << 1;
+                i = i + (i >>> 1);
+            }
+            else
+                i = k;
+        }
+        pool.shutdown();
+    }
+
+//    static final class MutexLoop implements Runnable {
+//        private int v = rng.next();
+//        private volatile int result = 17;
+//        private final Mutex lock = new Mutex();
+//        private final LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
+//        private final CyclicBarrier barrier;
+//        private final int nthreads;
+//        private volatile int readBarrier;
+//        MutexLoop(int nthreads) {
+//            this.nthreads = nthreads;
+//            barrier = new CyclicBarrier(nthreads+1, timer);
+//        }
+//
+//        final void test() throws Exception {
+//            for (int i = 0; i < nthreads; ++i)
+//                pool.execute(this);
+//            barrier.await();
+//            barrier.await();
+//            if (print) {
+//                long time = timer.getTime();
+//                long tpi = time / ((long)iters * nthreads);
+//                System.out.print("\t" + LoopHelpers.rightJustify(tpi) + " ns per lock");
+//                double secs = (double)(time) / 1000000000.0;
+//                System.out.println("\t " + secs + "s run time");
+//            }
+//
+//            int r = result;
+//            if (r == 0) // avoid overoptimization
+//                System.out.println("useless result: " + r);
+//        }
+//
+//        public final void run() {
+//            final Mutex lock = this.lock;
+//            try {
+//                barrier.await();
+//                int sum = v + 1;
+//                int x = 0;
+//                int n = iters;
+//                while (n-- > 0) {
+//                    lock.lock();
+//                    int k = (sum & 3);
+//                    if (k > 0) {
+//                        x = v;
+//                        while (k-- > 0)
+//                            x = LoopHelpers.compute6(x);
+//                        v = x;
+//                    }
+//                    else x = sum + 1;
+//                    lock.unlock();
+//                    if ((x += readBarrier) == 0)
+//                        ++readBarrier;
+//                    for (int l = x & 7; l > 0; --l)
+//                        sum += LoopHelpers.compute6(sum);
+//                }
+//                barrier.await();
+//                result += sum;
+//            }
+//            catch (Exception ie) {
+//                return;
+//            }
+//        }
+//    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/SimpleNoLockLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/SimpleNoLockLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/SimpleNoLockLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,107 @@
+/*
+ * @test
+ * @synopsis multiple threads using a single builtin lock
+ */
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain. Use, modify, and
+ * redistribute this code in any way without acknowledgement.
+ */
+
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import edu.emory.mathcs.backport.java.util.*;
+
+public final class SimpleNoLockLoops {
+    static final ExecutorService pool = Executors.newCachedThreadPool();
+    static final LoopHelpers.SimpleRandom rng = new LoopHelpers.SimpleRandom();
+    static boolean print = false;
+    static int iters = 2000000;
+
+    public static void main(String[] args) throws Exception {
+        int maxThreads = 100;
+        if (args.length > 0)
+            maxThreads = Integer.parseInt(args[0]);
+
+        new ReentrantLockLoop(1).test();
+        new ReentrantLockLoop(1).test();
+        print = true;
+
+        int k = 1;
+        for (int i = 1; i <= maxThreads;) {
+            System.out.print("Threads: " + i);
+            new ReentrantLockLoop(i).test();
+            Thread.sleep(100);
+            if (i == k) {
+                k = i << 1;
+                i = i + (i >>> 1);
+            }
+            else
+                i = k;
+        }
+        pool.shutdown();
+    }
+
+    static final class ReentrantLockLoop implements Runnable {
+        private int v = rng.next();
+        private volatile int result = 17;
+        private final LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
+        private final CyclicBarrier barrier;
+        private final int nthreads;
+        private volatile int readBarrier;
+        ReentrantLockLoop(int nthreads) {
+            this.nthreads = nthreads;
+            barrier = new CyclicBarrier(nthreads+1, timer);
+        }
+
+        final void test() throws Exception {
+            for (int i = 0; i < nthreads; ++i)
+                pool.execute(this);
+            barrier.await();
+            barrier.await();
+            if (print) {
+                long time = timer.getTime();
+                long tpi = time / ((long)iters * nthreads);
+                System.out.print("\t" + LoopHelpers.rightJustify(tpi) + " ns per lock");
+                double secs = (double)(time) / 1000000000.0;
+                System.out.println("\t " + secs + "s run time");
+            }
+
+            int r = result;
+            if (r == 0) // avoid overoptimization
+                System.out.println("useless result: " + r);
+        }
+
+        public final void run() {
+            try {
+                barrier.await();
+                int sum = v + 1;
+                int x = 0;
+                int n = iters;
+                while (n-- > 0) {
+
+                        int k = (sum & 3);
+                        if (k > 0) {
+                            x = v;
+                            while (k-- > 0)
+                                x = LoopHelpers.compute6(x);
+                            v = x;
+                        }
+                        else x = sum + 1;
+
+                    if ((x += readBarrier) == 0)
+                        ++readBarrier;
+                    for (int l = x & 1; l > 0; --l)
+                        sum += LoopHelpers.compute6(sum);
+                }
+                barrier.await();
+                result += sum;
+            }
+            catch (Exception ie) {
+                return;
+            }
+        }
+    }
+
+}
+

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/SimpleReentrantLockLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/SimpleReentrantLockLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/SimpleReentrantLockLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,108 @@
+/*
+ * @test
+ * @synopsis multiple threads using a single ReentrantLock
+ */
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain. Use, modify, and
+ * redistribute this code in any way without acknowledgement.
+ */
+
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import edu.emory.mathcs.backport.java.util.*;
+
+public final class SimpleReentrantLockLoops {
+    static final ExecutorService pool = Executors.newCachedThreadPool();
+    static final LoopHelpers.SimpleRandom rng = new LoopHelpers.SimpleRandom();
+    static boolean print = false;
+    static int iters = 2000000;
+
+    public static void main(String[] args) throws Exception {
+        int maxThreads = 100;
+        if (args.length > 0)
+            maxThreads = Integer.parseInt(args[0]);
+
+        new ReentrantLockLoop(1).test();
+        new ReentrantLockLoop(1).test();
+        print = true;
+
+        int k = 1;
+        for (int i = 1; i <= maxThreads;) {
+            System.out.print("Threads: " + i);
+            new ReentrantLockLoop(i).test();
+            Thread.sleep(100);
+            if (i == k) {
+                k = i << 1;
+                i = i + (i >>> 1);
+            }
+            else
+                i = k;
+        }
+        pool.shutdown();
+    }
+
+    static final class ReentrantLockLoop implements Runnable {
+        private int v = rng.next();
+        private volatile int result = 17;
+        private final ReentrantLock lock = new ReentrantLock();
+        private final LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
+        private final CyclicBarrier barrier;
+        private final int nthreads;
+        private volatile int readBarrier;
+        ReentrantLockLoop(int nthreads) {
+            this.nthreads = nthreads;
+            barrier = new CyclicBarrier(nthreads+1, timer);
+        }
+
+        final void test() throws Exception {
+            for (int i = 0; i < nthreads; ++i)
+                pool.execute(this);
+            barrier.await();
+            barrier.await();
+            if (print) {
+                long time = timer.getTime();
+                long tpi = time / ((long)iters * nthreads);
+                System.out.print("\t" + LoopHelpers.rightJustify(tpi) + " ns per lock");
+                double secs = (double)(time) / 1000000000.0;
+                System.out.println("\t " + secs + "s run time");
+            }
+
+            int r = result;
+            if (r == 0) // avoid overoptimization
+                System.out.println("useless result: " + r);
+        }
+
+        public final void run() {
+            final ReentrantLock lock = this.lock;
+            try {
+                barrier.await();
+                int sum = v + 1;
+                int x = 0;
+                int n = iters;
+                while (n-- > 0) {
+                    lock.lock();
+                    int k = (sum & 3);
+                    if (k > 0) {
+                        x = v;
+                        while (k-- > 0)
+                            x = LoopHelpers.compute6(x);
+                        v = x;
+                    }
+                    else x = sum + 1;
+                    lock.unlock();
+                    if ((x += readBarrier) == 0)
+                        ++readBarrier;
+                    for (int l = x & 7; l > 0; --l)
+                        sum += LoopHelpers.compute6(sum);
+                }
+                barrier.await();
+                result += sum;
+            }
+            catch (Exception ie) {
+                return;
+            }
+        }
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/SimpleSemaphoreLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/SimpleSemaphoreLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/SimpleSemaphoreLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,103 @@
+/*
+ * @test
+ * @synopsis multiple threads using a single lock
+ */
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain. Use, modify, and
+ * redistribute this code in any way without acknowledgement.
+ */
+
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import edu.emory.mathcs.backport.java.util.*;
+
+public final class SimpleSemaphoreLoops {
+    static final ExecutorService pool = Executors.newCachedThreadPool();
+    static final LoopHelpers.SimpleRandom rng = new LoopHelpers.SimpleRandom();
+    static boolean print = false;
+    static int iters = 10000000;
+
+    public static void main(String[] args) throws Exception {
+        int maxThreads = 100;
+        if (args.length > 0)
+            maxThreads = Integer.parseInt(args[0]);
+
+        print = true;
+
+        int reps = 2;
+        for (int i = 1; i <= maxThreads; i += (i+1) >>> 1) {
+            int n = reps;
+            if (reps > 1) --reps;
+            while (n-- > 0) {
+                System.out.print("Threads: " + i);
+                new SemaphoreLoop(i).test();
+                Thread.sleep(100);
+            }
+        }
+        pool.shutdown();
+    }
+
+    static final class SemaphoreLoop implements Runnable {
+        private int v = rng.next();
+        private volatile int result = 17;
+        private final Semaphore lock = new Semaphore(1, false);
+        private final LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
+        private final CyclicBarrier barrier;
+        private final int nthreads;
+        private volatile int readBarrier;
+        SemaphoreLoop(int nthreads) {
+            this.nthreads = nthreads;
+            barrier = new CyclicBarrier(nthreads+1, timer);
+        }
+
+        final void test() throws Exception {
+            for (int i = 0; i < nthreads; ++i)
+                pool.execute(this);
+            barrier.await();
+            barrier.await();
+            if (print) {
+                long time = timer.getTime();
+                long tpi = time / ((long)iters * nthreads);
+                System.out.print("\t" + LoopHelpers.rightJustify(tpi) + " ns per lock");
+                double secs = (double)(time) / 1000000000.0;
+                System.out.println("\t " + secs + "s run time");
+            }
+
+            int r = result;
+            if (r == 0) // avoid overoptimization
+                System.out.println("useless result: " + r);
+        }
+
+        public final void run() {
+            final Semaphore lock = this.lock;
+            try {
+                barrier.await();
+                int sum = v + 1;
+                int x = 0;
+                int n = iters;
+                while (n-- > 0) {
+                    lock.acquireUninterruptibly();
+                    int k = (sum & 3);
+                    if (k > 0) {
+                        x = v;
+                        while (k-- > 0)
+                            x = LoopHelpers.compute6(x);
+                        v = x;
+                    }
+                    else x = sum + 1;
+                    lock.release();
+                    if ((x += readBarrier) == 0)
+                        ++readBarrier;
+                    for (int l = x & 7; l > 0; --l)
+                        sum += LoopHelpers.compute6(sum);
+                }
+                barrier.await();
+                result += sum;
+            }
+            catch (Exception ie) {
+                return;
+            }
+        }
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/SimpleSpinLockLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/SimpleSpinLockLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/SimpleSpinLockLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,110 @@
+/*
+ * @test
+ * @synopsis multiple threads using a spinlock
+ */
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain. Use, modify, and
+ * redistribute this code in any way without acknowledgement.
+ */
+
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import edu.emory.mathcs.backport.java.util.concurrent.atomic.*;
+import edu.emory.mathcs.backport.java.util.*;
+
+public final class SimpleSpinLockLoops {
+    static final ExecutorService pool = Executors.newCachedThreadPool();
+    static final LoopHelpers.SimpleRandom rng = new LoopHelpers.SimpleRandom();
+    static boolean print = false;
+    static int iters = 2000000;
+
+    public static void main(String[] args) throws Exception {
+        int maxThreads = 100;
+        if (args.length > 0)
+            maxThreads = Integer.parseInt(args[0]);
+
+        new LockLoop(1).test();
+        new LockLoop(1).test();
+        print = true;
+
+        int k = 1;
+        for (int i = 1; i <= maxThreads;) {
+            System.out.print("Threads: " + i);
+            new LockLoop(i).test();
+            Thread.sleep(100);
+            if (i == k) {
+                k = i << 1;
+                i = i + (i >>> 1);
+            }
+            else
+                i = k;
+        }
+        pool.shutdown();
+    }
+
+    static final class LockLoop implements Runnable {
+        private int v = rng.next();
+        private volatile int result = 17;
+        private final LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
+        private final CyclicBarrier barrier;
+        private final int nthreads;
+        private volatile int readBarrier;
+        private final AtomicInteger spinlock = new AtomicInteger();
+        LockLoop(int nthreads) {
+            this.nthreads = nthreads;
+            barrier = new CyclicBarrier(nthreads+1, timer);
+        }
+
+        final void test() throws Exception {
+            for (int i = 0; i < nthreads; ++i)
+                pool.execute(this);
+            barrier.await();
+            barrier.await();
+            if (print) {
+                long time = timer.getTime();
+                long tpi = time / ((long)iters * nthreads);
+                System.out.print("\t" + LoopHelpers.rightJustify(tpi) + " ns per lock");
+                double secs = (double)(time) / 1000000000.0;
+                System.out.println("\t " + secs + "s run time");
+            }
+
+            int r = result;
+            if (r == 0) // avoid overoptimization
+                System.out.println("useless result: " + r);
+        }
+
+        public final void run() {
+            final AtomicInteger lock = this.spinlock;
+            try {
+                barrier.await();
+                int sum = v + 1;
+                int x = 0;
+                int n = iters;
+                while (n-- > 0) {
+                    while (!lock.compareAndSet(0, 1)) ;
+                    int k = (sum & 3);
+                    if (k > 0) {
+                        x = v;
+                        while (k-- > 0)
+                            x = LoopHelpers.compute6(x);
+                        v = x;
+                    }
+                    else x = sum + 1;
+                    lock.set(0);
+                    if ((x += readBarrier) == 0)
+                        ++readBarrier;
+                    for (int l = x & 1; l > 0; --l)
+                        sum += LoopHelpers.compute6(sum);
+                }
+                barrier.await();
+                result += sum;
+            }
+            catch (Exception ie) {
+                return;
+            }
+        }
+    }
+
+}
+

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/SimpleTimedLockLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/SimpleTimedLockLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/SimpleTimedLockLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,105 @@
+/*
+ * @test
+ * @synopsis multiple threads using a single lock
+ */
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain. Use, modify, and
+ * redistribute this code in any way without acknowledgement.
+ */
+
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import edu.emory.mathcs.backport.java.util.*;
+
+public final class SimpleTimedLockLoops {
+    static final ExecutorService pool = Executors.newCachedThreadPool();
+    static final LoopHelpers.SimpleRandom rng = new LoopHelpers.SimpleRandom();
+    static boolean print = false;
+    static int iters = 10000000;
+
+    public static void main(String[] args) throws Exception {
+        int maxThreads = 100;
+        if (args.length > 0)
+            maxThreads = Integer.parseInt(args[0]);
+
+        print = true;
+
+        int reps = 3;
+        for (int i = 1; i <= maxThreads; i += (i+1) >>> 1) {
+            int n = reps;
+            if (reps > 1) --reps;
+            while (n-- > 0) {
+                System.out.print("Threads: " + i);
+                new ReentrantLockLoop(i).test();
+                Thread.sleep(100);
+            }
+        }
+        pool.shutdown();
+    }
+
+    static final class ReentrantLockLoop implements Runnable {
+        private int v = rng.next();
+        private volatile int result = 17;
+        private final ReentrantLock lock = new ReentrantLock();
+        private final LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
+        private final CyclicBarrier barrier;
+        private final int nthreads;
+        private volatile int readBarrier;
+        ReentrantLockLoop(int nthreads) {
+            this.nthreads = nthreads;
+            barrier = new CyclicBarrier(nthreads+1, timer);
+        }
+
+        final void test() throws Exception {
+            for (int i = 0; i < nthreads; ++i)
+                pool.execute(this);
+            barrier.await();
+            barrier.await();
+            if (print) {
+                long time = timer.getTime();
+                long tpi = time / ((long)iters * nthreads);
+                System.out.print("\t" + LoopHelpers.rightJustify(tpi) + " ns per lock");
+                double secs = (double)(time) / 1000000000.0;
+                System.out.println("\t " + secs + "s run time");
+            }
+
+            int r = result;
+            if (r == 0) // avoid overoptimization
+                System.out.println("useless result: " + r);
+        }
+
+        public final void run() {
+            final ReentrantLock lock = this.lock;
+            try {
+                barrier.await();
+                int sum = v + 1;
+                int x = 0;
+                int n = iters;
+                while (n > 0) {
+                    if (lock.tryLock(1, TimeUnit.SECONDS)) {
+                        --n;
+                        int k = (sum & 3);
+                        if (k > 0) {
+                            x = v;
+                            while (k-- > 0)
+                                x = LoopHelpers.compute6(x);
+                            v = x;
+                        }
+                        else x = sum + 1;
+                        lock.unlock();
+                    }
+                    if ((x += readBarrier) == 0)
+                        ++readBarrier;
+                    for (int l = x & 7; l > 0; --l)
+                        sum += LoopHelpers.compute6(sum);
+                }
+                barrier.await();
+                result += sum;
+            }
+            catch (Exception ie) {
+                return;
+            }
+        }
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/SimpleWriteLockLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/SimpleWriteLockLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/SimpleWriteLockLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,104 @@
+/*
+ * @test
+ * @synopsis multiple threads using a single lock
+ */
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain. Use, modify, and
+ * redistribute this code in any way without acknowledgement.
+ */
+
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import edu.emory.mathcs.backport.java.util.*;
+
+public final class SimpleWriteLockLoops {
+    static final ExecutorService pool = Executors.newCachedThreadPool();
+    static final LoopHelpers.SimpleRandom rng = new LoopHelpers.SimpleRandom();
+    static boolean print = false;
+    static int iters = 10000000;
+
+    public static void main(String[] args) throws Exception {
+        int maxThreads = 100;
+        if (args.length > 0)
+            maxThreads = Integer.parseInt(args[0]);
+
+        print = true;
+
+        int reps = 2;
+        for (int i = 1; i <= maxThreads; i += (i+1) >>> 1) {
+            int n = reps;
+            if (reps > 1) --reps;
+            while (n-- > 0) {
+                System.out.print("Threads: " + i);
+                new WriteLockLoop(i).test();
+                Thread.sleep(100);
+            }
+        }
+        pool.shutdown();
+    }
+
+    static final class WriteLockLoop implements Runnable {
+        private int v = rng.next();
+        private volatile int result = 17;
+        private volatile int readBarrier;
+        private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        private final LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
+        private final CyclicBarrier barrier;
+        private final int nthreads;
+        WriteLockLoop(int nthreads) {
+            this.nthreads = nthreads;
+            barrier = new CyclicBarrier(nthreads+1, timer);
+        }
+
+        final void test() throws Exception {
+            for (int i = 0; i < nthreads; ++i)
+                pool.execute(this);
+            barrier.await();
+            barrier.await();
+            if (print) {
+                long time = timer.getTime();
+                long tpi = time / ((long)iters * nthreads);
+                System.out.print("\t" + LoopHelpers.rightJustify(tpi) + " ns per lock");
+                double secs = (double)(time) / 1000000000.0;
+                System.out.println("\t " + secs + "s run time");
+            }
+
+            int r = result;
+            if (r == 0) // avoid overoptimization
+                System.out.println("useless result: " + r);
+        }
+
+        public final void run() {
+            final Lock lock = this.lock.writeLock();
+            try {
+                barrier.await();
+                int sum = v + 1;
+                int x = 0;
+                int n = iters;
+                while (n-- > 0) {
+                    lock.lock();
+                    int k = (sum & 3);
+                    if (k > 0) {
+                        x = v;
+                        while (k-- > 0)
+                            x = LoopHelpers.compute6(x);
+                        v = x;
+                    }
+                    else x = sum + 1;
+                    lock.unlock();
+                    if ((x += readBarrier) == 0)
+                        ++readBarrier;
+                    for (int l = x & 7; l > 0; --l)
+                        sum += LoopHelpers.compute6(sum);
+                }
+                barrier.await();
+                result += sum;
+            }
+            catch (Exception ie) {
+                return;
+            }
+        }
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/SingleProducerMultipleConsumerLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/SingleProducerMultipleConsumerLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/SingleProducerMultipleConsumerLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,142 @@
+/*
+ * @test
+ * @synopsis  check ordering for blocking queues with 1 producer and multiple consumers
+ */
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain. Use, modify, and
+ * redistribute this code in any way without acknowledgement.
+ */
+
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+
+public class SingleProducerMultipleConsumerLoops {
+    static final int CAPACITY =      100;
+
+    static final ExecutorService pool = Executors.newCachedThreadPool();
+    static boolean print = false;
+
+    public static void main(String[] args) throws Exception {
+        int maxConsumers = 100;
+        int iters = 10000;
+
+        if (args.length > 0)
+            maxConsumers = Integer.parseInt(args[0]);
+
+        print = false;
+        System.out.println("Warmup...");
+        oneTest(1, 10000);
+        Thread.sleep(100);
+        oneTest(2, 10000);
+        Thread.sleep(100);
+        print = true;
+
+        for (int i = 1; i <= maxConsumers; i += (i+1) >>> 1) {
+            System.out.println("Consumers:" + i);
+            oneTest(i, iters);
+            Thread.sleep(100);
+        }
+        pool.shutdown();
+   }
+
+    static void oneTest(int consumers, int iters) throws Exception {
+        if (print)
+            System.out.print("ArrayBlockingQueue      ");
+        oneRun(new ArrayBlockingQueue(CAPACITY), consumers, iters);
+
+        if (print)
+            System.out.print("LinkedBlockingQueue     ");
+        oneRun(new LinkedBlockingQueue(CAPACITY), consumers, iters);
+
+        if (print)
+            System.out.print("PriorityBlockingQueue   ");
+        oneRun(new PriorityBlockingQueue(), consumers, iters/10);
+
+        if (print)
+            System.out.print("SynchronousQueue        ");
+        oneRun(new SynchronousQueue(), consumers, iters);
+
+        if (print)
+            System.out.print("ArrayBlockingQueue(fair)");
+        oneRun(new ArrayBlockingQueue(CAPACITY, true), consumers, iters/10);
+    }
+
+    static abstract class Stage implements Runnable {
+        final int iters;
+        final BlockingQueue queue;
+        final CyclicBarrier barrier;
+        volatile int result;
+        Stage (BlockingQueue q, CyclicBarrier b, int iters) {
+            queue = q;
+            barrier = b;
+            this.iters = iters;
+        }
+    }
+
+    static class Producer extends Stage {
+        Producer(BlockingQueue q, CyclicBarrier b, int iters) {
+            super(q, b, iters);
+        }
+
+        public void run() {
+            try {
+                barrier.await();
+                for (int i = 0; i < iters; ++i) {
+                    queue.put(new Integer(i));
+                }
+                barrier.await();
+                result = 432;
+            }
+            catch (Exception ie) {
+                ie.printStackTrace();
+                return;
+            }
+        }
+    }
+
+    static class Consumer extends Stage {
+        Consumer(BlockingQueue q, CyclicBarrier b, int iters) {
+            super(q, b, iters);
+        }
+
+        public void run() {
+            try {
+                barrier.await();
+                int l = 0;
+                int s = 0;
+                int last = -1;
+                for (int i = 0; i < iters; ++i) {
+                    Integer item = (Integer)queue.take();
+                    int v = item.intValue();
+                    if (v < last)
+                        throw new Error("Out-of-Order transfer");
+                    last = v;
+                    l = LoopHelpers.compute1(v);
+                    s += l;
+                }
+                barrier.await();
+                result = s;
+            }
+            catch (Exception ie) {
+                ie.printStackTrace();
+                return;
+            }
+        }
+
+    }
+
+    static void oneRun(BlockingQueue q, int nconsumers, int iters) throws Exception {
+        LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
+        CyclicBarrier barrier = new CyclicBarrier(nconsumers + 2, timer);
+        pool.execute(new Producer(q, barrier, iters * nconsumers));
+        for (int i = 0; i < nconsumers; ++i) {
+            pool.execute(new Consumer(q, barrier, iters));
+        }
+        barrier.await();
+        barrier.await();
+        long time = timer.getTime();
+        if (print)
+            System.out.println("\t: " + LoopHelpers.rightJustify(time / (iters * nconsumers)) + " ns per transfer");
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/StringMapLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/StringMapLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/StringMapLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,207 @@
+/*
+ * @test
+ * @synopsis Exercise multithreaded maps, by default
+ * ConcurrentHashMap.  Each thread does a random walk though elements
+ * of "key" array. On each iteration, it checks if table includes key.
+ * If absent, with probablility pinsert it inserts it, and if present,
+ * with probablility premove it removes it.  (pinsert and premove are
+ * expressed as percentages to simplify parsing from command line.)
+ */
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain. Use, modify, and
+ * redistribute this code in any way without acknowledgement.
+ */
+
+
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import java.util.Map;
+import java.util.Random;
+
+public class StringMapLoops {
+    static int nkeys       = 1000;
+    static int pinsert     = 60;
+    static int premove     = 2;
+    static int maxThreads  = 100;
+    static int nops        = 1000000;
+    static int removesPerMaxRandom;
+    static int insertsPerMaxRandom;
+
+    static final ExecutorService pool = Executors.newCachedThreadPool();
+
+    public static void main(String[] args) throws Exception {
+
+        Class mapClass = null;
+        if (args.length > 0) {
+            try {
+                mapClass = Class.forName(args[0]);
+            } catch(ClassNotFoundException e) {
+                throw new RuntimeException("Class " + args[0] + " not found.");
+            }
+        }
+        else
+            mapClass = edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap.class;
+
+        if (args.length > 1)
+            maxThreads = Integer.parseInt(args[1]);
+
+        if (args.length > 2)
+            nkeys = Integer.parseInt(args[2]);
+
+        if (args.length > 3)
+            pinsert = Integer.parseInt(args[3]);
+
+        if (args.length > 4)
+            premove = Integer.parseInt(args[4]);
+
+        if (args.length > 5)
+            nops = Integer.parseInt(args[5]);
+
+        // normalize probabilities wrt random number generator
+        removesPerMaxRandom = (int)(((double)premove/100.0 * 0x7FFFFFFFL));
+        insertsPerMaxRandom = (int)(((double)pinsert/100.0 * 0x7FFFFFFFL));
+
+        System.out.print("Class: " + mapClass.getName());
+        System.out.print(" threads: " + maxThreads);
+        System.out.print(" size: " + nkeys);
+        System.out.print(" ins: " + pinsert);
+        System.out.print(" rem: " + premove);
+        System.out.print(" ops: " + nops);
+        System.out.println();
+
+        String[] key = makeKeys(nkeys);
+
+        int k = 1;
+        int warmups = 2;
+        for (int i = 1; i <= maxThreads;) {
+            Thread.sleep(100);
+            test(i, nkeys, key, mapClass);
+            shuffleKeys(key);
+            if (warmups > 0)
+                --warmups;
+            else if (i == k) {
+                k = i << 1;
+                i = i + (i >>> 1);
+            }
+            else if (i == 1 && k == 2) {
+                i = k;
+                warmups = 1;
+            }
+            else
+                i = k;
+        }
+        pool.shutdown();
+    }
+
+    static String[] makeKeys(int n) {
+        LoopHelpers.SimpleRandom rng = new LoopHelpers.SimpleRandom();
+        String[] key = new String[n];
+        for (int i = 0; i < key.length; ++i) {
+            int k = 0;
+            int len = 1 + (rng.next() & 0xf);
+            char[] c = new char[len * 4];
+            for (int j = 0; j < len; ++j) {
+                int r = rng.next();
+                c[k++] = (char)(' ' + (r & 0x7f));
+                r >>>= 8;
+                c[k++] = (char)(' ' + (r & 0x7f));
+                r >>>= 8;
+                c[k++] = (char)(' ' + (r & 0x7f));
+                r >>>= 8;
+                c[k++] = (char)(' ' + (r & 0x7f));
+            }
+            key[i] = new String(c);
+        }
+        return key;
+    }
+
+    static void shuffleKeys(String[] key) {
+        Random rng = new Random();
+        for (int i = key.length; i > 1; --i) {
+            int j = rng.nextInt(i);
+            String tmp = key[j];
+            key[j] = key[i-1];
+            key[i-1] = tmp;
+        }
+    }
+
+    static void test(int i, int nkeys, String[] key, Class mapClass) throws Exception {
+        System.out.print("Threads: " + i + "\t:");
+        Map map = (Map)mapClass.newInstance();
+        // Uncomment to start with a non-empty table
+        //        for (int j = 0; j < nkeys; j += 4) // start 1/4 occupied
+        //            map.put(key[j], key[j]);
+        LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
+        CyclicBarrier barrier = new CyclicBarrier(i+1, timer);
+        for (int t = 0; t < i; ++t)
+            pool.execute(new Runner(t, map, key, barrier));
+        barrier.await();
+        barrier.await();
+        long time = timer.getTime();
+        long tpo = time / (i * (long)nops);
+        System.out.print(LoopHelpers.rightJustify(tpo) + " ns per op");
+        double secs = (double)(time) / 1000000000.0;
+        System.out.println("\t " + secs + "s run time");
+        map.clear();
+    }
+
+    static class Runner implements Runnable {
+        final Map map;
+        final String[] key;
+        final LoopHelpers.SimpleRandom rng;
+        final CyclicBarrier barrier;
+        int position;
+        int total;
+
+        Runner(int id, Map map, String[] key,  CyclicBarrier barrier) {
+            this.map = map;
+            this.key = key;
+            this.barrier = barrier;
+            position = key.length / 2;
+            rng = new LoopHelpers.SimpleRandom((id + 1) * 8862213513L);
+            rng.next();
+        }
+
+        int step() {
+            // random-walk around key positions,  bunching accesses
+            int r = rng.next();
+            position += (r & 7) - 3;
+            while (position >= key.length) position -= key.length;
+            while (position < 0) position += key.length;
+
+            String k = key[position];
+            String x = (String)map.get(k);
+
+            if (x != null) {
+                if (r < removesPerMaxRandom) {
+                    if (map.remove(k) != null) {
+                        position = total % key.length; // move from position
+                        return 2;
+                    }
+                }
+            }
+            else if (r < insertsPerMaxRandom) {
+                ++position;
+                map.put(k, k);
+                return 2;
+            }
+
+            total += r;
+            return 1;
+        }
+
+        public void run() {
+            try {
+                barrier.await();
+                int ops = nops;
+                while (ops > 0)
+                    ops -= step();
+                barrier.await();
+            }
+            catch (Exception ex) {
+                ex.printStackTrace();
+            }
+        }
+    }
+}
+

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/Sync100M.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/Sync100M.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/Sync100M.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,40 @@
+
+
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.*;/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+class Sync100M {
+    public static void main(String[] args) throws Exception {
+        int x = loop((int)Utils.nanoTime(), 100000);
+        x = loop(x, 100000);
+        x = loop(x, 100000);
+        long start = Utils.nanoTime();
+        x = loop(x, 100000000);
+        if (x == 0) System.out.print(" ");
+        long time = Utils.nanoTime() - start;
+        double secs = (double)time / 1000000000.0;
+        System.out.println("time: " + secs);
+        start = Utils.nanoTime();
+        x = loop(x, 100000000);
+        if (x == 0) System.out.print(" ");
+        time = Utils.nanoTime() - start;
+        secs = (double)time / 1000000000.0;
+        System.out.println("time: " + secs);
+
+    }
+
+    static final Object obj = new Object();
+
+    static int loop(int x, int iters) {
+        for (int i = iters; i > 0; --i) {
+            synchronized(obj) {
+                x = x * 134775813 + 1;
+            }
+        }
+        return x;
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/SynchronizedCollection.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/SynchronizedCollection.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/SynchronizedCollection.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,78 @@
+// Stand-alone version of java.util.Collections.synchronizedCollection
+import edu.emory.mathcs.backport.java.util.*;
+import java.io.*;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.ArrayList;
+
+public final class SynchronizedCollection implements Collection, Serializable {
+    // use serialVersionUID from JDK 1.2.2 for interoperability
+    private static final long serialVersionUID = 3053995032091335093L;
+
+    final Collection c;	   // Backing Collection
+    final Object	   mutex;  // Object on which to synchronize
+
+    public SynchronizedCollection(Collection c) {
+        if (c==null)
+            throw new NullPointerException();
+        this.c = c;
+        mutex = this;
+    }
+    public SynchronizedCollection(Collection c, Object mutex) {
+        this.c = c;
+        this.mutex = mutex;
+    }
+
+    public SynchronizedCollection() {
+        this(new ArrayList());
+    }
+
+    public final int size() {
+        synchronized(mutex) {return c.size();}
+    }
+    public final boolean isEmpty() {
+        synchronized(mutex) {return c.isEmpty();}
+    }
+    public final boolean contains(Object o) {
+        synchronized(mutex) {return c.contains(o);}
+    }
+    public final Object[] toArray() {
+        synchronized(mutex) {return c.toArray();}
+    }
+    public final Object[] toArray(Object[] a) {
+        synchronized(mutex) {return c.toArray(a);}
+    }
+
+    public final Iterator iterator() {
+        return c.iterator(); // Must be manually synched by user!
+    }
+
+    public final boolean add(Object e) {
+        synchronized(mutex) {return c.add(e);}
+    }
+    public final boolean remove(Object o) {
+        synchronized(mutex) {return c.remove(o);}
+    }
+
+    public final boolean containsAll(Collection coll) {
+        synchronized(mutex) {return c.containsAll(coll);}
+    }
+    public final boolean addAll(Collection coll) {
+        synchronized(mutex) {return c.addAll(coll);}
+    }
+    public final boolean removeAll(Collection coll) {
+        synchronized(mutex) {return c.removeAll(coll);}
+    }
+    public final boolean retainAll(Collection coll) {
+        synchronized(mutex) {return c.retainAll(coll);}
+    }
+    public final void clear() {
+        synchronized(mutex) {c.clear();}
+    }
+    public final String toString() {
+        synchronized(mutex) {return c.toString();}
+    }
+    private void writeObject(ObjectOutputStream s) throws IOException {
+        synchronized(mutex) {s.defaultWriteObject();}
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/SynchronizedLinkedListQueue.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/SynchronizedLinkedListQueue.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/SynchronizedLinkedListQueue.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,76 @@
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import edu.emory.mathcs.backport.java.util.LinkedList;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.AbstractCollection;
+
+public class SynchronizedLinkedListQueue
+    extends AbstractCollection implements Queue {
+    private final Queue q = new LinkedList();
+
+    public synchronized Iterator iterator() {
+        return q.iterator();
+    }
+
+    public synchronized boolean isEmpty() {
+        return q.isEmpty();
+    }
+    public synchronized int size() {
+        return q.size();
+    }
+    public synchronized boolean offer(Object o) {
+        return q.offer(o);
+    }
+    public synchronized boolean add(Object o) {
+        return q.add(o);
+    }
+    public synchronized Object poll() {
+        return q.poll();
+    }
+    public synchronized Object remove() {
+        return q.remove();
+    }
+    public synchronized Object peek() {
+        return q.peek();
+    }
+    public synchronized Object element() {
+        return q.element();
+    }
+
+    public synchronized boolean contains(Object o) {
+        return q.contains(o);
+    }
+    public synchronized Object[] toArray() {
+        return q.toArray();
+    }
+    public synchronized Object[] toArray(Object[] a) {
+        return q.toArray(a);
+    }
+    public synchronized boolean remove(Object o) {
+        return q.remove(o);
+    }
+
+    public synchronized boolean containsAll(Collection coll) {
+        return q.containsAll(coll);
+    }
+    public synchronized boolean addAll(Collection coll) {
+        return q.addAll(coll);
+    }
+    public synchronized boolean removeAll(Collection coll) {
+        return q.removeAll(coll);
+    }
+    public synchronized boolean retainAll(Collection coll) {
+        return q.retainAll(coll);
+    }
+    public synchronized void clear() {
+        q.clear();
+    }
+    public synchronized String toString() {
+        return q.toString();
+    }
+
+}
+

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/TSPExchangerTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/TSPExchangerTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/TSPExchangerTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,737 @@
+/*
+ * Written by Doug Lea and Bill Scherer with assistance from members
+ * of JCP JSR-166 Expert Group and released to the public domain, as
+ * explained at http://creativecommons.org/licenses/publicdomain
+ */
+
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.atomic.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import java.util.Random;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.Utils;
+
+/**
+ * A parallel Traveling Salesperson Problem (TSP) program based on a
+ * genetic algorithm using an Exchanger.  A population of chromosomes is
+ * distributed among "subpops".  Each chromosomes represents a tour,
+ * and its fitness is the total tour length.
+ *
+ * A set of worker threads perform updates on subpops. The basic
+ * update step is:
+ * <ol>
+ *   <li> Select a breeder b from the subpop
+ *   <li> Create a strand of its tour with a random starting point and length
+ *   <li> Offer the strand to the exchanger, receiving a strand from
+ *        another subpop
+ *   <li> Combine b and the received strand using crossing function to
+ *        create new chromosome c.
+ *   <li> Replace a chromosome in the subpop with c.
+ * </ol>
+ *
+ * This continues for a given number of generations per subpop.
+ * Because there are normally more subpops than threads, each worker
+ * thread performs small (randomly sized) run of updates for one
+ * subpop and then selects another. A run continues until there is at
+ * most one remaining thread performing updates.
+ *
+ * See below for more details.
+ */
+public class TSPExchangerTest {
+    static final int NCPUS = Runtime.getRuntime().availableProcessors();
+
+    /** Runs start with two threads, increasing by two through max */
+    static final int DEFAULT_MAX_THREADS  = Math.max(4, NCPUS + NCPUS/2);
+
+    /** The number of replication runs per thread value */
+    static final int DEFAULT_REPLICATIONS = 3;
+
+    /** If true, print statistics in SNAPSHOT_RATE intervals */
+    static boolean verbose = true;
+    static final long SNAPSHOT_RATE = 10000; // in milliseconds
+
+    /**
+     * The problem size. Each city is a random point. The goal is to
+     * find a tour among them with smallest total Euclidean distance.
+     */
+    static final int DEFAULT_CITIES = 144;
+
+    // Tuning parameters.
+
+    /**
+     * The number of chromosomes per subpop. Must be a power of two.
+     *
+     * Smaller values lead to faster iterations but poorer quality
+     * results
+     */
+    static final int DEFAULT_SUBPOP_SIZE = 32;
+
+    /**
+     * The number of iterations per subpop. Convergence appears
+     * to be roughly proportional to #cities-squared
+     */
+    static final int DEFAULT_GENERATIONS = DEFAULT_CITIES * DEFAULT_CITIES;
+
+    /**
+     * The number of subpops. The total population is #subpops * subpopSize,
+     * which should be roughly on the order of #cities-squared
+     *
+     * Smaller values lead to faster total runs but poorer quality
+     * results
+     */
+    static final int DEFAULT_NSUBPOPS = DEFAULT_GENERATIONS / DEFAULT_SUBPOP_SIZE;
+
+    /**
+     * The minimum length for a random chromosome strand.
+     * Must be at least 1.
+     */
+    static final int MIN_STRAND_LENGTH = 3;
+
+    /**
+     * The probablility mask value for creating random strands,
+     * that have lengths at least MIN_STRAND_LENGTH, and grow
+     * with exposnential decay 2^(-(1/(RANDOM_STRAND_MASK + 1)
+     * Must be 1 less than a power of two.
+     */
+    static final int RANDOM_STRAND_MASK = 7;
+
+    /**
+     * Probablility control for selecting breeders.
+     * Breeders are selected starting at the best-fitness chromosome,
+     * with exponentially decaying probablility
+     * 1 / (subpopSize >>> BREEDER_DECAY).
+     *
+     * Larger values usually cause faster convergence but poorer
+     * quality results
+     */
+    static final int BREEDER_DECAY = 1;
+
+    /**
+     * Probablility control for selecting dyers.
+     * Dyers are selected starting at the worst-fitness chromosome,
+     * with exponentially decaying probablility
+     * 1 / (subpopSize >>> DYER_DECAY)
+     *
+     * Larger values usually cause faster convergence but poorer
+     * quality results
+     */
+    static final int DYER_DECAY = 1;
+
+    /**
+     * The set of cities. Created once per program run, to
+     * make it easier to compare solutions across different runs.
+     */
+    static CitySet cities;
+
+    public static void main(String[] args) throws Exception {
+        int maxThreads = DEFAULT_MAX_THREADS;
+        int nCities = DEFAULT_CITIES;
+        int subpopSize = DEFAULT_SUBPOP_SIZE;
+        int nGen = nCities * nCities;
+        int nSubpops = nCities * nCities / subpopSize;
+        int nReps = DEFAULT_REPLICATIONS;
+
+        try {
+            int argc = 0;
+            while (argc < args.length) {
+                String option = args[argc++];
+                if (option.equals("-c")) {
+                    nCities = Integer.parseInt(args[argc]);
+                    nGen = nCities * nCities;
+                    nSubpops = nCities * nCities / subpopSize;
+                }
+                else if (option.equals("-p"))
+                    subpopSize = Integer.parseInt(args[argc]);
+                else if (option.equals("-g"))
+                    nGen = Integer.parseInt(args[argc]);
+                else if (option.equals("-n"))
+                    nSubpops = Integer.parseInt(args[argc]);
+                else if (option.equals("-q")) {
+                    verbose = false;
+                    argc--;
+                }
+                else if (option.equals("-r"))
+                    nReps = Integer.parseInt(args[argc]);
+                else
+                    maxThreads = Integer.parseInt(option);
+                argc++;
+            }
+        }
+        catch (Exception e) {
+            reportUsageErrorAndDie();
+        }
+
+        System.out.print("TSPExchangerTest");
+        System.out.print(" -c " + nCities);
+        System.out.print(" -g " + nGen);
+        System.out.print(" -p " + subpopSize);
+        System.out.print(" -n " + nSubpops);
+        System.out.print(" -r " + nReps);
+        System.out.print(" max threads " + maxThreads);
+        System.out.println();
+
+        cities = new CitySet(nCities);
+
+        if (false && NCPUS > 4) {
+            int h = NCPUS/2;
+            System.out.println("Threads: " + h + " Warmup");
+            oneRun(h, nSubpops, subpopSize, nGen);
+            Thread.sleep(500);
+        }
+
+        int maxt = (maxThreads < nSubpops) ? maxThreads : nSubpops;
+        for (int j = 0; j < nReps; ++j) {
+            for (int i = 2; i <= maxt; i += 2) {
+                System.out.println("Threads: " + i + " Replication: " + j);
+                oneRun(i, nSubpops, subpopSize, nGen);
+                Thread.sleep(500);
+            }
+        }
+    }
+
+    static void reportUsageErrorAndDie() {
+        System.out.print("usage: TSPExchangerTest");
+        System.out.print(" [-c #cities]");
+        System.out.print(" [-p #subpopSize]");
+        System.out.print(" [-g #generations]");
+        System.out.print(" [-n #subpops]");
+        System.out.print(" [-r #replications]");
+        System.out.print(" [-q]");
+        System.out.print(" #threads]");
+        System.out.println();
+        System.exit(0);
+    }
+
+    /**
+     * Perform one run with the given parameters.  Each run complete
+     * when there are fewer than 2 active threads.  When there is
+     * only one remaining thread, it will have no one to exchange
+     * with, so it is terminated (via interrupt).
+     */
+    static void oneRun(int nThreads, int nSubpops, int subpopSize, int nGen)
+        throws InterruptedException {
+        Population p = new Population(nThreads, nSubpops, subpopSize, nGen);
+        ProgressMonitor mon = null;
+        if (verbose) {
+            p.printSnapshot(0);
+            mon = new ProgressMonitor(p);
+            mon.start();
+        }
+        long startTime = Utils.nanoTime();
+        p.start();
+        p.awaitDone();
+        long stopTime = Utils.nanoTime();
+        if (mon != null)
+            mon.interrupt();
+        p.shutdown();
+        //        Thread.sleep(100);
+
+        long elapsed = stopTime - startTime;
+        double secs = (double)elapsed / 1000000000.0;
+        p.printSnapshot(secs);
+    }
+
+
+    /**
+     * A Population creates the subpops, subpops, and threads for a run
+     * and has control methods to start, stop, and report progress.
+     */
+    static final class Population {
+        final Worker[] threads;
+        final Subpop[] subpops;
+        final Exchanger exchanger;
+        final CountDownLatch done;
+        final int nGen;
+        final int subpopSize;
+        final int nThreads;
+
+        Population(int nThreads, int nSubpops, int subpopSize, int nGen) {
+            this.nThreads = nThreads;
+            this.nGen = nGen;
+            this.subpopSize = subpopSize;
+            this.exchanger = new Exchanger();
+            this.done = new CountDownLatch(nThreads - 1);
+
+            this.subpops = new Subpop[nSubpops];
+            for (int i = 0; i < nSubpops; i++)
+                subpops[i] = new Subpop(this);
+
+            this.threads = new Worker[nThreads];
+            int maxExchanges = nGen * nSubpops / nThreads;
+            for (int i = 0; i < nThreads; ++i) {
+                threads[i] = new Worker(this, maxExchanges);
+            }
+
+        }
+
+        void start() {
+            for (int i = 0; i < nThreads; ++i) {
+                threads[i].start();
+            }
+        }
+
+        /** Stop the tasks */
+        void shutdown() {
+            for (int i = 0; i < threads.length; ++ i)
+                threads[i].interrupt();
+        }
+
+        void threadDone() {
+            done.countDown();
+        }
+
+        /** Wait for tasks to complete */
+        void awaitDone() throws InterruptedException {
+            done.await();
+        }
+
+        int totalExchanges() {
+            int xs = 0;
+            for (int i = 0; i < threads.length; ++i)
+                xs += threads[i].exchanges;
+            return xs;
+        }
+
+        /**
+         * Prints statistics, including best and worst tour lengths
+         * for points scaled in [0,1), scaled by the square root of
+         * number of points. This simplifies checking results.  The
+         * expected optimal TSP for random points is believed to be
+         * around 0.76 * sqrt(N). For papers discussing this, see
+         * http://www.densis.fee.unicamp.br/~moscato/TSPBIB_home.html
+         */
+        void printSnapshot(double secs) {
+            int xs = totalExchanges();
+            long rate = (xs == 0)? 0L : (long)((secs * 1000000000.0) / xs);
+            Chromosome bestc = subpops[0].chromosomes[0];
+            Chromosome worstc = bestc;
+            for (int k = 0; k < subpops.length; ++k) {
+                Chromosome[] cs = subpops[k].chromosomes;
+                if (cs[0].fitness < bestc.fitness)
+                    bestc = cs[0];
+                int w = cs[cs.length-1].fitness;
+                if (cs[cs.length-1].fitness > worstc.fitness)
+                    worstc = cs[cs.length-1];
+            }
+            double sqrtn = Math.sqrt(cities.length);
+            double best = bestc.unitTourLength() / sqrtn;
+            double worst = worstc.unitTourLength() / sqrtn;
+            System.out.println("N:" + nThreads + " T:" + secs +
+                               " B:" + best + " W:" + worst +
+                               " X:" + xs + " R:" + rate);
+            //            exchanger.printStats();
+            //            System.out.print(" s: " + exchanger.aveSpins());
+            //            System.out.print(" p: " + exchanger.aveParks());
+        }
+    }
+
+    /**
+     * Worker threads perform updates on subpops.
+     */
+    static final class Worker extends Thread {
+        final Population pop;
+        final int maxExchanges;
+        int exchanges;
+        final RNG rng = new RNG();
+
+        Worker(Population pop, int maxExchanges) {
+            this.pop = pop;
+            this.maxExchanges = maxExchanges;
+        }
+
+        /**
+         * Repeatedly, find a subpop that is not being updated by
+         * another thread, and run a random number of updates on it.
+         */
+        public void run() {
+            try {
+                int len = pop.subpops.length;
+                int pos = (rng.next() & 0x7FFFFFFF) % len;
+                while (exchanges < maxExchanges) {
+                    Subpop s = pop.subpops[pos];
+                    AtomicBoolean busy = s.busy;
+                    if (!busy.get() && busy.compareAndSet(false, true)) {
+                        exchanges += s.runUpdates();
+                        busy.set(false);
+                        pos = (rng.next() & 0x7FFFFFFF) % len;
+                    }
+                    else if (++pos >= len)
+                        pos = 0;
+                }
+                pop.threadDone();
+            } catch (InterruptedException fallthrough) {
+            }
+        }
+    }
+
+    /**
+     * A Subpop maintains a set of chromosomes..
+     */
+    static final class Subpop {
+        /** The chromosomes, kept in sorted order */
+        final Chromosome[] chromosomes;
+        /** The parent population */
+        final Population pop;
+        /** Reservation bit for worker threads */
+        final AtomicBoolean busy;
+        /** The common exchanger, same for all subpops */
+        final Exchanger exchanger;
+        /** The current strand being exchanged */
+        Strand strand;
+        /** Bitset used in cross */
+        final int[] inTour;
+        final RNG rng;
+        final int subpopSize;
+
+        Subpop(Population pop) {
+            this.pop = pop;
+            this.subpopSize = pop.subpopSize;
+            this.exchanger = pop.exchanger;
+            this.busy = new AtomicBoolean(false);
+            this.rng = new RNG();
+            int length = cities.length;
+            this.strand = new Strand(length);
+            this.inTour = new int[(length >>> 5) + 1];
+            this.chromosomes = new Chromosome[subpopSize];
+            for (int j = 0; j < subpopSize; ++j)
+                chromosomes[j] = new Chromosome(length, rng);
+            Arrays.sort(chromosomes);
+        }
+
+        /**
+         * Run a random number of updates.  The number of updates is
+         * at least 1 and no more than subpopSize.  This
+         * controls the granularity of multiplexing subpop updates on
+         * to threads. It is small enough to balance out updates
+         * across tasks, but large enough to avoid having runs
+         * dominated by subpop selection. It is randomized to avoid
+         * long runs where pairs of subpops exchange only with each
+         * other.  It is hardwired because small variations of it
+         * don't matter much.
+         *
+         * @param g the first generation to run.
+         */
+        int runUpdates() throws InterruptedException {
+            int n = 1 + (rng.next() & ((subpopSize << 1) - 1));
+            for (int i = 0; i < n; ++i)
+                update();
+            return n;
+        }
+
+        /**
+         * Choose a breeder, exchange strand with another subpop, and
+         * cross them to create new chromosome to replace a chosen
+         * dyer.
+         */
+        void update() throws InterruptedException {
+            int b = chooseBreeder();
+            int d = chooseDyer(b);
+            Chromosome breeder = chromosomes[b];
+            Chromosome child = chromosomes[d];
+            chooseStrand(breeder);
+            strand = (Strand)exchanger.exchange(strand);
+            cross(breeder, child);
+            fixOrder(child, d);
+        }
+
+        /**
+         * Choose a breeder, with exponentially decreasing probability
+         * starting at best.
+         * @return index of selected breeder
+         */
+        int chooseBreeder() {
+            int mask = (subpopSize >>> BREEDER_DECAY) - 1;
+            int b = 0;
+            while ((rng.next() & mask) != mask) {
+                if (++b >= subpopSize)
+                    b = 0;
+            }
+            return b;
+        }
+
+        /**
+         * Choose a chromosome that will be replaced, with
+         * exponentially decreasing probablility starting at
+         * worst, ignoring the excluded index
+         * @param exclude index to ignore; use -1 to not exclude any
+         * @return index of selected dyer
+         */
+        int chooseDyer(int exclude) {
+            int mask = (subpopSize >>> DYER_DECAY)  - 1;
+            int d = subpopSize - 1;
+            while (d == exclude || (rng.next() & mask) != mask) {
+                if (--d < 0)
+                    d = subpopSize - 1;
+            }
+            return d;
+        }
+
+        /**
+         * Select a random strand of b's.
+         * @param breeder the breeder
+         */
+        void chooseStrand(Chromosome breeder) {
+            int[] bs = breeder.alleles;
+            int length = bs.length;
+            int strandLength = MIN_STRAND_LENGTH;
+            while (strandLength < length &&
+                   (rng.next() & RANDOM_STRAND_MASK) != RANDOM_STRAND_MASK)
+                strandLength++;
+            strand.strandLength = strandLength;
+            int[] ss = strand.alleles;
+            int k = (rng.next() & 0x7FFFFFFF) % length;
+            for (int i = 0; i < strandLength; ++i) {
+                ss[i] = bs[k];
+                if (++k >= length) k = 0;
+            }
+        }
+
+        /**
+         * Copy current strand to start of c's, and then append all
+         * remaining b's that aren't in the strand.
+         * @param breeder the breeder
+         * @param child the child
+         */
+        void cross(Chromosome breeder, Chromosome child) {
+            for (int k = 0; k < inTour.length; ++k) // clear bitset
+                inTour[k] = 0;
+
+            // Copy current strand to c
+            int[] cs = child.alleles;
+            int ssize = strand.strandLength;
+            int[] ss = strand.alleles;
+            int i;
+            for (i = 0; i < ssize; ++i) {
+                int x = ss[i];
+                cs[i] = x;
+                inTour[x >>> 5] |= 1 << (x & 31); // record in bit set
+            }
+
+            // Find index of matching origin in b
+            int first = cs[0];
+            int j = 0;
+            int[] bs = breeder.alleles;
+            while (bs[j] != first)
+                ++j;
+
+            // Append remaining b's that aren't already in tour
+            while (i < cs.length) {
+                if (++j >= bs.length) j = 0;
+                int x = bs[j];
+                if ((inTour[x >>> 5] & (1 << (x & 31))) == 0)
+                    cs[i++] = x;
+            }
+
+        }
+
+        /**
+         * Fix the sort order of a changed Chromosome c at position k
+         * @param c the chromosome
+         * @param k the index
+         */
+        void fixOrder(Chromosome c, int k) {
+            Chromosome[] cs = chromosomes;
+            int oldFitness = c.fitness;
+            c.recalcFitness();
+            int newFitness = c.fitness;
+            if (newFitness < oldFitness) {
+                int j = k;
+                int p = j - 1;
+                while (p >= 0 && cs[p].fitness > newFitness) {
+                    cs[j] = cs[p];
+                    j = p--;
+                }
+                cs[j] = c;
+            } else if (newFitness > oldFitness) {
+                int j = k;
+                int n = j + 1;
+                while (n < cs.length && cs[n].fitness < newFitness) {
+                    cs[j] = cs[n];
+                    j = n++;
+                }
+                cs[j] = c;
+            }
+        }
+    }
+
+    /**
+     * A Chromosome is a candidate TSP tour.
+     */
+    static final class Chromosome implements Comparable {
+        /** Index of cities in tour order */
+        final int[] alleles;
+        /** Total tour length */
+        int fitness;
+
+        /**
+         * Initialize to random tour
+         */
+        Chromosome(int length, RNG random) {
+            alleles = new int[length];
+            for (int i = 0; i < length; i++)
+                alleles[i] = i;
+            for (int i = length - 1; i > 0; i--) {
+                int idx = (random.next() & 0x7FFFFFFF) % alleles.length;
+                int tmp = alleles[i];
+                alleles[i] = alleles[idx];
+                alleles[idx] = tmp;
+            }
+            recalcFitness();
+        }
+
+        public int compareTo(Object x) { // to enable sorting
+            int xf = ((Chromosome)x).fitness;
+            int f = fitness;
+            return ((f == xf)? 0 :((f < xf)? -1 : 1));
+        }
+
+        void recalcFitness() {
+            int[] a = alleles;
+            int len = a.length;
+            int p = a[0];
+            long f = cities.distanceBetween(a[len-1], p);
+            for (int i = 1; i < len; i++) {
+                int n = a[i];
+                f += cities.distanceBetween(p, n);
+                p = n;
+            }
+            fitness = (int)(f / len);
+        }
+
+        /**
+         * Return tour length for points scaled in [0, 1).
+         */
+        double unitTourLength() {
+            int[] a = alleles;
+            int len = a.length;
+            int p = a[0];
+            double f = cities.unitDistanceBetween(a[len-1], p);
+            for (int i = 1; i < len; i++) {
+                int n = a[i];
+                f += cities.unitDistanceBetween(p, n);
+                p = n;
+            }
+            return f;
+        }
+
+        /**
+         * Check that this tour visits each city
+         */
+        void validate() {
+            int len = alleles.length;
+            boolean[] used = new boolean[len];
+            for (int i = 0; i < len; ++i)
+                used[alleles[i]] = true;
+            for (int i = 0; i < len; ++i)
+                if (!used[i])
+                    throw new Error("Bad tour");
+        }
+
+    }
+
+    /**
+     * A Strand is a random sub-sequence of a Chromosome.  Each subpop
+     * creates only one strand, and then trades it with others,
+     * refilling it on each iteration.
+     */
+    static final class Strand {
+        final int[] alleles;
+        int strandLength;
+        Strand(int length) { alleles = new int[length]; }
+    }
+
+    /**
+     * A collection of (x,y) points that represent cities.
+     */
+    static final class CitySet {
+
+        final int length;
+        final int[] xPts;
+        final int[] yPts;
+        final int[][] distances;
+
+        CitySet(int n) {
+            this.length = n;
+            this.xPts = new int[n];
+            this.yPts = new int[n];
+            this.distances = new int[n][n];
+
+            RNG random = new RNG();
+            for (int i = 0; i < n; i++) {
+                xPts[i] = (random.next() & 0x7FFFFFFF);
+                yPts[i] = (random.next() & 0x7FFFFFFF);
+            }
+
+            for (int i = 0; i < n; i++) {
+                for (int j = 0; j < n; j++) {
+                    double dx = (double)xPts[i] - (double)xPts[j];
+                    double dy = (double)yPts[i] - (double)yPts[j];
+                    double dd = Math.sqrt(dx*dx+dy*dy) / 2.0;
+                    long ld = Math.round(dd);
+                    distances[i][j] = (ld >= Integer.MAX_VALUE)?
+                        Integer.MAX_VALUE : (int)ld;
+                }
+            }
+        }
+
+        /**
+         *  Returns the cached distance between a pair of cities
+         */
+        int distanceBetween(int i, int j) {
+            return distances[i][j];
+        }
+
+        // Scale ints to doubles in [0,1)
+        static final double PSCALE = (double)0x80000000L;
+
+        /**
+         * Return distance for points scaled in [0,1). This simplifies
+         * checking results.  The expected optimal TSP for random
+         * points is believed to be around 0.76 * sqrt(N). For papers
+         * discussing this, see
+         * http://www.densis.fee.unicamp.br/~moscato/TSPBIB_home.html
+         */
+        double unitDistanceBetween(int i, int j) {
+            double dx = ((double)xPts[i] - (double)xPts[j]) / PSCALE;
+            double dy = ((double)yPts[i] - (double)yPts[j]) / PSCALE;
+            return Math.sqrt(dx*dx+dy*dy);
+        }
+
+    }
+
+    /**
+     * Cheap XorShift random number generator
+     */
+    static final class RNG {
+        /** Seed generator for XorShift RNGs */
+        static final Random seedGenerator = new Random();
+
+        int seed;
+        RNG(int seed) { this.seed = seed; }
+        RNG()         { this.seed = seedGenerator.nextInt() | 1;  }
+
+        int next() {
+            int x = seed;
+            x ^= x << 6;
+            x ^= x >>> 21;
+            x ^= x << 7;
+            seed = x;
+            return x;
+        }
+    }
+
+    static final class ProgressMonitor extends Thread {
+        final Population pop;
+        ProgressMonitor(Population p) { pop = p; }
+        public void run() {
+            double time = 0;
+            try {
+                while (!Thread.interrupted()) {
+                    sleep(SNAPSHOT_RATE);
+                    time += SNAPSHOT_RATE;
+                    pop.printSnapshot(time / 1000.0);
+                }
+            } catch (InterruptedException ie) {}
+        }
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/TimeUnitLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/TimeUnitLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/TimeUnitLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,63 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import java.util.Random;
+
+public class TimeUnitLoops {
+
+    static final LoopHelpers.SimpleRandom rng = new LoopHelpers.SimpleRandom();
+
+    /**
+     * False value allows aggressive inlining of cvt() calls from
+     * test(). True value prevents any inlining, requiring virtual
+     * method dispatch.
+     */
+    static final boolean PREVENT_INLINING = true;
+
+    // The following all are used by inlining prevention clause:
+    static int index = 0;
+    static final int NUNITS = 100;
+    static final TimeUnit[] units = new TimeUnit[NUNITS];
+    static {
+        TimeUnit[] v = TimeUnit.values();
+        for (int i = 0; i < NUNITS; ++i)
+            units[i] = v[rng.next() % v.length];
+    }
+
+    public static void main(String[] args) throws Exception {
+        long start = System.currentTimeMillis();
+        long s = 0;
+        for (int i = 0; i < 100; ++i) {
+            s += test();
+            if (s == start) System.out.println(" ");
+        }
+        long end = System.currentTimeMillis();
+        System.out.println("Time: " + (end - start) + " ms");
+    }
+
+    static long test() {
+        long sum = 0;
+        int x = rng.next();
+        for (int i = 0; i < 1000000; ++i) {
+            long l = (long)x + (long)x;
+            sum += cvt(l, TimeUnit.SECONDS);
+            sum += TimeUnit.MILLISECONDS.toMicros(l+2);
+            sum += cvt(l+17, TimeUnit.NANOSECONDS);
+            sum += cvt(l+42, TimeUnit.MILLISECONDS);
+            x = LoopHelpers.compute4(x);
+        }
+        return sum + x;
+    }
+
+    static long cvt(long d, TimeUnit u) {
+        if (PREVENT_INLINING) {
+            u = units[index];
+            index = (index+1) % NUNITS;
+        }
+
+        return u.toNanos(d);
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/TimeoutExchangerLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/TimeoutExchangerLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/TimeoutExchangerLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,158 @@
+/*
+ * Written by Bill Scherer and Doug Lea with assistance from members
+ * of JCP JSR-166 Expert Group and released to the public domain. Use,
+ * modify, and redistribute this code in any way without
+ * acknowledgement.
+ */
+
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.atomic.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.Utils;
+
+public class TimeoutExchangerLoops {
+    static final int NCPUS = Runtime.getRuntime().availableProcessors();
+
+    static final int  DEFAULT_THREADS = NCPUS + 2;
+    static final long DEFAULT_PATIENCE_NANOS = 500000;
+    static final long DEFAULT_TRIAL_MILLIS   = 10000;
+
+    public static void main(String[] args) throws Exception {
+        int maxThreads = DEFAULT_THREADS;
+        long trialMillis = DEFAULT_TRIAL_MILLIS;
+        long patienceNanos = DEFAULT_PATIENCE_NANOS;
+        int nReps = 3;
+
+        // Parse and check args
+        int argc = 0;
+        while (argc < args.length) {
+            String option = args[argc++];
+            if (option.equals("-t"))
+                trialMillis = Integer.parseInt(args[argc]);
+            else if (option.equals("-p"))
+                patienceNanos = Long.parseLong(args[argc]);
+            else if (option.equals("-r"))
+                nReps = Integer.parseInt(args[argc]);
+            else
+                maxThreads = Integer.parseInt(option);
+            argc++;
+        }
+
+	// Display runtime parameters
+	System.out.print("TimeoutExchangerTest");
+	System.out.print(" -t " + trialMillis);
+	System.out.print(" -p " + patienceNanos);
+        System.out.print(" -r " + nReps);
+	System.out.print(" max threads " + maxThreads);
+	System.out.println();
+
+        System.out.println("Warmups..");
+        long warmupTime = 1000;
+        long sleepTime = 500;
+        if (false) {
+            for (int k = 0; k < 10; ++k) {
+                for (int j = 0; j < 10; ++j) {
+                    oneRun(2, (j + 1) * 1000, patienceNanos);
+                    Thread.sleep(sleepTime);
+                }
+            }
+        }
+
+        oneRun(3, warmupTime, patienceNanos);
+        Thread.sleep(sleepTime);
+
+        for (int i = maxThreads; i >= 2; i -= 1) {
+            oneRun(i, warmupTime, patienceNanos);
+            Thread.sleep(sleepTime);
+        }
+
+        for (int j = 0; j < nReps; ++j) {
+            System.out.println("Replication " + j);
+            for (int i = 2; i <= maxThreads; i += 2) {
+                oneRun(i, trialMillis, patienceNanos);
+                Thread.sleep(sleepTime);
+            }
+        }
+    }
+
+    static void oneRun(int nThreads, long trialMillis, long patienceNanos)
+        throws Exception {
+        System.out.println(nThreads + " threads");
+        System.out.println(trialMillis + "ms");
+        final CountDownLatch start = new CountDownLatch(1);
+        Exchanger x = new Exchanger();
+        Runner[] runners = new Runner[nThreads];
+        Thread[] threads = new Thread[nThreads];
+        for (int i = 0; i < nThreads; ++i) {
+            runners[i] = new Runner(x, patienceNanos, start);
+            threads[i] = new Thread(runners[i]);
+            threads[i].start();
+        }
+        long startTime = Utils.nanoTime();
+        start.countDown();
+        Thread.sleep(trialMillis);
+        for (int i = 0; i < nThreads; ++i)
+            threads[i].interrupt();
+        long elapsed = Utils.nanoTime() - startTime;
+        for (int i = 0; i < nThreads; ++i)
+            threads[i].join();
+        int iters = 0;
+        long fails = 0;
+        for (int i = 0; i < nThreads; ++i) {
+            iters += runners[i].iters;
+            fails += runners[i].failures;
+        }
+        if (iters <= 0) iters = 1;
+        long rate = iters * 1000L * 1000L * 1000L / elapsed;
+        long npt = elapsed / iters;
+        double failRate = (fails * 100.0) / (double)iters;
+        System.out.println(rate + " it/s ");
+        System.out.println(npt + " ns/it");
+        System.out.println(failRate + " fails");
+        System.out.println();
+        //        x.printStats();
+    }
+
+
+    static final class Runner implements Runnable {
+        final Exchanger exchanger;
+        final CountDownLatch start;
+        final long patience;
+        volatile int iters;
+        volatile int failures;
+        Runner(Exchanger x, long patience, CountDownLatch start) {
+            this.exchanger = x;
+            this.patience = patience;
+            this.start = start;
+        }
+
+        public void run() {
+            int i = 0;
+            try {
+                Exchanger x = exchanger;
+                Object m = new Integer(17);
+                long p = patience;
+                start.await();
+                for (;;) {
+                    try {
+                        Object e = x.exchange(m, p, TimeUnit.NANOSECONDS);
+                        if (e == null || e == m)
+                            throw new Error();
+                        m = e;
+                        ++i;
+                    } catch (TimeoutException to) {
+                        if (Thread.interrupted()) {
+                            iters = i;
+                            return;
+                        }
+                        ++i;
+                        ++failures;
+                    }
+                }
+            } catch (InterruptedException ie) {
+                iters = i;
+            }
+        }
+    }
+}
+

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/TimeoutLockLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/TimeoutLockLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/TimeoutLockLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,115 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+/*
+ * @test %I% %E%
+ * @bug 4486658
+ * @compile -source 1.5 TimeoutLockLoops.java
+ * @run main TimeoutLockLoops
+ * @summary Checks for responsiveness of locks to timeouts.
+ * Runs under the assumption that ITERS computations require more than
+ * TIMEOUT msecs to complete, which seems to be a safe assumption for
+ * another decade.
+ */
+
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import edu.emory.mathcs.backport.java.util.*;
+
+public final class TimeoutLockLoops {
+    static final ExecutorService pool = Executors.newCachedThreadPool();
+    static final LoopHelpers.SimpleRandom rng = new LoopHelpers.SimpleRandom();
+    static boolean print = false;
+    static final int ITERS = Integer.MAX_VALUE;
+    static final long TIMEOUT = 100; 
+
+    public static void main(String[] args) throws Exception {
+        int maxThreads = 100;
+        if (args.length > 0) 
+            maxThreads = Integer.parseInt(args[0]);
+
+        print = true;
+
+        for (int i = 1; i <= maxThreads; i += (i+1) >>> 1) {
+            System.out.print("Threads: " + i);
+            new ReentrantLockLoop(i).test();
+            //            Thread.sleep(10);
+        }
+        pool.shutdown();
+    }
+
+    static final class ReentrantLockLoop implements Runnable {
+        private int v = rng.next();
+        private volatile boolean completed;
+        private volatile int result = 17;
+        private final ReentrantLock lock = new ReentrantLock();
+        private final LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
+        private final CyclicBarrier barrier;
+        private final int nthreads;
+        ReentrantLockLoop(int nthreads) {
+            this.nthreads = nthreads;
+            barrier = new CyclicBarrier(nthreads+1, timer);
+        }
+
+        final void test() throws Exception {
+            for (int i = 0; i < nthreads; ++i) {
+                lock.lock();
+                pool.execute(this);
+                lock.unlock();
+            }
+            barrier.await();
+            Thread.sleep(TIMEOUT);
+            while (!lock.tryLock()); // Jam lock
+            //            lock.lock();
+            barrier.await();
+            if (print) {
+                long time = timer.getTime();
+                double secs = (double)(time) / 1000000000.0;
+                System.out.println("\t " + secs + "s run time");
+            }
+
+            if (completed)
+                throw new Error("Some thread completed instead of timing out");
+            int r = result;
+            if (r == 0) // avoid overoptimization
+                System.out.println("useless result: " + r);
+        }
+
+        public final void run() {
+            try {
+                barrier.await(); 
+                int sum = v;
+                int x = 17;
+                int n = ITERS;
+                final ReentrantLock lock = this.lock;
+                for (;;) {
+                    if (x != 0) {
+                        if (n-- <= 0)
+                            break;
+                    }
+                    if (!lock.tryLock(TIMEOUT, TimeUnit.MILLISECONDS))
+                        break;
+                    try {
+                        v = x = LoopHelpers.compute1(v);
+                    }
+                    finally {
+                        lock.unlock();
+                    }
+                    sum += LoopHelpers.compute2(x);
+                }
+                if (n <= 0)
+                    completed = true;
+                barrier.await();
+                result += sum;
+            }
+            catch (Exception ex) { 
+                ex.printStackTrace();
+                return; 
+            }
+        }
+    }
+
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/TimeoutMutexLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/TimeoutMutexLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/TimeoutMutexLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,101 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+/*
+ * @test
+ * Checks for responsiveness of locks to timeouts. Runs under the
+ * assumption that ITERS computations require more than TIMEOUT msecs
+ * to complete, which seems to be a safe assumption for another
+ * decade.
+ */
+
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import edu.emory.mathcs.backport.java.util.*;
+
+public final class TimeoutMutexLoops {
+    static final ExecutorService pool = Executors.newCachedThreadPool();
+    static final LoopHelpers.SimpleRandom rng = new LoopHelpers.SimpleRandom();
+    static boolean print = false;
+    static final int ITERS = Integer.MAX_VALUE;
+    static final long TIMEOUT = 100;
+
+    public static void main(String[] args) throws Exception {
+//        int maxThreads = 100;
+//        if (args.length > 0)
+//            maxThreads = Integer.parseInt(args[0]);
+//
+//        print = true;
+//
+//        for (int i = 1; i <= maxThreads; i += (i+1) >>> 1) {
+//            System.out.print("Threads: " + i);
+//            new MutexLoop(i).test();
+//            Thread.sleep(TIMEOUT);
+//        }
+//        pool.shutdown();
+    }
+
+    static final class MutexLoop implements Runnable {
+        private int v = rng.next();
+        private volatile boolean completed;
+        private volatile int result = 17;
+//        private final Mutex lock = new Mutex();
+        private final LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
+        private final CyclicBarrier barrier;
+        private final int nthreads;
+        MutexLoop(int nthreads) {
+            this.nthreads = nthreads;
+            barrier = new CyclicBarrier(nthreads+1, timer);
+        }
+
+//        final void test() throws Exception {
+//            for (int i = 0; i < nthreads; ++i)
+//                pool.execute(this);
+//            barrier.await();
+//            Thread.sleep(TIMEOUT);
+//            lock.lock();
+//            barrier.await();
+//            if (print) {
+//                long time = timer.getTime();
+//                double secs = (double)(time) / 1000000000.0;
+//                System.out.println("\t " + secs + "s run time");
+//            }
+//
+//            if (completed)
+//                throw new Error("Some thread completed instead of timing out");
+//            int r = result;
+//            if (r == 0) // avoid overoptimization
+//                System.out.println("useless result: " + r);
+//        }
+//
+        public final void run() {
+//            try {
+//                barrier.await();
+//                int sum = v;
+//                int x = 0;
+//                int n = ITERS;
+//                do {
+//                    if (!lock.tryLock(TIMEOUT, TimeUnit.MILLISECONDS))
+//                        break;
+//                    try {
+//                        v = x = LoopHelpers.compute1(v);
+//                    }
+//                    finally {
+//                        lock.unlock();
+//                    }
+//                    sum += LoopHelpers.compute2(x);
+//                } while (n-- > 0);
+//                if (n <= 0)
+//                    completed = true;
+//                barrier.await();
+//                result += sum;
+//            }
+//            catch (Exception ie) {
+//                return;
+//            }
+        }
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/TimeoutProducerConsumerLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/TimeoutProducerConsumerLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/TimeoutProducerConsumerLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,193 @@
+/*
+ * @test
+ * @synopsis  multiple producers and consumers using timeouts in blocking queues
+ */
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain. Use, modify, and
+ * redistribute this code in any way without acknowledgement.
+ */
+
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+
+public class TimeoutProducerConsumerLoops {
+    static final int CAPACITY =      100;
+    static final ExecutorService pool = Executors.newCachedThreadPool();
+    static boolean print = false;
+    static int producerSum;
+    static int consumerSum;
+    static synchronized void addProducerSum(int x) {
+        producerSum += x;
+    }
+
+    static synchronized void addConsumerSum(int x) {
+        consumerSum += x;
+    }
+
+    static synchronized void checkSum() {
+        if (producerSum != consumerSum) {
+            throw new Error("CheckSum mismatch");
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+        int maxPairs = 100;
+        int iters = 100000;
+
+        if (args.length > 0)
+            maxPairs = Integer.parseInt(args[0]);
+
+        print = false;
+        System.out.println("Warmup...");
+        oneTest(1, 10000);
+        Thread.sleep(100);
+        oneTest(2, 10000);
+        Thread.sleep(100);
+        oneTest(2, 10000);
+        Thread.sleep(100);
+        print = true;
+
+        int k = 1;
+        for (int i = 1; i <= maxPairs;) {
+            System.out.println("Pairs:" + i);
+            oneTest(i, iters);
+            Thread.sleep(100);
+            if (i == k) {
+                k = i << 1;
+                i = i + (i >>> 1);
+            }
+            else
+                i = k;
+        }
+        pool.shutdown();
+   }
+
+    static void oneTest(int pairs, int iters) throws Exception {
+        int fairIters = iters/20;
+        if (print)
+            System.out.print("ArrayBlockingQueue      ");
+        oneRun(new ArrayBlockingQueue(CAPACITY), pairs, iters);
+
+        if (print)
+            System.out.print("LinkedBlockingQueue     ");
+        oneRun(new LinkedBlockingQueue(CAPACITY), pairs, iters);
+
+        if (print)
+            System.out.print("LinkedBlockingDeque     ");
+        oneRun(new LinkedBlockingDeque(CAPACITY), pairs, iters);
+
+        if (print)
+            System.out.print("SynchronousQueue        ");
+        oneRun(new SynchronousQueue(), pairs, iters);
+
+        if (print)
+            System.out.print("SynchronousQueue(fair)  ");
+        oneRun(new SynchronousQueue(true), pairs, fairIters);
+
+        if (print)
+            System.out.print("PriorityBlockingQueue   ");
+        oneRun(new PriorityBlockingQueue(), pairs, fairIters);
+
+        if (print)
+            System.out.print("ArrayBlockingQueue(fair)");
+        oneRun(new ArrayBlockingQueue(CAPACITY, true), pairs, fairIters);
+
+    }
+
+    static abstract class Stage implements Runnable {
+        final int iters;
+        final BlockingQueue queue;
+        final CyclicBarrier barrier;
+        Stage (BlockingQueue q, CyclicBarrier b, int iters) {
+            queue = q;
+            barrier = b;
+            this.iters = iters;
+        }
+    }
+
+    static class Producer extends Stage {
+        Producer(BlockingQueue q, CyclicBarrier b, int iters) {
+            super(q, b, iters);
+        }
+
+        public void run() {
+            try {
+                barrier.await();
+                int s = 0;
+                int l = hashCode();
+                int i = 0;
+                long timeout = 1;
+                while (i < iters) {
+                    l = LoopHelpers.compute4(l);
+                    if (queue.offer(new Integer(l),
+                                    timeout, TimeUnit.NANOSECONDS)) {
+                        s += LoopHelpers.compute4(l);
+                        ++i;
+                        if (timeout > 1)
+                            timeout--;
+                    }
+                    else
+                        timeout++;
+                }
+                addProducerSum(s);
+                barrier.await();
+            }
+            catch (Exception ie) {
+                ie.printStackTrace();
+                return;
+            }
+        }
+    }
+
+    static class Consumer extends Stage {
+        Consumer(BlockingQueue q, CyclicBarrier b, int iters) {
+            super(q, b, iters);
+        }
+
+        public void run() {
+            try {
+                barrier.await();
+                int l = 0;
+                int s = 0;
+                int i = 0;
+                long timeout = 1;
+                while (i < iters) {
+                    Integer e = (Integer)queue.poll(timeout,
+                                           TimeUnit.NANOSECONDS);
+                    if (e != null) {
+                        l = LoopHelpers.compute4(e.intValue());
+                        s += l;
+                        ++i;
+                        if (timeout > 1)
+                            --timeout;
+                    }
+                    else
+                        ++timeout;
+                }
+                addConsumerSum(s);
+                barrier.await();
+            }
+            catch (Exception ie) {
+                ie.printStackTrace();
+                return;
+            }
+        }
+
+    }
+
+    static void oneRun(BlockingQueue q, int npairs, int iters) throws Exception {
+        LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
+        CyclicBarrier barrier = new CyclicBarrier(npairs * 2 + 1, timer);
+        for (int i = 0; i < npairs; ++i) {
+            pool.execute(new Producer(q, barrier, iters));
+            pool.execute(new Consumer(q, barrier, iters));
+        }
+        barrier.await();
+        barrier.await();
+        long time = timer.getTime();
+        checkSum();
+        if (print)
+            System.out.println("\t: " + LoopHelpers.rightJustify(time / (iters * npairs)) + " ns per transfer");
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/UnboundedQueueFillEmptyLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/UnboundedQueueFillEmptyLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/UnboundedQueueFillEmptyLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,71 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain. Use, modify, and
+ * redistribute this code in any way without acknowledgement.
+ */
+
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import edu.emory.mathcs.backport.java.util.concurrent.atomic.*;
+import java.util.Random;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.*;
+
+public class UnboundedQueueFillEmptyLoops {
+    static int maxSize = 10000;
+    static Random rng = new Random(3153122688L);
+    static volatile int total;
+    static Integer[] numbers;
+
+    public static void main(String[] args) throws Exception {
+        Class klass = null;
+        if (args.length > 0) {
+            try {
+                klass = Class.forName(args[0]);
+            } catch(ClassNotFoundException e) {
+                throw new RuntimeException("Class " + args[0] + " not found.");
+            }
+        }
+
+        if (args.length > 2)
+            maxSize = Integer.parseInt(args[2]);
+
+        System.out.print("Class: " + klass.getName());
+        System.out.println(" size: " + maxSize);
+
+        numbers = new Integer[maxSize];
+        for (int i = 0; i < maxSize; ++i)
+            numbers[i] = new Integer(rng.nextInt(128));
+
+        oneRun(klass, maxSize);
+        Thread.sleep(100);
+        oneRun(klass, maxSize);
+        Thread.sleep(100);
+        oneRun(klass, maxSize);
+
+        if (total == 0) System.out.print(" ");
+   }
+
+    static void oneRun(Class klass, int n) throws Exception {
+        Queue q = (Queue)klass.newInstance();
+        int sum = total;
+        int m = rng.nextInt(numbers.length);
+        long startTime = Utils.nanoTime();
+        for (int k = 0; k < n; ++k) {
+            for (int i = 0; i < k; ++i) {
+                if (m >= numbers.length)
+                    m = 0;
+                q.offer(numbers[m++]);
+            }
+            Integer p;
+            while ((p = (Integer)q.poll()) != null)
+                sum += p.intValue();
+        }
+        total += sum;
+        long endTime = Utils.nanoTime();
+        long time = endTime - startTime;
+        double secs = (double)(time) / 1000000000.0;
+        System.out.println("Time: " + secs);
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/src/UncheckedLockLoops.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/src/UncheckedLockLoops.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/src/UncheckedLockLoops.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,440 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+/*
+ * @test
+ * @summary basic safety and liveness of ReentrantLocks, and other locks based on them
+ */
+
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import edu.emory.mathcs.backport.java.util.*;
+
+public final class UncheckedLockLoops {
+    static final LoopHelpers.SimpleRandom rng = new LoopHelpers.SimpleRandom();
+    static boolean print = false;
+    static boolean doBuiltin = true;
+
+    public static void main(String[] args) throws Exception {
+        int maxThreads = 100;
+        int iters = 10000000;
+
+        if (args.length > 0)
+            maxThreads = Integer.parseInt(args[0]);
+
+        rng.setSeed(3122688L);
+
+        print = false;
+        System.out.println("Warmup...");
+        oneTest(1, 100000);
+        Thread.sleep(1000);
+        oneTest(3, 10000);
+        Thread.sleep(1000);
+        oneTest(2, 10000);
+        Thread.sleep(100);
+        oneTest(1, 100000);
+        Thread.sleep(100);
+        oneTest(1, 100000);
+        Thread.sleep(1000);
+        print = true;
+
+        System.out.println("Threads:" + 1);
+        oneTest(1, iters / 1);
+        Thread.sleep(100);
+
+        for (int i = 1; i <= maxThreads; i += (i+1) >>> 1) {
+            System.out.println("Threads:" + i);
+            oneTest(i, iters / i);
+            Thread.sleep(100);
+        }
+
+    }
+
+    static void oneTest(int nthreads, int iters) throws Exception {
+        int fairIters = (nthreads <= 1)? iters : iters/20;
+        int v = rng.next();
+
+        if (print)
+            System.out.print("NoLock (1 thread)     ");
+        new NoLockLoop().test(v, 1, iters * nthreads);
+        Thread.sleep(10);
+
+        if (print)
+            System.out.print("ReentrantLock         ");
+        new ReentrantLockLoop().test(v, nthreads, iters);
+        Thread.sleep(10);
+
+        if (false) {
+        if (print)
+            System.out.print("FairReentrantLock     ");
+        new FairReentrantLockLoop().test(v, nthreads, fairIters);
+        Thread.sleep(10);
+        }
+        if (doBuiltin) {
+            if (print)
+                System.out.print("builtin lock          ");
+            new BuiltinLockLoop().test(v, nthreads, fairIters);
+            Thread.sleep(10);
+        }
+
+//        if (print)
+//            System.out.print("Mutex                 ");
+//        new MutexLoop().test(v, nthreads, iters);
+//        Thread.sleep(10);
+//
+//        if (print)
+//            System.out.print("LongMutex             ");
+//        new LongMutexLoop().test(v, nthreads, iters);
+//        Thread.sleep(10);
+//
+        if (print)
+            System.out.print("Semaphore             ");
+        new SemaphoreLoop().test(v, nthreads, iters);
+        Thread.sleep(10);
+
+        if (print)
+            System.out.print("FairSemaphore         ");
+        new FairSemaphoreLoop().test(v, nthreads, fairIters);
+        Thread.sleep(10);
+
+        if (print)
+            System.out.print("ReentrantWriteLock    ");
+        new ReentrantWriteLockLoop().test(v, nthreads, iters);
+        Thread.sleep(10);
+
+//        if (print)
+//            System.out.print("FairRWriteLock         ");
+//        new FairReentrantWriteLockLoop().test(v, nthreads, fairIters);
+//        Thread.sleep(10);
+//
+        if (print)
+            System.out.print("ReentrantReadWriteLock");
+        new ReentrantReadWriteLockLoop().test(v, nthreads, iters);
+        Thread.sleep(10);
+
+//        if (print)
+//            System.out.print("FairRReadWriteLock     ");
+//        new FairReentrantReadWriteLockLoop().test(v, nthreads, fairIters);
+//        Thread.sleep(10);
+//
+    }
+
+    static abstract class LockLoop implements Runnable {
+        int value;
+        int checkValue;
+        int iters;
+        volatile int result;
+        volatile int failures;
+        final LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
+        CyclicBarrier barrier;
+
+        final int setValue(int v) {
+            checkValue = v ^ 0x55555555;
+            value = v;
+            return v;
+        }
+
+        final int getValue() {
+            int v = value;
+            if (checkValue != ~(v ^ 0xAAAAAAAA))
+                ++failures;
+            return v;
+        }
+
+        final void test(int initialValue, int nthreads, int iters) throws Exception {
+            setValue(initialValue);
+            this.iters = iters;
+            barrier = new CyclicBarrier(nthreads+1, timer);
+            for (int i = 0; i < nthreads; ++i)
+                new Thread(this).start();
+            barrier.await();
+            barrier.await();
+            long time = timer.getTime();
+            if (print) {
+                long tpi = time / (iters * nthreads);
+                System.out.print("\t" + LoopHelpers.rightJustify(tpi) + " ns per update");
+                //                double secs = (double)(time) / 1000000000.0;
+                //                System.out.print("\t " + secs + "s run time");
+                System.out.println();
+            }
+
+            if (result == 0) // avoid overoptimization
+                System.out.println("useless result: " + result);
+            if (failures != 0)
+                throw new Error("protection failure?");
+        }
+        abstract int loop(int n);
+        public final void run() {
+            try {
+                barrier.await();
+                result += loop(iters);
+                barrier.await();
+            }
+            catch (Exception ie) {
+                return;
+            }
+        }
+
+    }
+
+    private static class NoLockLoop extends LockLoop {
+        private volatile int readBarrier;
+        final int loop(int n) {
+            int sum = 0;
+            int x = 0;;
+            while (n-- > 0) {
+                int r1 = readBarrier;
+                x = setValue(LoopHelpers.compute1(getValue()));
+                int r2 = readBarrier;
+                if (r1 == r2 && (x & 255) == 0)
+                    ++readBarrier;
+                sum += LoopHelpers.compute2(x);
+            }
+            return sum;
+        }
+    }
+
+    private static class BuiltinLockLoop extends LockLoop {
+        final int loop(int n) {
+            int sum = 0;
+            int x = 0;;
+            while (n-- > 0) {
+                synchronized(this) {
+                    x = setValue(LoopHelpers.compute1(getValue()));
+                }
+                sum += LoopHelpers.compute2(x);
+            }
+            return sum;
+        }
+    }
+
+    private static class ReentrantLockLoop extends LockLoop {
+        final private ReentrantLock lock = new ReentrantLock();
+        final int loop(int n) {
+            final ReentrantLock lock = this.lock;
+            int sum = 0;
+            int x = 0;
+            while (n-- > 0) {
+                lock.lock();
+                try {
+                    x = setValue(LoopHelpers.compute1(getValue()));
+                }
+                finally {
+                    lock.unlock();
+                }
+                sum += LoopHelpers.compute2(x);
+            }
+            return sum;
+        }
+    }
+
+//    private static class MutexLoop extends LockLoop {
+//        final private Mutex lock = new Mutex();
+//        final int loop(int n) {
+//            final Mutex lock = this.lock;
+//            int sum = 0;
+//            int x = 0;
+//            while (n-- > 0) {
+//                lock.lock();
+//                try {
+//                    x = setValue(LoopHelpers.compute1(getValue()));
+//                }
+//                finally {
+//                    lock.unlock();
+//                }
+//                sum += LoopHelpers.compute2(x);
+//            }
+//            return sum;
+//        }
+//    }
+//
+//    private static class LongMutexLoop extends LockLoop {
+//        final private LongMutex lock = new LongMutex();
+//        final int loop(int n) {
+//            final LongMutex lock = this.lock;
+//            int sum = 0;
+//            int x = 0;
+//            while (n-- > 0) {
+//                lock.lock();
+//                try {
+//                    x = setValue(LoopHelpers.compute1(getValue()));
+//                }
+//                finally {
+//                    lock.unlock();
+//                }
+//                sum += LoopHelpers.compute2(x);
+//            }
+//            return sum;
+//        }
+//    }
+
+    private static class FairReentrantLockLoop extends LockLoop {
+        final private ReentrantLock lock = new ReentrantLock(true);
+        final int loop(int n) {
+            final ReentrantLock lock = this.lock;
+            int sum = 0;
+            int x = 0;
+            while (n-- > 0) {
+                lock.lock();
+                try {
+                    x = setValue(LoopHelpers.compute1(getValue()));
+                }
+                finally {
+                    lock.unlock();
+                }
+                sum += LoopHelpers.compute2(x);
+            }
+            return sum;
+        }
+    }
+
+    private static class ReentrantWriteLockLoop extends LockLoop {
+        final private Lock lock = new ReentrantReadWriteLock().writeLock();
+        final int loop(int n) {
+            final Lock lock = this.lock;
+            int sum = 0;
+            int x = 0;
+            while (n-- > 0) {
+                lock.lock();
+                try {
+                    x = setValue(LoopHelpers.compute1(getValue()));
+                }
+                finally {
+                    lock.unlock();
+                }
+                sum += LoopHelpers.compute2(x);
+            }
+            return sum;
+        }
+    }
+
+//    private static class FairReentrantWriteLockLoop extends LockLoop {
+//        final Lock lock = new ReentrantReadWriteLock(true).writeLock();
+//        final int loop(int n) {
+//            final Lock lock = this.lock;
+//            int sum = 0;
+//            int x = 0;
+//            while (n-- > 0) {
+//                lock.lock();
+//                try {
+//                    x = setValue(LoopHelpers.compute1(getValue()));
+//                }
+//                finally {
+//                    lock.unlock();
+//                }
+//                sum += LoopHelpers.compute2(x);
+//            }
+//            return sum;
+//        }
+//    }
+//
+    private static class SemaphoreLoop extends LockLoop {
+        final private Semaphore sem = new Semaphore(1, false);
+        final int loop(int n) {
+            final Semaphore sem = this.sem;
+            int sum = 0;
+            int x = 0;
+            while (n-- > 0) {
+                sem.acquireUninterruptibly();
+                try {
+                    x = setValue(LoopHelpers.compute1(getValue()));
+                }
+                finally {
+                    sem.release();
+                }
+                sum += LoopHelpers.compute2(x);
+            }
+            return sum;
+        }
+    }
+    private static class FairSemaphoreLoop extends LockLoop {
+        final private Semaphore sem = new Semaphore(1, true);
+        final int loop(int n) {
+            final Semaphore sem = this.sem;
+            int sum = 0;
+            int x = 0;
+            while (n-- > 0) {
+                sem.acquireUninterruptibly();
+                try {
+                    x = setValue(LoopHelpers.compute1(getValue()));
+                }
+                finally {
+                    sem.release();
+                }
+                sum += LoopHelpers.compute2(x);
+            }
+            return sum;
+        }
+    }
+
+    private static class ReentrantReadWriteLockLoop extends LockLoop {
+        final private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        final int loop(int n) {
+            final Lock rlock = lock.readLock();
+            final Lock wlock = lock.writeLock();
+            int sum = 0;
+            int x = 0;
+            while (n-- > 0) {
+                if ((n & 16) != 0) {
+                    rlock.lock();
+                    try {
+                        x = LoopHelpers.compute1(getValue());
+                        x = LoopHelpers.compute2(x);
+                    }
+                    finally {
+                        rlock.unlock();
+                    }
+                }
+                else {
+                    wlock.lock();
+                    try {
+                        setValue(x);
+                    }
+                    finally {
+                        wlock.unlock();
+                    }
+                    sum += LoopHelpers.compute2(x);
+                }
+            }
+            return sum;
+        }
+
+    }
+
+
+//    private static class FairReentrantReadWriteLockLoop extends LockLoop {
+//        final private ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);
+//        final int loop(int n) {
+//            final Lock rlock = lock.readLock();
+//            final Lock wlock = lock.writeLock();
+//            int sum = 0;
+//            int x = 0;
+//            while (n-- > 0) {
+//                if ((n & 16) != 0) {
+//                    rlock.lock();
+//                    try {
+//                        x = LoopHelpers.compute1(getValue());
+//                        x = LoopHelpers.compute2(x);
+//                    }
+//                    finally {
+//                        rlock.unlock();
+//                    }
+//                }
+//                else {
+//                    wlock.lock();
+//                    try {
+//                        setValue(x);
+//                    }
+//                    finally {
+//                        wlock.unlock();
+//                    }
+//                    sum += LoopHelpers.compute2(x);
+//                }
+//            }
+//            return sum;
+//        }
+//
+//    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/words/class.txt
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/words/class.txt	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/words/class.txt	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,1207 @@
+ASCII
+AWTError
+AWTEvent
+AWTEventListener
+AWTEventListenerProxy
+AWTEventMulticaster
+AWTException
+AWTKeyStroke
+AWTPermission
+AbstractChannel
+AbstractCollection
+AbstractList
+AbstractMap
+AbstractMethodError
+AbstractPreferences
+AbstractSelectableChannel
+AbstractSelectionKey
+AbstractSelector
+AbstractSequentialList
+AbstractSet
+AccessControlContext
+AccessControlException
+AccessController
+AccessException
+AccessibleObject
+Acl
+AclEntry
+AclNotFoundException
+ActionEvent
+ActionListener
+Activatable
+ActivateFailedException
+ActivationDesc
+ActivationException
+ActivationGroup
+ActivationGroupDesc
+ActivationGroupID
+ActivationID
+ActivationInstantiator
+ActivationMonitor
+ActivationSystem
+Activator
+ActiveEvent
+Adjustable
+AdjustmentEvent
+AdjustmentListener
+Adler32
+AffineTransform
+AffineTransformOp
+AlgorithmParameterGenerator
+AlgorithmParameterGeneratorSpi
+AlgorithmParameterSpec
+AlgorithmParameters
+AlgorithmParametersSpi
+AllPermission
+AlphaComposite
+AlreadyBoundException
+AlreadyConnectedException
+Annotation
+Applet
+AppletContext
+AppletInitializer
+AppletStub
+Arc2D
+ArcIterator
+Area
+AreaAveragingScaleFilter
+ArithmeticException
+Array
+ArrayIndexOutOfBoundsException
+ArrayList
+ArrayStoreException
+Arrays
+AssertionError
+AssertionStatusDirectives
+AsynchronousCloseException
+AttributeValue
+AttributedCharacterIterator
+AttributedString
+Attributes
+AudioClip
+Authenticator
+Autoscroll
+BackingStoreException
+BandCombineOp
+BandedSampleModel
+Base64
+BasicPermission
+BasicStroke
+BatchUpdateException
+BeanContext
+BeanContextChild
+BeanContextChildComponentProxy
+BeanContextChildSupport
+BeanContextContainerProxy
+BeanContextEvent
+BeanContextMembershipEvent
+BeanContextMembershipListener
+BeanContextProxy
+BeanContextServiceAvailableEvent
+BeanContextServiceProvider
+BeanContextServiceProviderBeanInfo
+BeanContextServiceRevokedEvent
+BeanContextServiceRevokedListener
+BeanContextServices
+BeanContextServicesListener
+BeanContextServicesSupport
+BeanContextSupport
+BeanDescriptor
+BeanInfo
+Beans
+Bidi
+BigDecimal
+BigInteger
+BindException
+BitSet
+BitSieve
+Bits
+Blob
+Book
+Boolean
+BorderLayout
+BreakDictionary
+BreakIterator
+Buffer
+BufferCapabilities
+BufferOverflowException
+BufferStrategy
+BufferUnderflowException
+BufferedImage
+BufferedImageFilter
+BufferedImageOp
+BufferedInputStream
+BufferedOutputStream
+BufferedReader
+BufferedWriter
+Button
+ButtonPeer
+Byte
+ByteArrayInputStream
+ByteArrayOutputStream
+ByteBuffer
+ByteBufferAs-X-Buffer
+ByteBufferAsCharBufferB
+ByteBufferAsCharBufferL
+ByteBufferAsCharBufferRB
+ByteBufferAsCharBufferRL
+ByteBufferAsDoubleBufferB
+ByteBufferAsDoubleBufferL
+ByteBufferAsDoubleBufferRB
+ByteBufferAsDoubleBufferRL
+ByteBufferAsFloatBufferB
+ByteBufferAsFloatBufferL
+ByteBufferAsFloatBufferRB
+ByteBufferAsFloatBufferRL
+ByteBufferAsIntBufferB
+ByteBufferAsIntBufferL
+ByteBufferAsIntBufferRB
+ByteBufferAsIntBufferRL
+ByteBufferAsLongBufferB
+ByteBufferAsLongBufferL
+ByteBufferAsLongBufferRB
+ByteBufferAsLongBufferRL
+ByteBufferAsShortBufferB
+ByteBufferAsShortBufferL
+ByteBufferAsShortBufferRB
+ByteBufferAsShortBufferRL
+ByteChannel
+ByteLookupTable
+ByteOrder
+CMMException
+CRC32
+CRL
+CRLException
+CRLSelector
+Calendar
+CallableStatement
+CancelledKeyException
+Canvas
+CanvasPeer
+CardLayout
+CertPath
+CertPathBuilder
+CertPathBuilderException
+CertPathBuilderResult
+CertPathBuilderSpi
+CertPathParameters
+CertPathValidator
+CertPathValidatorException
+CertPathValidatorResult
+CertPathValidatorSpi
+CertSelector
+CertStore
+CertStoreException
+CertStoreParameters
+CertStoreSpi
+Certificate
+CertificateEncodingException
+CertificateException
+CertificateExpiredException
+CertificateFactory
+CertificateFactorySpi
+CertificateNotYetValidException
+CertificateParsingException
+Channel
+Channels
+CharArrayIterator
+CharArrayReader
+CharArrayWriter
+CharBuffer
+CharConversionException
+CharSequence
+CharSet
+Character
+CharacterBreakData
+CharacterCodingException
+CharacterIterator
+CharacterIteratorFieldDelegate
+Charset
+Charset-X-Coder
+CharsetDecoder
+CharsetEncoder
+CharsetProvider
+Checkbox
+CheckboxGroup
+CheckboxMenuItem
+CheckboxMenuItemPeer
+CheckboxPeer
+CheckedInputStream
+CheckedOutputStream
+Checksum
+Choice
+ChoiceFormat
+ChoicePeer
+Class
+ClassCastException
+ClassCircularityError
+ClassFormatError
+ClassLoader
+ClassNotFoundException
+Clipboard
+ClipboardOwner
+Clob
+CloneNotSupportedException
+Cloneable
+ClosedByInterruptException
+ClosedChannelException
+ClosedSelectorException
+CodeSource
+CollationElementIterator
+CollationKey
+CollationRules
+Collator
+Collection
+CollectionCertStoreParameters
+Collections
+Color
+ColorConvertOp
+ColorModel
+ColorPaintContext
+ColorSpace
+Comparable
+Comparator
+Compiler
+Component
+ComponentAdapter
+ComponentColorModel
+ComponentEvent
+ComponentListener
+ComponentOrientation
+ComponentPeer
+ComponentSampleModel
+Composite
+CompositeContext
+ConcurrentModificationException
+Conditional
+ConnectException
+ConnectIOException
+Connection
+ConnectionPendingException
+ConsoleHandler
+Constructor
+Container
+ContainerAdapter
+ContainerEvent
+ContainerListener
+ContainerOrderFocusTraversalPolicy
+ContainerPeer
+ContentHandler
+ContentHandlerFactory
+ContextualRenderedImageFactory
+ConvolveOp
+CropImageFilter
+CubicCurve2D
+CubicIterator
+Currency
+CurrencyData
+Cursor
+Customizer
+DGC
+DSAKey
+DSAKeyPairGenerator
+DSAParameterSpec
+DSAParams
+DSAPrivateKey
+DSAPrivateKeySpec
+DSAPublicKey
+DSAPublicKeySpec
+DataBuffer
+DataBufferByte
+DataBufferDouble
+DataBufferFloat
+DataBufferInt
+DataBufferShort
+DataBufferUShort
+DataFlavor
+DataFormatException
+DataInput
+DataInputStream
+DataOutput
+DataOutputStream
+DataTruncation
+DatabaseMetaData
+DatagramChannel
+DatagramPacket
+DatagramSocket
+DatagramSocketImpl
+DatagramSocketImplFactory
+Date
+DateFormat
+DateFormatSymbols
+DecimalFormat
+DecimalFormatSymbols
+DefaultFocusTraversalPolicy
+DefaultKeyboardFocusManager
+DefaultPersistenceDelegate
+Deflater
+DeflaterOutputStream
+DesignMode
+Dialog
+DialogPeer
+Dictionary
+DictionaryBasedBreakIterator
+DigestException
+DigestInputStream
+DigestOutputStream
+DigitList
+Dimension
+Dimension2D
+Direct-X-Buffer
+Direct-X-Buffer-bin
+DirectByteBuffer
+DirectByteBufferR
+DirectCharBufferRS
+DirectCharBufferRU
+DirectCharBufferS
+DirectCharBufferU
+DirectColorModel
+DirectDoubleBufferRS
+DirectDoubleBufferRU
+DirectDoubleBufferS
+DirectDoubleBufferU
+DirectFloatBufferRS
+DirectFloatBufferRU
+DirectFloatBufferS
+DirectFloatBufferU
+DirectIntBufferRS
+DirectIntBufferRU
+DirectIntBufferS
+DirectIntBufferU
+DirectLongBufferRS
+DirectLongBufferRU
+DirectLongBufferS
+DirectLongBufferU
+DirectShortBufferRS
+DirectShortBufferRU
+DirectShortBufferS
+DirectShortBufferU
+DisplayMode
+DnDConstants
+DomainCombiner
+Double
+DoubleBuffer
+DragGestureEvent
+DragGestureListener
+DragGestureRecognizer
+DragSource
+DragSourceAdapter
+DragSourceContext
+DragSourceContextPeer
+DragSourceDragEvent
+DragSourceDropEvent
+DragSourceEvent
+DragSourceListener
+Driver
+DriverManager
+DriverPropertyInfo
+DropTarget
+DropTargetAdapter
+DropTargetContext
+DropTargetContextPeer
+DropTargetDragEvent
+DropTargetDropEvent
+DropTargetEvent
+DropTargetListener
+DropTargetPeer
+EOFException
+Ellipse2D
+EllipseIterator
+EmptyStackException
+EncodedKeySpec
+Encoder
+EntryPair
+Enumeration
+Error
+Event
+EventDispatchThread
+EventHandler
+EventListener
+EventListenerProxy
+EventObject
+EventQueue
+EventSetDescriptor
+Exception
+ExceptionInInitializerError
+ExceptionListener
+ExportException
+Expression
+Externalizable
+FeatureDescriptor
+Field
+FieldPosition
+File
+FileChannel
+FileDescriptor
+FileDialog
+FileDialogPeer
+FileFilter
+FileHandler
+FileInputStream
+FileLock
+FileLockInterruptionException
+FileNameMap
+FileNotFoundException
+FileOutputStream
+FilePermission
+FileReader
+FileSystem
+FileSystemPreferences
+FileSystemPreferencesFactory
+FileWriter
+FilenameFilter
+Filter
+FilterInputStream
+FilterOutputStream
+FilterReader
+FilterWriter
+FilteredImageSource
+FinalReference
+Finalizer
+FlatteningPathIterator
+FlavorMap
+FlavorTable
+Float
+FloatBuffer
+FloatingDecimal
+FlowLayout
+FocusAdapter
+FocusEvent
+FocusListener
+FocusTraversalPolicy
+Font
+FontFormatException
+FontMetrics
+FontPeer
+FontRenderContext
+Format
+Formatter
+Frame
+FramePeer
+GZIPInputStream
+GZIPOutputStream
+GatheringByteChannel
+GeneralPath
+GeneralPathIterator
+GeneralSecurityException
+GlyphJustificationInfo
+GlyphMetrics
+GlyphVector
+GradientPaint
+GradientPaintContext
+GraphicAttribute
+Graphics
+Graphics2D
+GraphicsCallback
+GraphicsConfigTemplate
+GraphicsConfiguration
+GraphicsDevice
+GraphicsEnvironment
+GregorianCalendar
+GridBagConstraints
+GridBagLayout
+GridLayout
+Group
+Guard
+GuardedObject
+Handler
+HashMap
+HashSet
+Hashtable
+HeadlessException
+Heap-X-Buffer
+HeapByteBuffer
+HeapByteBufferR
+HeapCharBuffer
+HeapCharBufferR
+HeapDoubleBuffer
+HeapDoubleBufferR
+HeapFloatBuffer
+HeapFloatBufferR
+HeapIntBuffer
+HeapIntBufferR
+HeapLongBuffer
+HeapLongBufferR
+HeapShortBuffer
+HeapShortBufferR
+HierarchyBoundsAdapter
+HierarchyBoundsListener
+HierarchyEvent
+HierarchyListener
+HttpURLConnection
+ICC_ColorSpace
+ICC_Profile
+ICC_ProfileGray
+ICC_ProfileRGB
+IOException
+Identity
+IdentityHashMap
+IdentityHashtable
+IdentityScope
+IllegalAccessError
+IllegalAccessException
+IllegalArgumentException
+IllegalBlockingModeException
+IllegalCharsetNameException
+IllegalComponentStateException
+IllegalMonitorStateException
+IllegalPathStateException
+IllegalSelectorException
+IllegalStateException
+IllegalThreadStateException
+Image
+ImageCapabilities
+ImageConsumer
+ImageFilter
+ImageGraphicAttribute
+ImageObserver
+ImageProducer
+ImagingOpException
+InaccessibleBufferIndexException
+IncompatibleClassChangeError
+IndexColorModel
+IndexOutOfBoundsException
+IndexedPropertyDescriptor
+Inet4Address
+Inet6Address
+InetAddress
+InetSocketAddress
+Inflater
+InflaterInputStream
+InheritableThreadLocal
+InputContext
+InputEvent
+InputMethod
+InputMethodContext
+InputMethodDescriptor
+InputMethodEvent
+InputMethodHighlight
+InputMethodListener
+InputMethodRequests
+InputStream
+InputStreamReader
+InputSubset
+Insets
+InstantiationError
+InstantiationException
+IntBuffer
+Integer
+InternalError
+InterruptedException
+InterruptedIOException
+IntrospectionException
+Introspector
+InvalidAlgorithmParameterException
+InvalidClassException
+InvalidDnDOperationException
+InvalidKeyException
+InvalidKeySpecException
+InvalidMarkException
+InvalidObjectException
+InvalidParameterException
+InvalidParameterSpecException
+InvalidPreferencesFormatException
+InvocationEvent
+InvocationHandler
+InvocationTargetException
+ItemEvent
+ItemListener
+ItemSelectable
+Iterator
+JarEntry
+JarException
+JarFile
+JarInputStream
+JarOutputStream
+JarURLConnection
+JarVerifier
+JobAttributes
+Kernel
+Key
+KeyAdapter
+KeyEvent
+KeyEventDispatcher
+KeyEventPostProcessor
+KeyException
+KeyFactory
+KeyFactorySpi
+KeyListener
+KeyManagementException
+KeyPair
+KeyPairGenerator
+KeyPairGeneratorSpi
+KeySpec
+KeyStore
+KeyStoreException
+KeyStoreSpi
+KeyboardFocusManager
+LDAPCertStoreParameters
+Label
+LabelPeer
+LastOwnerException
+LayoutManager
+LayoutManager2
+Lease
+Level
+LightweightPeer
+Line2D
+LineBreakData
+LineBreakMeasurer
+LineIterator
+LineMetrics
+LineNumberInputStream
+LineNumberReader
+LinkageError
+LinkedHashMap
+LinkedHashSet
+LinkedList
+List
+ListIterator
+ListPeer
+ListResourceBundle
+LoaderHandler
+Locale
+LocateRegistry
+LogManager
+LogRecord
+LogStream
+Logger
+LoggingPermission
+Long
+LongBuffer
+LookupOp
+LookupTable
+MalformedInputException
+MalformedURLException
+Manifest
+Map
+MappedByteBuffer
+MarshalException
+MarshalledObject
+Matcher
+Math
+MediaTracker
+Member
+MemoryHandler
+MemoryImageSource
+Menu
+MenuBar
+MenuBarPeer
+MenuComponent
+MenuComponentPeer
+MenuContainer
+MenuItem
+MenuItemPeer
+MenuPeer
+MenuShortcut
+MergeCollation
+MessageDigest
+MessageDigestSpi
+MessageFormat
+MetaData
+Method
+MethodDescriptor
+MimeType
+MimeTypeParameterList
+MimeTypeParseException
+MissingResourceException
+Modifier
+MouseAdapter
+MouseDragGestureRecognizer
+MouseEvent
+MouseListener
+MouseMotionAdapter
+MouseMotionListener
+MouseWheelEvent
+MouseWheelListener
+MultiPixelPackedSampleModel
+MulticastSocket
+MultipleMaster
+MutableBigInteger
+NameGenerator
+Naming
+NativeLibLoader
+NegativeArraySizeException
+NetPermission
+NetworkInterface
+NoClassDefFoundError
+NoConnectionPendingException
+NoRouteToHostException
+NoSuchAlgorithmException
+NoSuchElementException
+NoSuchFieldError
+NoSuchFieldException
+NoSuchMethodError
+NoSuchMethodException
+NoSuchObjectException
+NoSuchProviderException
+NodeChangeEvent
+NodeChangeListener
+NonReadableChannelException
+NonWritableChannelException
+NoninvertibleTransformException
+Normalizer
+NotActiveException
+NotBoundException
+NotOwnerException
+NotSerializableException
+NotYetConnectedException
+NullPointerException
+Number
+NumberFormat
+NumberFormatException
+NumericShaper
+ObjID
+Object
+ObjectInput
+ObjectInputStream
+ObjectInputValidation
+ObjectOutput
+ObjectOutputStream
+ObjectStreamClass
+ObjectStreamConstants
+ObjectStreamException
+ObjectStreamField
+Observable
+Observer
+OpenType
+Operation
+OptionalDataException
+OutOfMemoryError
+OutputStream
+OutputStreamWriter
+OverlappingFileLockException
+Owner
+PKCS8EncodedKeySpec
+PKIXBuilderParameters
+PKIXCertPathBuilderResult
+PKIXCertPathChecker
+PKIXCertPathValidatorResult
+PKIXParameters
+Package
+PackedColorModel
+PageAttributes
+PageFormat
+Pageable
+Paint
+PaintContext
+PaintEvent
+Panel
+PanelPeer
+Paper
+ParameterBlock
+ParameterDescriptor
+ParameterMetaData
+ParseException
+ParsePosition
+PasswordAuthentication
+PathIterator
+Pattern
+PatternEntry
+PatternSyntaxException
+Permission
+PermissionCollection
+Permissions
+PersistenceDelegate
+PhantomReference
+Pipe
+PipedInputStream
+PipedOutputStream
+PipedReader
+PipedWriter
+PixelGrabber
+PixelInterleavedSampleModel
+PlainDatagramSocketImpl
+PlainSocketImpl
+Point
+Point2D
+Policy
+PolicyNode
+PolicyQualifierInfo
+Polygon
+PopupMenu
+PopupMenuPeer
+PortUnreachableException
+PreferenceChangeEvent
+PreferenceChangeListener
+Preferences
+PreferencesFactory
+PreparedStatement
+Principal
+PrintGraphics
+PrintJob
+PrintStream
+PrintWriter
+Printable
+PrinterAbortException
+PrinterException
+PrinterGraphics
+PrinterIOException
+PrinterJob
+PrivateKey
+PrivilegedAction
+PrivilegedActionException
+PrivilegedExceptionAction
+Process
+ProfileDataException
+Properties
+PropertyChangeEvent
+PropertyChangeListener
+PropertyChangeListenerProxy
+PropertyChangeSupport
+PropertyDescriptor
+PropertyEditor
+PropertyEditorManager
+PropertyEditorSupport
+PropertyPermission
+PropertyResourceBundle
+PropertyVetoException
+ProtectionDomain
+ProtocolException
+Provider
+ProviderException
+Proxy
+PublicKey
+PushbackInputStream
+PushbackReader
+QuadCurve2D
+QuadIterator
+RBCollationTables
+RBTableBuilder
+RGBImageFilter
+RMIClassLoader
+RMIClassLoaderSpi
+RMIClientSocketFactory
+RMIFailureHandler
+RMISecurityException
+RMISecurityManager
+RMIServerSocketFactory
+RMISocketFactory
+RSAKey
+RSAKeyGenParameterSpec
+RSAPrivateCrtKey
+RSAPrivateCrtKeySpec
+RSAPrivateKey
+RSAPrivateKeySpec
+RSAPublicKey
+RSAPublicKeySpec
+Random
+RandomAccess
+RandomAccessFile
+Raster
+RasterFormatException
+RasterOp
+ReadOnlyBufferException
+ReadableByteChannel
+Reader
+RectIterator
+Rectangle
+Rectangle2D
+RectangularShape
+Ref
+Reference
+ReferenceQueue
+ReflectAccess
+ReflectPermission
+Registry
+RegistryHandler
+Remote
+RemoteCall
+RemoteException
+RemoteObject
+RemoteRef
+RemoteServer
+RemoteStub
+RenderContext
+RenderableImage
+RenderableImageOp
+RenderableImageProducer
+RenderedImage
+RenderedImageFactory
+RenderingHints
+ReplicateScaleFilter
+RescaleOp
+ResourceBundle
+ResultSet
+ResultSetMetaData
+Robot
+RobotPeer
+RoundRectIterator
+RoundRectangle2D
+RuleBasedBreakIterator
+RuleBasedCollator
+Runnable
+Runtime
+RuntimeException
+RuntimePermission
+SQLData
+SQLException
+SQLInput
+SQLOutput
+SQLPermission
+SQLWarning
+SampleModel
+Savepoint
+ScatteringByteChannel
+ScrollPane
+ScrollPaneAdjustable
+ScrollPanePeer
+Scrollbar
+ScrollbarPeer
+SecureClassLoader
+SecureRandom
+SecureRandomSpi
+Security
+SecurityException
+SecurityManager
+SecurityPermission
+SelectableChannel
+SelectionKey
+Selector
+SelectorProvider
+SentEvent
+SentenceBreakData
+SequenceInputStream
+SequencedEvent
+Serializable
+SerializablePermission
+SerializationTester
+ServerCloneException
+ServerError
+ServerException
+ServerNotActiveException
+ServerRef
+ServerRuntimeException
+ServerSocket
+ServerSocketChannel
+Set
+Shape
+ShapeGraphicAttribute
+Short
+ShortBuffer
+ShortLookupTable
+Shutdown
+Signature
+SignatureException
+SignatureSpi
+SignedMutableBigInteger
+SignedObject
+Signer
+SimpleBeanInfo
+SimpleDateFormat
+SimpleFormatter
+SimpleTextBoundary
+SimpleTimeZone
+SinglePixelPackedSampleModel
+Skeleton
+SkeletonMismatchException
+SkeletonNotFoundException
+Socket
+SocketAddress
+SocketChannel
+SocketException
+SocketHandler
+SocketImpl
+SocketImplFactory
+SocketInputStream
+SocketOptions
+SocketOutputStream
+SocketPermission
+SocketSecurityException
+SocketTimeoutException
+SocksConsts
+SocksSocketImpl
+SocksSocketImplFactory
+SoftReference
+SortedMap
+SortedSet
+SpecialMapping
+Stack
+StackOverflowError
+StackTraceElement
+Statement
+StreamCorruptedException
+StreamHandler
+StreamTokenizer
+StrictMath
+String
+StringBuffer
+StringBufferInputStream
+StringCharBuffer
+StringCharacterIterator
+StringCoding
+StringIndexOutOfBoundsException
+StringReader
+StringSelection
+StringTokenizer
+StringWriter
+Stroke
+Struct
+StubNotFoundException
+StyledParagraph
+SyncFailedException
+System
+SystemColor
+SystemFlavorMap
+Terminator
+TextArea
+TextAreaPeer
+TextAttribute
+TextBoundaryData
+TextComponent
+TextComponentPeer
+TextEvent
+TextField
+TextFieldPeer
+TextHitInfo
+TextJustifier
+TextLayout
+TextLine
+TextListener
+TextMeasurer
+TexturePaint
+TexturePaintContext
+Thread
+ThreadDeath
+ThreadGroup
+ThreadLocal
+Throwable
+TileObserver
+Time
+TimeZone
+TimeoutException
+Timer
+TimerTask
+Timestamp
+TooManyListenersException
+Toolkit
+Transferable
+TransformAttribute
+Transparency
+TreeMap
+TreeSet
+TrustAnchor
+Types
+UID
+UNIXProcess
+URI
+URISyntaxException
+URL
+URLClassLoader
+URLConnection
+URLDecoder
+URLEncoder
+URLStreamHandler
+URLStreamHandlerFactory
+UTFDataFormatException
+UnconnectedChannelException
+UndeclaredThrowableException
+UnexpectedException
+UnicastRemoteObject
+UnicodeClassMapping
+UnixFileSystem
+UnknownError
+UnknownGroupException
+UnknownHostException
+UnknownObjectException
+UnknownServiceException
+UnmappableCharacterException
+UnmarshalException
+UnrecoverableKeyException
+Unreferenced
+UnresolvedPermission
+UnresolvedPermissionCollection
+UnsatisfiedLinkError
+UnsupportedCharsetException
+UnsupportedClassVersionError
+UnsupportedEncodingException
+UnsupportedFlavorException
+UnsupportedOperationException
+VMID
+Vector
+VerifyError
+VetoableChangeListener
+VetoableChangeListenerProxy
+VetoableChangeSupport
+VirtualMachineError
+Visibility
+Void
+VolatileImage
+WeakHashMap
+WeakReference
+Window
+WindowAdapter
+WindowEvent
+WindowFocusListener
+WindowListener
+WindowPeer
+WindowStateListener
+WordBreakData
+WordBreakTable
+WritableByteChannel
+WritableRaster
+WritableRenderedImage
+WriteAbortedException
+Writer
+X-Buffer
+X-Buffer-bin
+X509CRL
+X509CRLEntry
+X509CRLSelector
+X509CertSelector
+X509Certificate
+X509EncodedKeySpec
+X509Extension
+XMLDecoder
+XMLEncoder
+XMLFormatter
+XmlSupport
+ZipConstants
+ZipEntry
+ZipException
+ZipFile
+ZipInputStream
+ZipOutputStream
+acl
+activation
+applet
+awt
+beancontext
+beans
+cert
+channels
+charset
+color
+datatransfer
+dgc
+dnd
+event
+font
+geom
+im
+image
+interfaces
+io
+jar
+lang
+logging
+math
+net
+nio
+peer
+prefs
+print
+ref
+reflect
+regex
+registry
+renderable
+rmi
+security
+server
+spec
+spi
+sql
+text
+util
+zip

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/words/dir.txt
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/words/dir.txt	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/words/dir.txt	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,22083 @@
+SCCS
+SCCS/s.overview-bundled.html
+SCCS/s.jdi-overview.html
+SCCS/s.overview-core.html
+com
+com/sun
+com/sun/accessibility
+com/sun/accessibility/internal
+com/sun/accessibility/internal/resources
+com/sun/accessibility/internal/resources/SCCS
+com/sun/accessibility/internal/resources/SCCS/s.accessibility_de.properties
+com/sun/accessibility/internal/resources/SCCS/s.accessibility.properties
+com/sun/accessibility/internal/resources/SCCS/s.accessibility_en.properties
+com/sun/accessibility/internal/resources/SCCS/s.accessibility_es.properties
+com/sun/accessibility/internal/resources/SCCS/s.accessibility_fr.properties
+com/sun/accessibility/internal/resources/SCCS/s.accessibility_it.properties
+com/sun/accessibility/internal/resources/SCCS/s.accessibility_ja.properties
+com/sun/accessibility/internal/resources/SCCS/s.accessibility_ko.properties
+com/sun/accessibility/internal/resources/SCCS/s.accessibility_sv.properties
+com/sun/accessibility/internal/resources/SCCS/s.accessibility_zh_CN.properties
+com/sun/accessibility/internal/resources/SCCS/s.accessibility_zh_TW.properties
+com/sun/accessibility/internal/resources/accessibility_zh_CN.properties
+com/sun/accessibility/internal/resources/accessibility.properties
+com/sun/accessibility/internal/resources/accessibility_de.properties
+com/sun/accessibility/internal/resources/accessibility_en.properties
+com/sun/accessibility/internal/resources/accessibility_es.properties
+com/sun/accessibility/internal/resources/accessibility_fr.properties
+com/sun/accessibility/internal/resources/accessibility_it.properties
+com/sun/accessibility/internal/resources/accessibility_ja.properties
+com/sun/accessibility/internal/resources/accessibility_ko.properties
+com/sun/accessibility/internal/resources/accessibility_sv.properties
+com/sun/accessibility/internal/resources/accessibility_zh_TW.properties
+com/sun/beans
+com/sun/beans/SCCS
+com/sun/beans/SCCS/s.ObjectHandler.java
+com/sun/beans/ObjectHandler.java
+com/sun/corba
+com/sun/corba/se
+com/sun/corba/se/ActivationIDL
+com/sun/corba/se/ActivationIDL/SCCS
+com/sun/corba/se/GiopIDL
+com/sun/corba/se/GiopIDL/SCCS
+com/sun/corba/se/GiopIDL/SCCS/s.messages.idl
+com/sun/corba/se/GiopIDL/SCCS/s.GIOP.idl
+com/sun/corba/se/GiopIDL/messages.idl
+com/sun/corba/se/GiopIDL/GIOP.idl
+com/sun/corba/se/PortableActivationIDL
+com/sun/corba/se/PortableActivationIDL/SCCS
+com/sun/corba/se/PortableActivationIDL/SCCS/s.activation.idl
+com/sun/corba/se/PortableActivationIDL/activation.idl
+com/sun/corba/se/connection
+com/sun/corba/se/connection/SCCS
+com/sun/corba/se/extension
+com/sun/corba/se/extension/SCCS
+com/sun/corba/se/impl
+com/sun/corba/se/impl/activation
+com/sun/corba/se/impl/activation/SCCS
+com/sun/corba/se/impl/activation/SCCS/s.NameServiceStartThread.java
+com/sun/corba/se/impl/activation/SCCS/s.CommandHandler.java
+com/sun/corba/se/impl/activation/SCCS/s.ServerMain.java
+com/sun/corba/se/impl/activation/SCCS/s.ORBD.java
+com/sun/corba/se/impl/activation/SCCS/s.ProcessMonitorThread.java
+com/sun/corba/se/impl/activation/SCCS/s.RepositoryImpl.java
+com/sun/corba/se/impl/activation/SCCS/s.ServerManagerImpl.java
+com/sun/corba/se/impl/activation/SCCS/s.ServerTableEntry.java
+com/sun/corba/se/impl/activation/SCCS/s.ServerTool.java
+com/sun/corba/se/impl/activation/NameServiceStartThread.java
+com/sun/corba/se/impl/activation/CommandHandler.java
+com/sun/corba/se/impl/activation/RepositoryImpl.java
+com/sun/corba/se/impl/activation/ORBD.java
+com/sun/corba/se/impl/activation/ProcessMonitorThread.java
+com/sun/corba/se/impl/activation/ServerMain.java
+com/sun/corba/se/impl/activation/ServerManagerImpl.java
+com/sun/corba/se/impl/activation/ServerTableEntry.java
+com/sun/corba/se/impl/activation/ServerTool.java
+com/sun/corba/se/impl/copyobject
+com/sun/corba/se/impl/copyobject/SCCS
+com/sun/corba/se/impl/copyobject/SCCS/s.FallbackObjectCopierImpl.java
+com/sun/corba/se/impl/copyobject/SCCS/s.CopierManagerImpl.java
+com/sun/corba/se/impl/copyobject/SCCS/s.JavaStreamObjectCopierImpl.java
+com/sun/corba/se/impl/copyobject/SCCS/s.JavaInputStream.sjava
+com/sun/corba/se/impl/copyobject/SCCS/s.JavaOutputStream.sjava
+com/sun/corba/se/impl/copyobject/SCCS/s.ORBStreamObjectCopierImpl.java
+com/sun/corba/se/impl/copyobject/SCCS/s.ReferenceObjectCopierImpl.java
+com/sun/corba/se/impl/copyobject/FallbackObjectCopierImpl.java
+com/sun/corba/se/impl/copyobject/CopierManagerImpl.java
+com/sun/corba/se/impl/copyobject/JavaStreamObjectCopierImpl.java
+com/sun/corba/se/impl/copyobject/JavaInputStream.sjava
+com/sun/corba/se/impl/copyobject/JavaOutputStream.sjava
+com/sun/corba/se/impl/copyobject/ORBStreamObjectCopierImpl.java
+com/sun/corba/se/impl/copyobject/ReferenceObjectCopierImpl.java
+com/sun/corba/se/impl/corba
+com/sun/corba/se/impl/corba/SCCS
+com/sun/corba/se/impl/corba/SCCS/s.AnyImplHelper.java
+com/sun/corba/se/impl/corba/SCCS/s.AnyImpl.java
+com/sun/corba/se/impl/corba/SCCS/s.CORBAObjectImpl.java
+com/sun/corba/se/impl/corba/SCCS/s.AsynchInvoke.java
+com/sun/corba/se/impl/corba/SCCS/s.ExceptionListImpl.java
+com/sun/corba/se/impl/corba/SCCS/s.ContextImpl.java
+com/sun/corba/se/impl/corba/SCCS/s.ContextListImpl.java
+com/sun/corba/se/impl/corba/SCCS/s.EnvironmentImpl.java
+com/sun/corba/se/impl/corba/SCCS/s.ServerRequestImpl.java
+com/sun/corba/se/impl/corba/SCCS/s.NVListImpl.java
+com/sun/corba/se/impl/corba/SCCS/s.NamedValueImpl.java
+com/sun/corba/se/impl/corba/SCCS/s.PrincipalImpl.java
+com/sun/corba/se/impl/corba/SCCS/s.RequestImpl.java
+com/sun/corba/se/impl/corba/SCCS/s.TCUtility.java
+com/sun/corba/se/impl/corba/SCCS/s.TypeCodeFactory.java
+com/sun/corba/se/impl/corba/SCCS/s.TypeCodeImpl.java
+com/sun/corba/se/impl/corba/SCCS/s.TypeCodeImplHelper.java
+com/sun/corba/se/impl/corba/SCCS/s.orb_config_design.txt
+com/sun/corba/se/impl/corba/AnyImplHelper.java
+com/sun/corba/se/impl/corba/AnyImpl.java
+com/sun/corba/se/impl/corba/AsynchInvoke.java
+com/sun/corba/se/impl/corba/CORBAObjectImpl.java
+com/sun/corba/se/impl/corba/ContextImpl.java
+com/sun/corba/se/impl/corba/ContextListImpl.java
+com/sun/corba/se/impl/corba/EnvironmentImpl.java
+com/sun/corba/se/impl/corba/ExceptionListImpl.java
+com/sun/corba/se/impl/corba/NVListImpl.java
+com/sun/corba/se/impl/corba/NamedValueImpl.java
+com/sun/corba/se/impl/corba/PrincipalImpl.java
+com/sun/corba/se/impl/corba/RequestImpl.java
+com/sun/corba/se/impl/corba/ServerRequestImpl.java
+com/sun/corba/se/impl/corba/TCUtility.java
+com/sun/corba/se/impl/corba/TypeCodeFactory.java
+com/sun/corba/se/impl/corba/TypeCodeImpl.java
+com/sun/corba/se/impl/corba/TypeCodeImplHelper.java
+com/sun/corba/se/impl/corba/orb_config_design.txt
+com/sun/corba/se/impl/core
+com/sun/corba/se/impl/core/SCCS
+com/sun/corba/se/impl/dynamicany
+com/sun/corba/se/impl/dynamicany/SCCS
+com/sun/corba/se/impl/dynamicany/SCCS/s.DynAnyCollectionImpl.java
+com/sun/corba/se/impl/dynamicany/SCCS/s.DynAnyBasicImpl.java
+com/sun/corba/se/impl/dynamicany/SCCS/s.DynAnyComplexImpl.java
+com/sun/corba/se/impl/dynamicany/SCCS/s.DynAnyConstructedImpl.java
+com/sun/corba/se/impl/dynamicany/SCCS/s.DynAnyFactoryImpl.java
+com/sun/corba/se/impl/dynamicany/SCCS/s.DynAnyImpl.java
+com/sun/corba/se/impl/dynamicany/SCCS/s.DynAnyUtil.java
+com/sun/corba/se/impl/dynamicany/SCCS/s.DynArrayImpl.java
+com/sun/corba/se/impl/dynamicany/SCCS/s.DynEnumImpl.java
+com/sun/corba/se/impl/dynamicany/SCCS/s.DynFixedImpl.java
+com/sun/corba/se/impl/dynamicany/SCCS/s.DynSequenceImpl.java
+com/sun/corba/se/impl/dynamicany/SCCS/s.DynStructImpl.java
+com/sun/corba/se/impl/dynamicany/SCCS/s.DynUnionImpl.java
+com/sun/corba/se/impl/dynamicany/SCCS/s.DynValueBoxImpl.java
+com/sun/corba/se/impl/dynamicany/SCCS/s.DynValueCommonImpl.java
+com/sun/corba/se/impl/dynamicany/SCCS/s.DynValueImpl.java
+com/sun/corba/se/impl/dynamicany/DynAnyCollectionImpl.java
+com/sun/corba/se/impl/dynamicany/DynAnyBasicImpl.java
+com/sun/corba/se/impl/dynamicany/DynAnyComplexImpl.java
+com/sun/corba/se/impl/dynamicany/DynAnyConstructedImpl.java
+com/sun/corba/se/impl/dynamicany/DynAnyFactoryImpl.java
+com/sun/corba/se/impl/dynamicany/DynAnyImpl.java
+com/sun/corba/se/impl/dynamicany/DynAnyUtil.java
+com/sun/corba/se/impl/dynamicany/DynArrayImpl.java
+com/sun/corba/se/impl/dynamicany/DynEnumImpl.java
+com/sun/corba/se/impl/dynamicany/DynFixedImpl.java
+com/sun/corba/se/impl/dynamicany/DynSequenceImpl.java
+com/sun/corba/se/impl/dynamicany/DynStructImpl.java
+com/sun/corba/se/impl/dynamicany/DynUnionImpl.java
+com/sun/corba/se/impl/dynamicany/DynValueBoxImpl.java
+com/sun/corba/se/impl/dynamicany/DynValueCommonImpl.java
+com/sun/corba/se/impl/dynamicany/DynValueImpl.java
+com/sun/corba/se/impl/encoding
+com/sun/corba/se/impl/encoding/SCCS
+com/sun/corba/se/impl/encoding/SCCS/s.BufferManagerReadGrow.java
+com/sun/corba/se/impl/encoding/SCCS/s.BufferManagerFactory.java
+com/sun/corba/se/impl/encoding/SCCS/s.BufferManagerRead.java
+com/sun/corba/se/impl/encoding/SCCS/s.BufferManagerReadStream.java
+com/sun/corba/se/impl/encoding/SCCS/s.BufferManagerWrite.java
+com/sun/corba/se/impl/encoding/SCCS/s.BufferManagerWriteCollect.java
+com/sun/corba/se/impl/encoding/SCCS/s.BufferManagerWriteGrow.java
+com/sun/corba/se/impl/encoding/SCCS/s.BufferManagerWriteStream.java
+com/sun/corba/se/impl/encoding/SCCS/s.BufferQueue.java
+com/sun/corba/se/impl/encoding/SCCS/s.ByteBufferWithInfo.java
+com/sun/corba/se/impl/encoding/SCCS/s.CDRInputObject.java
+com/sun/corba/se/impl/encoding/SCCS/s.CDRInputStream.java
+com/sun/corba/se/impl/encoding/SCCS/s.IDLJavaSerializationInputStream.java
+com/sun/corba/se/impl/encoding/SCCS/s.CDRInputStreamBase.java
+com/sun/corba/se/impl/encoding/SCCS/s.CDRInputStream_1_0.java
+com/sun/corba/se/impl/encoding/SCCS/s.CDRInputStream_1_1.java
+com/sun/corba/se/impl/encoding/SCCS/s.CDRInputStream_1_2.java
+com/sun/corba/se/impl/encoding/SCCS/s.CDROutputObject.java
+com/sun/corba/se/impl/encoding/SCCS/s.CDROutputStream.java
+com/sun/corba/se/impl/encoding/SCCS/s.CDROutputStreamBase.java
+com/sun/corba/se/impl/encoding/SCCS/s.CDROutputStream_1_0.java
+com/sun/corba/se/impl/encoding/SCCS/s.CDROutputStream_1_1.java
+com/sun/corba/se/impl/encoding/SCCS/s.CDROutputStream_1_2.java
+com/sun/corba/se/impl/encoding/SCCS/s.CachedCodeBase.java
+com/sun/corba/se/impl/encoding/SCCS/s.CodeSetCache.java
+com/sun/corba/se/impl/encoding/SCCS/s.CodeSetComponentInfo.java
+com/sun/corba/se/impl/encoding/SCCS/s.CodeSetConversion.java
+com/sun/corba/se/impl/encoding/SCCS/s.EncapsInputStream.java
+com/sun/corba/se/impl/encoding/SCCS/s.EncapsOutputStream.java
+com/sun/corba/se/impl/encoding/SCCS/s.IDLJavaSerializationOutputStream.java
+com/sun/corba/se/impl/encoding/SCCS/s.MarkAndResetHandler.java
+com/sun/corba/se/impl/encoding/SCCS/s.MarshalInputStream.java
+com/sun/corba/se/impl/encoding/SCCS/s.MarshalOutputStream.java
+com/sun/corba/se/impl/encoding/SCCS/s.OSFCodeSetRegistry.java
+com/sun/corba/se/impl/encoding/SCCS/s.RestorableInputStream.java
+com/sun/corba/se/impl/encoding/SCCS/s.TypeCodeInputStream.java
+com/sun/corba/se/impl/encoding/SCCS/s.TypeCodeOutputStream.java
+com/sun/corba/se/impl/encoding/SCCS/s.TypeCodeReader.java
+com/sun/corba/se/impl/encoding/SCCS/s.WrapperInputStream.java
+com/sun/corba/se/impl/encoding/BufferManagerReadStream.java
+com/sun/corba/se/impl/encoding/BufferManagerFactory.java
+com/sun/corba/se/impl/encoding/BufferManagerRead.java
+com/sun/corba/se/impl/encoding/BufferManagerReadGrow.java
+com/sun/corba/se/impl/encoding/BufferManagerWriteCollect.java
+com/sun/corba/se/impl/encoding/BufferManagerWrite.java
+com/sun/corba/se/impl/encoding/BufferManagerWriteGrow.java
+com/sun/corba/se/impl/encoding/BufferManagerWriteStream.java
+com/sun/corba/se/impl/encoding/BufferQueue.java
+com/sun/corba/se/impl/encoding/ByteBufferWithInfo.java
+com/sun/corba/se/impl/encoding/CDRInputObject.java
+com/sun/corba/se/impl/encoding/CDRInputStream.java
+com/sun/corba/se/impl/encoding/WrapperInputStream.java
+com/sun/corba/se/impl/encoding/TypeCodeReader.java
+com/sun/corba/se/impl/encoding/CDRInputStreamBase.java
+com/sun/corba/se/impl/encoding/CDRInputStream_1_0.java
+com/sun/corba/se/impl/encoding/CDRInputStream_1_1.java
+com/sun/corba/se/impl/encoding/CDRInputStream_1_2.java
+com/sun/corba/se/impl/encoding/CDROutputObject.java
+com/sun/corba/se/impl/encoding/CDROutputStream.java
+com/sun/corba/se/impl/encoding/CDROutputStreamBase.java
+com/sun/corba/se/impl/encoding/CDROutputStream_1_0.java
+com/sun/corba/se/impl/encoding/CDROutputStream_1_1.java
+com/sun/corba/se/impl/encoding/CDROutputStream_1_2.java
+com/sun/corba/se/impl/encoding/CachedCodeBase.java
+com/sun/corba/se/impl/encoding/CodeSetCache.java
+com/sun/corba/se/impl/encoding/CodeSetComponentInfo.java
+com/sun/corba/se/impl/encoding/CodeSetConversion.java
+com/sun/corba/se/impl/encoding/EncapsInputStream.java
+com/sun/corba/se/impl/encoding/EncapsOutputStream.java
+com/sun/corba/se/impl/encoding/IDLJavaSerializationInputStream.java
+com/sun/corba/se/impl/encoding/IDLJavaSerializationOutputStream.java
+com/sun/corba/se/impl/encoding/MarkAndResetHandler.java
+com/sun/corba/se/impl/encoding/MarshalInputStream.java
+com/sun/corba/se/impl/encoding/MarshalOutputStream.java
+com/sun/corba/se/impl/encoding/OSFCodeSetRegistry.java
+com/sun/corba/se/impl/encoding/RestorableInputStream.java
+com/sun/corba/se/impl/encoding/TypeCodeInputStream.java
+com/sun/corba/se/impl/encoding/TypeCodeOutputStream.java
+com/sun/corba/se/impl/interceptors
+com/sun/corba/se/impl/interceptors/SCCS
+com/sun/corba/se/impl/interceptors/SCCS/s.ClientRequestInfoImpl.java
+com/sun/corba/se/impl/interceptors/SCCS/s.CDREncapsCodec.java
+com/sun/corba/se/impl/interceptors/SCCS/s.InterceptorInvoker.java
+com/sun/corba/se/impl/interceptors/SCCS/s.CodecFactoryImpl.java
+com/sun/corba/se/impl/interceptors/SCCS/s.IORInfoImpl.java
+com/sun/corba/se/impl/interceptors/SCCS/s.ServerRequestInfoImpl.java
+com/sun/corba/se/impl/interceptors/SCCS/s.InterceptorList.java
+com/sun/corba/se/impl/interceptors/SCCS/s.ORBInitInfoImpl.java
+com/sun/corba/se/impl/interceptors/SCCS/s.PICurrent.java
+com/sun/corba/se/impl/interceptors/SCCS/s.PIHandlerImpl.java
+com/sun/corba/se/impl/interceptors/SCCS/s.PINoOpHandlerImpl.java
+com/sun/corba/se/impl/interceptors/SCCS/s.RequestInfoImpl.java
+com/sun/corba/se/impl/interceptors/SCCS/s.SlotTable.java
+com/sun/corba/se/impl/interceptors/SCCS/s.SlotTableStack.java
+com/sun/corba/se/impl/interceptors/SCCS/s.ThreadCurrentStack.sjava
+com/sun/corba/se/impl/interceptors/ClientRequestInfoImpl.java
+com/sun/corba/se/impl/interceptors/CDREncapsCodec.java
+com/sun/corba/se/impl/interceptors/ServerRequestInfoImpl.java
+com/sun/corba/se/impl/interceptors/CodecFactoryImpl.java
+com/sun/corba/se/impl/interceptors/IORInfoImpl.java
+com/sun/corba/se/impl/interceptors/InterceptorInvoker.java
+com/sun/corba/se/impl/interceptors/InterceptorList.java
+com/sun/corba/se/impl/interceptors/ORBInitInfoImpl.java
+com/sun/corba/se/impl/interceptors/PICurrent.java
+com/sun/corba/se/impl/interceptors/PIHandlerImpl.java
+com/sun/corba/se/impl/interceptors/PINoOpHandlerImpl.java
+com/sun/corba/se/impl/interceptors/RequestInfoImpl.java
+com/sun/corba/se/impl/interceptors/SlotTable.java
+com/sun/corba/se/impl/interceptors/SlotTableStack.java
+com/sun/corba/se/impl/interceptors/ThreadCurrentStack.sjava
+com/sun/corba/se/impl/io
+com/sun/corba/se/impl/io/SCCS
+com/sun/corba/se/impl/io/SCCS/s.ObjectStreamClass.java
+com/sun/corba/se/impl/io/SCCS/s.FVDCodeBaseImpl.java
+com/sun/corba/se/impl/io/SCCS/s.IIOPInputStream.java
+com/sun/corba/se/impl/io/SCCS/s.IIOPOutputStream.java
+com/sun/corba/se/impl/io/SCCS/s.InputStreamHook.java
+com/sun/corba/se/impl/io/SCCS/s.ObjectStreamClassCorbaExt.java
+com/sun/corba/se/impl/io/SCCS/s.ObjectStreamField.java
+com/sun/corba/se/impl/io/SCCS/s.OptionalDataException.java
+com/sun/corba/se/impl/io/SCCS/s.OutputStreamHook.java
+com/sun/corba/se/impl/io/SCCS/s.TypeMismatchException.java
+com/sun/corba/se/impl/io/SCCS/s.ValueHandlerImpl.java
+com/sun/corba/se/impl/io/SCCS/s.ValueUtility.java
+com/sun/corba/se/impl/io/ObjectStreamClassCorbaExt.java
+com/sun/corba/se/impl/io/FVDCodeBaseImpl.java
+com/sun/corba/se/impl/io/IIOPInputStream.java
+com/sun/corba/se/impl/io/IIOPOutputStream.java
+com/sun/corba/se/impl/io/InputStreamHook.java
+com/sun/corba/se/impl/io/ObjectStreamClass.java
+com/sun/corba/se/impl/io/OptionalDataException.java
+com/sun/corba/se/impl/io/ObjectStreamField.java
+com/sun/corba/se/impl/io/OutputStreamHook.java
+com/sun/corba/se/impl/io/TypeMismatchException.java
+com/sun/corba/se/impl/io/ValueHandlerImpl.java
+com/sun/corba/se/impl/io/ValueUtility.java
+com/sun/corba/se/impl/ior
+com/sun/corba/se/impl/ior/SCCS
+com/sun/corba/se/impl/ior/SCCS/s.EncapsulationUtility.java
+com/sun/corba/se/impl/ior/SCCS/s.ByteBuffer.java
+com/sun/corba/se/impl/ior/SCCS/s.GenericIdentifiable.java
+com/sun/corba/se/impl/ior/SCCS/s.FreezableList.java
+com/sun/corba/se/impl/ior/SCCS/s.IdentifiableFactoryFinderBase.java
+com/sun/corba/se/impl/ior/SCCS/s.GenericTaggedComponent.java
+com/sun/corba/se/impl/ior/SCCS/s.GenericTaggedProfile.java
+com/sun/corba/se/impl/ior/SCCS/s.IORImpl.java
+com/sun/corba/se/impl/ior/SCCS/s.IORTemplateImpl.java
+com/sun/corba/se/impl/ior/SCCS/s.IORTemplateListImpl.java
+com/sun/corba/se/impl/ior/SCCS/s.JIDLObjectKeyTemplate.java
+com/sun/corba/se/impl/ior/SCCS/s.NewObjectKeyTemplateBase.java
+com/sun/corba/se/impl/ior/SCCS/s.TaggedProfileTemplateFactoryFinderImpl.java
+com/sun/corba/se/impl/ior/SCCS/s.ObjectAdapterIdArray.java
+com/sun/corba/se/impl/ior/SCCS/s.ObjectAdapterIdBase.java
+com/sun/corba/se/impl/ior/SCCS/s.ObjectAdapterIdNumber.java
+com/sun/corba/se/impl/ior/SCCS/s.ObjectIdImpl.java
+com/sun/corba/se/impl/ior/SCCS/s.ObjectKeyFactoryImpl.java
+com/sun/corba/se/impl/ior/SCCS/s.ObjectKeyImpl.java
+com/sun/corba/se/impl/ior/SCCS/s.ObjectKeyTemplateBase.java
+com/sun/corba/se/impl/ior/SCCS/s.ObjectReferenceFactoryImpl.java
+com/sun/corba/se/impl/ior/SCCS/s.ObjectReferenceProducerBase.java
+com/sun/corba/se/impl/ior/SCCS/s.ObjectReferenceTemplateImpl.java
+com/sun/corba/se/impl/ior/SCCS/s.OldJIDLObjectKeyTemplate.java
+com/sun/corba/se/impl/ior/SCCS/s.OldObjectKeyTemplateBase.java
+com/sun/corba/se/impl/ior/SCCS/s.OldPOAObjectKeyTemplate.java
+com/sun/corba/se/impl/ior/SCCS/s.POAObjectKeyTemplate.java
+com/sun/corba/se/impl/ior/SCCS/s.StubIORImpl.java
+com/sun/corba/se/impl/ior/SCCS/s.TaggedComponentFactoryFinderImpl.java
+com/sun/corba/se/impl/ior/SCCS/s.TaggedProfileFactoryFinderImpl.java
+com/sun/corba/se/impl/ior/SCCS/s.TestAssertions
+com/sun/corba/se/impl/ior/SCCS/s.ior.mdl
+com/sun/corba/se/impl/ior/SCCS/s.notes
+com/sun/corba/se/impl/ior/SCCS/s.WireObjectKeyTemplate.java
+com/sun/corba/se/impl/ior/iiop
+com/sun/corba/se/impl/ior/iiop/SCCS
+com/sun/corba/se/impl/ior/iiop/SCCS/s.AlternateIIOPAddressComponentImpl.java
+com/sun/corba/se/impl/ior/iiop/SCCS/s.CodeSetsComponentImpl.java
+com/sun/corba/se/impl/ior/iiop/SCCS/s.IIOPAddressBase.java
+com/sun/corba/se/impl/ior/iiop/SCCS/s.IIOPAddressClosureImpl.java
+com/sun/corba/se/impl/ior/iiop/SCCS/s.IIOPAddressImpl.java
+com/sun/corba/se/impl/ior/iiop/SCCS/s.IIOPProfileImpl.java
+com/sun/corba/se/impl/ior/iiop/SCCS/s.IIOPProfileTemplateImpl.java
+com/sun/corba/se/impl/ior/iiop/SCCS/s.JavaCodebaseComponentImpl.java
+com/sun/corba/se/impl/ior/iiop/SCCS/s.JavaSerializationComponent.java
+com/sun/corba/se/impl/ior/iiop/SCCS/s.MaxStreamFormatVersionComponentImpl.java
+com/sun/corba/se/impl/ior/iiop/SCCS/s.ORBTypeComponentImpl.java
+com/sun/corba/se/impl/ior/iiop/SCCS/s.RequestPartitioningComponentImpl.java
+com/sun/corba/se/impl/ior/iiop/MaxStreamFormatVersionComponentImpl.java
+com/sun/corba/se/impl/ior/iiop/AlternateIIOPAddressComponentImpl.java
+com/sun/corba/se/impl/ior/iiop/CodeSetsComponentImpl.java
+com/sun/corba/se/impl/ior/iiop/IIOPAddressBase.java
+com/sun/corba/se/impl/ior/iiop/IIOPAddressClosureImpl.java
+com/sun/corba/se/impl/ior/iiop/IIOPAddressImpl.java
+com/sun/corba/se/impl/ior/iiop/IIOPProfileImpl.java
+com/sun/corba/se/impl/ior/iiop/IIOPProfileTemplateImpl.java
+com/sun/corba/se/impl/ior/iiop/JavaCodebaseComponentImpl.java
+com/sun/corba/se/impl/ior/iiop/JavaSerializationComponent.java
+com/sun/corba/se/impl/ior/iiop/ORBTypeComponentImpl.java
+com/sun/corba/se/impl/ior/iiop/RequestPartitioningComponentImpl.java
+com/sun/corba/se/impl/ior/FreezableList.java
+com/sun/corba/se/impl/ior/ByteBuffer.java
+com/sun/corba/se/impl/ior/IdentifiableFactoryFinderBase.java
+com/sun/corba/se/impl/ior/EncapsulationUtility.java
+com/sun/corba/se/impl/ior/GenericIdentifiable.java
+com/sun/corba/se/impl/ior/GenericTaggedComponent.java
+com/sun/corba/se/impl/ior/GenericTaggedProfile.java
+com/sun/corba/se/impl/ior/IORImpl.java
+com/sun/corba/se/impl/ior/IORTemplateImpl.java
+com/sun/corba/se/impl/ior/IORTemplateListImpl.java
+com/sun/corba/se/impl/ior/ObjectReferenceProducerBase.java
+com/sun/corba/se/impl/ior/JIDLObjectKeyTemplate.java
+com/sun/corba/se/impl/ior/NewObjectKeyTemplateBase.java
+com/sun/corba/se/impl/ior/ObjectAdapterIdArray.java
+com/sun/corba/se/impl/ior/ObjectAdapterIdBase.java
+com/sun/corba/se/impl/ior/ObjectAdapterIdNumber.java
+com/sun/corba/se/impl/ior/ObjectIdImpl.java
+com/sun/corba/se/impl/ior/ObjectKeyFactoryImpl.java
+com/sun/corba/se/impl/ior/ObjectKeyImpl.java
+com/sun/corba/se/impl/ior/ObjectKeyTemplateBase.java
+com/sun/corba/se/impl/ior/ObjectReferenceFactoryImpl.java
+com/sun/corba/se/impl/ior/ObjectReferenceTemplateImpl.java
+com/sun/corba/se/impl/ior/OldJIDLObjectKeyTemplate.java
+com/sun/corba/se/impl/ior/OldObjectKeyTemplateBase.java
+com/sun/corba/se/impl/ior/OldPOAObjectKeyTemplate.java
+com/sun/corba/se/impl/ior/TestAssertions
+com/sun/corba/se/impl/ior/ior.mdl
+com/sun/corba/se/impl/ior/StubIORImpl.java
+com/sun/corba/se/impl/ior/POAObjectKeyTemplate.java
+com/sun/corba/se/impl/ior/TaggedComponentFactoryFinderImpl.java
+com/sun/corba/se/impl/ior/TaggedProfileFactoryFinderImpl.java
+com/sun/corba/se/impl/ior/TaggedProfileTemplateFactoryFinderImpl.java
+com/sun/corba/se/impl/ior/WireObjectKeyTemplate.java
+com/sun/corba/se/impl/ior/notes
+com/sun/corba/se/impl/javax
+com/sun/corba/se/impl/javax/rmi
+com/sun/corba/se/impl/javax/rmi/CORBA
+com/sun/corba/se/impl/javax/rmi/CORBA/SCCS
+com/sun/corba/se/impl/javax/rmi/CORBA/SCCS/s.StubDelegateImpl.java
+com/sun/corba/se/impl/javax/rmi/CORBA/SCCS/s.Util.java
+com/sun/corba/se/impl/javax/rmi/CORBA/StubDelegateImpl.java
+com/sun/corba/se/impl/javax/rmi/CORBA/Util.java
+com/sun/corba/se/impl/javax/rmi/SCCS
+com/sun/corba/se/impl/javax/rmi/SCCS/s.PortableRemoteObject.java
+com/sun/corba/se/impl/javax/rmi/PortableRemoteObject.java
+com/sun/corba/se/impl/legacy
+com/sun/corba/se/impl/legacy/connection
+com/sun/corba/se/impl/legacy/connection/SCCS
+com/sun/corba/se/impl/legacy/connection/SCCS/s.SocketFactoryAcceptorImpl.java
+com/sun/corba/se/impl/legacy/connection/SCCS/s.DefaultSocketFactory.java
+com/sun/corba/se/impl/legacy/connection/SCCS/s.EndPointInfoImpl.java
+com/sun/corba/se/impl/legacy/connection/SCCS/s.SocketFactoryContactInfoListIteratorImpl.java
+com/sun/corba/se/impl/legacy/connection/SCCS/s.LegacyServerSocketManagerImpl.java
+com/sun/corba/se/impl/legacy/connection/SCCS/s.SocketFactoryConnectionImpl.java
+com/sun/corba/se/impl/legacy/connection/SCCS/s.SocketFactoryContactInfoImpl.java
+com/sun/corba/se/impl/legacy/connection/SCCS/s.SocketFactoryContactInfoListImpl.java
+com/sun/corba/se/impl/legacy/connection/SCCS/s.USLPort.java
+com/sun/corba/se/impl/legacy/connection/LegacyServerSocketManagerImpl.java
+com/sun/corba/se/impl/legacy/connection/DefaultSocketFactory.java
+com/sun/corba/se/impl/legacy/connection/EndPointInfoImpl.java
+com/sun/corba/se/impl/legacy/connection/SocketFactoryConnectionImpl.java
+com/sun/corba/se/impl/legacy/connection/SocketFactoryAcceptorImpl.java
+com/sun/corba/se/impl/legacy/connection/SocketFactoryContactInfoListIteratorImpl.java
+com/sun/corba/se/impl/legacy/connection/SocketFactoryContactInfoImpl.java
+com/sun/corba/se/impl/legacy/connection/SocketFactoryContactInfoListImpl.java
+com/sun/corba/se/impl/legacy/connection/USLPort.java
+com/sun/corba/se/impl/monitoring
+com/sun/corba/se/impl/monitoring/SCCS
+com/sun/corba/se/impl/monitoring/SCCS/s.MonitoredAttributeInfoFactoryImpl.java
+com/sun/corba/se/impl/monitoring/SCCS/s.MonitoredAttributeInfoImpl.java
+com/sun/corba/se/impl/monitoring/SCCS/s.MonitoredObjectFactoryImpl.java
+com/sun/corba/se/impl/monitoring/SCCS/s.MonitoredObjectImpl.java
+com/sun/corba/se/impl/monitoring/SCCS/s.MonitoringManagerFactoryImpl.java
+com/sun/corba/se/impl/monitoring/SCCS/s.MonitoringManagerImpl.java
+com/sun/corba/se/impl/monitoring/MonitoredAttributeInfoFactoryImpl.java
+com/sun/corba/se/impl/monitoring/MonitoredAttributeInfoImpl.java
+com/sun/corba/se/impl/monitoring/MonitoredObjectFactoryImpl.java
+com/sun/corba/se/impl/monitoring/MonitoredObjectImpl.java
+com/sun/corba/se/impl/monitoring/MonitoringManagerFactoryImpl.java
+com/sun/corba/se/impl/monitoring/MonitoringManagerImpl.java
+com/sun/corba/se/impl/naming
+com/sun/corba/se/impl/naming/cosnaming
+com/sun/corba/se/impl/naming/cosnaming/SCCS
+com/sun/corba/se/impl/naming/cosnaming/SCCS/s.InterOperableNamingImpl.java
+com/sun/corba/se/impl/naming/cosnaming/SCCS/s.BindingIteratorImpl.java
+com/sun/corba/se/impl/naming/cosnaming/SCCS/s.InternalBindingKey.java
+com/sun/corba/se/impl/naming/cosnaming/SCCS/s.InternalBindingValue.java
+com/sun/corba/se/impl/naming/cosnaming/SCCS/s.NamingContextDataStore.java
+com/sun/corba/se/impl/naming/cosnaming/SCCS/s.NamingContextImpl.java
+com/sun/corba/se/impl/naming/cosnaming/SCCS/s.NamingUtils.java
+com/sun/corba/se/impl/naming/cosnaming/SCCS/s.TransientBindingIterator.java
+com/sun/corba/se/impl/naming/cosnaming/SCCS/s.TransientNameServer.java
+com/sun/corba/se/impl/naming/cosnaming/SCCS/s.TransientNameService.java
+com/sun/corba/se/impl/naming/cosnaming/SCCS/s.TransientNamingContext.java
+com/sun/corba/se/impl/naming/cosnaming/InterOperableNamingImpl.java
+com/sun/corba/se/impl/naming/cosnaming/BindingIteratorImpl.java
+com/sun/corba/se/impl/naming/cosnaming/TransientBindingIterator.java
+com/sun/corba/se/impl/naming/cosnaming/InternalBindingKey.java
+com/sun/corba/se/impl/naming/cosnaming/InternalBindingValue.java
+com/sun/corba/se/impl/naming/cosnaming/NamingContextDataStore.java
+com/sun/corba/se/impl/naming/cosnaming/NamingContextImpl.java
+com/sun/corba/se/impl/naming/cosnaming/NamingUtils.java
+com/sun/corba/se/impl/naming/cosnaming/TransientNameServer.java
+com/sun/corba/se/impl/naming/cosnaming/TransientNameService.java
+com/sun/corba/se/impl/naming/cosnaming/TransientNamingContext.java
+com/sun/corba/se/impl/naming/namingutil
+com/sun/corba/se/impl/naming/namingutil/SCCS
+com/sun/corba/se/impl/naming/namingutil/SCCS/s.IIOPEndpointInfo.java
+com/sun/corba/se/impl/naming/namingutil/SCCS/s.CorbalocURL.java
+com/sun/corba/se/impl/naming/namingutil/SCCS/s.CorbanameURL.java
+com/sun/corba/se/impl/naming/namingutil/SCCS/s.INSURLHandler.java
+com/sun/corba/se/impl/naming/namingutil/SCCS/s.INSURL.java
+com/sun/corba/se/impl/naming/namingutil/SCCS/s.INSURLBase.java
+com/sun/corba/se/impl/naming/namingutil/SCCS/s.NamingConstants.java
+com/sun/corba/se/impl/naming/namingutil/SCCS/s.Utility.java
+com/sun/corba/se/impl/naming/namingutil/IIOPEndpointInfo.java
+com/sun/corba/se/impl/naming/namingutil/CorbalocURL.java
+com/sun/corba/se/impl/naming/namingutil/CorbanameURL.java
+com/sun/corba/se/impl/naming/namingutil/INSURLHandler.java
+com/sun/corba/se/impl/naming/namingutil/INSURL.java
+com/sun/corba/se/impl/naming/namingutil/INSURLBase.java
+com/sun/corba/se/impl/naming/namingutil/NamingConstants.java
+com/sun/corba/se/impl/naming/namingutil/Utility.java
+com/sun/corba/se/impl/naming/pcosnaming
+com/sun/corba/se/impl/naming/pcosnaming/SCCS
+com/sun/corba/se/impl/naming/pcosnaming/SCCS/s.PersistentBindingIterator.java
+com/sun/corba/se/impl/naming/pcosnaming/SCCS/s.InternalBindingKey.java
+com/sun/corba/se/impl/naming/pcosnaming/SCCS/s.InternalBindingValue.java
+com/sun/corba/se/impl/naming/pcosnaming/SCCS/s.NameServer.java
+com/sun/corba/se/impl/naming/pcosnaming/SCCS/s.NameService.java
+com/sun/corba/se/impl/naming/pcosnaming/SCCS/s.NamingContextImpl.java
+com/sun/corba/se/impl/naming/pcosnaming/SCCS/s.ServantManagerImpl.java
+com/sun/corba/se/impl/naming/pcosnaming/InternalBindingValue.java
+com/sun/corba/se/impl/naming/pcosnaming/InternalBindingKey.java
+com/sun/corba/se/impl/naming/pcosnaming/NamingContextImpl.java
+com/sun/corba/se/impl/naming/pcosnaming/NameServer.java
+com/sun/corba/se/impl/naming/pcosnaming/NameService.java
+com/sun/corba/se/impl/naming/pcosnaming/PersistentBindingIterator.java
+com/sun/corba/se/impl/naming/pcosnaming/ServantManagerImpl.java
+com/sun/corba/se/impl/oa
+com/sun/corba/se/impl/oa/SCCS
+com/sun/corba/se/impl/oa/SCCS/s.NullServantImpl.java
+com/sun/corba/se/impl/oa/poa
+com/sun/corba/se/impl/oa/poa/SCCS
+com/sun/corba/se/impl/oa/poa/SCCS/s.ActiveObjectMap.java
+com/sun/corba/se/impl/oa/poa/SCCS/s.AOMEntry.java
+com/sun/corba/se/impl/oa/poa/SCCS/s.IdAssignmentPolicyImpl.java
+com/sun/corba/se/impl/oa/poa/SCCS/s.BadServerIdHandler.java
+com/sun/corba/se/impl/oa/poa/SCCS/s.DelegateImpl.java
+com/sun/corba/se/impl/oa/poa/SCCS/s.IdUniquenessPolicyImpl.java
+com/sun/corba/se/impl/oa/poa/SCCS/s.ImplicitActivationPolicyImpl.java
+com/sun/corba/se/impl/oa/poa/SCCS/s.LifespanPolicyImpl.java
+com/sun/corba/se/impl/oa/poa/SCCS/s.POACurrent.java
+com/sun/corba/se/impl/oa/poa/SCCS/s.POAFactory.java
+com/sun/corba/se/impl/oa/poa/SCCS/s.POAImpl.java
+com/sun/corba/se/impl/oa/poa/SCCS/s.POAManagerImpl.java
+com/sun/corba/se/impl/oa/poa/SCCS/s.POAPolicyMediator.java
+com/sun/corba/se/impl/oa/poa/SCCS/s.POAPolicyMediatorBase.java
+com/sun/corba/se/impl/oa/poa/SCCS/s.POAPolicyMediatorBase_R.java
+com/sun/corba/se/impl/oa/poa/SCCS/s.POAPolicyMediatorFactory.java
+com/sun/corba/se/impl/oa/poa/SCCS/s.POAPolicyMediatorImpl_NR_UDS.java
+com/sun/corba/se/impl/oa/poa/SCCS/s.POAPolicyMediatorImpl_NR_USM.java
+com/sun/corba/se/impl/oa/poa/SCCS/s.POAPolicyMediatorImpl_R_AOM.java
+com/sun/corba/se/impl/oa/poa/SCCS/s.POAPolicyMediatorImpl_R_UDS.java
+com/sun/corba/se/impl/oa/poa/SCCS/s.POAPolicyMediatorImpl_R_USM.java
+com/sun/corba/se/impl/oa/poa/SCCS/s.Policies.java
+com/sun/corba/se/impl/oa/poa/SCCS/s.RequestProcessingPolicyImpl.java
+com/sun/corba/se/impl/oa/poa/SCCS/s.ServantRetentionPolicyImpl.java
+com/sun/corba/se/impl/oa/poa/SCCS/s.ThreadPolicyImpl.java
+com/sun/corba/se/impl/oa/poa/SCCS/s.minor_code_example.txt
+com/sun/corba/se/impl/oa/poa/SCCS/s.standard_minor_codes.txt
+com/sun/corba/se/impl/oa/poa/ActiveObjectMap.java
+com/sun/corba/se/impl/oa/poa/AOMEntry.java
+com/sun/corba/se/impl/oa/poa/IdAssignmentPolicyImpl.java
+com/sun/corba/se/impl/oa/poa/BadServerIdHandler.java
+com/sun/corba/se/impl/oa/poa/DelegateImpl.java
+com/sun/corba/se/impl/oa/poa/ImplicitActivationPolicyImpl.java
+com/sun/corba/se/impl/oa/poa/IdUniquenessPolicyImpl.java
+com/sun/corba/se/impl/oa/poa/LifespanPolicyImpl.java
+com/sun/corba/se/impl/oa/poa/POACurrent.java
+com/sun/corba/se/impl/oa/poa/POAFactory.java
+com/sun/corba/se/impl/oa/poa/POAImpl.java
+com/sun/corba/se/impl/oa/poa/POAManagerImpl.java
+com/sun/corba/se/impl/oa/poa/POAPolicyMediator.java
+com/sun/corba/se/impl/oa/poa/Policies.java
+com/sun/corba/se/impl/oa/poa/POAPolicyMediatorBase.java
+com/sun/corba/se/impl/oa/poa/POAPolicyMediatorBase_R.java
+com/sun/corba/se/impl/oa/poa/POAPolicyMediatorFactory.java
+com/sun/corba/se/impl/oa/poa/POAPolicyMediatorImpl_NR_UDS.java
+com/sun/corba/se/impl/oa/poa/POAPolicyMediatorImpl_NR_USM.java
+com/sun/corba/se/impl/oa/poa/POAPolicyMediatorImpl_R_AOM.java
+com/sun/corba/se/impl/oa/poa/POAPolicyMediatorImpl_R_UDS.java
+com/sun/corba/se/impl/oa/poa/POAPolicyMediatorImpl_R_USM.java
+com/sun/corba/se/impl/oa/poa/RequestProcessingPolicyImpl.java
+com/sun/corba/se/impl/oa/poa/ServantRetentionPolicyImpl.java
+com/sun/corba/se/impl/oa/poa/ThreadPolicyImpl.java
+com/sun/corba/se/impl/oa/poa/minor_code_example.txt
+com/sun/corba/se/impl/oa/poa/standard_minor_codes.txt
+com/sun/corba/se/impl/oa/toa
+com/sun/corba/se/impl/oa/toa/SCCS
+com/sun/corba/se/impl/oa/toa/SCCS/s.TOAFactory.java
+com/sun/corba/se/impl/oa/toa/SCCS/s.TOA.java
+com/sun/corba/se/impl/oa/toa/SCCS/s.TOAImpl.java
+com/sun/corba/se/impl/oa/toa/SCCS/s.TransientObjectManager.java
+com/sun/corba/se/impl/oa/toa/TOAFactory.java
+com/sun/corba/se/impl/oa/toa/TOA.java
+com/sun/corba/se/impl/oa/toa/TOAImpl.java
+com/sun/corba/se/impl/oa/toa/TransientObjectManager.java
+com/sun/corba/se/impl/oa/NullServantImpl.java
+com/sun/corba/se/impl/orb
+com/sun/corba/se/impl/orb/SCCS
+com/sun/corba/se/impl/orb/SCCS/s.AppletDataCollector.java
+com/sun/corba/se/impl/orb/SCCS/s.DataCollectorBase.java
+com/sun/corba/se/impl/orb/SCCS/s.DataCollectorFactory.java
+com/sun/corba/se/impl/orb/SCCS/s.NormalDataCollector.java
+com/sun/corba/se/impl/orb/SCCS/s.NormalParserAction.java
+com/sun/corba/se/impl/orb/SCCS/s.NormalParserData.java
+com/sun/corba/se/impl/orb/SCCS/s.ORBConfiguratorImpl.java
+com/sun/corba/se/impl/orb/SCCS/s.ORBDataParserImpl.java
+com/sun/corba/se/impl/orb/SCCS/s.ORBImpl.java
+com/sun/corba/se/impl/orb/SCCS/s.ORBSingleton.java
+com/sun/corba/se/impl/orb/SCCS/s.ORBVersionImpl.java
+com/sun/corba/se/impl/orb/SCCS/s.ParserAction.java
+com/sun/corba/se/impl/orb/SCCS/s.ParserActionBase.java
+com/sun/corba/se/impl/orb/SCCS/s.ParserActionFactory.java
+com/sun/corba/se/impl/orb/SCCS/s.ParserDataBase.java
+com/sun/corba/se/impl/orb/SCCS/s.ParserTable.java
+com/sun/corba/se/impl/orb/SCCS/s.PrefixParserAction.java
+com/sun/corba/se/impl/orb/SCCS/s.PrefixParserData.java
+com/sun/corba/se/impl/orb/SCCS/s.PropertyOnlyDataCollector.java
+com/sun/corba/se/impl/orb/SCCS/s.parsing_combinators.txt
+com/sun/corba/se/impl/orb/AppletDataCollector.java
+com/sun/corba/se/impl/orb/DataCollectorBase.java
+com/sun/corba/se/impl/orb/DataCollectorFactory.java
+com/sun/corba/se/impl/orb/NormalDataCollector.java
+com/sun/corba/se/impl/orb/NormalParserAction.java
+com/sun/corba/se/impl/orb/NormalParserData.java
+com/sun/corba/se/impl/orb/ORBConfiguratorImpl.java
+com/sun/corba/se/impl/orb/ORBDataParserImpl.java
+com/sun/corba/se/impl/orb/ORBImpl.java
+com/sun/corba/se/impl/orb/ORBSingleton.java
+com/sun/corba/se/impl/orb/ORBVersionImpl.java
+com/sun/corba/se/impl/orb/ParserAction.java
+com/sun/corba/se/impl/orb/ParserActionBase.java
+com/sun/corba/se/impl/orb/ParserActionFactory.java
+com/sun/corba/se/impl/orb/ParserDataBase.java
+com/sun/corba/se/impl/orb/ParserTable.java
+com/sun/corba/se/impl/orb/PrefixParserAction.java
+com/sun/corba/se/impl/orb/PrefixParserData.java
+com/sun/corba/se/impl/orb/PropertyOnlyDataCollector.java
+com/sun/corba/se/impl/orb/parsing_combinators.txt
+com/sun/corba/se/impl/orbutil
+com/sun/corba/se/impl/orbutil/SCCS
+com/sun/corba/se/impl/orbutil/SCCS/s.CorbaResourceUtil.java
+com/sun/corba/se/impl/orbutil/SCCS/s.CacheTable.java
+com/sun/corba/se/impl/orbutil/SCCS/s.GetPropertyAction.java
+com/sun/corba/se/impl/orbutil/SCCS/s.DefineWrapper.sjava
+com/sun/corba/se/impl/orbutil/SCCS/s.DenseIntMapImpl.java
+com/sun/corba/se/impl/orbutil/SCCS/s.IIOPInputStream_1_3_1.java
+com/sun/corba/se/impl/orbutil/SCCS/s.HexOutputStream.java
+com/sun/corba/se/impl/orbutil/SCCS/s.IIOPInputStream_1_3.java
+com/sun/corba/se/impl/orbutil/SCCS/s.IIOPOutputStream_1_3.java
+com/sun/corba/se/impl/orbutil/SCCS/s.IIOPOutputStream_1_3_1.java
+com/sun/corba/se/impl/orbutil/SCCS/s.LegacyHookGetFields.java
+com/sun/corba/se/impl/orbutil/SCCS/s.LegacyHookPutFields.java
+com/sun/corba/se/impl/orbutil/SCCS/s.LogKeywords.java
+com/sun/corba/se/impl/orbutil/SCCS/s.ObjectStreamClass_1_3_1.java
+com/sun/corba/se/impl/orbutil/SCCS/s.ORBClassLoader.java
+com/sun/corba/se/impl/orbutil/SCCS/s.ORBConstants.java
+com/sun/corba/se/impl/orbutil/SCCS/s.ORBUtility.java
+com/sun/corba/se/impl/orbutil/SCCS/s.ObjectStreamClassUtil_1_3.java
+com/sun/corba/se/impl/orbutil/SCCS/s.ObjectStreamField.java
+com/sun/corba/se/impl/orbutil/SCCS/s.ObjectUtility.java
+com/sun/corba/se/impl/orbutil/SCCS/s.ObjectWriter.java
+com/sun/corba/se/impl/orbutil/SCCS/s.RepIdDelegator.java
+com/sun/corba/se/impl/orbutil/SCCS/s.RepIdDelegator_1_3.java
+com/sun/corba/se/impl/orbutil/SCCS/s.RepIdDelegator_1_3_1.java
+com/sun/corba/se/impl/orbutil/SCCS/s.RepositoryIdCache_1_3.java
+com/sun/corba/se/impl/orbutil/SCCS/s.RepositoryIdCache_1_3_1.java
+com/sun/corba/se/impl/orbutil/SCCS/s.RepositoryIdFactory.java
+com/sun/corba/se/impl/orbutil/SCCS/s.RepositoryIdInterface.java
+com/sun/corba/se/impl/orbutil/SCCS/s.RepositoryIdStrings.java
+com/sun/corba/se/impl/orbutil/SCCS/s.RepositoryIdUtility.java
+com/sun/corba/se/impl/orbutil/SCCS/s.RepositoryId_1_3.java
+com/sun/corba/se/impl/orbutil/SCCS/s.RepositoryId_1_3_1.java
+com/sun/corba/se/impl/orbutil/SCCS/s.StackImpl.java
+com/sun/corba/se/impl/orbutil/SCCS/s.ValueHandlerImpl_1_3.java
+com/sun/corba/se/impl/orbutil/SCCS/s.ValueHandlerImpl_1_3_1.java
+com/sun/corba/se/impl/orbutil/closure
+com/sun/corba/se/impl/orbutil/closure/SCCS
+com/sun/corba/se/impl/orbutil/closure/SCCS/s.Constant.java
+com/sun/corba/se/impl/orbutil/closure/SCCS/s.Future.java
+com/sun/corba/se/impl/orbutil/closure/Constant.java
+com/sun/corba/se/impl/orbutil/closure/Future.java
+com/sun/corba/se/impl/orbutil/concurrent
+com/sun/corba/se/impl/orbutil/concurrent/SCCS
+com/sun/corba/se/impl/orbutil/concurrent/SCCS/s.DebugMutex.java
+com/sun/corba/se/impl/orbutil/concurrent/SCCS/s.CondVar.java
+com/sun/corba/se/impl/orbutil/concurrent/SCCS/s.ReentrantMutex.java
+com/sun/corba/se/impl/orbutil/concurrent/SCCS/s.Mutex.java
+com/sun/corba/se/impl/orbutil/concurrent/SCCS/s.Sync.java
+com/sun/corba/se/impl/orbutil/concurrent/SCCS/s.SyncUtil.java
+com/sun/corba/se/impl/orbutil/concurrent/ReentrantMutex.java
+com/sun/corba/se/impl/orbutil/concurrent/CondVar.java
+com/sun/corba/se/impl/orbutil/concurrent/DebugMutex.java
+com/sun/corba/se/impl/orbutil/concurrent/Mutex.java
+com/sun/corba/se/impl/orbutil/concurrent/Sync.java
+com/sun/corba/se/impl/orbutil/concurrent/SyncUtil.java
+com/sun/corba/se/impl/orbutil/fsm
+com/sun/corba/se/impl/orbutil/fsm/SCCS
+com/sun/corba/se/impl/orbutil/fsm/SCCS/s.GuardedAction.java
+com/sun/corba/se/impl/orbutil/fsm/SCCS/s.NameBase.java
+com/sun/corba/se/impl/orbutil/fsm/SCCS/s.StateEngineImpl.java
+com/sun/corba/se/impl/orbutil/fsm/StateEngineImpl.java
+com/sun/corba/se/impl/orbutil/fsm/GuardedAction.java
+com/sun/corba/se/impl/orbutil/fsm/NameBase.java
+com/sun/corba/se/impl/orbutil/graph
+com/sun/corba/se/impl/orbutil/graph/SCCS
+com/sun/corba/se/impl/orbutil/graph/SCCS/s.GraphImpl.java
+com/sun/corba/se/impl/orbutil/graph/SCCS/s.Graph.java
+com/sun/corba/se/impl/orbutil/graph/SCCS/s.Node.java
+com/sun/corba/se/impl/orbutil/graph/SCCS/s.NodeData.java
+com/sun/corba/se/impl/orbutil/graph/GraphImpl.java
+com/sun/corba/se/impl/orbutil/graph/Graph.java
+com/sun/corba/se/impl/orbutil/graph/Node.java
+com/sun/corba/se/impl/orbutil/graph/NodeData.java
+com/sun/corba/se/impl/orbutil/resources
+com/sun/corba/se/impl/orbutil/resources/SCCS
+com/sun/corba/se/impl/orbutil/resources/SCCS/s.sunorb_de.properties
+com/sun/corba/se/impl/orbutil/resources/SCCS/s.sunorb.properties
+com/sun/corba/se/impl/orbutil/resources/SCCS/s.sunorb_es.properties
+com/sun/corba/se/impl/orbutil/resources/SCCS/s.sunorb_fr.properties
+com/sun/corba/se/impl/orbutil/resources/SCCS/s.sunorb_it.properties
+com/sun/corba/se/impl/orbutil/resources/SCCS/s.sunorb_ja.properties
+com/sun/corba/se/impl/orbutil/resources/SCCS/s.sunorb_ko.properties
+com/sun/corba/se/impl/orbutil/resources/SCCS/s.sunorb_sv.properties
+com/sun/corba/se/impl/orbutil/resources/SCCS/s.sunorb_zh_CN.properties
+com/sun/corba/se/impl/orbutil/resources/SCCS/s.sunorb_zh_TW.properties
+com/sun/corba/se/impl/orbutil/resources/sunorb_de.properties
+com/sun/corba/se/impl/orbutil/resources/sunorb.properties
+com/sun/corba/se/impl/orbutil/resources/sunorb_es.properties
+com/sun/corba/se/impl/orbutil/resources/sunorb_fr.properties
+com/sun/corba/se/impl/orbutil/resources/sunorb_it.properties
+com/sun/corba/se/impl/orbutil/resources/sunorb_ja.properties
+com/sun/corba/se/impl/orbutil/resources/sunorb_ko.properties
+com/sun/corba/se/impl/orbutil/resources/sunorb_sv.properties
+com/sun/corba/se/impl/orbutil/resources/sunorb_zh_CN.properties
+com/sun/corba/se/impl/orbutil/resources/sunorb_zh_TW.properties
+com/sun/corba/se/impl/orbutil/threadpool
+com/sun/corba/se/impl/orbutil/threadpool/SCCS
+com/sun/corba/se/impl/orbutil/threadpool/SCCS/s.ThreadPoolManagerImpl.java
+com/sun/corba/se/impl/orbutil/threadpool/SCCS/s.ThreadPoolImpl.java
+com/sun/corba/se/impl/orbutil/threadpool/SCCS/s.TimeoutException.java
+com/sun/corba/se/impl/orbutil/threadpool/SCCS/s.WorkQueueImpl.java
+com/sun/corba/se/impl/orbutil/threadpool/ThreadPoolManagerImpl.java
+com/sun/corba/se/impl/orbutil/threadpool/ThreadPoolImpl.java
+com/sun/corba/se/impl/orbutil/threadpool/TimeoutException.java
+com/sun/corba/se/impl/orbutil/threadpool/WorkQueueImpl.java
+com/sun/corba/se/impl/orbutil/CorbaResourceUtil.java
+com/sun/corba/se/impl/orbutil/CacheTable.java
+com/sun/corba/se/impl/orbutil/DenseIntMapImpl.java
+com/sun/corba/se/impl/orbutil/DefineWrapper.sjava
+com/sun/corba/se/impl/orbutil/ObjectStreamClassUtil_1_3.java
+com/sun/corba/se/impl/orbutil/GetPropertyAction.java
+com/sun/corba/se/impl/orbutil/HexOutputStream.java
+com/sun/corba/se/impl/orbutil/IIOPInputStream_1_3.java
+com/sun/corba/se/impl/orbutil/IIOPInputStream_1_3_1.java
+com/sun/corba/se/impl/orbutil/IIOPOutputStream_1_3.java
+com/sun/corba/se/impl/orbutil/IIOPOutputStream_1_3_1.java
+com/sun/corba/se/impl/orbutil/LegacyHookGetFields.java
+com/sun/corba/se/impl/orbutil/LegacyHookPutFields.java
+com/sun/corba/se/impl/orbutil/LogKeywords.java
+com/sun/corba/se/impl/orbutil/ORBClassLoader.java
+com/sun/corba/se/impl/orbutil/ORBConstants.java
+com/sun/corba/se/impl/orbutil/ORBUtility.java
+com/sun/corba/se/impl/orbutil/ObjectStreamClass_1_3_1.java
+com/sun/corba/se/impl/orbutil/ObjectStreamField.java
+com/sun/corba/se/impl/orbutil/ObjectUtility.java
+com/sun/corba/se/impl/orbutil/ObjectWriter.java
+com/sun/corba/se/impl/orbutil/RepIdDelegator.java
+com/sun/corba/se/impl/orbutil/RepIdDelegator_1_3.java
+com/sun/corba/se/impl/orbutil/RepIdDelegator_1_3_1.java
+com/sun/corba/se/impl/orbutil/RepositoryIdCache_1_3.java
+com/sun/corba/se/impl/orbutil/StackImpl.java
+com/sun/corba/se/impl/orbutil/RepositoryIdCache_1_3_1.java
+com/sun/corba/se/impl/orbutil/RepositoryIdFactory.java
+com/sun/corba/se/impl/orbutil/RepositoryIdInterface.java
+com/sun/corba/se/impl/orbutil/RepositoryIdStrings.java
+com/sun/corba/se/impl/orbutil/RepositoryIdUtility.java
+com/sun/corba/se/impl/orbutil/RepositoryId_1_3.java
+com/sun/corba/se/impl/orbutil/RepositoryId_1_3_1.java
+com/sun/corba/se/impl/orbutil/ValueHandlerImpl_1_3.java
+com/sun/corba/se/impl/orbutil/ValueHandlerImpl_1_3_1.java
+com/sun/corba/se/impl/presentation
+com/sun/corba/se/impl/presentation/rmi
+com/sun/corba/se/impl/presentation/rmi/SCCS
+com/sun/corba/se/impl/presentation/rmi/SCCS/s.DynamicMethodMarshallerImpl.java
+com/sun/corba/se/impl/presentation/rmi/SCCS/s.DynamicStubImpl.java
+com/sun/corba/se/impl/presentation/rmi/SCCS/s.ExceptionHandler.java
+com/sun/corba/se/impl/presentation/rmi/SCCS/s.ExceptionHandlerImpl.java
+com/sun/corba/se/impl/presentation/rmi/SCCS/s.IDLNameTranslatorImpl.java
+com/sun/corba/se/impl/presentation/rmi/SCCS/s.IDLNameTranslatorImpl_save.sjava
+com/sun/corba/se/impl/presentation/rmi/SCCS/s.IDLType.java
+com/sun/corba/se/impl/presentation/rmi/SCCS/s.IDLTypeException.java
+com/sun/corba/se/impl/presentation/rmi/SCCS/s.IDLTypesUtil.java
+com/sun/corba/se/impl/presentation/rmi/SCCS/s.IDLTypesUtil_save.sjava
+com/sun/corba/se/impl/presentation/rmi/SCCS/s.InvocationHandlerFactoryImpl.java
+com/sun/corba/se/impl/presentation/rmi/SCCS/s.JNDIStateFactoryImpl.java
+com/sun/corba/se/impl/presentation/rmi/SCCS/s.PresentationManagerImpl.java
+com/sun/corba/se/impl/presentation/rmi/SCCS/s.ReflectiveTie.java
+com/sun/corba/se/impl/presentation/rmi/SCCS/s.StubConnectImpl.java
+com/sun/corba/se/impl/presentation/rmi/SCCS/s.StubFactoryBase.java
+com/sun/corba/se/impl/presentation/rmi/SCCS/s.StubFactoryDynamicBase.java
+com/sun/corba/se/impl/presentation/rmi/SCCS/s.StubFactoryFactoryBase.java
+com/sun/corba/se/impl/presentation/rmi/SCCS/s.StubFactoryFactoryDynamicBase.java
+com/sun/corba/se/impl/presentation/rmi/SCCS/s.StubFactoryFactoryProxyImpl.java
+com/sun/corba/se/impl/presentation/rmi/SCCS/s.StubFactoryFactoryStaticImpl.java
+com/sun/corba/se/impl/presentation/rmi/SCCS/s.StubFactoryProxyImpl.java
+com/sun/corba/se/impl/presentation/rmi/SCCS/s.StubFactoryStaticImpl.java
+com/sun/corba/se/impl/presentation/rmi/SCCS/s.StubInvocationHandlerImpl.java
+com/sun/corba/se/impl/presentation/rmi/SCCS/s.jndi.properties
+com/sun/corba/se/impl/presentation/rmi/DynamicMethodMarshallerImpl.java
+com/sun/corba/se/impl/presentation/rmi/DynamicStubImpl.java
+com/sun/corba/se/impl/presentation/rmi/ExceptionHandler.java
+com/sun/corba/se/impl/presentation/rmi/ExceptionHandlerImpl.java
+com/sun/corba/se/impl/presentation/rmi/IDLNameTranslatorImpl.java
+com/sun/corba/se/impl/presentation/rmi/IDLNameTranslatorImpl_save.sjava
+com/sun/corba/se/impl/presentation/rmi/IDLType.java
+com/sun/corba/se/impl/presentation/rmi/IDLTypeException.java
+com/sun/corba/se/impl/presentation/rmi/IDLTypesUtil.java
+com/sun/corba/se/impl/presentation/rmi/IDLTypesUtil_save.sjava
+com/sun/corba/se/impl/presentation/rmi/InvocationHandlerFactoryImpl.java
+com/sun/corba/se/impl/presentation/rmi/JNDIStateFactoryImpl.java
+com/sun/corba/se/impl/presentation/rmi/PresentationManagerImpl.java
+com/sun/corba/se/impl/presentation/rmi/ReflectiveTie.java
+com/sun/corba/se/impl/presentation/rmi/StubConnectImpl.java
+com/sun/corba/se/impl/presentation/rmi/StubFactoryBase.java
+com/sun/corba/se/impl/presentation/rmi/StubFactoryDynamicBase.java
+com/sun/corba/se/impl/presentation/rmi/StubFactoryFactoryBase.java
+com/sun/corba/se/impl/presentation/rmi/StubFactoryFactoryDynamicBase.java
+com/sun/corba/se/impl/presentation/rmi/StubFactoryFactoryProxyImpl.java
+com/sun/corba/se/impl/presentation/rmi/StubFactoryFactoryStaticImpl.java
+com/sun/corba/se/impl/presentation/rmi/StubFactoryProxyImpl.java
+com/sun/corba/se/impl/presentation/rmi/StubFactoryStaticImpl.java
+com/sun/corba/se/impl/presentation/rmi/StubInvocationHandlerImpl.java
+com/sun/corba/se/impl/presentation/rmi/jndi.properties
+com/sun/corba/se/impl/protocol
+com/sun/corba/se/impl/protocol/SCCS
+com/sun/corba/se/impl/protocol/SCCS/s.AddressingDispositionException.java
+com/sun/corba/se/impl/protocol/SCCS/s.BootstrapServerRequestDispatcher.java
+com/sun/corba/se/impl/protocol/SCCS/s.CorbaClientDelegateImpl.java
+com/sun/corba/se/impl/protocol/SCCS/s.CorbaClientRequestDispatcherImpl.java
+com/sun/corba/se/impl/protocol/SCCS/s.CorbaInvocationInfo.java
+com/sun/corba/se/impl/protocol/SCCS/s.CorbaMessageMediatorImpl.java
+com/sun/corba/se/impl/protocol/SCCS/s.CorbaServerRequestDispatcherImpl.java
+com/sun/corba/se/impl/protocol/SCCS/s.FullServantCacheLocalCRDImpl.java
+com/sun/corba/se/impl/protocol/SCCS/s.INSServerRequestDispatcher.java
+com/sun/corba/se/impl/protocol/SCCS/s.JIDLLocalCRDImpl.java
+com/sun/corba/se/impl/protocol/SCCS/s.InfoOnlyServantCacheLocalCRDImpl.java
+com/sun/corba/se/impl/protocol/SCCS/s.LocalClientRequestDispatcherBase.java
+com/sun/corba/se/impl/protocol/SCCS/s.MinimalServantCacheLocalCRDImpl.java
+com/sun/corba/se/impl/protocol/SCCS/s.NotLocalLocalCRDImpl.java
+com/sun/corba/se/impl/protocol/SCCS/s.POALocalCRDImpl.java
+com/sun/corba/se/impl/protocol/SCCS/s.RequestCanceledException.java
+com/sun/corba/se/impl/protocol/SCCS/s.RequestDispatcherRegistryImpl.java
+com/sun/corba/se/impl/protocol/SCCS/s.ServantCacheLocalCRDBase.java
+com/sun/corba/se/impl/protocol/SCCS/s.SharedCDRClientRequestDispatcherImpl.java
+com/sun/corba/se/impl/protocol/SCCS/s.SpecialMethod.java
+com/sun/corba/se/impl/protocol/giopmsgheaders
+com/sun/corba/se/impl/protocol/giopmsgheaders/SCCS
+com/sun/corba/se/impl/protocol/giopmsgheaders/SCCS/s.AddressingDispositionHelper.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/SCCS/s.CancelRequestMessage.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/SCCS/s.CancelRequestMessage_1_0.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/SCCS/s.CancelRequestMessage_1_1.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/SCCS/s.CancelRequestMessage_1_2.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/SCCS/s.FragmentMessage.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/SCCS/s.FragmentMessage_1_1.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/SCCS/s.FragmentMessage_1_2.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/SCCS/s.IORAddressingInfo.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/SCCS/s.IORAddressingInfoHelper.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/SCCS/s.KeyAddr.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/SCCS/s.LocateReplyMessage.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/SCCS/s.LocateReplyOrReplyMessage.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/SCCS/s.LocateReplyMessage_1_0.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/SCCS/s.LocateReplyMessage_1_1.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/SCCS/s.LocateReplyMessage_1_2.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/SCCS/s.LocateRequestMessage_1_0.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/SCCS/s.LocateRequestMessage.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/SCCS/s.LocateRequestMessage_1_1.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/SCCS/s.LocateRequestMessage_1_2.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/SCCS/s.Message.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/SCCS/s.MessageBase.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/SCCS/s.MessageHandler.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/SCCS/s.Message_1_0.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/SCCS/s.Message_1_1.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/SCCS/s.Message_1_2.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/SCCS/s.ProfileAddr.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/SCCS/s.RequestMessage_1_0.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/SCCS/s.ReferenceAddr.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/SCCS/s.ReplyMessage.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/SCCS/s.ReplyMessage_1_0.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/SCCS/s.ReplyMessage_1_1.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/SCCS/s.ReplyMessage_1_2.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/SCCS/s.RequestMessage.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/SCCS/s.RequestMessage_1_1.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/SCCS/s.RequestMessage_1_2.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/SCCS/s.TargetAddress.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/SCCS/s.TargetAddressHelper.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/LocateReplyMessage_1_0.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/AddressingDispositionHelper.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/CancelRequestMessage.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/CancelRequestMessage_1_0.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/CancelRequestMessage_1_1.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/CancelRequestMessage_1_2.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/FragmentMessage.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/FragmentMessage_1_1.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/FragmentMessage_1_2.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/IORAddressingInfo.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/IORAddressingInfoHelper.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/KeyAddr.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/LocateReplyMessage.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/LocateReplyOrReplyMessage.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/LocateReplyMessage_1_1.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/LocateReplyMessage_1_2.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/LocateRequestMessage.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/LocateRequestMessage_1_0.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/LocateRequestMessage_1_1.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/LocateRequestMessage_1_2.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/Message.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/MessageBase.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/MessageHandler.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/Message_1_0.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/Message_1_1.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/Message_1_2.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/ProfileAddr.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/ReferenceAddr.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/ReplyMessage.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/ReplyMessage_1_0.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/ReplyMessage_1_1.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/ReplyMessage_1_2.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/RequestMessage.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/RequestMessage_1_0.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/RequestMessage_1_1.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/RequestMessage_1_2.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/TargetAddress.java
+com/sun/corba/se/impl/protocol/giopmsgheaders/TargetAddressHelper.java
+com/sun/corba/se/impl/protocol/oldlocal
+com/sun/corba/se/impl/protocol/oldlocal/SCCS
+com/sun/corba/se/impl/protocol/oldlocal/SCCS/s.LocalClientRequestImpl.sjava
+com/sun/corba/se/impl/protocol/oldlocal/SCCS/s.LocalClientResponseImpl.sjava
+com/sun/corba/se/impl/protocol/oldlocal/SCCS/s.LocalServerRequestImpl.sjava
+com/sun/corba/se/impl/protocol/oldlocal/SCCS/s.LocalServerResponseImpl.sjava
+com/sun/corba/se/impl/protocol/oldlocal/LocalClientRequestImpl.sjava
+com/sun/corba/se/impl/protocol/oldlocal/LocalClientResponseImpl.sjava
+com/sun/corba/se/impl/protocol/oldlocal/LocalServerRequestImpl.sjava
+com/sun/corba/se/impl/protocol/oldlocal/LocalServerResponseImpl.sjava
+com/sun/corba/se/impl/protocol/BootstrapServerRequestDispatcher.java
+com/sun/corba/se/impl/protocol/AddressingDispositionException.java
+com/sun/corba/se/impl/protocol/CorbaClientRequestDispatcherImpl.java
+com/sun/corba/se/impl/protocol/CorbaClientDelegateImpl.java
+com/sun/corba/se/impl/protocol/CorbaServerRequestDispatcherImpl.java
+com/sun/corba/se/impl/protocol/CorbaInvocationInfo.java
+com/sun/corba/se/impl/protocol/CorbaMessageMediatorImpl.java
+com/sun/corba/se/impl/protocol/FullServantCacheLocalCRDImpl.java
+com/sun/corba/se/impl/protocol/JIDLLocalCRDImpl.java
+com/sun/corba/se/impl/protocol/RequestDispatcherRegistryImpl.java
+com/sun/corba/se/impl/protocol/INSServerRequestDispatcher.java
+com/sun/corba/se/impl/protocol/InfoOnlyServantCacheLocalCRDImpl.java
+com/sun/corba/se/impl/protocol/NotLocalLocalCRDImpl.java
+com/sun/corba/se/impl/protocol/LocalClientRequestDispatcherBase.java
+com/sun/corba/se/impl/protocol/MinimalServantCacheLocalCRDImpl.java
+com/sun/corba/se/impl/protocol/POALocalCRDImpl.java
+com/sun/corba/se/impl/protocol/RequestCanceledException.java
+com/sun/corba/se/impl/protocol/SpecialMethod.java
+com/sun/corba/se/impl/protocol/ServantCacheLocalCRDBase.java
+com/sun/corba/se/impl/protocol/SharedCDRClientRequestDispatcherImpl.java
+com/sun/corba/se/impl/resolver
+com/sun/corba/se/impl/resolver/SCCS
+com/sun/corba/se/impl/resolver/SCCS/s.ORBDefaultInitRefResolverImpl.java
+com/sun/corba/se/impl/resolver/SCCS/s.BootstrapResolverImpl.java
+com/sun/corba/se/impl/resolver/SCCS/s.CompositeResolverImpl.java
+com/sun/corba/se/impl/resolver/SCCS/s.FileResolverImpl.java
+com/sun/corba/se/impl/resolver/SCCS/s.INSURLOperationImpl.java
+com/sun/corba/se/impl/resolver/SCCS/s.LocalResolverImpl.java
+com/sun/corba/se/impl/resolver/SCCS/s.ORBInitRefResolverImpl.java
+com/sun/corba/se/impl/resolver/SCCS/s.SplitLocalResolverImpl.java
+com/sun/corba/se/impl/resolver/ORBDefaultInitRefResolverImpl.java
+com/sun/corba/se/impl/resolver/BootstrapResolverImpl.java
+com/sun/corba/se/impl/resolver/CompositeResolverImpl.java
+com/sun/corba/se/impl/resolver/FileResolverImpl.java
+com/sun/corba/se/impl/resolver/INSURLOperationImpl.java
+com/sun/corba/se/impl/resolver/LocalResolverImpl.java
+com/sun/corba/se/impl/resolver/ORBInitRefResolverImpl.java
+com/sun/corba/se/impl/resolver/SplitLocalResolverImpl.java
+com/sun/corba/se/impl/transport
+com/sun/corba/se/impl/transport/SCCS
+com/sun/corba/se/impl/transport/SCCS/s.CorbaContactInfoListIteratorImpl.java
+com/sun/corba/se/impl/transport/SCCS/s.BufferConnectionImpl.sjava
+com/sun/corba/se/impl/transport/SCCS/s.ByteBufferPoolImpl.java
+com/sun/corba/se/impl/transport/SCCS/s.CorbaConnectionCacheBase.java
+com/sun/corba/se/impl/transport/SCCS/s.CorbaContactInfoBase.java
+com/sun/corba/se/impl/transport/SCCS/s.CorbaContactInfoListImpl.java
+com/sun/corba/se/impl/transport/SCCS/s.CorbaInboundConnectionCacheImpl.java
+com/sun/corba/se/impl/transport/SCCS/s.CorbaOutboundConnectionCacheImpl.java
+com/sun/corba/se/impl/transport/SCCS/s.CorbaResponseWaitingRoomImpl.java
+com/sun/corba/se/impl/transport/SCCS/s.CorbaTransportManagerImpl.java
+com/sun/corba/se/impl/transport/SCCS/s.DefaultIORToSocketInfoImpl.java
+com/sun/corba/se/impl/transport/SCCS/s.DefaultSocketFactoryImpl.java
+com/sun/corba/se/impl/transport/SCCS/s.EventHandlerBase.java
+com/sun/corba/se/impl/transport/SCCS/s.ListenerThreadImpl.java
+com/sun/corba/se/impl/transport/SCCS/s.ReadTCPTimeoutsImpl.java
+com/sun/corba/se/impl/transport/SCCS/s.ReaderThreadImpl.java
+com/sun/corba/se/impl/transport/SCCS/s.SelectorImpl.java
+com/sun/corba/se/impl/transport/SCCS/s.SharedCDRContactInfoImpl.java
+com/sun/corba/se/impl/transport/SCCS/s.SocketOrChannelAcceptorImpl.java
+com/sun/corba/se/impl/transport/SCCS/s.SocketOrChannelConnectionImpl.java
+com/sun/corba/se/impl/transport/SCCS/s.SocketOrChannelContactInfoImpl.java
+com/sun/corba/se/impl/transport/CorbaConnectionCacheBase.java
+com/sun/corba/se/impl/transport/BufferConnectionImpl.sjava
+com/sun/corba/se/impl/transport/ByteBufferPoolImpl.java
+com/sun/corba/se/impl/transport/CorbaContactInfoListIteratorImpl.java
+com/sun/corba/se/impl/transport/CorbaContactInfoBase.java
+com/sun/corba/se/impl/transport/CorbaContactInfoListImpl.java
+com/sun/corba/se/impl/transport/CorbaInboundConnectionCacheImpl.java
+com/sun/corba/se/impl/transport/CorbaOutboundConnectionCacheImpl.java
+com/sun/corba/se/impl/transport/CorbaResponseWaitingRoomImpl.java
+com/sun/corba/se/impl/transport/CorbaTransportManagerImpl.java
+com/sun/corba/se/impl/transport/DefaultIORToSocketInfoImpl.java
+com/sun/corba/se/impl/transport/DefaultSocketFactoryImpl.java
+com/sun/corba/se/impl/transport/EventHandlerBase.java
+com/sun/corba/se/impl/transport/ListenerThreadImpl.java
+com/sun/corba/se/impl/transport/ReadTCPTimeoutsImpl.java
+com/sun/corba/se/impl/transport/ReaderThreadImpl.java
+com/sun/corba/se/impl/transport/SelectorImpl.java
+com/sun/corba/se/impl/transport/SharedCDRContactInfoImpl.java
+com/sun/corba/se/impl/transport/SocketOrChannelAcceptorImpl.java
+com/sun/corba/se/impl/transport/SocketOrChannelConnectionImpl.java
+com/sun/corba/se/impl/transport/SocketOrChannelContactInfoImpl.java
+com/sun/corba/se/impl/util
+com/sun/corba/se/impl/util/SCCS
+com/sun/corba/se/impl/util/SCCS/s.IdentityHashtableEnumerator.java
+com/sun/corba/se/impl/util/SCCS/s.IdentityHashtable.java
+com/sun/corba/se/impl/util/SCCS/s.JDKClassLoader.java
+com/sun/corba/se/impl/util/SCCS/s.JDKBridge.java
+com/sun/corba/se/impl/util/SCCS/s.ORBProperties.java
+com/sun/corba/se/impl/util/SCCS/s.PackagePrefixChecker.java
+com/sun/corba/se/impl/util/SCCS/s.RepositoryId.java
+com/sun/corba/se/impl/util/SCCS/s.RepositoryIdCache.java
+com/sun/corba/se/impl/util/SCCS/s.SUNVMCID.java
+com/sun/corba/se/impl/util/SCCS/s.Utility.java
+com/sun/corba/se/impl/util/SCCS/s.Version.java
+com/sun/corba/se/impl/util/PackagePrefixChecker.java
+com/sun/corba/se/impl/util/IdentityHashtable.java
+com/sun/corba/se/impl/util/JDKBridge.java
+com/sun/corba/se/impl/util/JDKClassLoader.java
+com/sun/corba/se/impl/util/IdentityHashtableEnumerator.java
+com/sun/corba/se/impl/util/ORBProperties.java
+com/sun/corba/se/impl/util/RepositoryId.java
+com/sun/corba/se/impl/util/RepositoryIdCache.java
+com/sun/corba/se/impl/util/SUNVMCID.java
+com/sun/corba/se/impl/util/Utility.java
+com/sun/corba/se/impl/util/Version.java
+com/sun/corba/se/interceptor
+com/sun/corba/se/interceptor/SCCS
+com/sun/corba/se/internal
+com/sun/corba/se/internal/Activation
+com/sun/corba/se/internal/Activation/SCCS
+com/sun/corba/se/internal/CosNaming
+com/sun/corba/se/internal/CosNaming/SCCS
+com/sun/corba/se/internal/CosNaming/SCCS/s.BootstrapServer.java
+com/sun/corba/se/internal/CosNaming/BootstrapServer.java
+com/sun/corba/se/internal/DynamicAny
+com/sun/corba/se/internal/DynamicAny/SCCS
+com/sun/corba/se/internal/Interceptors
+com/sun/corba/se/internal/Interceptors/SCCS
+com/sun/corba/se/internal/Interceptors/SCCS/s.PIORB.java
+com/sun/corba/se/internal/Interceptors/PIORB.java
+com/sun/corba/se/internal/PCosNaming
+com/sun/corba/se/internal/PCosNaming/SCCS
+com/sun/corba/se/internal/POA
+com/sun/corba/se/internal/POA/SCCS
+com/sun/corba/se/internal/POA/SCCS/s.POAORB.java
+com/sun/corba/se/internal/POA/POAORB.java
+com/sun/corba/se/internal/corba
+com/sun/corba/se/internal/corba/SCCS
+com/sun/corba/se/internal/corba/SCCS/s.ORBSingleton.java
+com/sun/corba/se/internal/corba/ORBSingleton.java
+com/sun/corba/se/internal/core
+com/sun/corba/se/internal/core/SCCS
+com/sun/corba/se/internal/iiop
+com/sun/corba/se/internal/iiop/SCCS
+com/sun/corba/se/internal/iiop/SCCS/s.ORB.java
+com/sun/corba/se/internal/iiop/messages
+com/sun/corba/se/internal/iiop/messages/SCCS
+com/sun/corba/se/internal/iiop/ORB.java
+com/sun/corba/se/internal/io
+com/sun/corba/se/internal/io/SCCS
+com/sun/corba/se/internal/io/SCCS/s.ObjectStreamClass.java
+com/sun/corba/se/internal/io/SCCS/s.IIOPInputStream.java
+com/sun/corba/se/internal/io/SCCS/s.IIOPOutputStream.java
+com/sun/corba/se/internal/io/SCCS/s.LibraryManager.java
+com/sun/corba/se/internal/io/IIOPInputStream.java
+com/sun/corba/se/internal/io/IIOPOutputStream.java
+com/sun/corba/se/internal/io/LibraryManager.java
+com/sun/corba/se/internal/io/ObjectStreamClass.java
+com/sun/corba/se/internal/ior
+com/sun/corba/se/internal/ior/SCCS
+com/sun/corba/se/internal/javax
+com/sun/corba/se/internal/javax/rmi
+com/sun/corba/se/internal/javax/rmi/CORBA
+com/sun/corba/se/internal/javax/rmi/CORBA/SCCS
+com/sun/corba/se/internal/javax/rmi/SCCS
+com/sun/corba/se/internal/orbutil
+com/sun/corba/se/internal/orbutil/SCCS
+com/sun/corba/se/internal/orbutil/resources
+com/sun/corba/se/internal/orbutil/resources/SCCS
+com/sun/corba/se/internal/util
+com/sun/corba/se/internal/util/SCCS
+com/sun/corba/se/org
+com/sun/corba/se/org/omg
+com/sun/corba/se/org/omg/CORBA
+com/sun/corba/se/org/omg/CORBA/SCCS
+com/sun/corba/se/org/omg/CORBA/SCCS/s.ORB.java
+com/sun/corba/se/org/omg/CORBA/ORB.java
+com/sun/corba/se/pept
+com/sun/corba/se/pept/SCCS
+com/sun/corba/se/pept/SCCS/s.package.html
+com/sun/corba/se/pept/broker
+com/sun/corba/se/pept/broker/SCCS
+com/sun/corba/se/pept/broker/SCCS/s.Broker.java
+com/sun/corba/se/pept/broker/Broker.java
+com/sun/corba/se/pept/encoding
+com/sun/corba/se/pept/encoding/SCCS
+com/sun/corba/se/pept/encoding/SCCS/s.InputObject.java
+com/sun/corba/se/pept/encoding/SCCS/s.OutputObject.java
+com/sun/corba/se/pept/encoding/InputObject.java
+com/sun/corba/se/pept/encoding/OutputObject.java
+com/sun/corba/se/pept/protocol
+com/sun/corba/se/pept/protocol/SCCS
+com/sun/corba/se/pept/protocol/SCCS/s.ClientInvocationInfo.java
+com/sun/corba/se/pept/protocol/SCCS/s.ClientDelegate.java
+com/sun/corba/se/pept/protocol/SCCS/s.ClientRequestDispatcher.java
+com/sun/corba/se/pept/protocol/SCCS/s.MessageMediator.java
+com/sun/corba/se/pept/protocol/SCCS/s.ProtocolHandler.java
+com/sun/corba/se/pept/protocol/SCCS/s.ServerRequestDispatcher.java
+com/sun/corba/se/pept/protocol/ClientInvocationInfo.java
+com/sun/corba/se/pept/protocol/ClientDelegate.java
+com/sun/corba/se/pept/protocol/ClientRequestDispatcher.java
+com/sun/corba/se/pept/protocol/MessageMediator.java
+com/sun/corba/se/pept/protocol/ProtocolHandler.java
+com/sun/corba/se/pept/protocol/ServerRequestDispatcher.java
+com/sun/corba/se/pept/transport
+com/sun/corba/se/pept/transport/SCCS
+com/sun/corba/se/pept/transport/SCCS/s.ByteBufferPool.java
+com/sun/corba/se/pept/transport/SCCS/s.Acceptor.java
+com/sun/corba/se/pept/transport/SCCS/s.ConnectionCache.java
+com/sun/corba/se/pept/transport/SCCS/s.Connection.java
+com/sun/corba/se/pept/transport/SCCS/s.ContactInfoListIterator.java
+com/sun/corba/se/pept/transport/SCCS/s.ContactInfo.java
+com/sun/corba/se/pept/transport/SCCS/s.ContactInfoList.java
+com/sun/corba/se/pept/transport/SCCS/s.ListenerThread.java
+com/sun/corba/se/pept/transport/SCCS/s.EventHandler.java
+com/sun/corba/se/pept/transport/SCCS/s.InboundConnectionCache.java
+com/sun/corba/se/pept/transport/SCCS/s.OutboundConnectionCache.java
+com/sun/corba/se/pept/transport/SCCS/s.ReaderThread.java
+com/sun/corba/se/pept/transport/SCCS/s.ResponseWaitingRoom.java
+com/sun/corba/se/pept/transport/SCCS/s.Selector.java
+com/sun/corba/se/pept/transport/SCCS/s.TransportManager.java
+com/sun/corba/se/pept/transport/SCCS/s.transport.zargo
+com/sun/corba/se/pept/transport/ByteBufferPool.java
+com/sun/corba/se/pept/transport/Acceptor.java
+com/sun/corba/se/pept/transport/ConnectionCache.java
+com/sun/corba/se/pept/transport/Connection.java
+com/sun/corba/se/pept/transport/ContactInfoListIterator.java
+com/sun/corba/se/pept/transport/ContactInfo.java
+com/sun/corba/se/pept/transport/ContactInfoList.java
+com/sun/corba/se/pept/transport/InboundConnectionCache.java
+com/sun/corba/se/pept/transport/EventHandler.java
+com/sun/corba/se/pept/transport/ListenerThread.java
+com/sun/corba/se/pept/transport/ReaderThread.java
+com/sun/corba/se/pept/transport/Selector.java
+com/sun/corba/se/pept/transport/OutboundConnectionCache.java
+com/sun/corba/se/pept/transport/ResponseWaitingRoom.java
+com/sun/corba/se/pept/transport/TransportManager.java
+com/sun/corba/se/pept/transport/transport.zargo
+com/sun/corba/se/pept/package.html
+com/sun/corba/se/spi
+com/sun/corba/se/spi/activation
+com/sun/corba/se/spi/activation/SCCS
+com/sun/corba/se/spi/activation/SCCS/s.activation.idl
+com/sun/corba/se/spi/activation/activation.idl
+com/sun/corba/se/spi/copyobject
+com/sun/corba/se/spi/copyobject/SCCS
+com/sun/corba/se/spi/copyobject/SCCS/s.CopyobjectDefaults.java
+com/sun/corba/se/spi/copyobject/SCCS/s.CopierManager.java
+com/sun/corba/se/spi/copyobject/SCCS/s.ObjectCopierFactory.java
+com/sun/corba/se/spi/copyobject/SCCS/s.ObjectCopier.java
+com/sun/corba/se/spi/copyobject/SCCS/s.ReflectiveCopyException.java
+com/sun/corba/se/spi/copyobject/CopyobjectDefaults.java
+com/sun/corba/se/spi/copyobject/CopierManager.java
+com/sun/corba/se/spi/copyobject/ObjectCopierFactory.java
+com/sun/corba/se/spi/copyobject/ObjectCopier.java
+com/sun/corba/se/spi/copyobject/ReflectiveCopyException.java
+com/sun/corba/se/spi/costransactions
+com/sun/corba/se/spi/costransactions/SCCS
+com/sun/corba/se/spi/costransactions/SCCS/s.TransactionService.java
+com/sun/corba/se/spi/costransactions/TransactionService.java
+com/sun/corba/se/spi/encoding
+com/sun/corba/se/spi/encoding/SCCS
+com/sun/corba/se/spi/encoding/SCCS/s.CorbaOutputObject.java
+com/sun/corba/se/spi/encoding/SCCS/s.CorbaInputObject.java
+com/sun/corba/se/spi/encoding/CorbaInputObject.java
+com/sun/corba/se/spi/encoding/CorbaOutputObject.java
+com/sun/corba/se/spi/extension
+com/sun/corba/se/spi/extension/SCCS
+com/sun/corba/se/spi/extension/SCCS/s.ServantCachingPolicy.java
+com/sun/corba/se/spi/extension/SCCS/s.CopyObjectPolicy.java
+com/sun/corba/se/spi/extension/SCCS/s.RequestPartitioningPolicy.java
+com/sun/corba/se/spi/extension/SCCS/s.ZeroPortPolicy.java
+com/sun/corba/se/spi/extension/RequestPartitioningPolicy.java
+com/sun/corba/se/spi/extension/CopyObjectPolicy.java
+com/sun/corba/se/spi/extension/ServantCachingPolicy.java
+com/sun/corba/se/spi/extension/ZeroPortPolicy.java
+com/sun/corba/se/spi/ior
+com/sun/corba/se/spi/ior/SCCS
+com/sun/corba/se/spi/ior/SCCS/s.IORFactories.java
+com/sun/corba/se/spi/ior/SCCS/s.IOR.java
+com/sun/corba/se/spi/ior/SCCS/s.EncapsulationFactoryBase.java
+com/sun/corba/se/spi/ior/SCCS/s.IORTemplateList.java
+com/sun/corba/se/spi/ior/SCCS/s.IORFactory.java
+com/sun/corba/se/spi/ior/SCCS/s.IORTemplate.java
+com/sun/corba/se/spi/ior/SCCS/s.IdentifiableFactory.java
+com/sun/corba/se/spi/ior/SCCS/s.Identifiable.java
+com/sun/corba/se/spi/ior/SCCS/s.IdentifiableBase.java
+com/sun/corba/se/spi/ior/SCCS/s.ObjectId.java
+com/sun/corba/se/spi/ior/SCCS/s.IdentifiableContainerBase.java
+com/sun/corba/se/spi/ior/SCCS/s.IdentifiableFactoryFinder.java
+com/sun/corba/se/spi/ior/SCCS/s.MakeImmutable.java
+com/sun/corba/se/spi/ior/SCCS/s.ObjectAdapterId.java
+com/sun/corba/se/spi/ior/SCCS/s.ObjectKeyTemplate.java
+com/sun/corba/se/spi/ior/SCCS/s.ObjectKey.java
+com/sun/corba/se/spi/ior/SCCS/s.ObjectKeyFactory.java
+com/sun/corba/se/spi/ior/SCCS/s.TaggedComponentBase.java
+com/sun/corba/se/spi/ior/SCCS/s.TaggedComponent.java
+com/sun/corba/se/spi/ior/SCCS/s.iornotes
+com/sun/corba/se/spi/ior/SCCS/s.TaggedComponentFactoryFinder.java
+com/sun/corba/se/spi/ior/SCCS/s.TaggedProfile.java
+com/sun/corba/se/spi/ior/SCCS/s.TaggedProfileTemplate.java
+com/sun/corba/se/spi/ior/SCCS/s.TaggedProfileTemplateBase.java
+com/sun/corba/se/spi/ior/SCCS/s.WriteContents.java
+com/sun/corba/se/spi/ior/SCCS/s.Writeable.java
+com/sun/corba/se/spi/ior/SCCS/s.package.html
+com/sun/corba/se/spi/ior/iiop
+com/sun/corba/se/spi/ior/iiop/SCCS
+com/sun/corba/se/spi/ior/iiop/SCCS/s.AlternateIIOPAddressComponent.java
+com/sun/corba/se/spi/ior/iiop/SCCS/s.CodeSetsComponent.java
+com/sun/corba/se/spi/ior/iiop/SCCS/s.GIOPVersion.java
+com/sun/corba/se/spi/ior/iiop/SCCS/s.IIOPAddress.java
+com/sun/corba/se/spi/ior/iiop/SCCS/s.IIOPFactories.java
+com/sun/corba/se/spi/ior/iiop/SCCS/s.IIOPProfile.java
+com/sun/corba/se/spi/ior/iiop/SCCS/s.IIOPProfileTemplate.java
+com/sun/corba/se/spi/ior/iiop/SCCS/s.JavaCodebaseComponent.java
+com/sun/corba/se/spi/ior/iiop/SCCS/s.MaxStreamFormatVersionComponent.java
+com/sun/corba/se/spi/ior/iiop/SCCS/s.ORBTypeComponent.java
+com/sun/corba/se/spi/ior/iiop/SCCS/s.RequestPartitioningComponent.java
+com/sun/corba/se/spi/ior/iiop/MaxStreamFormatVersionComponent.java
+com/sun/corba/se/spi/ior/iiop/AlternateIIOPAddressComponent.java
+com/sun/corba/se/spi/ior/iiop/CodeSetsComponent.java
+com/sun/corba/se/spi/ior/iiop/GIOPVersion.java
+com/sun/corba/se/spi/ior/iiop/IIOPAddress.java
+com/sun/corba/se/spi/ior/iiop/IIOPFactories.java
+com/sun/corba/se/spi/ior/iiop/IIOPProfile.java
+com/sun/corba/se/spi/ior/iiop/IIOPProfileTemplate.java
+com/sun/corba/se/spi/ior/iiop/JavaCodebaseComponent.java
+com/sun/corba/se/spi/ior/iiop/RequestPartitioningComponent.java
+com/sun/corba/se/spi/ior/iiop/ORBTypeComponent.java
+com/sun/corba/se/spi/ior/IORFactories.java
+com/sun/corba/se/spi/ior/IOR.java
+com/sun/corba/se/spi/ior/EncapsulationFactoryBase.java
+com/sun/corba/se/spi/ior/IORTemplate.java
+com/sun/corba/se/spi/ior/IORFactory.java
+com/sun/corba/se/spi/ior/IdentifiableContainerBase.java
+com/sun/corba/se/spi/ior/IORTemplateList.java
+com/sun/corba/se/spi/ior/Identifiable.java
+com/sun/corba/se/spi/ior/IdentifiableBase.java
+com/sun/corba/se/spi/ior/TaggedComponentFactoryFinder.java
+com/sun/corba/se/spi/ior/IdentifiableFactory.java
+com/sun/corba/se/spi/ior/IdentifiableFactoryFinder.java
+com/sun/corba/se/spi/ior/MakeImmutable.java
+com/sun/corba/se/spi/ior/ObjectAdapterId.java
+com/sun/corba/se/spi/ior/ObjectId.java
+com/sun/corba/se/spi/ior/ObjectKey.java
+com/sun/corba/se/spi/ior/ObjectKeyFactory.java
+com/sun/corba/se/spi/ior/ObjectKeyTemplate.java
+com/sun/corba/se/spi/ior/TaggedComponent.java
+com/sun/corba/se/spi/ior/TaggedComponentBase.java
+com/sun/corba/se/spi/ior/TaggedProfileTemplate.java
+com/sun/corba/se/spi/ior/TaggedProfile.java
+com/sun/corba/se/spi/ior/package.html
+com/sun/corba/se/spi/ior/iornotes
+com/sun/corba/se/spi/ior/TaggedProfileTemplateBase.java
+com/sun/corba/se/spi/ior/WriteContents.java
+com/sun/corba/se/spi/ior/Writeable.java
+com/sun/corba/se/spi/legacy
+com/sun/corba/se/spi/legacy/connection
+com/sun/corba/se/spi/legacy/connection/SCCS
+com/sun/corba/se/spi/legacy/connection/SCCS/s.ORBSocketFactory.java
+com/sun/corba/se/spi/legacy/connection/SCCS/s.Connection.java
+com/sun/corba/se/spi/legacy/connection/SCCS/s.README.txt
+com/sun/corba/se/spi/legacy/connection/SCCS/s.GetEndPointInfoAgainException.java
+com/sun/corba/se/spi/legacy/connection/SCCS/s.LegacyServerSocketEndPointInfo.java
+com/sun/corba/se/spi/legacy/connection/SCCS/s.LegacyServerSocketManager.java
+com/sun/corba/se/spi/legacy/connection/ORBSocketFactory.java
+com/sun/corba/se/spi/legacy/connection/Connection.java
+com/sun/corba/se/spi/legacy/connection/README.txt
+com/sun/corba/se/spi/legacy/connection/GetEndPointInfoAgainException.java
+com/sun/corba/se/spi/legacy/connection/LegacyServerSocketEndPointInfo.java
+com/sun/corba/se/spi/legacy/connection/LegacyServerSocketManager.java
+com/sun/corba/se/spi/legacy/interceptor
+com/sun/corba/se/spi/legacy/interceptor/SCCS
+com/sun/corba/se/spi/legacy/interceptor/SCCS/s.ORBInitInfoExt.java
+com/sun/corba/se/spi/legacy/interceptor/SCCS/s.IORInfoExt.java
+com/sun/corba/se/spi/legacy/interceptor/SCCS/s.RequestInfoExt.java
+com/sun/corba/se/spi/legacy/interceptor/SCCS/s.UnknownType.java
+com/sun/corba/se/spi/legacy/interceptor/ORBInitInfoExt.java
+com/sun/corba/se/spi/legacy/interceptor/IORInfoExt.java
+com/sun/corba/se/spi/legacy/interceptor/RequestInfoExt.java
+com/sun/corba/se/spi/legacy/interceptor/UnknownType.java
+com/sun/corba/se/spi/logging
+com/sun/corba/se/spi/logging/SCCS
+com/sun/corba/se/spi/logging/SCCS/s.LogWrapperFactory.java
+com/sun/corba/se/spi/logging/SCCS/s.CORBALogDomains.java
+com/sun/corba/se/spi/logging/SCCS/s.LogWrapperBase.java
+com/sun/corba/se/spi/logging/data
+com/sun/corba/se/spi/logging/data/SCCS
+com/sun/corba/se/spi/logging/data/SCCS/s.Interceptors.mc
+com/sun/corba/se/spi/logging/data/SCCS/s.Activation.mc
+com/sun/corba/se/spi/logging/data/SCCS/s.IOR.mc
+com/sun/corba/se/spi/logging/data/SCCS/s.Naming.mc
+com/sun/corba/se/spi/logging/data/SCCS/s.OMG.mc
+com/sun/corba/se/spi/logging/data/SCCS/s.ORBUtil.mc
+com/sun/corba/se/spi/logging/data/SCCS/s.POA.mc
+com/sun/corba/se/spi/logging/data/SCCS/s.Util.mc
+com/sun/corba/se/spi/logging/data/Activation.mc
+com/sun/corba/se/spi/logging/data/IOR.mc
+com/sun/corba/se/spi/logging/data/Interceptors.mc
+com/sun/corba/se/spi/logging/data/Naming.mc
+com/sun/corba/se/spi/logging/data/OMG.mc
+com/sun/corba/se/spi/logging/data/ORBUtil.mc
+com/sun/corba/se/spi/logging/data/POA.mc
+com/sun/corba/se/spi/logging/data/Util.mc
+com/sun/corba/se/spi/logging/CORBALogDomains.java
+com/sun/corba/se/spi/logging/LogWrapperBase.java
+com/sun/corba/se/spi/logging/LogWrapperFactory.java
+com/sun/corba/se/spi/monitoring
+com/sun/corba/se/spi/monitoring/SCCS
+com/sun/corba/se/spi/monitoring/SCCS/s.MonitoredAttribute.java
+com/sun/corba/se/spi/monitoring/SCCS/s.CorbaMBean.zargo
+com/sun/corba/se/spi/monitoring/SCCS/s.MonitoredAttributeInfoFactory.java
+com/sun/corba/se/spi/monitoring/SCCS/s.LongMonitoredAttributeBase.java
+com/sun/corba/se/spi/monitoring/SCCS/s.MonitoredAttributeBase.java
+com/sun/corba/se/spi/monitoring/SCCS/s.MonitoredAttributeInfo.java
+com/sun/corba/se/spi/monitoring/SCCS/s.MonitoredObjectFactory.java
+com/sun/corba/se/spi/monitoring/SCCS/s.MonitoredObject.java
+com/sun/corba/se/spi/monitoring/SCCS/s.MonitoringConstants.java
+com/sun/corba/se/spi/monitoring/SCCS/s.MonitoringFactories.java
+com/sun/corba/se/spi/monitoring/SCCS/s.MonitoringManager.java
+com/sun/corba/se/spi/monitoring/SCCS/s.cut1.zargo
+com/sun/corba/se/spi/monitoring/SCCS/s.MonitoringManagerFactory.java
+com/sun/corba/se/spi/monitoring/SCCS/s.StatisticMonitoredAttribute.java
+com/sun/corba/se/spi/monitoring/SCCS/s.StatisticsAccumulator.java
+com/sun/corba/se/spi/monitoring/SCCS/s.StringMonitoredAttributeBase.java
+com/sun/corba/se/spi/monitoring/SCCS/s.package.html
+com/sun/corba/se/spi/monitoring/MonitoredAttribute.java
+com/sun/corba/se/spi/monitoring/CorbaMBean.zargo
+com/sun/corba/se/spi/monitoring/cut1.zargo
+com/sun/corba/se/spi/monitoring/LongMonitoredAttributeBase.java
+com/sun/corba/se/spi/monitoring/MonitoredAttributeBase.java
+com/sun/corba/se/spi/monitoring/MonitoredAttributeInfo.java
+com/sun/corba/se/spi/monitoring/MonitoredAttributeInfoFactory.java
+com/sun/corba/se/spi/monitoring/MonitoredObject.java
+com/sun/corba/se/spi/monitoring/MonitoredObjectFactory.java
+com/sun/corba/se/spi/monitoring/MonitoringConstants.java
+com/sun/corba/se/spi/monitoring/MonitoringFactories.java
+com/sun/corba/se/spi/monitoring/MonitoringManager.java
+com/sun/corba/se/spi/monitoring/package.html
+com/sun/corba/se/spi/monitoring/MonitoringManagerFactory.java
+com/sun/corba/se/spi/monitoring/StatisticMonitoredAttribute.java
+com/sun/corba/se/spi/monitoring/StatisticsAccumulator.java
+com/sun/corba/se/spi/monitoring/StringMonitoredAttributeBase.java
+com/sun/corba/se/spi/oa
+com/sun/corba/se/spi/oa/SCCS
+com/sun/corba/se/spi/oa/SCCS/s.OAInvocationInfo.java
+com/sun/corba/se/spi/oa/SCCS/s.NullServant.java
+com/sun/corba/se/spi/oa/SCCS/s.OADefault.java
+com/sun/corba/se/spi/oa/SCCS/s.OADestroyed.java
+com/sun/corba/se/spi/oa/SCCS/s.ObjectAdapter.java
+com/sun/corba/se/spi/oa/SCCS/s.ObjectAdapterBase.java
+com/sun/corba/se/spi/oa/SCCS/s.ObjectAdapterFactory.java
+com/sun/corba/se/spi/oa/OAInvocationInfo.java
+com/sun/corba/se/spi/oa/NullServant.java
+com/sun/corba/se/spi/oa/OADefault.java
+com/sun/corba/se/spi/oa/OADestroyed.java
+com/sun/corba/se/spi/oa/ObjectAdapterFactory.java
+com/sun/corba/se/spi/oa/ObjectAdapter.java
+com/sun/corba/se/spi/oa/ObjectAdapterBase.java
+com/sun/corba/se/spi/orb
+com/sun/corba/se/spi/orb/SCCS
+com/sun/corba/se/spi/orb/SCCS/s.ORBVersionFactory.java
+com/sun/corba/se/spi/orb/SCCS/s.DataCollector.java
+com/sun/corba/se/spi/orb/SCCS/s.ORB.java
+com/sun/corba/se/spi/orb/SCCS/s.ORBConfigurator.java
+com/sun/corba/se/spi/orb/SCCS/s.ORBData.java
+com/sun/corba/se/spi/orb/SCCS/s.ORBVersion.java
+com/sun/corba/se/spi/orb/SCCS/s.ParserDataFactory.java
+com/sun/corba/se/spi/orb/SCCS/s.Operation.java
+com/sun/corba/se/spi/orb/SCCS/s.OperationFactory.java
+com/sun/corba/se/spi/orb/SCCS/s.ParserData.java
+com/sun/corba/se/spi/orb/SCCS/s.ParserImplBase.java
+com/sun/corba/se/spi/orb/SCCS/s.ParserImplTableBase.java
+com/sun/corba/se/spi/orb/SCCS/s.PropertyParser.java
+com/sun/corba/se/spi/orb/SCCS/s.StringPair.java
+com/sun/corba/se/spi/orb/ORBConfigurator.java
+com/sun/corba/se/spi/orb/DataCollector.java
+com/sun/corba/se/spi/orb/ORB.java
+com/sun/corba/se/spi/orb/ORBVersionFactory.java
+com/sun/corba/se/spi/orb/ORBData.java
+com/sun/corba/se/spi/orb/ORBVersion.java
+com/sun/corba/se/spi/orb/OperationFactory.java
+com/sun/corba/se/spi/orb/Operation.java
+com/sun/corba/se/spi/orb/ParserDataFactory.java
+com/sun/corba/se/spi/orb/ParserData.java
+com/sun/corba/se/spi/orb/ParserImplTableBase.java
+com/sun/corba/se/spi/orb/ParserImplBase.java
+com/sun/corba/se/spi/orb/PropertyParser.java
+com/sun/corba/se/spi/orb/StringPair.java
+com/sun/corba/se/spi/orbutil
+com/sun/corba/se/spi/orbutil/closure
+com/sun/corba/se/spi/orbutil/closure/SCCS
+com/sun/corba/se/spi/orbutil/closure/SCCS/s.ClosureFactory.java
+com/sun/corba/se/spi/orbutil/closure/SCCS/s.Closure.java
+com/sun/corba/se/spi/orbutil/closure/ClosureFactory.java
+com/sun/corba/se/spi/orbutil/closure/Closure.java
+com/sun/corba/se/spi/orbutil/fsm
+com/sun/corba/se/spi/orbutil/fsm/SCCS
+com/sun/corba/se/spi/orbutil/fsm/SCCS/s.ActionBase.java
+com/sun/corba/se/spi/orbutil/fsm/SCCS/s.Action.java
+com/sun/corba/se/spi/orbutil/fsm/SCCS/s.GuardBase.java
+com/sun/corba/se/spi/orbutil/fsm/SCCS/s.FSM.java
+com/sun/corba/se/spi/orbutil/fsm/SCCS/s.FSMImpl.java
+com/sun/corba/se/spi/orbutil/fsm/SCCS/s.FSMTest.java
+com/sun/corba/se/spi/orbutil/fsm/SCCS/s.Guard.java
+com/sun/corba/se/spi/orbutil/fsm/SCCS/s.StateEngineFactory.java
+com/sun/corba/se/spi/orbutil/fsm/SCCS/s.Input.java
+com/sun/corba/se/spi/orbutil/fsm/SCCS/s.InputImpl.java
+com/sun/corba/se/spi/orbutil/fsm/SCCS/s.State.java
+com/sun/corba/se/spi/orbutil/fsm/SCCS/s.StateEngine.java
+com/sun/corba/se/spi/orbutil/fsm/SCCS/s.StateImpl.java
+com/sun/corba/se/spi/orbutil/fsm/ActionBase.java
+com/sun/corba/se/spi/orbutil/fsm/Action.java
+com/sun/corba/se/spi/orbutil/fsm/StateEngine.java
+com/sun/corba/se/spi/orbutil/fsm/FSM.java
+com/sun/corba/se/spi/orbutil/fsm/FSMImpl.java
+com/sun/corba/se/spi/orbutil/fsm/FSMTest.java
+com/sun/corba/se/spi/orbutil/fsm/Guard.java
+com/sun/corba/se/spi/orbutil/fsm/GuardBase.java
+com/sun/corba/se/spi/orbutil/fsm/Input.java
+com/sun/corba/se/spi/orbutil/fsm/InputImpl.java
+com/sun/corba/se/spi/orbutil/fsm/State.java
+com/sun/corba/se/spi/orbutil/fsm/StateEngineFactory.java
+com/sun/corba/se/spi/orbutil/fsm/StateImpl.java
+com/sun/corba/se/spi/orbutil/proxy
+com/sun/corba/se/spi/orbutil/proxy/SCCS
+com/sun/corba/se/spi/orbutil/proxy/SCCS/s.CompositeInvocationHandlerImpl.java
+com/sun/corba/se/spi/orbutil/proxy/SCCS/s.CompositeInvocationHandler.java
+com/sun/corba/se/spi/orbutil/proxy/SCCS/s.DelegateInvocationHandlerImpl.java
+com/sun/corba/se/spi/orbutil/proxy/SCCS/s.InvocationHandlerFactory.java
+com/sun/corba/se/spi/orbutil/proxy/SCCS/s.LinkedInvocationHandler.java
+com/sun/corba/se/spi/orbutil/proxy/CompositeInvocationHandlerImpl.java
+com/sun/corba/se/spi/orbutil/proxy/CompositeInvocationHandler.java
+com/sun/corba/se/spi/orbutil/proxy/DelegateInvocationHandlerImpl.java
+com/sun/corba/se/spi/orbutil/proxy/InvocationHandlerFactory.java
+com/sun/corba/se/spi/orbutil/proxy/LinkedInvocationHandler.java
+com/sun/corba/se/spi/orbutil/threadpool
+com/sun/corba/se/spi/orbutil/threadpool/SCCS
+com/sun/corba/se/spi/orbutil/threadpool/SCCS/s.WorkQueue.java
+com/sun/corba/se/spi/orbutil/threadpool/SCCS/s.Work.java
+com/sun/corba/se/spi/orbutil/threadpool/SCCS/s.NoSuchThreadPoolException.java
+com/sun/corba/se/spi/orbutil/threadpool/SCCS/s.NoSuchWorkQueueException.java
+com/sun/corba/se/spi/orbutil/threadpool/SCCS/s.ThreadPool.java
+com/sun/corba/se/spi/orbutil/threadpool/SCCS/s.ThreadPoolChooser.java
+com/sun/corba/se/spi/orbutil/threadpool/SCCS/s.ThreadPoolManager.java
+com/sun/corba/se/spi/orbutil/threadpool/WorkQueue.java
+com/sun/corba/se/spi/orbutil/threadpool/Work.java
+com/sun/corba/se/spi/orbutil/threadpool/NoSuchThreadPoolException.java
+com/sun/corba/se/spi/orbutil/threadpool/NoSuchWorkQueueException.java
+com/sun/corba/se/spi/orbutil/threadpool/ThreadPool.java
+com/sun/corba/se/spi/orbutil/threadpool/ThreadPoolChooser.java
+com/sun/corba/se/spi/orbutil/threadpool/ThreadPoolManager.java
+com/sun/corba/se/spi/presentation
+com/sun/corba/se/spi/presentation/rmi
+com/sun/corba/se/spi/presentation/rmi/SCCS
+com/sun/corba/se/spi/presentation/rmi/SCCS/s.DynamicMethodMarshaller.java
+com/sun/corba/se/spi/presentation/rmi/SCCS/s.DynamicStub.java
+com/sun/corba/se/spi/presentation/rmi/SCCS/s.IDLNameTranslator.java
+com/sun/corba/se/spi/presentation/rmi/SCCS/s.PresentationDefaults.java
+com/sun/corba/se/spi/presentation/rmi/SCCS/s.PresentationManager.java
+com/sun/corba/se/spi/presentation/rmi/SCCS/s.StubAdapter.java
+com/sun/corba/se/spi/presentation/rmi/SCCS/s.StubWrapper.java
+com/sun/corba/se/spi/presentation/rmi/DynamicMethodMarshaller.java
+com/sun/corba/se/spi/presentation/rmi/DynamicStub.java
+com/sun/corba/se/spi/presentation/rmi/IDLNameTranslator.java
+com/sun/corba/se/spi/presentation/rmi/PresentationDefaults.java
+com/sun/corba/se/spi/presentation/rmi/PresentationManager.java
+com/sun/corba/se/spi/presentation/rmi/StubAdapter.java
+com/sun/corba/se/spi/presentation/rmi/StubWrapper.java
+com/sun/corba/se/spi/protocol
+com/sun/corba/se/spi/protocol/SCCS
+com/sun/corba/se/spi/protocol/SCCS/s.CorbaServerRequestDispatcher.java
+com/sun/corba/se/spi/protocol/SCCS/s.ClientDelegateFactory.java
+com/sun/corba/se/spi/protocol/SCCS/s.CorbaClientDelegate.java
+com/sun/corba/se/spi/protocol/SCCS/s.CorbaMessageMediator.java
+com/sun/corba/se/spi/protocol/SCCS/s.CorbaProtocolHandler.java
+com/sun/corba/se/spi/protocol/SCCS/s.ForwardException.java
+com/sun/corba/se/spi/protocol/SCCS/s.PIHandler.java
+com/sun/corba/se/spi/protocol/SCCS/s.InitialServerRequestDispatcher.java
+com/sun/corba/se/spi/protocol/SCCS/s.LocalClientRequestDispatcher.java
+com/sun/corba/se/spi/protocol/SCCS/s.LocalClientRequestDispatcherFactory.java
+com/sun/corba/se/spi/protocol/SCCS/s.RequestDispatcherDefault.java
+com/sun/corba/se/spi/protocol/SCCS/s.RequestDispatcherRegistry.java
+com/sun/corba/se/spi/protocol/SCCS/s.protocol.zargo
+com/sun/corba/se/spi/protocol/CorbaServerRequestDispatcher.java
+com/sun/corba/se/spi/protocol/ClientDelegateFactory.java
+com/sun/corba/se/spi/protocol/CorbaClientDelegate.java
+com/sun/corba/se/spi/protocol/CorbaMessageMediator.java
+com/sun/corba/se/spi/protocol/CorbaProtocolHandler.java
+com/sun/corba/se/spi/protocol/ForwardException.java
+com/sun/corba/se/spi/protocol/PIHandler.java
+com/sun/corba/se/spi/protocol/InitialServerRequestDispatcher.java
+com/sun/corba/se/spi/protocol/LocalClientRequestDispatcher.java
+com/sun/corba/se/spi/protocol/LocalClientRequestDispatcherFactory.java
+com/sun/corba/se/spi/protocol/RequestDispatcherDefault.java
+com/sun/corba/se/spi/protocol/RequestDispatcherRegistry.java
+com/sun/corba/se/spi/protocol/protocol.zargo
+com/sun/corba/se/spi/resolver
+com/sun/corba/se/spi/resolver/SCCS
+com/sun/corba/se/spi/resolver/SCCS/s.LocalResolver.java
+com/sun/corba/se/spi/resolver/SCCS/s.Resolver.java
+com/sun/corba/se/spi/resolver/SCCS/s.ResolverDefault.java
+com/sun/corba/se/spi/resolver/ResolverDefault.java
+com/sun/corba/se/spi/resolver/LocalResolver.java
+com/sun/corba/se/spi/resolver/Resolver.java
+com/sun/corba/se/spi/servicecontext
+com/sun/corba/se/spi/servicecontext/SCCS
+com/sun/corba/se/spi/servicecontext/SCCS/s.CodeSetServiceContext.java
+com/sun/corba/se/spi/servicecontext/SCCS/s.ORBVersionServiceContext.java
+com/sun/corba/se/spi/servicecontext/SCCS/s.MaxStreamFormatVersionServiceContext.java
+com/sun/corba/se/spi/servicecontext/SCCS/s.SendingContextServiceContext.java
+com/sun/corba/se/spi/servicecontext/SCCS/s.ServiceContext.java
+com/sun/corba/se/spi/servicecontext/SCCS/s.ServiceContextData.java
+com/sun/corba/se/spi/servicecontext/SCCS/s.ServiceContextRegistry.java
+com/sun/corba/se/spi/servicecontext/SCCS/s.ServiceContexts.java
+com/sun/corba/se/spi/servicecontext/SCCS/s.UEInfoServiceContext.java
+com/sun/corba/se/spi/servicecontext/SCCS/s.UnknownServiceContext.java
+com/sun/corba/se/spi/servicecontext/ORBVersionServiceContext.java
+com/sun/corba/se/spi/servicecontext/CodeSetServiceContext.java
+com/sun/corba/se/spi/servicecontext/MaxStreamFormatVersionServiceContext.java
+com/sun/corba/se/spi/servicecontext/SendingContextServiceContext.java
+com/sun/corba/se/spi/servicecontext/ServiceContext.java
+com/sun/corba/se/spi/servicecontext/ServiceContextData.java
+com/sun/corba/se/spi/servicecontext/ServiceContextRegistry.java
+com/sun/corba/se/spi/servicecontext/ServiceContexts.java
+com/sun/corba/se/spi/servicecontext/UEInfoServiceContext.java
+com/sun/corba/se/spi/servicecontext/UnknownServiceContext.java
+com/sun/corba/se/spi/transport
+com/sun/corba/se/spi/transport/SCCS
+com/sun/corba/se/spi/transport/SCCS/s.CorbaConnectionCache.java
+com/sun/corba/se/spi/transport/SCCS/s.CorbaAcceptor.java
+com/sun/corba/se/spi/transport/SCCS/s.CorbaConnection.java
+com/sun/corba/se/spi/transport/SCCS/s.CorbaContactInfoListFactory.java
+com/sun/corba/se/spi/transport/SCCS/s.CorbaContactInfo.java
+com/sun/corba/se/spi/transport/SCCS/s.CorbaContactInfoList.java
+com/sun/corba/se/spi/transport/SCCS/s.CorbaContactInfoListIterator.java
+com/sun/corba/se/spi/transport/SCCS/s.CorbaResponseWaitingRoom.java
+com/sun/corba/se/spi/transport/SCCS/s.CorbaTransportManager.java
+com/sun/corba/se/spi/transport/SCCS/s.IIOPPrimaryToContactInfo.java
+com/sun/corba/se/spi/transport/SCCS/s.IORToSocketInfo.java
+com/sun/corba/se/spi/transport/SCCS/s.IORTransformer.java
+com/sun/corba/se/spi/transport/SCCS/s.ORBSocketFactory.java
+com/sun/corba/se/spi/transport/SCCS/s.ReadTimeouts.java
+com/sun/corba/se/spi/transport/SCCS/s.ReadTimeoutsFactory.java
+com/sun/corba/se/spi/transport/SCCS/s.SocketInfo.java
+com/sun/corba/se/spi/transport/SCCS/s.SocketOrChannelAcceptor.java
+com/sun/corba/se/spi/transport/SCCS/s.TransportDefault.java
+com/sun/corba/se/spi/transport/CorbaConnection.java
+com/sun/corba/se/spi/transport/CorbaAcceptor.java
+com/sun/corba/se/spi/transport/CorbaContactInfoListFactory.java
+com/sun/corba/se/spi/transport/CorbaConnectionCache.java
+com/sun/corba/se/spi/transport/CorbaContactInfo.java
+com/sun/corba/se/spi/transport/CorbaContactInfoList.java
+com/sun/corba/se/spi/transport/CorbaContactInfoListIterator.java
+com/sun/corba/se/spi/transport/CorbaResponseWaitingRoom.java
+com/sun/corba/se/spi/transport/CorbaTransportManager.java
+com/sun/corba/se/spi/transport/IIOPPrimaryToContactInfo.java
+com/sun/corba/se/spi/transport/IORToSocketInfo.java
+com/sun/corba/se/spi/transport/IORTransformer.java
+com/sun/corba/se/spi/transport/SocketOrChannelAcceptor.java
+com/sun/corba/se/spi/transport/ORBSocketFactory.java
+com/sun/corba/se/spi/transport/ReadTimeouts.java
+com/sun/corba/se/spi/transport/ReadTimeoutsFactory.java
+com/sun/corba/se/spi/transport/SocketInfo.java
+com/sun/corba/se/spi/transport/TransportDefault.java
+com/sun/image
+com/sun/image/codec
+com/sun/image/codec/jpeg
+com/sun/image/codec/jpeg/SCCS
+com/sun/image/codec/jpeg/SCCS/s.TruncatedFileException.java
+com/sun/image/codec/jpeg/SCCS/s.ImageFormatException.java
+com/sun/image/codec/jpeg/SCCS/s.JPEGCodec.java
+com/sun/image/codec/jpeg/SCCS/s.JPEGDecodeParam.java
+com/sun/image/codec/jpeg/SCCS/s.JPEGEncodeParam.java
+com/sun/image/codec/jpeg/SCCS/s.JPEGHuffmanTable.java
+com/sun/image/codec/jpeg/SCCS/s.JPEGImageDecoder.java
+com/sun/image/codec/jpeg/SCCS/s.JPEGImageEncoder.java
+com/sun/image/codec/jpeg/SCCS/s.JPEGQTable.java
+com/sun/image/codec/jpeg/SCCS/s.package.html
+com/sun/image/codec/jpeg/ImageFormatException.java
+com/sun/image/codec/jpeg/JPEGCodec.java
+com/sun/image/codec/jpeg/JPEGDecodeParam.java
+com/sun/image/codec/jpeg/JPEGEncodeParam.java
+com/sun/image/codec/jpeg/JPEGHuffmanTable.java
+com/sun/image/codec/jpeg/JPEGImageDecoder.java
+com/sun/image/codec/jpeg/JPEGImageEncoder.java
+com/sun/image/codec/jpeg/JPEGQTable.java
+com/sun/image/codec/jpeg/TruncatedFileException.java
+com/sun/image/codec/jpeg/package.html
+com/sun/imageio
+com/sun/imageio/metadata
+com/sun/imageio/metadata/SCCS
+com/sun/imageio/metadata/SCCS/s.XmlChars.java
+com/sun/imageio/metadata/SCCS/s.XmlNames.java
+com/sun/imageio/metadata/XmlChars.java
+com/sun/imageio/metadata/XmlNames.java
+com/sun/imageio/plugins
+com/sun/imageio/plugins/bmp
+com/sun/imageio/plugins/bmp/SCCS
+com/sun/imageio/plugins/bmp/SCCS/s.BMPImageReader.java
+com/sun/imageio/plugins/bmp/SCCS/s.BMPConstants.java
+com/sun/imageio/plugins/bmp/SCCS/s.BMPMetadataFormatResources.java
+com/sun/imageio/plugins/bmp/SCCS/s.BMPImageReaderSpi.java
+com/sun/imageio/plugins/bmp/SCCS/s.BMPImageWriter.java
+com/sun/imageio/plugins/bmp/SCCS/s.BMPImageWriterSpi.java
+com/sun/imageio/plugins/bmp/SCCS/s.BMPMetadata.java
+com/sun/imageio/plugins/bmp/SCCS/s.BMPMetadataFormat.java
+com/sun/imageio/plugins/bmp/BMPImageReaderSpi.java
+com/sun/imageio/plugins/bmp/BMPConstants.java
+com/sun/imageio/plugins/bmp/BMPImageReader.java
+com/sun/imageio/plugins/bmp/BMPMetadataFormatResources.java
+com/sun/imageio/plugins/bmp/BMPImageWriter.java
+com/sun/imageio/plugins/bmp/BMPImageWriterSpi.java
+com/sun/imageio/plugins/bmp/BMPMetadata.java
+com/sun/imageio/plugins/bmp/BMPMetadataFormat.java
+com/sun/imageio/plugins/common
+com/sun/imageio/plugins/common/SCCS
+com/sun/imageio/plugins/common/SCCS/s.InputStreamAdapter.java
+com/sun/imageio/plugins/common/SCCS/s.BogusColorSpace.java
+com/sun/imageio/plugins/common/SCCS/s.I18N.java
+com/sun/imageio/plugins/common/SCCS/s.I18NImpl.java
+com/sun/imageio/plugins/common/SCCS/s.ImageUtil.java
+com/sun/imageio/plugins/common/SCCS/s.StandardMetadataFormatResources.java
+com/sun/imageio/plugins/common/SCCS/s.StandardMetadataFormat.java
+com/sun/imageio/plugins/common/SCCS/s.SubImageInputStream.java
+com/sun/imageio/plugins/common/SCCS/s.iio-plugin.properties
+com/sun/imageio/plugins/common/StandardMetadataFormat.java
+com/sun/imageio/plugins/common/BogusColorSpace.java
+com/sun/imageio/plugins/common/I18N.java
+com/sun/imageio/plugins/common/I18NImpl.java
+com/sun/imageio/plugins/common/ImageUtil.java
+com/sun/imageio/plugins/common/InputStreamAdapter.java
+com/sun/imageio/plugins/common/StandardMetadataFormatResources.java
+com/sun/imageio/plugins/common/SubImageInputStream.java
+com/sun/imageio/plugins/common/iio-plugin.properties
+com/sun/imageio/plugins/gif
+com/sun/imageio/plugins/gif/SCCS
+com/sun/imageio/plugins/gif/SCCS/s.GIFImageMetadataFormat.java
+com/sun/imageio/plugins/gif/SCCS/s.GIFImageMetadata.java
+com/sun/imageio/plugins/gif/SCCS/s.GIFImageMetadataFormatResources.java
+com/sun/imageio/plugins/gif/SCCS/s.GIFImageReader.java
+com/sun/imageio/plugins/gif/SCCS/s.GIFImageReaderSpi.java
+com/sun/imageio/plugins/gif/SCCS/s.GIFStreamMetadata.java
+com/sun/imageio/plugins/gif/SCCS/s.GIFStreamMetadataFormat.java
+com/sun/imageio/plugins/gif/SCCS/s.GIFStreamMetadataFormatResources.java
+com/sun/imageio/plugins/gif/GIFImageMetadataFormat.java
+com/sun/imageio/plugins/gif/GIFImageMetadata.java
+com/sun/imageio/plugins/gif/GIFImageMetadataFormatResources.java
+com/sun/imageio/plugins/gif/GIFImageReader.java
+com/sun/imageio/plugins/gif/GIFImageReaderSpi.java
+com/sun/imageio/plugins/gif/GIFStreamMetadata.java
+com/sun/imageio/plugins/gif/GIFStreamMetadataFormat.java
+com/sun/imageio/plugins/gif/GIFStreamMetadataFormatResources.java
+com/sun/imageio/plugins/jpeg
+com/sun/imageio/plugins/jpeg/SCCS
+com/sun/imageio/plugins/jpeg/SCCS/s.JPEGImageMetadataFormat.java
+com/sun/imageio/plugins/jpeg/SCCS/s.AdobeMarkerSegment.java
+com/sun/imageio/plugins/jpeg/SCCS/s.COMMarkerSegment.java
+com/sun/imageio/plugins/jpeg/SCCS/s.DHTMarkerSegment.java
+com/sun/imageio/plugins/jpeg/SCCS/s.DQTMarkerSegment.java
+com/sun/imageio/plugins/jpeg/SCCS/s.DRIMarkerSegment.java
+com/sun/imageio/plugins/jpeg/SCCS/s.JFIFMarkerSegment.java
+com/sun/imageio/plugins/jpeg/SCCS/s.JPEG.java
+com/sun/imageio/plugins/jpeg/SCCS/s.JPEGBuffer.java
+com/sun/imageio/plugins/jpeg/SCCS/s.JPEGImageWriterResources.java
+com/sun/imageio/plugins/jpeg/SCCS/s.JPEGImageMetadataFormatResources.java
+com/sun/imageio/plugins/jpeg/SCCS/s.JPEGImageReader.java
+com/sun/imageio/plugins/jpeg/SCCS/s.JPEGImageReaderResources.java
+com/sun/imageio/plugins/jpeg/SCCS/s.JPEGImageReaderSpi.java
+com/sun/imageio/plugins/jpeg/SCCS/s.JPEGImageWriter.java
+com/sun/imageio/plugins/jpeg/SCCS/s.JPEGMetadataFormatResources.java
+com/sun/imageio/plugins/jpeg/SCCS/s.JPEGImageWriterSpi.java
+com/sun/imageio/plugins/jpeg/SCCS/s.JPEGMetadata.java
+com/sun/imageio/plugins/jpeg/SCCS/s.JPEGMetadataFormat.java
+com/sun/imageio/plugins/jpeg/SCCS/s.JPEGStreamMetadataFormat.java
+com/sun/imageio/plugins/jpeg/SCCS/s.MarkerSegment.java
+com/sun/imageio/plugins/jpeg/SCCS/s.JPEGStreamMetadataFormatResources.java
+com/sun/imageio/plugins/jpeg/SCCS/s.SOFMarkerSegment.java
+com/sun/imageio/plugins/jpeg/SCCS/s.SOSMarkerSegment.java
+com/sun/imageio/plugins/jpeg/JPEGImageMetadataFormat.java
+com/sun/imageio/plugins/jpeg/AdobeMarkerSegment.java
+com/sun/imageio/plugins/jpeg/COMMarkerSegment.java
+com/sun/imageio/plugins/jpeg/DHTMarkerSegment.java
+com/sun/imageio/plugins/jpeg/DQTMarkerSegment.java
+com/sun/imageio/plugins/jpeg/DRIMarkerSegment.java
+com/sun/imageio/plugins/jpeg/JFIFMarkerSegment.java
+com/sun/imageio/plugins/jpeg/JPEG.java
+com/sun/imageio/plugins/jpeg/JPEGBuffer.java
+com/sun/imageio/plugins/jpeg/JPEGImageWriterResources.java
+com/sun/imageio/plugins/jpeg/JPEGImageMetadataFormatResources.java
+com/sun/imageio/plugins/jpeg/JPEGImageReader.java
+com/sun/imageio/plugins/jpeg/JPEGImageReaderResources.java
+com/sun/imageio/plugins/jpeg/JPEGImageReaderSpi.java
+com/sun/imageio/plugins/jpeg/JPEGImageWriter.java
+com/sun/imageio/plugins/jpeg/JPEGStreamMetadataFormat.java
+com/sun/imageio/plugins/jpeg/JPEGImageWriterSpi.java
+com/sun/imageio/plugins/jpeg/JPEGMetadata.java
+com/sun/imageio/plugins/jpeg/JPEGMetadataFormat.java
+com/sun/imageio/plugins/jpeg/JPEGStreamMetadataFormatResources.java
+com/sun/imageio/plugins/jpeg/JPEGMetadataFormatResources.java
+com/sun/imageio/plugins/jpeg/MarkerSegment.java
+com/sun/imageio/plugins/jpeg/SOFMarkerSegment.java
+com/sun/imageio/plugins/jpeg/SOSMarkerSegment.java
+com/sun/imageio/plugins/png
+com/sun/imageio/plugins/png/SCCS
+com/sun/imageio/plugins/png/SCCS/s.PNGImageReaderSpi.java
+com/sun/imageio/plugins/png/SCCS/s.PNGImageReader.java
+com/sun/imageio/plugins/png/SCCS/s.PNGMetadataFormatResources.java
+com/sun/imageio/plugins/png/SCCS/s.PNGImageWriter.java
+com/sun/imageio/plugins/png/SCCS/s.PNGImageWriterSpi.java
+com/sun/imageio/plugins/png/SCCS/s.PNGMetadata.java
+com/sun/imageio/plugins/png/SCCS/s.PNGMetadataFormat.java
+com/sun/imageio/plugins/png/SCCS/s.RowFilter.java
+com/sun/imageio/plugins/png/PNGImageReaderSpi.java
+com/sun/imageio/plugins/png/PNGImageReader.java
+com/sun/imageio/plugins/png/PNGMetadataFormatResources.java
+com/sun/imageio/plugins/png/PNGImageWriter.java
+com/sun/imageio/plugins/png/PNGImageWriterSpi.java
+com/sun/imageio/plugins/png/PNGMetadata.java
+com/sun/imageio/plugins/png/PNGMetadataFormat.java
+com/sun/imageio/plugins/png/RowFilter.java
+com/sun/imageio/plugins/wbmp
+com/sun/imageio/plugins/wbmp/SCCS
+com/sun/imageio/plugins/wbmp/SCCS/s.WBMPImageReaderSpi.java
+com/sun/imageio/plugins/wbmp/SCCS/s.WBMPImageReader.java
+com/sun/imageio/plugins/wbmp/SCCS/s.WBMPImageWriter.java
+com/sun/imageio/plugins/wbmp/SCCS/s.WBMPImageWriterSpi.java
+com/sun/imageio/plugins/wbmp/SCCS/s.WBMPMetadata.java
+com/sun/imageio/plugins/wbmp/SCCS/s.WBMPMetadataFormat.java
+com/sun/imageio/plugins/wbmp/WBMPImageReader.java
+com/sun/imageio/plugins/wbmp/WBMPImageReaderSpi.java
+com/sun/imageio/plugins/wbmp/WBMPImageWriter.java
+com/sun/imageio/plugins/wbmp/WBMPImageWriterSpi.java
+com/sun/imageio/plugins/wbmp/WBMPMetadata.java
+com/sun/imageio/plugins/wbmp/WBMPMetadataFormat.java
+com/sun/imageio/spi
+com/sun/imageio/spi/SCCS
+com/sun/imageio/spi/SCCS/s.InputStreamImageInputStreamSpi.java
+com/sun/imageio/spi/SCCS/s.FileImageInputStreamSpi.java
+com/sun/imageio/spi/SCCS/s.FileImageOutputStreamSpi.java
+com/sun/imageio/spi/SCCS/s.OutputStreamImageOutputStreamSpi.java
+com/sun/imageio/spi/SCCS/s.RAFImageInputStreamSpi.java
+com/sun/imageio/spi/SCCS/s.RAFImageOutputStreamSpi.java
+com/sun/imageio/spi/InputStreamImageInputStreamSpi.java
+com/sun/imageio/spi/FileImageInputStreamSpi.java
+com/sun/imageio/spi/FileImageOutputStreamSpi.java
+com/sun/imageio/spi/OutputStreamImageOutputStreamSpi.java
+com/sun/imageio/spi/RAFImageInputStreamSpi.java
+com/sun/imageio/spi/RAFImageOutputStreamSpi.java
+com/sun/inputmethods
+com/sun/inputmethods/internal
+com/sun/inputmethods/internal/indicim
+com/sun/inputmethods/internal/indicim/SCCS
+com/sun/inputmethods/internal/indicim/SCCS/s.DevanagariInputMethodDescriptor.java
+com/sun/inputmethods/internal/indicim/SCCS/s.DevanagariTables.java
+com/sun/inputmethods/internal/indicim/SCCS/s.IndicInputMethod.java
+com/sun/inputmethods/internal/indicim/SCCS/s.IndicInputMethodImpl.java
+com/sun/inputmethods/internal/indicim/SCCS/s.java.awt.im.spi.InputMethodDescriptor
+com/sun/inputmethods/internal/indicim/resources
+com/sun/inputmethods/internal/indicim/resources/SCCS
+com/sun/inputmethods/internal/indicim/resources/SCCS/s.DisplayNames_de.properties
+com/sun/inputmethods/internal/indicim/resources/SCCS/s.DisplayNames.properties
+com/sun/inputmethods/internal/indicim/resources/SCCS/s.DisplayNames_es.properties
+com/sun/inputmethods/internal/indicim/resources/SCCS/s.DisplayNames_fr.properties
+com/sun/inputmethods/internal/indicim/resources/SCCS/s.DisplayNames_it.properties
+com/sun/inputmethods/internal/indicim/resources/SCCS/s.DisplayNames_ja.properties
+com/sun/inputmethods/internal/indicim/resources/SCCS/s.DisplayNames_ko.properties
+com/sun/inputmethods/internal/indicim/resources/SCCS/s.DisplayNames_sv.properties
+com/sun/inputmethods/internal/indicim/resources/SCCS/s.DisplayNames_zh_CN.properties
+com/sun/inputmethods/internal/indicim/resources/SCCS/s.DisplayNames_zh_TW.properties
+com/sun/inputmethods/internal/indicim/resources/DisplayNames_de.properties
+com/sun/inputmethods/internal/indicim/resources/DisplayNames.properties
+com/sun/inputmethods/internal/indicim/resources/DisplayNames_es.properties
+com/sun/inputmethods/internal/indicim/resources/DisplayNames_fr.properties
+com/sun/inputmethods/internal/indicim/resources/DisplayNames_it.properties
+com/sun/inputmethods/internal/indicim/resources/DisplayNames_ja.properties
+com/sun/inputmethods/internal/indicim/resources/DisplayNames_ko.properties
+com/sun/inputmethods/internal/indicim/resources/DisplayNames_sv.properties
+com/sun/inputmethods/internal/indicim/resources/DisplayNames_zh_CN.properties
+com/sun/inputmethods/internal/indicim/resources/DisplayNames_zh_TW.properties
+com/sun/inputmethods/internal/indicim/DevanagariInputMethodDescriptor.java
+com/sun/inputmethods/internal/indicim/DevanagariTables.java
+com/sun/inputmethods/internal/indicim/IndicInputMethod.java
+com/sun/inputmethods/internal/indicim/IndicInputMethodImpl.java
+com/sun/inputmethods/internal/indicim/java.awt.im.spi.InputMethodDescriptor
+com/sun/inputmethods/internal/thaiim
+com/sun/inputmethods/internal/thaiim/SCCS
+com/sun/inputmethods/internal/thaiim/SCCS/s.ThaiInputMethodImpl.java
+com/sun/inputmethods/internal/thaiim/SCCS/s.ThaiInputMethod.java
+com/sun/inputmethods/internal/thaiim/SCCS/s.ThaiInputMethodDescriptor.java
+com/sun/inputmethods/internal/thaiim/SCCS/s.ThaiRules.java
+com/sun/inputmethods/internal/thaiim/SCCS/s.java.awt.im.spi.InputMethodDescriptor
+com/sun/inputmethods/internal/thaiim/resources
+com/sun/inputmethods/internal/thaiim/resources/SCCS
+com/sun/inputmethods/internal/thaiim/resources/SCCS/s.DisplayNames.properties
+com/sun/inputmethods/internal/thaiim/resources/DisplayNames.properties
+com/sun/inputmethods/internal/thaiim/ThaiInputMethodDescriptor.java
+com/sun/inputmethods/internal/thaiim/ThaiInputMethod.java
+com/sun/inputmethods/internal/thaiim/ThaiInputMethodImpl.java
+com/sun/inputmethods/internal/thaiim/ThaiRules.java
+com/sun/inputmethods/internal/thaiim/java.awt.im.spi.InputMethodDescriptor
+com/sun/jarsigner
+com/sun/jarsigner/SCCS
+com/sun/jarsigner/SCCS/s.ContentSignerParameters.java
+com/sun/jarsigner/SCCS/s.ContentSigner.java
+com/sun/jarsigner/SCCS/s.package.html
+com/sun/jarsigner/ContentSigner.java
+com/sun/jarsigner/package.html
+com/sun/jarsigner/ContentSignerParameters.java
+com/sun/java
+com/sun/java/browser
+com/sun/java/browser/dom
+com/sun/java/browser/dom/SCCS
+com/sun/java/browser/dom/SCCS/s.DOMUnsupportedException.java
+com/sun/java/browser/dom/SCCS/s.DOMAccessException.java
+com/sun/java/browser/dom/SCCS/s.DOMAccessor.java
+com/sun/java/browser/dom/SCCS/s.DOMAction.java
+com/sun/java/browser/dom/SCCS/s.DOMService.java
+com/sun/java/browser/dom/SCCS/s.DOMServiceProvider.java
+com/sun/java/browser/dom/DOMUnsupportedException.java
+com/sun/java/browser/dom/DOMAccessException.java
+com/sun/java/browser/dom/DOMAccessor.java
+com/sun/java/browser/dom/DOMAction.java
+com/sun/java/browser/dom/DOMService.java
+com/sun/java/browser/dom/DOMServiceProvider.java
+com/sun/java/browser/net
+com/sun/java/browser/net/SCCS
+com/sun/java/browser/net/SCCS/s.ProxyServiceProvider.java
+com/sun/java/browser/net/SCCS/s.ProxyInfo.java
+com/sun/java/browser/net/SCCS/s.ProxyService.java
+com/sun/java/browser/net/ProxyService.java
+com/sun/java/browser/net/ProxyInfo.java
+com/sun/java/browser/net/ProxyServiceProvider.java
+com/sun/java/swing
+com/sun/java/swing/SCCS
+com/sun/java/swing/SCCS/s.SwingUtilities2.java
+com/sun/java/swing/plaf
+com/sun/java/swing/plaf/gtk
+com/sun/java/swing/plaf/gtk/SCCS
+com/sun/java/swing/plaf/gtk/SCCS/s.BluecurveEngineParser.java
+com/sun/java/swing/plaf/gtk/SCCS/s.BluecurveColorType.java
+com/sun/java/swing/plaf/gtk/SCCS/s.BluecurveEngine.java
+com/sun/java/swing/plaf/gtk/SCCS/s.BlueprintEngineParser.java
+com/sun/java/swing/plaf/gtk/SCCS/s.BluecurveStyle.java
+com/sun/java/swing/plaf/gtk/SCCS/s.BlueprintEngine.java
+com/sun/java/swing/plaf/gtk/SCCS/s.BlueprintGraphicsUtils.java
+com/sun/java/swing/plaf/gtk/SCCS/s.BlueprintStyle.java
+com/sun/java/swing/plaf/gtk/SCCS/s.CircularIdentityList.java
+com/sun/java/swing/plaf/gtk/SCCS/s.GTKColorChooserPanel.java
+com/sun/java/swing/plaf/gtk/SCCS/s.GTKColorType.java
+com/sun/java/swing/plaf/gtk/SCCS/s.GTKConstants.java
+com/sun/java/swing/plaf/gtk/SCCS/s.GTKEngine.java
+com/sun/java/swing/plaf/gtk/SCCS/s.GTKEngineParser.java
+com/sun/java/swing/plaf/gtk/SCCS/s.GTKFileChooserUI.java
+com/sun/java/swing/plaf/gtk/SCCS/s.GTKGraphicsUtils.java
+com/sun/java/swing/plaf/gtk/SCCS/s.GTKIconFactory.java
+com/sun/java/swing/plaf/gtk/SCCS/s.GTKLookAndFeel.java
+com/sun/java/swing/plaf/gtk/SCCS/s.GTKPainter.java
+com/sun/java/swing/plaf/gtk/SCCS/s.GTKParser.java
+com/sun/java/swing/plaf/gtk/SCCS/s.GTKRegion.java
+com/sun/java/swing/plaf/gtk/SCCS/s.GTKScanner.java
+com/sun/java/swing/plaf/gtk/SCCS/s.GTKStyle.java
+com/sun/java/swing/plaf/gtk/SCCS/s.GTKStyleFactory.java
+com/sun/java/swing/plaf/gtk/SCCS/s.Metacity.java
+com/sun/java/swing/plaf/gtk/SCCS/s.PangoFonts.java
+com/sun/java/swing/plaf/gtk/SCCS/s.PixmapEngine.java
+com/sun/java/swing/plaf/gtk/SCCS/s.PixmapEngineParser.java
+com/sun/java/swing/plaf/gtk/SCCS/s.PixmapStyle.java
+com/sun/java/swing/plaf/gtk/SCCS/s.PropertyParser.java
+com/sun/java/swing/plaf/gtk/SCCS/s.XColors.java
+com/sun/java/swing/plaf/gtk/SCCS/s.package.html
+com/sun/java/swing/plaf/gtk/icons
+com/sun/java/swing/plaf/gtk/icons/SCCS
+com/sun/java/swing/plaf/gtk/icons/SCCS/s.Directory.gif
+com/sun/java/swing/plaf/gtk/icons/SCCS/s.File.gif
+com/sun/java/swing/plaf/gtk/icons/Directory.gif
+com/sun/java/swing/plaf/gtk/icons/File.gif
+com/sun/java/swing/plaf/gtk/resources
+com/sun/java/swing/plaf/gtk/resources/SCCS
+com/sun/java/swing/plaf/gtk/resources/SCCS/s.gtk-dialog-error-6.png
+com/sun/java/swing/plaf/gtk/resources/SCCS/s.gtk-cancel-4.png
+com/sun/java/swing/plaf/gtk/resources/SCCS/s.gtk-dialog-question-6.png
+com/sun/java/swing/plaf/gtk/resources/SCCS/s.gtk-dialog-info-6.png
+com/sun/java/swing/plaf/gtk/resources/SCCS/s.gtk-dialog-warning-6.png
+com/sun/java/swing/plaf/gtk/resources/SCCS/s.gtk-no-4.png
+com/sun/java/swing/plaf/gtk/resources/SCCS/s.gtk-ok-4.png
+com/sun/java/swing/plaf/gtk/resources/SCCS/s.gtk-yes-4.png
+com/sun/java/swing/plaf/gtk/resources/SCCS/s.gtk.properties
+com/sun/java/swing/plaf/gtk/resources/SCCS/s.gtk_de.properties
+com/sun/java/swing/plaf/gtk/resources/SCCS/s.gtk_es.properties
+com/sun/java/swing/plaf/gtk/resources/SCCS/s.gtk_fr.properties
+com/sun/java/swing/plaf/gtk/resources/SCCS/s.gtk_it.properties
+com/sun/java/swing/plaf/gtk/resources/SCCS/s.gtk_ja.properties
+com/sun/java/swing/plaf/gtk/resources/SCCS/s.gtk_ko.properties
+com/sun/java/swing/plaf/gtk/resources/SCCS/s.gtk_sv.properties
+com/sun/java/swing/plaf/gtk/resources/SCCS/s.gtk_zh_CN.properties
+com/sun/java/swing/plaf/gtk/resources/SCCS/s.gtk_zh_TW.properties
+com/sun/java/swing/plaf/gtk/resources/metacity
+com/sun/java/swing/plaf/gtk/resources/metacity/SwingFallbackTheme
+com/sun/java/swing/plaf/gtk/resources/metacity/SwingFallbackTheme/metacity-1
+com/sun/java/swing/plaf/gtk/resources/metacity/SwingFallbackTheme/metacity-1/SCCS
+com/sun/java/swing/plaf/gtk/resources/metacity/SwingFallbackTheme/metacity-1/SCCS/s.metacity-theme-1.xml
+com/sun/java/swing/plaf/gtk/resources/metacity/SwingFallbackTheme/metacity-1/metacity-theme-1.xml
+com/sun/java/swing/plaf/gtk/resources/gtk-dialog-error-6.png
+com/sun/java/swing/plaf/gtk/resources/gtk-cancel-4.png
+com/sun/java/swing/plaf/gtk/resources/gtk-dialog-info-6.png
+com/sun/java/swing/plaf/gtk/resources/gtk-dialog-question-6.png
+com/sun/java/swing/plaf/gtk/resources/gtk-dialog-warning-6.png
+com/sun/java/swing/plaf/gtk/resources/gtk-no-4.png
+com/sun/java/swing/plaf/gtk/resources/gtk-ok-4.png
+com/sun/java/swing/plaf/gtk/resources/gtk-yes-4.png
+com/sun/java/swing/plaf/gtk/resources/gtk.properties
+com/sun/java/swing/plaf/gtk/resources/gtk_de.properties
+com/sun/java/swing/plaf/gtk/resources/gtk_es.properties
+com/sun/java/swing/plaf/gtk/resources/gtk_fr.properties
+com/sun/java/swing/plaf/gtk/resources/gtk_it.properties
+com/sun/java/swing/plaf/gtk/resources/gtk_ja.properties
+com/sun/java/swing/plaf/gtk/resources/gtk_ko.properties
+com/sun/java/swing/plaf/gtk/resources/gtk_sv.properties
+com/sun/java/swing/plaf/gtk/resources/gtk_zh_CN.properties
+com/sun/java/swing/plaf/gtk/resources/gtk_zh_TW.properties
+com/sun/java/swing/plaf/gtk/BluecurveEngineParser.java
+com/sun/java/swing/plaf/gtk/BluecurveColorType.java
+com/sun/java/swing/plaf/gtk/BluecurveEngine.java
+com/sun/java/swing/plaf/gtk/BlueprintEngineParser.java
+com/sun/java/swing/plaf/gtk/BluecurveStyle.java
+com/sun/java/swing/plaf/gtk/BlueprintEngine.java
+com/sun/java/swing/plaf/gtk/BlueprintGraphicsUtils.java
+com/sun/java/swing/plaf/gtk/BlueprintStyle.java
+com/sun/java/swing/plaf/gtk/CircularIdentityList.java
+com/sun/java/swing/plaf/gtk/GTKColorChooserPanel.java
+com/sun/java/swing/plaf/gtk/GTKColorType.java
+com/sun/java/swing/plaf/gtk/GTKConstants.java
+com/sun/java/swing/plaf/gtk/GTKEngine.java
+com/sun/java/swing/plaf/gtk/GTKPainter.java
+com/sun/java/swing/plaf/gtk/GTKEngineParser.java
+com/sun/java/swing/plaf/gtk/GTKFileChooserUI.java
+com/sun/java/swing/plaf/gtk/GTKGraphicsUtils.java
+com/sun/java/swing/plaf/gtk/GTKIconFactory.java
+com/sun/java/swing/plaf/gtk/GTKLookAndFeel.java
+com/sun/java/swing/plaf/gtk/GTKParser.java
+com/sun/java/swing/plaf/gtk/GTKRegion.java
+com/sun/java/swing/plaf/gtk/GTKScanner.java
+com/sun/java/swing/plaf/gtk/GTKStyle.java
+com/sun/java/swing/plaf/gtk/GTKStyleFactory.java
+com/sun/java/swing/plaf/gtk/Metacity.java
+com/sun/java/swing/plaf/gtk/PangoFonts.java
+com/sun/java/swing/plaf/gtk/PixmapEngine.java
+com/sun/java/swing/plaf/gtk/PixmapEngineParser.java
+com/sun/java/swing/plaf/gtk/PixmapStyle.java
+com/sun/java/swing/plaf/gtk/PropertyParser.java
+com/sun/java/swing/plaf/gtk/XColors.java
+com/sun/java/swing/plaf/gtk/package.html
+com/sun/java/swing/plaf/motif
+com/sun/java/swing/plaf/motif/SCCS
+com/sun/java/swing/plaf/motif/SCCS/s.MotifButtonListener.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifBorders.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifCheckBoxMenuItemUI.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifButtonUI.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifComboBoxRenderer.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifCheckBoxUI.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifDesktopIconUI.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifComboBoxUI.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifDesktopPaneUI.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifEditorPaneUI.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifFileChooserUI.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifGraphicsUtils.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifLabelUI.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifMenuMouseListener.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifIconFactory.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifInternalFrameTitlePane.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifInternalFrameUI.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifLookAndFeel.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifMenuBarUI.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifMenuItemUI.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifRadioButtonMenuItemUI.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifMenuMouseMotionListener.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifMenuUI.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifOptionPaneUI.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifPasswordFieldUI.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifPopupMenuSeparatorUI.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifPopupMenuUI.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifProgressBarUI.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifSplitPaneDivider.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifRadioButtonUI.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifScrollBarButton.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifScrollBarUI.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifScrollPaneUI.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifSeparatorUI.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifSliderUI.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifSplitPaneUI.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifTabbedPaneUI.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifTextAreaUI.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifTextFieldUI.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifTextPaneUI.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifTextUI.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifTreeUI.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifToggleButtonUI.java
+com/sun/java/swing/plaf/motif/SCCS/s.MotifTreeCellRenderer.java
+com/sun/java/swing/plaf/motif/icons
+com/sun/java/swing/plaf/motif/icons/SCCS
+com/sun/java/swing/plaf/motif/icons/SCCS/s.ScrollDownArrow.gif
+com/sun/java/swing/plaf/motif/icons/SCCS/s.DesktopIcon.gif
+com/sun/java/swing/plaf/motif/icons/SCCS/s.Error.gif
+com/sun/java/swing/plaf/motif/icons/SCCS/s.Inform.gif
+com/sun/java/swing/plaf/motif/icons/SCCS/s.Question.gif
+com/sun/java/swing/plaf/motif/icons/SCCS/s.Warn.gif
+com/sun/java/swing/plaf/motif/icons/SCCS/s.ScrollDownArrowActive.gif
+com/sun/java/swing/plaf/motif/icons/SCCS/s.ScrollKnobH.gif
+com/sun/java/swing/plaf/motif/icons/SCCS/s.ScrollLeftArrow.gif
+com/sun/java/swing/plaf/motif/icons/SCCS/s.ScrollLeftArrowActive.gif
+com/sun/java/swing/plaf/motif/icons/SCCS/s.ScrollRightArrow.gif
+com/sun/java/swing/plaf/motif/icons/SCCS/s.ScrollRightArrowActive.gif
+com/sun/java/swing/plaf/motif/icons/SCCS/s.ScrollUpArrow.gif
+com/sun/java/swing/plaf/motif/icons/SCCS/s.ScrollUpArrowActive.gif
+com/sun/java/swing/plaf/motif/icons/SCCS/s.StandardBackground.gif
+com/sun/java/swing/plaf/motif/icons/SCCS/s.TrayBottom.gif
+com/sun/java/swing/plaf/motif/icons/SCCS/s.TrayLeft.gif
+com/sun/java/swing/plaf/motif/icons/SCCS/s.TrayRight.gif
+com/sun/java/swing/plaf/motif/icons/SCCS/s.TrayTop.gif
+com/sun/java/swing/plaf/motif/icons/SCCS/s.TreeClosed.gif
+com/sun/java/swing/plaf/motif/icons/SCCS/s.TreeOpen.gif
+com/sun/java/swing/plaf/motif/icons/ScrollDownArrow.gif
+com/sun/java/swing/plaf/motif/icons/DesktopIcon.gif
+com/sun/java/swing/plaf/motif/icons/Error.gif
+com/sun/java/swing/plaf/motif/icons/Inform.gif
+com/sun/java/swing/plaf/motif/icons/Question.gif
+com/sun/java/swing/plaf/motif/icons/ScrollDownArrowActive.gif
+com/sun/java/swing/plaf/motif/icons/ScrollKnobH.gif
+com/sun/java/swing/plaf/motif/icons/ScrollLeftArrow.gif
+com/sun/java/swing/plaf/motif/icons/ScrollLeftArrowActive.gif
+com/sun/java/swing/plaf/motif/icons/ScrollRightArrow.gif
+com/sun/java/swing/plaf/motif/icons/ScrollRightArrowActive.gif
+com/sun/java/swing/plaf/motif/icons/ScrollUpArrow.gif
+com/sun/java/swing/plaf/motif/icons/ScrollUpArrowActive.gif
+com/sun/java/swing/plaf/motif/icons/StandardBackground.gif
+com/sun/java/swing/plaf/motif/icons/TrayBottom.gif
+com/sun/java/swing/plaf/motif/icons/TrayLeft.gif
+com/sun/java/swing/plaf/motif/icons/TrayRight.gif
+com/sun/java/swing/plaf/motif/icons/TrayTop.gif
+com/sun/java/swing/plaf/motif/icons/TreeClosed.gif
+com/sun/java/swing/plaf/motif/icons/TreeOpen.gif
+com/sun/java/swing/plaf/motif/icons/Warn.gif
+com/sun/java/swing/plaf/motif/resources
+com/sun/java/swing/plaf/motif/resources/SCCS
+com/sun/java/swing/plaf/motif/resources/SCCS/s.motif_de.properties
+com/sun/java/swing/plaf/motif/resources/SCCS/s.motif.properties
+com/sun/java/swing/plaf/motif/resources/SCCS/s.motif_es.properties
+com/sun/java/swing/plaf/motif/resources/SCCS/s.motif_fr.properties
+com/sun/java/swing/plaf/motif/resources/SCCS/s.motif_it.properties
+com/sun/java/swing/plaf/motif/resources/SCCS/s.motif_ja.properties
+com/sun/java/swing/plaf/motif/resources/SCCS/s.motif_ko.properties
+com/sun/java/swing/plaf/motif/resources/SCCS/s.motif_sv.properties
+com/sun/java/swing/plaf/motif/resources/SCCS/s.motif_zh_CN.properties
+com/sun/java/swing/plaf/motif/resources/SCCS/s.motif_zh_TW.properties
+com/sun/java/swing/plaf/motif/resources/motif_zh_CN.properties
+com/sun/java/swing/plaf/motif/resources/motif.properties
+com/sun/java/swing/plaf/motif/resources/motif_de.properties
+com/sun/java/swing/plaf/motif/resources/motif_es.properties
+com/sun/java/swing/plaf/motif/resources/motif_fr.properties
+com/sun/java/swing/plaf/motif/resources/motif_it.properties
+com/sun/java/swing/plaf/motif/resources/motif_ja.properties
+com/sun/java/swing/plaf/motif/resources/motif_ko.properties
+com/sun/java/swing/plaf/motif/resources/motif_sv.properties
+com/sun/java/swing/plaf/motif/resources/motif_zh_TW.properties
+com/sun/java/swing/plaf/motif/MotifButtonListener.java
+com/sun/java/swing/plaf/motif/MotifBorders.java
+com/sun/java/swing/plaf/motif/MotifCheckBoxUI.java
+com/sun/java/swing/plaf/motif/MotifButtonUI.java
+com/sun/java/swing/plaf/motif/MotifCheckBoxMenuItemUI.java
+com/sun/java/swing/plaf/motif/MotifComboBoxRenderer.java
+com/sun/java/swing/plaf/motif/MotifComboBoxUI.java
+com/sun/java/swing/plaf/motif/MotifDesktopIconUI.java
+com/sun/java/swing/plaf/motif/MotifDesktopPaneUI.java
+com/sun/java/swing/plaf/motif/MotifEditorPaneUI.java
+com/sun/java/swing/plaf/motif/MotifFileChooserUI.java
+com/sun/java/swing/plaf/motif/MotifGraphicsUtils.java
+com/sun/java/swing/plaf/motif/MotifMenuMouseMotionListener.java
+com/sun/java/swing/plaf/motif/MotifIconFactory.java
+com/sun/java/swing/plaf/motif/MotifInternalFrameUI.java
+com/sun/java/swing/plaf/motif/MotifInternalFrameTitlePane.java
+com/sun/java/swing/plaf/motif/MotifLabelUI.java
+com/sun/java/swing/plaf/motif/MotifLookAndFeel.java
+com/sun/java/swing/plaf/motif/MotifMenuBarUI.java
+com/sun/java/swing/plaf/motif/MotifMenuItemUI.java
+com/sun/java/swing/plaf/motif/MotifMenuMouseListener.java
+com/sun/java/swing/plaf/motif/MotifRadioButtonMenuItemUI.java
+com/sun/java/swing/plaf/motif/MotifMenuUI.java
+com/sun/java/swing/plaf/motif/MotifOptionPaneUI.java
+com/sun/java/swing/plaf/motif/MotifPasswordFieldUI.java
+com/sun/java/swing/plaf/motif/MotifPopupMenuSeparatorUI.java
+com/sun/java/swing/plaf/motif/MotifPopupMenuUI.java
+com/sun/java/swing/plaf/motif/MotifProgressBarUI.java
+com/sun/java/swing/plaf/motif/MotifScrollBarButton.java
+com/sun/java/swing/plaf/motif/MotifRadioButtonUI.java
+com/sun/java/swing/plaf/motif/MotifScrollBarUI.java
+com/sun/java/swing/plaf/motif/MotifScrollPaneUI.java
+com/sun/java/swing/plaf/motif/MotifSeparatorUI.java
+com/sun/java/swing/plaf/motif/MotifSliderUI.java
+com/sun/java/swing/plaf/motif/MotifSplitPaneDivider.java
+com/sun/java/swing/plaf/motif/MotifSplitPaneUI.java
+com/sun/java/swing/plaf/motif/MotifTabbedPaneUI.java
+com/sun/java/swing/plaf/motif/MotifTextAreaUI.java
+com/sun/java/swing/plaf/motif/MotifTextFieldUI.java
+com/sun/java/swing/plaf/motif/MotifTextPaneUI.java
+com/sun/java/swing/plaf/motif/MotifTextUI.java
+com/sun/java/swing/plaf/motif/MotifToggleButtonUI.java
+com/sun/java/swing/plaf/motif/MotifTreeCellRenderer.java
+com/sun/java/swing/plaf/motif/MotifTreeUI.java
+com/sun/java/swing/plaf/windows
+com/sun/java/swing/plaf/windows/SCCS
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsButtonListener.java
+com/sun/java/swing/plaf/windows/SCCS/s.DesktopProperty.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsBorders.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsCheckBoxUI.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsButtonUI.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsInternalFrameUI.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsCheckBoxMenuItemUI.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsClassicLookAndFeel.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsComboBoxUI.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsDesktopIconUI.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsDesktopManager.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsDesktopPaneUI.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsEditorPaneUI.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsFileChooserUI.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsGraphicsUtils.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsIconFactory.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsRadioButtonMenuItemUI.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsInternalFrameTitlePane.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsLabelUI.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsListUI.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsLookAndFeel.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsMenuBarUI.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsMenuItemUI.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsMenuUI.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsOptionPaneUI.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsPasswordFieldUI.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsPopupMenuUI.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsPopupWindow.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsProgressBarUI.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsSplitPaneDivider.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsRadioButtonUI.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsRootPaneUI.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsScrollBarUI.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsScrollPaneUI.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsSeparatorUI.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsSliderUI.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsSpinnerUI.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsToolBarSeparatorUI.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsSplitPaneUI.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsTabbedPaneUI.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsTableHeaderUI.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsTableUI.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsTextAreaUI.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsTextFieldUI.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsTextPaneUI.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsTextUI.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsToggleButtonUI.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsToolBarUI.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsTreeUI.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsUtils.java
+com/sun/java/swing/plaf/windows/SCCS/s.XPStyle.java
+com/sun/java/swing/plaf/windows/SCCS/s.WindowsPopupMenuSeparatorUI.java
+com/sun/java/swing/plaf/windows/icons
+com/sun/java/swing/plaf/windows/icons/SCCS
+com/sun/java/swing/plaf/windows/icons/SCCS/s.DetailsView.gif
+com/sun/java/swing/plaf/windows/icons/SCCS/s.Computer.gif
+com/sun/java/swing/plaf/windows/icons/SCCS/s.StandardBackground.gif
+com/sun/java/swing/plaf/windows/icons/SCCS/s.Directory.gif
+com/sun/java/swing/plaf/windows/icons/SCCS/s.Error.gif
+com/sun/java/swing/plaf/windows/icons/SCCS/s.File.gif
+com/sun/java/swing/plaf/windows/icons/SCCS/s.FloppyDrive.gif
+com/sun/java/swing/plaf/windows/icons/SCCS/s.HardDrive.gif
+com/sun/java/swing/plaf/windows/icons/SCCS/s.HomeFolder.gif
+com/sun/java/swing/plaf/windows/icons/SCCS/s.Inform.gif
+com/sun/java/swing/plaf/windows/icons/SCCS/s.JavaCup32.png
+com/sun/java/swing/plaf/windows/icons/SCCS/s.ListView.gif
+com/sun/java/swing/plaf/windows/icons/SCCS/s.NewFolder.gif
+com/sun/java/swing/plaf/windows/icons/SCCS/s.Question.gif
+com/sun/java/swing/plaf/windows/icons/SCCS/s.TreeClosed.gif
+com/sun/java/swing/plaf/windows/icons/SCCS/s.TreeLeaf.gif
+com/sun/java/swing/plaf/windows/icons/SCCS/s.TreeOpen.gif
+com/sun/java/swing/plaf/windows/icons/SCCS/s.UpFolder.gif
+com/sun/java/swing/plaf/windows/icons/SCCS/s.Warn.gif
+com/sun/java/swing/plaf/windows/icons/StandardBackground.gif
+com/sun/java/swing/plaf/windows/icons/Computer.gif
+com/sun/java/swing/plaf/windows/icons/DetailsView.gif
+com/sun/java/swing/plaf/windows/icons/Directory.gif
+com/sun/java/swing/plaf/windows/icons/Error.gif
+com/sun/java/swing/plaf/windows/icons/File.gif
+com/sun/java/swing/plaf/windows/icons/FloppyDrive.gif
+com/sun/java/swing/plaf/windows/icons/HardDrive.gif
+com/sun/java/swing/plaf/windows/icons/HomeFolder.gif
+com/sun/java/swing/plaf/windows/icons/Inform.gif
+com/sun/java/swing/plaf/windows/icons/JavaCup32.png
+com/sun/java/swing/plaf/windows/icons/ListView.gif
+com/sun/java/swing/plaf/windows/icons/NewFolder.gif
+com/sun/java/swing/plaf/windows/icons/Question.gif
+com/sun/java/swing/plaf/windows/icons/TreeClosed.gif
+com/sun/java/swing/plaf/windows/icons/TreeLeaf.gif
+com/sun/java/swing/plaf/windows/icons/TreeOpen.gif
+com/sun/java/swing/plaf/windows/icons/UpFolder.gif
+com/sun/java/swing/plaf/windows/icons/Warn.gif
+com/sun/java/swing/plaf/windows/resources
+com/sun/java/swing/plaf/windows/resources/SCCS
+com/sun/java/swing/plaf/windows/resources/SCCS/s.windows_zh_CN.properties
+com/sun/java/swing/plaf/windows/resources/SCCS/s.windows.properties
+com/sun/java/swing/plaf/windows/resources/SCCS/s.windows_de.properties
+com/sun/java/swing/plaf/windows/resources/SCCS/s.windows_es.properties
+com/sun/java/swing/plaf/windows/resources/SCCS/s.windows_fr.properties
+com/sun/java/swing/plaf/windows/resources/SCCS/s.windows_it.properties
+com/sun/java/swing/plaf/windows/resources/SCCS/s.windows_ja.properties
+com/sun/java/swing/plaf/windows/resources/SCCS/s.windows_ko.properties
+com/sun/java/swing/plaf/windows/resources/SCCS/s.windows_sv.properties
+com/sun/java/swing/plaf/windows/resources/SCCS/s.windows_zh_TW.properties
+com/sun/java/swing/plaf/windows/resources/windows_de.properties
+com/sun/java/swing/plaf/windows/resources/windows.properties
+com/sun/java/swing/plaf/windows/resources/windows_es.properties
+com/sun/java/swing/plaf/windows/resources/windows_fr.properties
+com/sun/java/swing/plaf/windows/resources/windows_it.properties
+com/sun/java/swing/plaf/windows/resources/windows_ja.properties
+com/sun/java/swing/plaf/windows/resources/windows_ko.properties
+com/sun/java/swing/plaf/windows/resources/windows_sv.properties
+com/sun/java/swing/plaf/windows/resources/windows_zh_CN.properties
+com/sun/java/swing/plaf/windows/resources/windows_zh_TW.properties
+com/sun/java/swing/plaf/windows/WindowsButtonListener.java
+com/sun/java/swing/plaf/windows/DesktopProperty.java
+com/sun/java/swing/plaf/windows/WindowsBorders.java
+com/sun/java/swing/plaf/windows/WindowsCheckBoxMenuItemUI.java
+com/sun/java/swing/plaf/windows/WindowsButtonUI.java
+com/sun/java/swing/plaf/windows/WindowsClassicLookAndFeel.java
+com/sun/java/swing/plaf/windows/WindowsCheckBoxUI.java
+com/sun/java/swing/plaf/windows/WindowsComboBoxUI.java
+com/sun/java/swing/plaf/windows/WindowsDesktopIconUI.java
+com/sun/java/swing/plaf/windows/WindowsDesktopManager.java
+com/sun/java/swing/plaf/windows/WindowsDesktopPaneUI.java
+com/sun/java/swing/plaf/windows/XPStyle.java
+com/sun/java/swing/plaf/windows/WindowsIconFactory.java
+com/sun/java/swing/plaf/windows/WindowsEditorPaneUI.java
+com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java
+com/sun/java/swing/plaf/windows/WindowsGraphicsUtils.java
+com/sun/java/swing/plaf/windows/WindowsInternalFrameTitlePane.java
+com/sun/java/swing/plaf/windows/WindowsInternalFrameUI.java
+com/sun/java/swing/plaf/windows/WindowsLabelUI.java
+com/sun/java/swing/plaf/windows/WindowsListUI.java
+com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java
+com/sun/java/swing/plaf/windows/WindowsMenuBarUI.java
+com/sun/java/swing/plaf/windows/WindowsMenuItemUI.java
+com/sun/java/swing/plaf/windows/WindowsMenuUI.java
+com/sun/java/swing/plaf/windows/WindowsOptionPaneUI.java
+com/sun/java/swing/plaf/windows/WindowsPasswordFieldUI.java
+com/sun/java/swing/plaf/windows/WindowsPopupMenuUI.java
+com/sun/java/swing/plaf/windows/WindowsPopupWindow.java
+com/sun/java/swing/plaf/windows/WindowsProgressBarUI.java
+com/sun/java/swing/plaf/windows/WindowsRadioButtonMenuItemUI.java
+com/sun/java/swing/plaf/windows/WindowsRadioButtonUI.java
+com/sun/java/swing/plaf/windows/WindowsRootPaneUI.java
+com/sun/java/swing/plaf/windows/WindowsScrollBarUI.java
+com/sun/java/swing/plaf/windows/WindowsScrollPaneUI.java
+com/sun/java/swing/plaf/windows/WindowsSeparatorUI.java
+com/sun/java/swing/plaf/windows/WindowsSliderUI.java
+com/sun/java/swing/plaf/windows/WindowsSpinnerUI.java
+com/sun/java/swing/plaf/windows/WindowsSplitPaneDivider.java
+com/sun/java/swing/plaf/windows/WindowsSplitPaneUI.java
+com/sun/java/swing/plaf/windows/WindowsTabbedPaneUI.java
+com/sun/java/swing/plaf/windows/WindowsTableHeaderUI.java
+com/sun/java/swing/plaf/windows/WindowsTableUI.java
+com/sun/java/swing/plaf/windows/WindowsTextUI.java
+com/sun/java/swing/plaf/windows/WindowsTextAreaUI.java
+com/sun/java/swing/plaf/windows/WindowsTextFieldUI.java
+com/sun/java/swing/plaf/windows/WindowsTextPaneUI.java
+com/sun/java/swing/plaf/windows/WindowsToggleButtonUI.java
+com/sun/java/swing/plaf/windows/WindowsToolBarSeparatorUI.java
+com/sun/java/swing/plaf/windows/WindowsToolBarUI.java
+com/sun/java/swing/plaf/windows/WindowsTreeUI.java
+com/sun/java/swing/plaf/windows/WindowsUtils.java
+com/sun/java/swing/plaf/windows/WindowsPopupMenuSeparatorUI.java
+com/sun/java/swing/SwingUtilities2.java
+com/sun/java/util
+com/sun/java/util/jar
+com/sun/java/util/jar/pack
+com/sun/java/util/jar/pack/SCCS
+com/sun/java/util/jar/pack/SCCS/s.AdaptiveCoding.java
+com/sun/java/util/jar/pack/SCCS/s.Attribute.java
+com/sun/java/util/jar/pack/SCCS/s.BandStructure.java
+com/sun/java/util/jar/pack/SCCS/s.ClassReader.java
+com/sun/java/util/jar/pack/SCCS/s.ClassWriter.java
+com/sun/java/util/jar/pack/SCCS/s.Code.java
+com/sun/java/util/jar/pack/SCCS/s.Coding.java
+com/sun/java/util/jar/pack/SCCS/s.CodingChooser.java
+com/sun/java/util/jar/pack/SCCS/s.CodingMethod.java
+com/sun/java/util/jar/pack/SCCS/s.ConstantPool.java
+com/sun/java/util/jar/pack/SCCS/s.Constants.java
+com/sun/java/util/jar/pack/SCCS/s.Driver.java
+com/sun/java/util/jar/pack/SCCS/s.Fixups.java
+com/sun/java/util/jar/pack/SCCS/s.Histogram.java
+com/sun/java/util/jar/pack/SCCS/s.Instruction.java
+com/sun/java/util/jar/pack/SCCS/s.NativeUnpack.java
+com/sun/java/util/jar/pack/SCCS/s.Package.java
+com/sun/java/util/jar/pack/SCCS/s.PropMap.java
+com/sun/java/util/jar/pack/SCCS/s.PackageReader.java
+com/sun/java/util/jar/pack/SCCS/s.PackageWriter.java
+com/sun/java/util/jar/pack/SCCS/s.PackerImpl.java
+com/sun/java/util/jar/pack/SCCS/s.PopulationCoding.java
+com/sun/java/util/jar/pack/SCCS/s.UnpackerImpl.java
+com/sun/java/util/jar/pack/SCCS/s.Utils.java
+com/sun/java/util/jar/pack/SCCS/s.intrinsic.properties
+com/sun/java/util/jar/pack/SCCS/s.package.html
+com/sun/java/util/jar/pack/AdaptiveCoding.java
+com/sun/java/util/jar/pack/Attribute.java
+com/sun/java/util/jar/pack/BandStructure.java
+com/sun/java/util/jar/pack/ClassReader.java
+com/sun/java/util/jar/pack/ClassWriter.java
+com/sun/java/util/jar/pack/Code.java
+com/sun/java/util/jar/pack/Coding.java
+com/sun/java/util/jar/pack/CodingChooser.java
+com/sun/java/util/jar/pack/CodingMethod.java
+com/sun/java/util/jar/pack/ConstantPool.java
+com/sun/java/util/jar/pack/Constants.java
+com/sun/java/util/jar/pack/Driver.java
+com/sun/java/util/jar/pack/Fixups.java
+com/sun/java/util/jar/pack/Histogram.java
+com/sun/java/util/jar/pack/Instruction.java
+com/sun/java/util/jar/pack/NativeUnpack.java
+com/sun/java/util/jar/pack/Package.java
+com/sun/java/util/jar/pack/PackageReader.java
+com/sun/java/util/jar/pack/PackageWriter.java
+com/sun/java/util/jar/pack/PackerImpl.java
+com/sun/java/util/jar/pack/PopulationCoding.java
+com/sun/java/util/jar/pack/PropMap.java
+com/sun/java/util/jar/pack/UnpackerImpl.java
+com/sun/java/util/jar/pack/Utils.java
+com/sun/java/util/jar/pack/intrinsic.properties
+com/sun/java/util/jar/pack/package.html
+com/sun/java/util/logging
+com/sun/java/util/logging/ulf
+com/sun/java/util/logging/ulf/SCCS
+com/sun/java2d
+com/sun/java2d/fontchecker
+com/sun/java2d/fontchecker/SCCS
+com/sun/java2d/fontchecker/SCCS/s.FontCheckerConstants.java
+com/sun/java2d/fontchecker/SCCS/s.FontCheckDummy.java
+com/sun/java2d/fontchecker/SCCS/s.FontChecker.java
+com/sun/java2d/fontchecker/SCCS/s.FontFileFilter.java
+com/sun/java2d/fontchecker/SCCS/s.README.txt
+com/sun/java2d/fontchecker/FontCheckerConstants.java
+com/sun/java2d/fontchecker/FontCheckDummy.java
+com/sun/java2d/fontchecker/FontChecker.java
+com/sun/java2d/fontchecker/FontFileFilter.java
+com/sun/java2d/fontchecker/README.txt
+com/sun/java_cup
+com/sun/java_cup/internal
+com/sun/java_cup/internal/SCCS
+com/sun/java_cup/internal/SCCS/s.action_part.java
+com/sun/java_cup/internal/SCCS/s.Main.java
+com/sun/java_cup/internal/SCCS/s.action_production.java
+com/sun/java_cup/internal/SCCS/s.assoc.java
+com/sun/java_cup/internal/SCCS/s.emit.java
+com/sun/java_cup/internal/SCCS/s.internal_error.java
+com/sun/java_cup/internal/SCCS/s.lalr_item.java
+com/sun/java_cup/internal/SCCS/s.lalr_item_set.java
+com/sun/java_cup/internal/SCCS/s.lalr_state.java
+com/sun/java_cup/internal/SCCS/s.lalr_transition.java
+com/sun/java_cup/internal/SCCS/s.lexer.java
+com/sun/java_cup/internal/SCCS/s.lr_item_core.java
+com/sun/java_cup/internal/SCCS/s.non_terminal.java
+com/sun/java_cup/internal/SCCS/s.nonassoc_action.java
+com/sun/java_cup/internal/SCCS/s.parse_action.java
+com/sun/java_cup/internal/SCCS/s.parser.java
+com/sun/java_cup/internal/SCCS/s.parse_action_row.java
+com/sun/java_cup/internal/SCCS/s.parse_action_table.java
+com/sun/java_cup/internal/SCCS/s.parse_reduce_row.java
+com/sun/java_cup/internal/SCCS/s.parse_reduce_table.java
+com/sun/java_cup/internal/SCCS/s.production.java
+com/sun/java_cup/internal/SCCS/s.production_part.java
+com/sun/java_cup/internal/SCCS/s.reduce_action.java
+com/sun/java_cup/internal/SCCS/s.shift_action.java
+com/sun/java_cup/internal/SCCS/s.sym.java
+com/sun/java_cup/internal/SCCS/s.symbol.java
+com/sun/java_cup/internal/SCCS/s.symbol_part.java
+com/sun/java_cup/internal/SCCS/s.symbol_set.java
+com/sun/java_cup/internal/SCCS/s.terminal.java
+com/sun/java_cup/internal/SCCS/s.terminal_set.java
+com/sun/java_cup/internal/SCCS/s.version.java
+com/sun/java_cup/internal/runtime
+com/sun/java_cup/internal/runtime/SCCS
+com/sun/java_cup/internal/runtime/SCCS/s.lr_parser.java
+com/sun/java_cup/internal/runtime/SCCS/s.Scanner.java
+com/sun/java_cup/internal/runtime/SCCS/s.Symbol.java
+com/sun/java_cup/internal/runtime/SCCS/s.virtual_parse_stack.java
+com/sun/java_cup/internal/runtime/Scanner.java
+com/sun/java_cup/internal/runtime/Symbol.java
+com/sun/java_cup/internal/runtime/lr_parser.java
+com/sun/java_cup/internal/runtime/virtual_parse_stack.java
+com/sun/java_cup/internal/action_part.java
+com/sun/java_cup/internal/Main.java
+com/sun/java_cup/internal/action_production.java
+com/sun/java_cup/internal/assoc.java
+com/sun/java_cup/internal/emit.java
+com/sun/java_cup/internal/internal_error.java
+com/sun/java_cup/internal/lalr_item.java
+com/sun/java_cup/internal/lalr_item_set.java
+com/sun/java_cup/internal/lalr_state.java
+com/sun/java_cup/internal/lalr_transition.java
+com/sun/java_cup/internal/lexer.java
+com/sun/java_cup/internal/lr_item_core.java
+com/sun/java_cup/internal/non_terminal.java
+com/sun/java_cup/internal/nonassoc_action.java
+com/sun/java_cup/internal/parse_action.java
+com/sun/java_cup/internal/parser.java
+com/sun/java_cup/internal/parse_action_row.java
+com/sun/java_cup/internal/parse_action_table.java
+com/sun/java_cup/internal/parse_reduce_row.java
+com/sun/java_cup/internal/parse_reduce_table.java
+com/sun/java_cup/internal/production.java
+com/sun/java_cup/internal/production_part.java
+com/sun/java_cup/internal/reduce_action.java
+com/sun/java_cup/internal/shift_action.java
+com/sun/java_cup/internal/sym.java
+com/sun/java_cup/internal/symbol.java
+com/sun/java_cup/internal/symbol_part.java
+com/sun/java_cup/internal/symbol_set.java
+com/sun/java_cup/internal/terminal.java
+com/sun/java_cup/internal/terminal_set.java
+com/sun/java_cup/internal/version.java
+com/sun/javadoc
+com/sun/javadoc/SCCS
+com/sun/javadoc/SCCS/s.AnnotationTypeDoc.java
+com/sun/javadoc/SCCS/s.AnnotationDesc.java
+com/sun/javadoc/SCCS/s.Doc.java
+com/sun/javadoc/SCCS/s.AnnotationTypeElementDoc.java
+com/sun/javadoc/SCCS/s.AnnotationValue.java
+com/sun/javadoc/SCCS/s.ClassDoc.java
+com/sun/javadoc/SCCS/s.ConstructorDoc.java
+com/sun/javadoc/SCCS/s.Doclet.java
+com/sun/javadoc/SCCS/s.ParameterizedType.java
+com/sun/javadoc/SCCS/s.DocErrorReporter.java
+com/sun/javadoc/SCCS/s.ExecutableMemberDoc.java
+com/sun/javadoc/SCCS/s.FieldDoc.java
+com/sun/javadoc/SCCS/s.LanguageVersion.java
+com/sun/javadoc/SCCS/s.MemberDoc.java
+com/sun/javadoc/SCCS/s.MethodDoc.java
+com/sun/javadoc/SCCS/s.PackageDoc.java
+com/sun/javadoc/SCCS/s.ParamTag.java
+com/sun/javadoc/SCCS/s.Parameter.java
+com/sun/javadoc/SCCS/s.ProgramElementDoc.java
+com/sun/javadoc/SCCS/s.RootDoc.java
+com/sun/javadoc/SCCS/s.SeeTag.java
+com/sun/javadoc/SCCS/s.SerialFieldTag.java
+com/sun/javadoc/SCCS/s.SourcePosition.java
+com/sun/javadoc/SCCS/s.Tag.java
+com/sun/javadoc/SCCS/s.ThrowsTag.java
+com/sun/javadoc/SCCS/s.Type.java
+com/sun/javadoc/SCCS/s.TypeVariable.java
+com/sun/javadoc/SCCS/s.WildcardType.java
+com/sun/javadoc/SCCS/s.package.html
+com/sun/javadoc/AnnotationTypeDoc.java
+com/sun/javadoc/AnnotationDesc.java
+com/sun/javadoc/Doc.java
+com/sun/javadoc/AnnotationTypeElementDoc.java
+com/sun/javadoc/AnnotationValue.java
+com/sun/javadoc/ClassDoc.java
+com/sun/javadoc/ConstructorDoc.java
+com/sun/javadoc/Doclet.java
+com/sun/javadoc/SerialFieldTag.java
+com/sun/javadoc/SeeTag.java
+com/sun/javadoc/DocErrorReporter.java
+com/sun/javadoc/ExecutableMemberDoc.java
+com/sun/javadoc/FieldDoc.java
+com/sun/javadoc/LanguageVersion.java
+com/sun/javadoc/MemberDoc.java
+com/sun/javadoc/MethodDoc.java
+com/sun/javadoc/PackageDoc.java
+com/sun/javadoc/ParamTag.java
+com/sun/javadoc/Parameter.java
+com/sun/javadoc/ParameterizedType.java
+com/sun/javadoc/ProgramElementDoc.java
+com/sun/javadoc/RootDoc.java
+com/sun/javadoc/SourcePosition.java
+com/sun/javadoc/Tag.java
+com/sun/javadoc/ThrowsTag.java
+com/sun/javadoc/Type.java
+com/sun/javadoc/TypeVariable.java
+com/sun/javadoc/WildcardType.java
+com/sun/javadoc/package.html
+com/sun/jdi
+com/sun/jdi/SCCS
+com/sun/jdi/SCCS/s.AbsentInformationException.java
+com/sun/jdi/SCCS/s.Accessible.java
+com/sun/jdi/SCCS/s.ArrayReference.java
+com/sun/jdi/SCCS/s.ArrayType.java
+com/sun/jdi/SCCS/s.BooleanType.java
+com/sun/jdi/SCCS/s.BooleanValue.java
+com/sun/jdi/SCCS/s.Bootstrap.java
+com/sun/jdi/SCCS/s.ByteType.java
+com/sun/jdi/SCCS/s.ByteValue.java
+com/sun/jdi/SCCS/s.CharType.java
+com/sun/jdi/SCCS/s.CharValue.java
+com/sun/jdi/SCCS/s.ClassLoaderReference.java
+com/sun/jdi/SCCS/s.ClassNotLoadedException.java
+com/sun/jdi/SCCS/s.ClassObjectReference.java
+com/sun/jdi/SCCS/s.LongValue.java
+com/sun/jdi/SCCS/s.Location.java
+com/sun/jdi/SCCS/s.ClassNotPreparedException.java
+com/sun/jdi/SCCS/s.ClassType.java
+com/sun/jdi/SCCS/s.DoubleType.java
+com/sun/jdi/SCCS/s.DoubleValue.java
+com/sun/jdi/SCCS/s.Field.java
+com/sun/jdi/SCCS/s.FloatType.java
+com/sun/jdi/SCCS/s.FloatValue.java
+com/sun/jdi/SCCS/s.IncompatibleThreadStateException.java
+com/sun/jdi/SCCS/s.InconsistentDebugInfoException.java
+com/sun/jdi/SCCS/s.IntegerType.java
+com/sun/jdi/SCCS/s.IntegerValue.java
+com/sun/jdi/SCCS/s.InterfaceType.java
+com/sun/jdi/SCCS/s.InternalException.java
+com/sun/jdi/SCCS/s.InvalidCodeIndexException.java
+com/sun/jdi/SCCS/s.InvalidTypeException.java
+com/sun/jdi/SCCS/s.InvalidLineNumberException.java
+com/sun/jdi/SCCS/s.InvalidStackFrameException.java
+com/sun/jdi/SCCS/s.InvocationException.java
+com/sun/jdi/SCCS/s.JDIPermission.java
+com/sun/jdi/SCCS/s.LocalVariable.java
+com/sun/jdi/SCCS/s.Locatable.java
+com/sun/jdi/SCCS/s.LongType.java
+com/sun/jdi/SCCS/s.ObjectReference.java
+com/sun/jdi/SCCS/s.Method.java
+com/sun/jdi/SCCS/s.Mirror.java
+com/sun/jdi/SCCS/s.PathSearchingVirtualMachine.java
+com/sun/jdi/SCCS/s.NativeMethodException.java
+com/sun/jdi/SCCS/s.ObjectCollectedException.java
+com/sun/jdi/SCCS/s.ThreadGroupReference.java
+com/sun/jdi/SCCS/s.ShortType.java
+com/sun/jdi/SCCS/s.PrimitiveType.java
+com/sun/jdi/SCCS/s.PrimitiveValue.java
+com/sun/jdi/SCCS/s.ReferenceType.java
+com/sun/jdi/SCCS/s.ShortValue.java
+com/sun/jdi/SCCS/s.StackFrame.java
+com/sun/jdi/SCCS/s.StringReference.java
+com/sun/jdi/SCCS/s.VMDisconnectedException.java
+com/sun/jdi/SCCS/s.ThreadReference.java
+com/sun/jdi/SCCS/s.Type.java
+com/sun/jdi/SCCS/s.TypeComponent.java
+com/sun/jdi/SCCS/s.VMCannotBeModifiedException.java
+com/sun/jdi/SCCS/s.VMMismatchException.java
+com/sun/jdi/SCCS/s.VMOutOfMemoryException.java
+com/sun/jdi/SCCS/s.Value.java
+com/sun/jdi/SCCS/s.VirtualMachine.java
+com/sun/jdi/SCCS/s.VoidType.java
+com/sun/jdi/SCCS/s.VirtualMachineManager.java
+com/sun/jdi/SCCS/s.VoidValue.java
+com/sun/jdi/SCCS/s.package.html
+com/sun/jdi/connect
+com/sun/jdi/connect/SCCS
+com/sun/jdi/connect/SCCS/s.AttachingConnector.java
+com/sun/jdi/connect/SCCS/s.Connector.java
+com/sun/jdi/connect/SCCS/s.LaunchingConnector.java
+com/sun/jdi/connect/SCCS/s.package.html
+com/sun/jdi/connect/SCCS/s.IllegalConnectorArgumentsException.java
+com/sun/jdi/connect/SCCS/s.ListeningConnector.java
+com/sun/jdi/connect/SCCS/s.Transport.java
+com/sun/jdi/connect/SCCS/s.TransportTimeoutException.java
+com/sun/jdi/connect/SCCS/s.VMStartException.java
+com/sun/jdi/connect/spi
+com/sun/jdi/connect/spi/SCCS
+com/sun/jdi/connect/spi/SCCS/s.ClosedConnectionException.java
+com/sun/jdi/connect/spi/SCCS/s.Connection.java
+com/sun/jdi/connect/spi/SCCS/s.TransportService.java
+com/sun/jdi/connect/spi/SCCS/s.package.html
+com/sun/jdi/connect/spi/ClosedConnectionException.java
+com/sun/jdi/connect/spi/Connection.java
+com/sun/jdi/connect/spi/TransportService.java
+com/sun/jdi/connect/spi/package.html
+com/sun/jdi/connect/TransportTimeoutException.java
+com/sun/jdi/connect/AttachingConnector.java
+com/sun/jdi/connect/Connector.java
+com/sun/jdi/connect/LaunchingConnector.java
+com/sun/jdi/connect/Transport.java
+com/sun/jdi/connect/IllegalConnectorArgumentsException.java
+com/sun/jdi/connect/ListeningConnector.java
+com/sun/jdi/connect/VMStartException.java
+com/sun/jdi/connect/package.html
+com/sun/jdi/doc-files
+com/sun/jdi/doc-files/SCCS
+com/sun/jdi/doc-files/SCCS/s.signature.html
+com/sun/jdi/doc-files/signature.html
+com/sun/jdi/event
+com/sun/jdi/event/SCCS
+com/sun/jdi/event/SCCS/s.ModificationWatchpointEvent.java
+com/sun/jdi/event/SCCS/s.AccessWatchpointEvent.java
+com/sun/jdi/event/SCCS/s.BreakpointEvent.java
+com/sun/jdi/event/SCCS/s.ClassPrepareEvent.java
+com/sun/jdi/event/SCCS/s.ClassUnloadEvent.java
+com/sun/jdi/event/SCCS/s.Event.java
+com/sun/jdi/event/SCCS/s.EventIterator.java
+com/sun/jdi/event/SCCS/s.EventQueue.java
+com/sun/jdi/event/SCCS/s.EventSet.java
+com/sun/jdi/event/SCCS/s.ExceptionEvent.java
+com/sun/jdi/event/SCCS/s.LocatableEvent.java
+com/sun/jdi/event/SCCS/s.MethodEntryEvent.java
+com/sun/jdi/event/SCCS/s.MethodExitEvent.java
+com/sun/jdi/event/SCCS/s.VMDisconnectEvent.java
+com/sun/jdi/event/SCCS/s.StepEvent.java
+com/sun/jdi/event/SCCS/s.ThreadDeathEvent.java
+com/sun/jdi/event/SCCS/s.ThreadStartEvent.java
+com/sun/jdi/event/SCCS/s.VMDeathEvent.java
+com/sun/jdi/event/SCCS/s.WatchpointEvent.java
+com/sun/jdi/event/SCCS/s.VMStartEvent.java
+com/sun/jdi/event/SCCS/s.package.html
+com/sun/jdi/event/ModificationWatchpointEvent.java
+com/sun/jdi/event/AccessWatchpointEvent.java
+com/sun/jdi/event/BreakpointEvent.java
+com/sun/jdi/event/ClassPrepareEvent.java
+com/sun/jdi/event/ClassUnloadEvent.java
+com/sun/jdi/event/Event.java
+com/sun/jdi/event/EventIterator.java
+com/sun/jdi/event/EventQueue.java
+com/sun/jdi/event/EventSet.java
+com/sun/jdi/event/ExceptionEvent.java
+com/sun/jdi/event/LocatableEvent.java
+com/sun/jdi/event/MethodEntryEvent.java
+com/sun/jdi/event/MethodExitEvent.java
+com/sun/jdi/event/StepEvent.java
+com/sun/jdi/event/package.html
+com/sun/jdi/event/ThreadDeathEvent.java
+com/sun/jdi/event/ThreadStartEvent.java
+com/sun/jdi/event/VMDeathEvent.java
+com/sun/jdi/event/VMDisconnectEvent.java
+com/sun/jdi/event/VMStartEvent.java
+com/sun/jdi/event/WatchpointEvent.java
+com/sun/jdi/request
+com/sun/jdi/request/SCCS
+com/sun/jdi/request/SCCS/s.DuplicateRequestException.java
+com/sun/jdi/request/SCCS/s.AccessWatchpointRequest.java
+com/sun/jdi/request/SCCS/s.BreakpointRequest.java
+com/sun/jdi/request/SCCS/s.ClassPrepareRequest.java
+com/sun/jdi/request/SCCS/s.ClassUnloadRequest.java
+com/sun/jdi/request/SCCS/s.EventRequestManager.java
+com/sun/jdi/request/SCCS/s.EventRequest.java
+com/sun/jdi/request/SCCS/s.ExceptionRequest.java
+com/sun/jdi/request/SCCS/s.MethodEntryRequest.java
+com/sun/jdi/request/SCCS/s.package.html
+com/sun/jdi/request/SCCS/s.InvalidRequestStateException.java
+com/sun/jdi/request/SCCS/s.MethodExitRequest.java
+com/sun/jdi/request/SCCS/s.ModificationWatchpointRequest.java
+com/sun/jdi/request/SCCS/s.StepRequest.java
+com/sun/jdi/request/SCCS/s.ThreadDeathRequest.java
+com/sun/jdi/request/SCCS/s.ThreadStartRequest.java
+com/sun/jdi/request/SCCS/s.VMDeathRequest.java
+com/sun/jdi/request/SCCS/s.WatchpointRequest.java
+com/sun/jdi/request/InvalidRequestStateException.java
+com/sun/jdi/request/AccessWatchpointRequest.java
+com/sun/jdi/request/BreakpointRequest.java
+com/sun/jdi/request/ClassPrepareRequest.java
+com/sun/jdi/request/ClassUnloadRequest.java
+com/sun/jdi/request/DuplicateRequestException.java
+com/sun/jdi/request/EventRequest.java
+com/sun/jdi/request/EventRequestManager.java
+com/sun/jdi/request/ExceptionRequest.java
+com/sun/jdi/request/MethodEntryRequest.java
+com/sun/jdi/request/MethodExitRequest.java
+com/sun/jdi/request/StepRequest.java
+com/sun/jdi/request/package.html
+com/sun/jdi/request/ThreadDeathRequest.java
+com/sun/jdi/request/ModificationWatchpointRequest.java
+com/sun/jdi/request/ThreadStartRequest.java
+com/sun/jdi/request/VMDeathRequest.java
+com/sun/jdi/request/WatchpointRequest.java
+com/sun/jdi/Field.java
+com/sun/jdi/AbsentInformationException.java
+com/sun/jdi/Accessible.java
+com/sun/jdi/ArrayReference.java
+com/sun/jdi/ArrayType.java
+com/sun/jdi/BooleanType.java
+com/sun/jdi/BooleanValue.java
+com/sun/jdi/Bootstrap.java
+com/sun/jdi/ByteType.java
+com/sun/jdi/ByteValue.java
+com/sun/jdi/CharType.java
+com/sun/jdi/CharValue.java
+com/sun/jdi/ClassLoaderReference.java
+com/sun/jdi/ClassType.java
+com/sun/jdi/IntegerType.java
+com/sun/jdi/ClassNotLoadedException.java
+com/sun/jdi/ClassNotPreparedException.java
+com/sun/jdi/ClassObjectReference.java
+com/sun/jdi/DoubleType.java
+com/sun/jdi/DoubleValue.java
+com/sun/jdi/FloatType.java
+com/sun/jdi/FloatValue.java
+com/sun/jdi/ObjectReference.java
+com/sun/jdi/Locatable.java
+com/sun/jdi/IncompatibleThreadStateException.java
+com/sun/jdi/InconsistentDebugInfoException.java
+com/sun/jdi/IntegerValue.java
+com/sun/jdi/InterfaceType.java
+com/sun/jdi/InternalException.java
+com/sun/jdi/InvalidCodeIndexException.java
+com/sun/jdi/Method.java
+com/sun/jdi/InvalidLineNumberException.java
+com/sun/jdi/InvalidStackFrameException.java
+com/sun/jdi/InvalidTypeException.java
+com/sun/jdi/InvocationException.java
+com/sun/jdi/JDIPermission.java
+com/sun/jdi/LocalVariable.java
+com/sun/jdi/Location.java
+com/sun/jdi/LongType.java
+com/sun/jdi/LongValue.java
+com/sun/jdi/Mirror.java
+com/sun/jdi/ObjectCollectedException.java
+com/sun/jdi/NativeMethodException.java
+com/sun/jdi/StringReference.java
+com/sun/jdi/PathSearchingVirtualMachine.java
+com/sun/jdi/PrimitiveType.java
+com/sun/jdi/PrimitiveValue.java
+com/sun/jdi/ReferenceType.java
+com/sun/jdi/ShortType.java
+com/sun/jdi/ShortValue.java
+com/sun/jdi/StackFrame.java
+com/sun/jdi/VMCannotBeModifiedException.java
+com/sun/jdi/ThreadGroupReference.java
+com/sun/jdi/ThreadReference.java
+com/sun/jdi/Type.java
+com/sun/jdi/TypeComponent.java
+com/sun/jdi/VirtualMachine.java
+com/sun/jdi/Value.java
+com/sun/jdi/VMDisconnectedException.java
+com/sun/jdi/VMMismatchException.java
+com/sun/jdi/VMOutOfMemoryException.java
+com/sun/jdi/VirtualMachineManager.java
+com/sun/jdi/VoidType.java
+com/sun/jdi/VoidValue.java
+com/sun/jdi/package.html
+com/sun/jlex
+com/sun/jlex/internal
+com/sun/jlex/internal/SCCS
+com/sun/jlex/internal/SCCS/s.Main.java
+com/sun/jlex/internal/Main.java
+com/sun/jmx
+com/sun/jmx/defaults
+com/sun/jmx/defaults/SCCS
+com/sun/jmx/defaults/SCCS/s.JmxProperties.java
+com/sun/jmx/defaults/SCCS/s.ServiceName.java
+com/sun/jmx/defaults/SCCS/s.package.html
+com/sun/jmx/defaults/JmxProperties.java
+com/sun/jmx/defaults/ServiceName.java
+com/sun/jmx/defaults/package.html
+com/sun/jmx/interceptor
+com/sun/jmx/interceptor/SCCS
+com/sun/jmx/interceptor/SCCS/s.package.html
+com/sun/jmx/interceptor/SCCS/s.DefaultMBeanServerInterceptor.java
+com/sun/jmx/interceptor/SCCS/s.MBeanServerInterceptor.java
+com/sun/jmx/interceptor/DefaultMBeanServerInterceptor.java
+com/sun/jmx/interceptor/MBeanServerInterceptor.java
+com/sun/jmx/interceptor/package.html
+com/sun/jmx/mbeanserver
+com/sun/jmx/mbeanserver/SCCS
+com/sun/jmx/mbeanserver/SCCS/s.DynamicMetaDataImpl.java
+com/sun/jmx/mbeanserver/SCCS/s.BaseMetaDataImpl.java
+com/sun/jmx/mbeanserver/SCCS/s.package.html
+com/sun/jmx/mbeanserver/SCCS/s.ClassLoaderRepositorySupport.java
+com/sun/jmx/mbeanserver/SCCS/s.GetPropertyAction.java
+com/sun/jmx/mbeanserver/SCCS/s.Introspector.java
+com/sun/jmx/mbeanserver/SCCS/s.JmxMBeanServer.java
+com/sun/jmx/mbeanserver/SCCS/s.JmxMBeanServerBuilder.java
+com/sun/jmx/mbeanserver/SCCS/s.MBeanInstantiator.java
+com/sun/jmx/mbeanserver/SCCS/s.MBeanInstantiatorImpl.java
+com/sun/jmx/mbeanserver/SCCS/s.MBeanServerDelegateImpl.java
+com/sun/jmx/mbeanserver/SCCS/s.MetaData.java
+com/sun/jmx/mbeanserver/SCCS/s.MetaDataImpl.java
+com/sun/jmx/mbeanserver/SCCS/s.ModifiableClassLoaderRepository.java
+com/sun/jmx/mbeanserver/SCCS/s.NamedObject.java
+com/sun/jmx/mbeanserver/SCCS/s.ObjectInputStreamWithLoader.java
+com/sun/jmx/mbeanserver/SCCS/s.Repository.java
+com/sun/jmx/mbeanserver/SCCS/s.RepositorySupport.java
+com/sun/jmx/mbeanserver/SCCS/s.SecureClassLoaderRepository.java
+com/sun/jmx/mbeanserver/SCCS/s.StandardMetaDataImpl.java
+com/sun/jmx/mbeanserver/SCCS/s.SunJmxMBeanServer.java
+com/sun/jmx/mbeanserver/DynamicMetaDataImpl.java
+com/sun/jmx/mbeanserver/BaseMetaDataImpl.java
+com/sun/jmx/mbeanserver/Repository.java
+com/sun/jmx/mbeanserver/ClassLoaderRepositorySupport.java
+com/sun/jmx/mbeanserver/GetPropertyAction.java
+com/sun/jmx/mbeanserver/Introspector.java
+com/sun/jmx/mbeanserver/JmxMBeanServer.java
+com/sun/jmx/mbeanserver/JmxMBeanServerBuilder.java
+com/sun/jmx/mbeanserver/MBeanInstantiator.java
+com/sun/jmx/mbeanserver/MBeanInstantiatorImpl.java
+com/sun/jmx/mbeanserver/MBeanServerDelegateImpl.java
+com/sun/jmx/mbeanserver/MetaData.java
+com/sun/jmx/mbeanserver/MetaDataImpl.java
+com/sun/jmx/mbeanserver/ModifiableClassLoaderRepository.java
+com/sun/jmx/mbeanserver/NamedObject.java
+com/sun/jmx/mbeanserver/ObjectInputStreamWithLoader.java
+com/sun/jmx/mbeanserver/RepositorySupport.java
+com/sun/jmx/mbeanserver/SecureClassLoaderRepository.java
+com/sun/jmx/mbeanserver/StandardMetaDataImpl.java
+com/sun/jmx/mbeanserver/SunJmxMBeanServer.java
+com/sun/jmx/mbeanserver/package.html
+com/sun/jmx/remote
+com/sun/jmx/remote/internal
+com/sun/jmx/remote/internal/SCCS
+com/sun/jmx/remote/internal/SCCS/s.ArrayNotificationBuffer.java
+com/sun/jmx/remote/internal/SCCS/s.ArrayQueue.java
+com/sun/jmx/remote/internal/SCCS/s.ClientCommunicatorAdmin.java
+com/sun/jmx/remote/internal/SCCS/s.ClientListenerInfo.java
+com/sun/jmx/remote/internal/SCCS/s.ClientNotifForwarder.java
+com/sun/jmx/remote/internal/SCCS/s.ListenerInfo.java
+com/sun/jmx/remote/internal/SCCS/s.NotificationBuffer.java
+com/sun/jmx/remote/internal/SCCS/s.ProxyInputStream.java
+com/sun/jmx/remote/internal/SCCS/s.ProxyRef.java
+com/sun/jmx/remote/internal/SCCS/s.RMIExporter.java
+com/sun/jmx/remote/internal/SCCS/s.ServerCommunicatorAdmin.java
+com/sun/jmx/remote/internal/SCCS/s.ServerNotifForwarder.java
+com/sun/jmx/remote/internal/SCCS/s.Unmarshal.java
+com/sun/jmx/remote/internal/SCCS/s.package.html
+com/sun/jmx/remote/internal/ArrayNotificationBuffer.java
+com/sun/jmx/remote/internal/ArrayQueue.java
+com/sun/jmx/remote/internal/ClientCommunicatorAdmin.java
+com/sun/jmx/remote/internal/ClientListenerInfo.java
+com/sun/jmx/remote/internal/ClientNotifForwarder.java
+com/sun/jmx/remote/internal/ListenerInfo.java
+com/sun/jmx/remote/internal/NotificationBuffer.java
+com/sun/jmx/remote/internal/ProxyInputStream.java
+com/sun/jmx/remote/internal/ProxyRef.java
+com/sun/jmx/remote/internal/RMIExporter.java
+com/sun/jmx/remote/internal/ServerCommunicatorAdmin.java
+com/sun/jmx/remote/internal/ServerNotifForwarder.java
+com/sun/jmx/remote/internal/Unmarshal.java
+com/sun/jmx/remote/internal/package.html
+com/sun/jmx/remote/protocol
+com/sun/jmx/remote/protocol/iiop
+com/sun/jmx/remote/protocol/iiop/SCCS
+com/sun/jmx/remote/protocol/iiop/SCCS/s.ClientProvider.java
+com/sun/jmx/remote/protocol/iiop/SCCS/s.ServerProvider.java
+com/sun/jmx/remote/protocol/iiop/ClientProvider.java
+com/sun/jmx/remote/protocol/iiop/ServerProvider.java
+com/sun/jmx/remote/protocol/rmi
+com/sun/jmx/remote/protocol/rmi/SCCS
+com/sun/jmx/remote/protocol/rmi/SCCS/s.ClientProvider.java
+com/sun/jmx/remote/protocol/rmi/SCCS/s.ServerProvider.java
+com/sun/jmx/remote/protocol/rmi/ClientProvider.java
+com/sun/jmx/remote/protocol/rmi/ServerProvider.java
+com/sun/jmx/remote/security
+com/sun/jmx/remote/security/SCCS
+com/sun/jmx/remote/security/SCCS/s.JMXSubjectDomainCombiner.java
+com/sun/jmx/remote/security/SCCS/s.FileLoginModule.java
+com/sun/jmx/remote/security/SCCS/s.MBeanServerFileAccessController.java
+com/sun/jmx/remote/security/SCCS/s.JMXPluggableAuthenticator.java
+com/sun/jmx/remote/security/SCCS/s.MBeanServerAccessController.java
+com/sun/jmx/remote/security/SCCS/s.SubjectDelegator.java
+com/sun/jmx/remote/security/JMXPluggableAuthenticator.java
+com/sun/jmx/remote/security/FileLoginModule.java
+com/sun/jmx/remote/security/MBeanServerAccessController.java
+com/sun/jmx/remote/security/JMXSubjectDomainCombiner.java
+com/sun/jmx/remote/security/MBeanServerFileAccessController.java
+com/sun/jmx/remote/security/SubjectDelegator.java
+com/sun/jmx/remote/util
+com/sun/jmx/remote/util/SCCS
+com/sun/jmx/remote/util/SCCS/s.ClassLogger.java
+com/sun/jmx/remote/util/SCCS/s.CacheMap.java
+com/sun/jmx/remote/util/SCCS/s.ClassLoaderWithRepository.java
+com/sun/jmx/remote/util/SCCS/s.EnvHelp.java
+com/sun/jmx/remote/util/SCCS/s.OrderClassLoaders.java
+com/sun/jmx/remote/util/SCCS/s.Service.java
+com/sun/jmx/remote/util/ClassLogger.java
+com/sun/jmx/remote/util/CacheMap.java
+com/sun/jmx/remote/util/ClassLoaderWithRepository.java
+com/sun/jmx/remote/util/EnvHelp.java
+com/sun/jmx/remote/util/OrderClassLoaders.java
+com/sun/jmx/remote/util/Service.java
+com/sun/jmx/snmp
+com/sun/jmx/snmp/IPAcl
+com/sun/jmx/snmp/IPAcl/SCCS
+com/sun/jmx/snmp/IPAcl/SCCS/s.ASCII_CharStream.README
+com/sun/jmx/snmp/IPAcl/SCCS/s.ASCII_CharStream.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.AclEntryImpl.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.AclImpl.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.GroupImpl.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.Host.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.JDMAccess.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.JDMAclBlock.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.JDMAclItem.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.JDMCommunities.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.JDMCommunity.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.JDMEnterprise.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.JDMHost.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.JDMHostInform.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.JDMHostName.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.Node.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.ParserTokenManager.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.JDMHostTrap.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.JDMInformBlock.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.JDMInformCommunity.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.JDMInformInterestedHost.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.JDMInformItem.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.JDMIpAddress.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.JDMIpMask.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.JDMIpV6Address.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.JDMManagers.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.JDMNetMask.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.JDMNetMaskV6.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.JDMSecurityDefs.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.JDMTrapBlock.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.JDMTrapCommunity.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.JDMTrapInterestedHost.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.JDMTrapItem.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.JDMTrapNum.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.JJTParserState.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.NetMaskImpl.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.OwnerImpl.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.ParseError.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.ParseException.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.Parser.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.Parser.jj
+com/sun/jmx/snmp/IPAcl/SCCS/s.Parser.jjt
+com/sun/jmx/snmp/IPAcl/SCCS/s.ParserConstants.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.TokenMgrError.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.ParserTreeConstants.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.PermissionImpl.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.PrincipalImpl.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.README.update
+com/sun/jmx/snmp/IPAcl/SCCS/s.SimpleNode.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.SnmpAcl.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.Token.java
+com/sun/jmx/snmp/IPAcl/SCCS/s.package.html
+com/sun/jmx/snmp/IPAcl/JDMInformInterestedHost.java
+com/sun/jmx/snmp/IPAcl/ASCII_CharStream.README
+com/sun/jmx/snmp/IPAcl/ASCII_CharStream.java
+com/sun/jmx/snmp/IPAcl/AclEntryImpl.java
+com/sun/jmx/snmp/IPAcl/AclImpl.java
+com/sun/jmx/snmp/IPAcl/GroupImpl.java
+com/sun/jmx/snmp/IPAcl/Host.java
+com/sun/jmx/snmp/IPAcl/JDMAccess.java
+com/sun/jmx/snmp/IPAcl/JDMAclBlock.java
+com/sun/jmx/snmp/IPAcl/JDMAclItem.java
+com/sun/jmx/snmp/IPAcl/JDMCommunities.java
+com/sun/jmx/snmp/IPAcl/JDMCommunity.java
+com/sun/jmx/snmp/IPAcl/JDMEnterprise.java
+com/sun/jmx/snmp/IPAcl/JDMHost.java
+com/sun/jmx/snmp/IPAcl/JDMHostInform.java
+com/sun/jmx/snmp/IPAcl/JDMHostName.java
+com/sun/jmx/snmp/IPAcl/JDMHostTrap.java
+com/sun/jmx/snmp/IPAcl/JDMInformBlock.java
+com/sun/jmx/snmp/IPAcl/JDMInformCommunity.java
+com/sun/jmx/snmp/IPAcl/JDMSecurityDefs.java
+com/sun/jmx/snmp/IPAcl/JDMInformItem.java
+com/sun/jmx/snmp/IPAcl/JDMIpAddress.java
+com/sun/jmx/snmp/IPAcl/JDMIpMask.java
+com/sun/jmx/snmp/IPAcl/JDMIpV6Address.java
+com/sun/jmx/snmp/IPAcl/JDMManagers.java
+com/sun/jmx/snmp/IPAcl/JDMNetMask.java
+com/sun/jmx/snmp/IPAcl/JDMNetMaskV6.java
+com/sun/jmx/snmp/IPAcl/JDMTrapInterestedHost.java
+com/sun/jmx/snmp/IPAcl/JDMTrapBlock.java
+com/sun/jmx/snmp/IPAcl/JDMTrapCommunity.java
+com/sun/jmx/snmp/IPAcl/JDMTrapItem.java
+com/sun/jmx/snmp/IPAcl/JDMTrapNum.java
+com/sun/jmx/snmp/IPAcl/JJTParserState.java
+com/sun/jmx/snmp/IPAcl/TokenMgrError.java
+com/sun/jmx/snmp/IPAcl/README.update
+com/sun/jmx/snmp/IPAcl/NetMaskImpl.java
+com/sun/jmx/snmp/IPAcl/Node.java
+com/sun/jmx/snmp/IPAcl/OwnerImpl.java
+com/sun/jmx/snmp/IPAcl/ParseError.java
+com/sun/jmx/snmp/IPAcl/ParseException.java
+com/sun/jmx/snmp/IPAcl/Parser.java
+com/sun/jmx/snmp/IPAcl/Parser.jj
+com/sun/jmx/snmp/IPAcl/Parser.jjt
+com/sun/jmx/snmp/IPAcl/ParserConstants.java
+com/sun/jmx/snmp/IPAcl/ParserTokenManager.java
+com/sun/jmx/snmp/IPAcl/ParserTreeConstants.java
+com/sun/jmx/snmp/IPAcl/PermissionImpl.java
+com/sun/jmx/snmp/IPAcl/PrincipalImpl.java
+com/sun/jmx/snmp/IPAcl/SimpleNode.java
+com/sun/jmx/snmp/IPAcl/SnmpAcl.java
+com/sun/jmx/snmp/IPAcl/Token.java
+com/sun/jmx/snmp/IPAcl/package.html
+com/sun/jmx/snmp/SCCS
+com/sun/jmx/snmp/SCCS/s.EnumRowStatus.java
+com/sun/jmx/snmp/SCCS/s.BerDecoder.java
+com/sun/jmx/snmp/SCCS/s.BerEncoder.java
+com/sun/jmx/snmp/SCCS/s.BerException.java
+com/sun/jmx/snmp/SCCS/s.Enumerated.java
+com/sun/jmx/snmp/SCCS/s.InetAddressAcl.java
+com/sun/jmx/snmp/SCCS/s.ServiceName.java
+com/sun/jmx/snmp/SCCS/s.SnmpAckPdu.java
+com/sun/jmx/snmp/SCCS/s.SnmpCounter.java
+com/sun/jmx/snmp/SCCS/s.SnmpEngine.java
+com/sun/jmx/snmp/SCCS/s.SnmpBadSecurityLevelException.java
+com/sun/jmx/snmp/SCCS/s.SnmpCounter64.java
+com/sun/jmx/snmp/SCCS/s.SnmpDataTypeEnums.java
+com/sun/jmx/snmp/SCCS/s.SnmpDefinitions.java
+com/sun/jmx/snmp/SCCS/s.SnmpUnknownAccContrModelException.java
+com/sun/jmx/snmp/SCCS/s.SnmpEngineFactory.java
+com/sun/jmx/snmp/SCCS/s.SnmpEngineId.java
+com/sun/jmx/snmp/SCCS/s.SnmpEngineParameters.java
+com/sun/jmx/snmp/SCCS/s.SnmpGauge.java
+com/sun/jmx/snmp/SCCS/s.SnmpInt.java
+com/sun/jmx/snmp/SCCS/s.SnmpIpAddress.java
+com/sun/jmx/snmp/SCCS/s.SnmpMessage.java
+com/sun/jmx/snmp/SCCS/s.SnmpMsg.java
+com/sun/jmx/snmp/SCCS/s.SnmpNull.java
+com/sun/jmx/snmp/SCCS/s.SnmpOid.java
+com/sun/jmx/snmp/SCCS/s.SnmpOidDatabase.java
+com/sun/jmx/snmp/SCCS/s.SnmpOidDatabaseSupport.java
+com/sun/jmx/snmp/SCCS/s.SnmpOidRecord.java
+com/sun/jmx/snmp/SCCS/s.SnmpOidTable.java
+com/sun/jmx/snmp/SCCS/s.SnmpOidTableSupport.java
+com/sun/jmx/snmp/SCCS/s.SnmpOpaque.java
+com/sun/jmx/snmp/SCCS/s.SnmpParameters.java
+com/sun/jmx/snmp/SCCS/s.SnmpParams.java
+com/sun/jmx/snmp/SCCS/s.SnmpPdu.java
+com/sun/jmx/snmp/SCCS/s.SnmpPduBulk.java
+com/sun/jmx/snmp/SCCS/s.SnmpPduBulkType.java
+com/sun/jmx/snmp/SCCS/s.SnmpPduFactory.java
+com/sun/jmx/snmp/SCCS/s.SnmpPduFactoryBER.java
+com/sun/jmx/snmp/SCCS/s.SnmpPduPacket.java
+com/sun/jmx/snmp/SCCS/s.SnmpPduRequest.java
+com/sun/jmx/snmp/SCCS/s.SnmpPduRequestType.java
+com/sun/jmx/snmp/SCCS/s.SnmpPduTrap.java
+com/sun/jmx/snmp/SCCS/s.SnmpPeer.java
+com/sun/jmx/snmp/SCCS/s.SnmpScopedPduBulk.java
+com/sun/jmx/snmp/SCCS/s.SnmpScopedPduPacket.java
+com/sun/jmx/snmp/SCCS/s.SnmpScopedPduRequest.java
+com/sun/jmx/snmp/SCCS/s.SnmpSecurityException.java
+com/sun/jmx/snmp/SCCS/s.SnmpString.java
+com/sun/jmx/snmp/SCCS/s.SnmpSecurityParameters.java
+com/sun/jmx/snmp/SCCS/s.SnmpStatusException.java
+com/sun/jmx/snmp/SCCS/s.SnmpStringFixed.java
+com/sun/jmx/snmp/SCCS/s.SnmpTimeticks.java
+com/sun/jmx/snmp/SCCS/s.SnmpTooBigException.java
+com/sun/jmx/snmp/SCCS/s.SnmpUnknownMsgProcModelException.java
+com/sun/jmx/snmp/SCCS/s.SnmpUnknownModelException.java
+com/sun/jmx/snmp/SCCS/s.SnmpUnknownModelLcdException.java
+com/sun/jmx/snmp/SCCS/s.UserAcl.java
+com/sun/jmx/snmp/SCCS/s.SnmpUnknownSecModelException.java
+com/sun/jmx/snmp/SCCS/s.SnmpUnknownSubSystemException.java
+com/sun/jmx/snmp/SCCS/s.SnmpUnsignedInt.java
+com/sun/jmx/snmp/SCCS/s.SnmpUsmKeyHandler.java
+com/sun/jmx/snmp/SCCS/s.SnmpV3Message.java
+com/sun/jmx/snmp/SCCS/s.SnmpValue.java
+com/sun/jmx/snmp/SCCS/s.SnmpVarBind.java
+com/sun/jmx/snmp/SCCS/s.SnmpVarBindList.java
+com/sun/jmx/snmp/SCCS/s.ThreadContext.java
+com/sun/jmx/snmp/SCCS/s.Timestamp.java
+com/sun/jmx/snmp/SCCS/s.package.html
+com/sun/jmx/snmp/agent
+com/sun/jmx/snmp/agent/SCCS
+com/sun/jmx/snmp/agent/SCCS/s.SnmpEntryOid.java
+com/sun/jmx/snmp/agent/SCCS/s.SnmpIndex.java
+com/sun/jmx/snmp/agent/SCCS/s.SnmpErrorHandlerAgent.java
+com/sun/jmx/snmp/agent/SCCS/s.SnmpGenericMetaServer.java
+com/sun/jmx/snmp/agent/SCCS/s.SnmpGenericObjectServer.java
+com/sun/jmx/snmp/agent/SCCS/s.SnmpMib.java
+com/sun/jmx/snmp/agent/SCCS/s.SnmpMibAgent.java
+com/sun/jmx/snmp/agent/SCCS/s.SnmpMibAgentMBean.java
+com/sun/jmx/snmp/agent/SCCS/s.SnmpMibEntry.java
+com/sun/jmx/snmp/agent/SCCS/s.SnmpMibGroup.java
+com/sun/jmx/snmp/agent/SCCS/s.SnmpMibHandler.java
+com/sun/jmx/snmp/agent/SCCS/s.SnmpMibNode.java
+com/sun/jmx/snmp/agent/SCCS/s.SnmpMibOid.java
+com/sun/jmx/snmp/agent/SCCS/s.SnmpMibRequest.java
+com/sun/jmx/snmp/agent/SCCS/s.SnmpTableEntryNotification.java
+com/sun/jmx/snmp/agent/SCCS/s.SnmpMibRequestImpl.java
+com/sun/jmx/snmp/agent/SCCS/s.SnmpMibSubRequest.java
+com/sun/jmx/snmp/agent/SCCS/s.SnmpMibTable.java
+com/sun/jmx/snmp/agent/SCCS/s.SnmpRequestTree.java
+com/sun/jmx/snmp/agent/SCCS/s.SnmpStandardMetaServer.java
+com/sun/jmx/snmp/agent/SCCS/s.SnmpStandardObjectServer.java
+com/sun/jmx/snmp/agent/SCCS/s.SnmpTableCallbackHandler.java
+com/sun/jmx/snmp/agent/SCCS/s.SnmpTableEntryFactory.java
+com/sun/jmx/snmp/agent/SCCS/s.SnmpUserDataFactory.java
+com/sun/jmx/snmp/agent/SCCS/s.SnmpTableSupport.java
+com/sun/jmx/snmp/agent/SCCS/s.package.html
+com/sun/jmx/snmp/agent/SnmpErrorHandlerAgent.java
+com/sun/jmx/snmp/agent/SnmpEntryOid.java
+com/sun/jmx/snmp/agent/SnmpGenericObjectServer.java
+com/sun/jmx/snmp/agent/SnmpGenericMetaServer.java
+com/sun/jmx/snmp/agent/SnmpMibAgentMBean.java
+com/sun/jmx/snmp/agent/SnmpIndex.java
+com/sun/jmx/snmp/agent/SnmpMib.java
+com/sun/jmx/snmp/agent/SnmpMibAgent.java
+com/sun/jmx/snmp/agent/SnmpMibEntry.java
+com/sun/jmx/snmp/agent/SnmpMibGroup.java
+com/sun/jmx/snmp/agent/SnmpMibHandler.java
+com/sun/jmx/snmp/agent/SnmpMibNode.java
+com/sun/jmx/snmp/agent/SnmpMibOid.java
+com/sun/jmx/snmp/agent/SnmpMibRequest.java
+com/sun/jmx/snmp/agent/package.html
+com/sun/jmx/snmp/agent/SnmpMibRequestImpl.java
+com/sun/jmx/snmp/agent/SnmpMibSubRequest.java
+com/sun/jmx/snmp/agent/SnmpMibTable.java
+com/sun/jmx/snmp/agent/SnmpRequestTree.java
+com/sun/jmx/snmp/agent/SnmpStandardMetaServer.java
+com/sun/jmx/snmp/agent/SnmpStandardObjectServer.java
+com/sun/jmx/snmp/agent/SnmpTableCallbackHandler.java
+com/sun/jmx/snmp/agent/SnmpTableEntryFactory.java
+com/sun/jmx/snmp/agent/SnmpTableEntryNotification.java
+com/sun/jmx/snmp/agent/SnmpTableSupport.java
+com/sun/jmx/snmp/agent/SnmpUserDataFactory.java
+com/sun/jmx/snmp/daemon
+com/sun/jmx/snmp/daemon/SCCS
+com/sun/jmx/snmp/daemon/SCCS/s.CommunicationException.java
+com/sun/jmx/snmp/daemon/SCCS/s.ClientHandler.java
+com/sun/jmx/snmp/daemon/SCCS/s.CommunicatorServerMBean.java
+com/sun/jmx/snmp/daemon/SCCS/s.CommunicatorServer.java
+com/sun/jmx/snmp/daemon/SCCS/s.SnmpAdaptorServer.java
+com/sun/jmx/snmp/daemon/SCCS/s.SnmpAdaptorServerMBean.java
+com/sun/jmx/snmp/daemon/SCCS/s.SnmpInformHandler.java
+com/sun/jmx/snmp/daemon/SCCS/s.SnmpInformRequest.java
+com/sun/jmx/snmp/daemon/SCCS/s.SnmpMibTree.java
+com/sun/jmx/snmp/daemon/SCCS/s.SnmpQManager.java
+com/sun/jmx/snmp/daemon/SCCS/s.SnmpRequestCounter.java
+com/sun/jmx/snmp/daemon/SCCS/s.SnmpRequestHandler.java
+com/sun/jmx/snmp/daemon/SCCS/s.package.html
+com/sun/jmx/snmp/daemon/SCCS/s.SnmpResponseHandler.java
+com/sun/jmx/snmp/daemon/SCCS/s.SnmpSendServer.java
+com/sun/jmx/snmp/daemon/SCCS/s.SnmpSession.java
+com/sun/jmx/snmp/daemon/SCCS/s.SnmpSocket.java
+com/sun/jmx/snmp/daemon/SCCS/s.SnmpSubBulkRequestHandler.java
+com/sun/jmx/snmp/daemon/SCCS/s.SnmpSubNextRequestHandler.java
+com/sun/jmx/snmp/daemon/SCCS/s.SnmpSubRequestHandler.java
+com/sun/jmx/snmp/daemon/SCCS/s.SnmpTimerServer.java
+com/sun/jmx/snmp/daemon/CommunicationException.java
+com/sun/jmx/snmp/daemon/ClientHandler.java
+com/sun/jmx/snmp/daemon/CommunicatorServerMBean.java
+com/sun/jmx/snmp/daemon/CommunicatorServer.java
+com/sun/jmx/snmp/daemon/SnmpAdaptorServerMBean.java
+com/sun/jmx/snmp/daemon/SnmpAdaptorServer.java
+com/sun/jmx/snmp/daemon/SnmpInformHandler.java
+com/sun/jmx/snmp/daemon/SnmpInformRequest.java
+com/sun/jmx/snmp/daemon/SnmpMibTree.java
+com/sun/jmx/snmp/daemon/SnmpQManager.java
+com/sun/jmx/snmp/daemon/SnmpRequestCounter.java
+com/sun/jmx/snmp/daemon/SnmpRequestHandler.java
+com/sun/jmx/snmp/daemon/SnmpResponseHandler.java
+com/sun/jmx/snmp/daemon/SnmpSendServer.java
+com/sun/jmx/snmp/daemon/SnmpSession.java
+com/sun/jmx/snmp/daemon/SnmpSocket.java
+com/sun/jmx/snmp/daemon/SnmpSubBulkRequestHandler.java
+com/sun/jmx/snmp/daemon/SnmpSubNextRequestHandler.java
+com/sun/jmx/snmp/daemon/SnmpSubRequestHandler.java
+com/sun/jmx/snmp/daemon/SnmpTimerServer.java
+com/sun/jmx/snmp/daemon/package.html
+com/sun/jmx/snmp/defaults
+com/sun/jmx/snmp/defaults/SCCS
+com/sun/jmx/snmp/defaults/SCCS/s.SnmpProperties.java
+com/sun/jmx/snmp/defaults/SCCS/s.DefaultPaths.java
+com/sun/jmx/snmp/defaults/SCCS/s.package.html
+com/sun/jmx/snmp/defaults/DefaultPaths.java
+com/sun/jmx/snmp/defaults/SnmpProperties.java
+com/sun/jmx/snmp/defaults/package.html
+com/sun/jmx/snmp/internal
+com/sun/jmx/snmp/internal/SCCS
+com/sun/jmx/snmp/internal/SCCS/s.SnmpAccessControlSubSystem.java
+com/sun/jmx/snmp/internal/SCCS/s.SnmpAccessControlModel.java
+com/sun/jmx/snmp/internal/SCCS/s.SnmpMsgProcessingModel.java
+com/sun/jmx/snmp/internal/SCCS/s.SnmpDecryptedPdu.java
+com/sun/jmx/snmp/internal/SCCS/s.SnmpEngineImpl.java
+com/sun/jmx/snmp/internal/SCCS/s.SnmpIncomingRequest.java
+com/sun/jmx/snmp/internal/SCCS/s.SnmpIncomingResponse.java
+com/sun/jmx/snmp/internal/SCCS/s.SnmpLcd.java
+com/sun/jmx/snmp/internal/SCCS/s.SnmpModel.java
+com/sun/jmx/snmp/internal/SCCS/s.SnmpModelLcd.java
+com/sun/jmx/snmp/internal/SCCS/s.SnmpMsgProcessingSubSystem.java
+com/sun/jmx/snmp/internal/SCCS/s.SnmpOutgoingRequest.java
+com/sun/jmx/snmp/internal/SCCS/s.SnmpSecurityCache.java
+com/sun/jmx/snmp/internal/SCCS/s.SnmpSubSystem.java
+com/sun/jmx/snmp/internal/SCCS/s.SnmpSecurityModel.java
+com/sun/jmx/snmp/internal/SCCS/s.SnmpSecuritySubSystem.java
+com/sun/jmx/snmp/internal/SCCS/s.SnmpTools.java
+com/sun/jmx/snmp/internal/SCCS/s.package.html
+com/sun/jmx/snmp/internal/SnmpAccessControlSubSystem.java
+com/sun/jmx/snmp/internal/SnmpAccessControlModel.java
+com/sun/jmx/snmp/internal/SnmpMsgProcessingSubSystem.java
+com/sun/jmx/snmp/internal/SnmpDecryptedPdu.java
+com/sun/jmx/snmp/internal/SnmpEngineImpl.java
+com/sun/jmx/snmp/internal/SnmpIncomingRequest.java
+com/sun/jmx/snmp/internal/SnmpIncomingResponse.java
+com/sun/jmx/snmp/internal/SnmpLcd.java
+com/sun/jmx/snmp/internal/SnmpModel.java
+com/sun/jmx/snmp/internal/SnmpModelLcd.java
+com/sun/jmx/snmp/internal/SnmpMsgProcessingModel.java
+com/sun/jmx/snmp/internal/SnmpOutgoingRequest.java
+com/sun/jmx/snmp/internal/SnmpSecurityCache.java
+com/sun/jmx/snmp/internal/SnmpSecurityModel.java
+com/sun/jmx/snmp/internal/SnmpSecuritySubSystem.java
+com/sun/jmx/snmp/internal/SnmpSubSystem.java
+com/sun/jmx/snmp/internal/SnmpTools.java
+com/sun/jmx/snmp/internal/package.html
+com/sun/jmx/snmp/mpm
+com/sun/jmx/snmp/mpm/SCCS
+com/sun/jmx/snmp/mpm/SCCS/s.SnmpMsgTranslator.java
+com/sun/jmx/snmp/mpm/SCCS/s.package.html
+com/sun/jmx/snmp/mpm/SnmpMsgTranslator.java
+com/sun/jmx/snmp/mpm/package.html
+com/sun/jmx/snmp/tasks
+com/sun/jmx/snmp/tasks/SCCS
+com/sun/jmx/snmp/tasks/SCCS/s.TaskServer.java
+com/sun/jmx/snmp/tasks/SCCS/s.Task.java
+com/sun/jmx/snmp/tasks/SCCS/s.ThreadService.java
+com/sun/jmx/snmp/tasks/SCCS/s.package.html
+com/sun/jmx/snmp/tasks/TaskServer.java
+com/sun/jmx/snmp/tasks/Task.java
+com/sun/jmx/snmp/tasks/ThreadService.java
+com/sun/jmx/snmp/tasks/package.html
+com/sun/jmx/snmp/BerException.java
+com/sun/jmx/snmp/BerDecoder.java
+com/sun/jmx/snmp/BerEncoder.java
+com/sun/jmx/snmp/EnumRowStatus.java
+com/sun/jmx/snmp/Enumerated.java
+com/sun/jmx/snmp/InetAddressAcl.java
+com/sun/jmx/snmp/ServiceName.java
+com/sun/jmx/snmp/SnmpAckPdu.java
+com/sun/jmx/snmp/SnmpCounter.java
+com/sun/jmx/snmp/SnmpCounter64.java
+com/sun/jmx/snmp/SnmpBadSecurityLevelException.java
+com/sun/jmx/snmp/SnmpUnknownAccContrModelException.java
+com/sun/jmx/snmp/SnmpDataTypeEnums.java
+com/sun/jmx/snmp/SnmpDefinitions.java
+com/sun/jmx/snmp/SnmpEngine.java
+com/sun/jmx/snmp/SnmpEngineFactory.java
+com/sun/jmx/snmp/SnmpEngineId.java
+com/sun/jmx/snmp/SnmpEngineParameters.java
+com/sun/jmx/snmp/SnmpGauge.java
+com/sun/jmx/snmp/SnmpInt.java
+com/sun/jmx/snmp/SnmpIpAddress.java
+com/sun/jmx/snmp/SnmpMessage.java
+com/sun/jmx/snmp/SnmpMsg.java
+com/sun/jmx/snmp/SnmpNull.java
+com/sun/jmx/snmp/SnmpOid.java
+com/sun/jmx/snmp/SnmpOidDatabase.java
+com/sun/jmx/snmp/SnmpOidDatabaseSupport.java
+com/sun/jmx/snmp/SnmpOidRecord.java
+com/sun/jmx/snmp/SnmpOidTable.java
+com/sun/jmx/snmp/SnmpOpaque.java
+com/sun/jmx/snmp/SnmpOidTableSupport.java
+com/sun/jmx/snmp/SnmpParameters.java
+com/sun/jmx/snmp/SnmpParams.java
+com/sun/jmx/snmp/SnmpPdu.java
+com/sun/jmx/snmp/SnmpPduBulk.java
+com/sun/jmx/snmp/SnmpPduBulkType.java
+com/sun/jmx/snmp/SnmpPduFactory.java
+com/sun/jmx/snmp/SnmpPduFactoryBER.java
+com/sun/jmx/snmp/SnmpPduPacket.java
+com/sun/jmx/snmp/SnmpPduRequest.java
+com/sun/jmx/snmp/SnmpPduRequestType.java
+com/sun/jmx/snmp/SnmpPduTrap.java
+com/sun/jmx/snmp/SnmpPeer.java
+com/sun/jmx/snmp/SnmpScopedPduBulk.java
+com/sun/jmx/snmp/SnmpScopedPduPacket.java
+com/sun/jmx/snmp/SnmpScopedPduRequest.java
+com/sun/jmx/snmp/SnmpSecurityException.java
+com/sun/jmx/snmp/SnmpSecurityParameters.java
+com/sun/jmx/snmp/SnmpStatusException.java
+com/sun/jmx/snmp/SnmpString.java
+com/sun/jmx/snmp/SnmpStringFixed.java
+com/sun/jmx/snmp/SnmpTimeticks.java
+com/sun/jmx/snmp/SnmpTooBigException.java
+com/sun/jmx/snmp/SnmpUnknownModelLcdException.java
+com/sun/jmx/snmp/SnmpUnknownModelException.java
+com/sun/jmx/snmp/SnmpValue.java
+com/sun/jmx/snmp/SnmpUnknownMsgProcModelException.java
+com/sun/jmx/snmp/SnmpUnknownSecModelException.java
+com/sun/jmx/snmp/SnmpUnknownSubSystemException.java
+com/sun/jmx/snmp/SnmpUnsignedInt.java
+com/sun/jmx/snmp/SnmpUsmKeyHandler.java
+com/sun/jmx/snmp/SnmpV3Message.java
+com/sun/jmx/snmp/SnmpVarBind.java
+com/sun/jmx/snmp/SnmpVarBindList.java
+com/sun/jmx/snmp/ThreadContext.java
+com/sun/jmx/snmp/Timestamp.java
+com/sun/jmx/snmp/UserAcl.java
+com/sun/jmx/snmp/package.html
+com/sun/jmx/trace
+com/sun/jmx/trace/SCCS
+com/sun/jmx/trace/SCCS/s.TraceDestination.java
+com/sun/jmx/trace/SCCS/s.Trace.java
+com/sun/jmx/trace/SCCS/s.TraceImplementation.java
+com/sun/jmx/trace/SCCS/s.TraceManager.java
+com/sun/jmx/trace/SCCS/s.TraceTags.java
+com/sun/jmx/trace/SCCS/s.logging.properties
+com/sun/jmx/trace/SCCS/s.package.html
+com/sun/jmx/trace/Trace.java
+com/sun/jmx/trace/TraceManager.java
+com/sun/jmx/trace/TraceDestination.java
+com/sun/jmx/trace/TraceImplementation.java
+com/sun/jmx/trace/TraceTags.java
+com/sun/jmx/trace/logging.properties
+com/sun/jmx/trace/package.html
+com/sun/jndi
+com/sun/jndi/cosnaming
+com/sun/jndi/cosnaming/SCCS
+com/sun/jndi/cosnaming/SCCS/s.CNBindingEnumeration.java
+com/sun/jndi/cosnaming/SCCS/s.CNCtx.java
+com/sun/jndi/cosnaming/SCCS/s.CNCtxFactory.java
+com/sun/jndi/cosnaming/SCCS/s.CNNameParser.java
+com/sun/jndi/cosnaming/SCCS/s.CorbanameUrl.java
+com/sun/jndi/cosnaming/SCCS/s.ExceptionMapper.java
+com/sun/jndi/cosnaming/SCCS/s.IiopUrl.java
+com/sun/jndi/cosnaming/SCCS/s.RemoteToCorba.java
+com/sun/jndi/cosnaming/SCCS/s.jndiprovider.properties
+com/sun/jndi/cosnaming/CNBindingEnumeration.java
+com/sun/jndi/cosnaming/CNCtx.java
+com/sun/jndi/cosnaming/CNCtxFactory.java
+com/sun/jndi/cosnaming/CNNameParser.java
+com/sun/jndi/cosnaming/CorbanameUrl.java
+com/sun/jndi/cosnaming/ExceptionMapper.java
+com/sun/jndi/cosnaming/IiopUrl.java
+com/sun/jndi/cosnaming/RemoteToCorba.java
+com/sun/jndi/cosnaming/jndiprovider.properties
+com/sun/jndi/dns
+com/sun/jndi/dns/SCCS
+com/sun/jndi/dns/SCCS/s.DnsContextFactory.java
+com/sun/jndi/dns/SCCS/s.DnsClient.java
+com/sun/jndi/dns/SCCS/s.DnsContext.java
+com/sun/jndi/dns/SCCS/s.DnsNameParser.java
+com/sun/jndi/dns/SCCS/s.DnsName.java
+com/sun/jndi/dns/SCCS/s.ResourceRecord.java
+com/sun/jndi/dns/SCCS/s.DnsUrl.java
+com/sun/jndi/dns/SCCS/s.Header.java
+com/sun/jndi/dns/SCCS/s.NameNode.java
+com/sun/jndi/dns/SCCS/s.Resolver.java
+com/sun/jndi/dns/SCCS/s.ResourceRecords.java
+com/sun/jndi/dns/SCCS/s.ZoneNode.java
+com/sun/jndi/dns/DnsContextFactory.java
+com/sun/jndi/dns/DnsClient.java
+com/sun/jndi/dns/DnsContext.java
+com/sun/jndi/dns/DnsNameParser.java
+com/sun/jndi/dns/DnsName.java
+com/sun/jndi/dns/ResourceRecord.java
+com/sun/jndi/dns/DnsUrl.java
+com/sun/jndi/dns/Header.java
+com/sun/jndi/dns/NameNode.java
+com/sun/jndi/dns/Resolver.java
+com/sun/jndi/dns/ResourceRecords.java
+com/sun/jndi/dns/ZoneNode.java
+com/sun/jndi/ldap
+com/sun/jndi/ldap/SCCS
+com/sun/jndi/ldap/SCCS/s.BindingWithControls.java
+com/sun/jndi/ldap/SCCS/s.BasicControl.java
+com/sun/jndi/ldap/SCCS/s.Ber.java
+com/sun/jndi/ldap/SCCS/s.BerDecoder.java
+com/sun/jndi/ldap/SCCS/s.BerEncoder.java
+com/sun/jndi/ldap/SCCS/s.Connection.java
+com/sun/jndi/ldap/SCCS/s.ClientId.java
+com/sun/jndi/ldap/SCCS/s.LdapAttribute.java
+com/sun/jndi/ldap/SCCS/s.Filter.java
+com/sun/jndi/ldap/SCCS/s.DefaultResponseControlFactory.java
+com/sun/jndi/ldap/SCCS/s.DigestClientId.java
+com/sun/jndi/ldap/SCCS/s.EntryChangeResponseControl.java
+com/sun/jndi/ldap/SCCS/s.EventQueue.java
+com/sun/jndi/ldap/SCCS/s.EventSupport.java
+com/sun/jndi/ldap/SCCS/s.LdapCtxFactory.java
+com/sun/jndi/ldap/SCCS/s.LdapCtx.java
+com/sun/jndi/ldap/SCCS/s.LdapBindingEnumeration.java
+com/sun/jndi/ldap/SCCS/s.LdapClient.java
+com/sun/jndi/ldap/SCCS/s.LdapClientFactory.java
+com/sun/jndi/ldap/SCCS/s.LdapNameParser.java
+com/sun/jndi/ldap/SCCS/s.LdapEntry.java
+com/sun/jndi/ldap/SCCS/s.LdapName.java
+com/sun/jndi/ldap/SCCS/s.Obj.java
+com/sun/jndi/ldap/SCCS/s.VersionHelper12.java
+com/sun/jndi/ldap/SCCS/s.LdapNamingEnumeration.java
+com/sun/jndi/ldap/SCCS/s.LdapPoolManager.java
+com/sun/jndi/ldap/SCCS/s.LdapReferralContext.java
+com/sun/jndi/ldap/SCCS/s.LdapReferralException.java
+com/sun/jndi/ldap/SCCS/s.LdapRequest.java
+com/sun/jndi/ldap/SCCS/s.LdapResult.java
+com/sun/jndi/ldap/SCCS/s.LdapSchemaCtx.java
+com/sun/jndi/ldap/SCCS/s.LdapSchemaParser.java
+com/sun/jndi/ldap/SCCS/s.LdapSearchEnumeration.java
+com/sun/jndi/ldap/SCCS/s.LdapURL.java
+com/sun/jndi/ldap/SCCS/s.ManageReferralControl.java
+com/sun/jndi/ldap/SCCS/s.NameClassPairWithControls.java
+com/sun/jndi/ldap/SCCS/s.NamingEventNotifier.java
+com/sun/jndi/ldap/SCCS/s.NotifierArgs.java
+com/sun/jndi/ldap/SCCS/s.PersistentSearchControl.java
+com/sun/jndi/ldap/SCCS/s.ReferralEnumeration.java
+com/sun/jndi/ldap/SCCS/s.SearchResultWithControls.java
+com/sun/jndi/ldap/SCCS/s.ServiceLocator.java
+com/sun/jndi/ldap/SCCS/s.SimpleClientId.java
+com/sun/jndi/ldap/SCCS/s.UnsolicitedResponseImpl.java
+com/sun/jndi/ldap/SCCS/s.VersionHelper.java
+com/sun/jndi/ldap/SCCS/s.jndiprovider.properties
+com/sun/jndi/ldap/ext
+com/sun/jndi/ldap/ext/SCCS
+com/sun/jndi/ldap/ext/SCCS/s.StartTlsResponseImpl.java
+com/sun/jndi/ldap/ext/StartTlsResponseImpl.java
+com/sun/jndi/ldap/pool
+com/sun/jndi/ldap/pool/SCCS
+com/sun/jndi/ldap/pool/SCCS/s.ConnectionsWeakRef.java
+com/sun/jndi/ldap/pool/SCCS/s.ConnectionDesc.java
+com/sun/jndi/ldap/pool/SCCS/s.Connections.java
+com/sun/jndi/ldap/pool/SCCS/s.ConnectionsRef.java
+com/sun/jndi/ldap/pool/SCCS/s.PoolCallback.java
+com/sun/jndi/ldap/pool/SCCS/s.Pool.java
+com/sun/jndi/ldap/pool/SCCS/s.PooledConnectionFactory.java
+com/sun/jndi/ldap/pool/SCCS/s.PoolCleaner.java
+com/sun/jndi/ldap/pool/SCCS/s.PooledConnection.java
+com/sun/jndi/ldap/pool/ConnectionsWeakRef.java
+com/sun/jndi/ldap/pool/ConnectionDesc.java
+com/sun/jndi/ldap/pool/Connections.java
+com/sun/jndi/ldap/pool/ConnectionsRef.java
+com/sun/jndi/ldap/pool/PoolCallback.java
+com/sun/jndi/ldap/pool/Pool.java
+com/sun/jndi/ldap/pool/PooledConnectionFactory.java
+com/sun/jndi/ldap/pool/PoolCleaner.java
+com/sun/jndi/ldap/pool/PooledConnection.java
+com/sun/jndi/ldap/sasl
+com/sun/jndi/ldap/sasl/SCCS
+com/sun/jndi/ldap/sasl/SCCS/s.DefaultCallbackHandler.java
+com/sun/jndi/ldap/sasl/SCCS/s.LdapSasl.java
+com/sun/jndi/ldap/sasl/SCCS/s.SaslInputStream.java
+com/sun/jndi/ldap/sasl/SCCS/s.SaslOutputStream.java
+com/sun/jndi/ldap/sasl/DefaultCallbackHandler.java
+com/sun/jndi/ldap/sasl/LdapSasl.java
+com/sun/jndi/ldap/sasl/SaslInputStream.java
+com/sun/jndi/ldap/sasl/SaslOutputStream.java
+com/sun/jndi/ldap/BindingWithControls.java
+com/sun/jndi/ldap/BasicControl.java
+com/sun/jndi/ldap/Ber.java
+com/sun/jndi/ldap/BerDecoder.java
+com/sun/jndi/ldap/BerEncoder.java
+com/sun/jndi/ldap/DigestClientId.java
+com/sun/jndi/ldap/ClientId.java
+com/sun/jndi/ldap/Connection.java
+com/sun/jndi/ldap/Filter.java
+com/sun/jndi/ldap/LdapBindingEnumeration.java
+com/sun/jndi/ldap/DefaultResponseControlFactory.java
+com/sun/jndi/ldap/EntryChangeResponseControl.java
+com/sun/jndi/ldap/EventQueue.java
+com/sun/jndi/ldap/EventSupport.java
+com/sun/jndi/ldap/LdapAttribute.java
+com/sun/jndi/ldap/LdapClientFactory.java
+com/sun/jndi/ldap/LdapClient.java
+com/sun/jndi/ldap/LdapCtxFactory.java
+com/sun/jndi/ldap/LdapCtx.java
+com/sun/jndi/ldap/LdapNamingEnumeration.java
+com/sun/jndi/ldap/LdapEntry.java
+com/sun/jndi/ldap/LdapName.java
+com/sun/jndi/ldap/LdapNameParser.java
+com/sun/jndi/ldap/LdapReferralContext.java
+com/sun/jndi/ldap/LdapPoolManager.java
+com/sun/jndi/ldap/ServiceLocator.java
+com/sun/jndi/ldap/Obj.java
+com/sun/jndi/ldap/LdapReferralException.java
+com/sun/jndi/ldap/LdapRequest.java
+com/sun/jndi/ldap/LdapResult.java
+com/sun/jndi/ldap/LdapSchemaCtx.java
+com/sun/jndi/ldap/LdapSchemaParser.java
+com/sun/jndi/ldap/LdapURL.java
+com/sun/jndi/ldap/LdapSearchEnumeration.java
+com/sun/jndi/ldap/ManageReferralControl.java
+com/sun/jndi/ldap/NameClassPairWithControls.java
+com/sun/jndi/ldap/NamingEventNotifier.java
+com/sun/jndi/ldap/NotifierArgs.java
+com/sun/jndi/ldap/PersistentSearchControl.java
+com/sun/jndi/ldap/ReferralEnumeration.java
+com/sun/jndi/ldap/SearchResultWithControls.java
+com/sun/jndi/ldap/SimpleClientId.java
+com/sun/jndi/ldap/UnsolicitedResponseImpl.java
+com/sun/jndi/ldap/VersionHelper.java
+com/sun/jndi/ldap/VersionHelper12.java
+com/sun/jndi/ldap/jndiprovider.properties
+com/sun/jndi/rmi
+com/sun/jndi/rmi/registry
+com/sun/jndi/rmi/registry/SCCS
+com/sun/jndi/rmi/registry/SCCS/s.RegistryContextFactory.java
+com/sun/jndi/rmi/registry/SCCS/s.ReferenceWrapper.java
+com/sun/jndi/rmi/registry/SCCS/s.RegistryContext.java
+com/sun/jndi/rmi/registry/SCCS/s.RemoteReference.java
+com/sun/jndi/rmi/registry/RegistryContextFactory.java
+com/sun/jndi/rmi/registry/ReferenceWrapper.java
+com/sun/jndi/rmi/registry/RegistryContext.java
+com/sun/jndi/rmi/registry/RemoteReference.java
+com/sun/jndi/toolkit
+com/sun/jndi/toolkit/corba
+com/sun/jndi/toolkit/corba/SCCS
+com/sun/jndi/toolkit/corba/SCCS/s.CorbaUtils.java
+com/sun/jndi/toolkit/corba/CorbaUtils.java
+com/sun/jndi/toolkit/ctx
+com/sun/jndi/toolkit/ctx/SCCS
+com/sun/jndi/toolkit/ctx/SCCS/s.ComponentDirContext.java
+com/sun/jndi/toolkit/ctx/SCCS/s.AtomicContext.java
+com/sun/jndi/toolkit/ctx/SCCS/s.AtomicDirContext.java
+com/sun/jndi/toolkit/ctx/SCCS/s.ComponentContext.java
+com/sun/jndi/toolkit/ctx/SCCS/s.Continuation.java
+com/sun/jndi/toolkit/ctx/SCCS/s.HeadTail.java
+com/sun/jndi/toolkit/ctx/SCCS/s.StringHeadTail.java
+com/sun/jndi/toolkit/ctx/SCCS/s.PartialCompositeContext.java
+com/sun/jndi/toolkit/ctx/SCCS/s.PartialCompositeDirContext.java
+com/sun/jndi/toolkit/ctx/AtomicDirContext.java
+com/sun/jndi/toolkit/ctx/AtomicContext.java
+com/sun/jndi/toolkit/ctx/PartialCompositeContext.java
+com/sun/jndi/toolkit/ctx/ComponentContext.java
+com/sun/jndi/toolkit/ctx/ComponentDirContext.java
+com/sun/jndi/toolkit/ctx/Continuation.java
+com/sun/jndi/toolkit/ctx/HeadTail.java
+com/sun/jndi/toolkit/ctx/PartialCompositeDirContext.java
+com/sun/jndi/toolkit/ctx/StringHeadTail.java
+com/sun/jndi/toolkit/dir
+com/sun/jndi/toolkit/dir/SCCS
+com/sun/jndi/toolkit/dir/SCCS/s.ContainmentFilter.java
+com/sun/jndi/toolkit/dir/SCCS/s.AttrFilter.java
+com/sun/jndi/toolkit/dir/SCCS/s.LazySearchEnumerationImpl.java
+com/sun/jndi/toolkit/dir/SCCS/s.ContextEnumerator.java
+com/sun/jndi/toolkit/dir/SCCS/s.DirSearch.java
+com/sun/jndi/toolkit/dir/SCCS/s.HierMemDirCtx.java
+com/sun/jndi/toolkit/dir/SCCS/s.SearchFilter.java
+com/sun/jndi/toolkit/dir/ContainmentFilter.java
+com/sun/jndi/toolkit/dir/AttrFilter.java
+com/sun/jndi/toolkit/dir/LazySearchEnumerationImpl.java
+com/sun/jndi/toolkit/dir/ContextEnumerator.java
+com/sun/jndi/toolkit/dir/DirSearch.java
+com/sun/jndi/toolkit/dir/HierMemDirCtx.java
+com/sun/jndi/toolkit/dir/SearchFilter.java
+com/sun/jndi/toolkit/url
+com/sun/jndi/toolkit/url/SCCS
+com/sun/jndi/toolkit/url/SCCS/s.GenericURLContext.java
+com/sun/jndi/toolkit/url/SCCS/s.GenericURLDirContext.java
+com/sun/jndi/toolkit/url/SCCS/s.Uri.java
+com/sun/jndi/toolkit/url/SCCS/s.UrlUtil.java
+com/sun/jndi/toolkit/url/GenericURLDirContext.java
+com/sun/jndi/toolkit/url/GenericURLContext.java
+com/sun/jndi/toolkit/url/Uri.java
+com/sun/jndi/toolkit/url/UrlUtil.java
+com/sun/jndi/url
+com/sun/jndi/url/corbaname
+com/sun/jndi/url/corbaname/SCCS
+com/sun/jndi/url/corbaname/SCCS/s.corbanameURLContextFactory.java
+com/sun/jndi/url/corbaname/corbanameURLContextFactory.java
+com/sun/jndi/url/dns
+com/sun/jndi/url/dns/SCCS
+com/sun/jndi/url/dns/SCCS/s.dnsURLContextFactory.java
+com/sun/jndi/url/dns/SCCS/s.dnsURLContext.java
+com/sun/jndi/url/dns/dnsURLContextFactory.java
+com/sun/jndi/url/dns/dnsURLContext.java
+com/sun/jndi/url/iiop
+com/sun/jndi/url/iiop/SCCS
+com/sun/jndi/url/iiop/SCCS/s.iiopURLContextFactory.java
+com/sun/jndi/url/iiop/SCCS/s.iiopURLContext.java
+com/sun/jndi/url/iiop/iiopURLContextFactory.java
+com/sun/jndi/url/iiop/iiopURLContext.java
+com/sun/jndi/url/iiopname
+com/sun/jndi/url/iiopname/SCCS
+com/sun/jndi/url/iiopname/SCCS/s.iiopnameURLContextFactory.java
+com/sun/jndi/url/iiopname/iiopnameURLContextFactory.java
+com/sun/jndi/url/ldap
+com/sun/jndi/url/ldap/SCCS
+com/sun/jndi/url/ldap/SCCS/s.ldapURLContextFactory.java
+com/sun/jndi/url/ldap/SCCS/s.ldapURLContext.java
+com/sun/jndi/url/ldap/ldapURLContextFactory.java
+com/sun/jndi/url/ldap/ldapURLContext.java
+com/sun/jndi/url/ldaps
+com/sun/jndi/url/ldaps/SCCS
+com/sun/jndi/url/ldaps/SCCS/s.ldapsURLContextFactory.java
+com/sun/jndi/url/ldaps/ldapsURLContextFactory.java
+com/sun/jndi/url/rmi
+com/sun/jndi/url/rmi/SCCS
+com/sun/jndi/url/rmi/SCCS/s.rmiURLContextFactory.java
+com/sun/jndi/url/rmi/SCCS/s.rmiURLContext.java
+com/sun/jndi/url/rmi/rmiURLContextFactory.java
+com/sun/jndi/url/rmi/rmiURLContext.java
+com/sun/management
+com/sun/management/SCCS
+com/sun/management/SCCS/s.UnixOperatingSystemMXBean.java
+com/sun/management/SCCS/s.GarbageCollectorMXBean.java
+com/sun/management/SCCS/s.GcInfo.java
+com/sun/management/SCCS/s.OperatingSystemMXBean.java
+com/sun/management/SCCS/s.mgmt-overview.html
+com/sun/management/SCCS/s.package.html
+com/sun/management/jmx
+com/sun/management/jmx/SCCS
+com/sun/management/jmx/SCCS/s.MBeanServerImpl.java
+com/sun/management/jmx/SCCS/s.Introspector.java
+com/sun/management/jmx/SCCS/s.JMProperties.java
+com/sun/management/jmx/SCCS/s.TraceNotification.java
+com/sun/management/jmx/SCCS/s.ServiceName.java
+com/sun/management/jmx/SCCS/s.Trace.java
+com/sun/management/jmx/SCCS/s.TraceFilter.java
+com/sun/management/jmx/SCCS/s.TraceListener.java
+com/sun/management/jmx/SCCS/s.package.html
+com/sun/management/jmx/MBeanServerImpl.java
+com/sun/management/jmx/Introspector.java
+com/sun/management/jmx/JMProperties.java
+com/sun/management/jmx/ServiceName.java
+com/sun/management/jmx/Trace.java
+com/sun/management/jmx/TraceFilter.java
+com/sun/management/jmx/TraceListener.java
+com/sun/management/jmx/TraceNotification.java
+com/sun/management/jmx/package.html
+com/sun/management/UnixOperatingSystemMXBean.java
+com/sun/management/GarbageCollectorMXBean.java
+com/sun/management/GcInfo.java
+com/sun/management/OperatingSystemMXBean.java
+com/sun/management/mgmt-overview.html
+com/sun/management/package.html
+com/sun/media
+com/sun/media/sound
+com/sun/media/sound/SCCS
+com/sun/media/sound/SCCS/s.AbstractMidiDevice.java
+com/sun/media/sound/SCCS/s.AbstractDataLine.java
+com/sun/media/sound/SCCS/s.AbstractLine.java
+com/sun/media/sound/SCCS/s.AbstractMidiDeviceProvider.java
+com/sun/media/sound/SCCS/s.AbstractMixer.java
+com/sun/media/sound/SCCS/s.AbstractPlayer.java
+com/sun/media/sound/SCCS/s.AiffFileFormat.java
+com/sun/media/sound/SCCS/s.AiffFileReader.java
+com/sun/media/sound/SCCS/s.AiffFileWriter.java
+com/sun/media/sound/SCCS/s.AlawCodec.java
+com/sun/media/sound/SCCS/s.AuFileFormat.java
+com/sun/media/sound/SCCS/s.AuFileReader.java
+com/sun/media/sound/SCCS/s.AuFileWriter.java
+com/sun/media/sound/SCCS/s.AutoClosingClip.java
+com/sun/media/sound/SCCS/s.DirectAudioDeviceProvider.java
+com/sun/media/sound/SCCS/s.AutoConnectSequencer.java
+com/sun/media/sound/SCCS/s.CircularBuffer.java
+com/sun/media/sound/SCCS/s.DataPusher.java
+com/sun/media/sound/SCCS/s.DirectAudioDevice.java
+com/sun/media/sound/SCCS/s.HeadspaceInstrument.java
+com/sun/media/sound/SCCS/s.EventDispatcher.java
+com/sun/media/sound/SCCS/s.FastShortMessage.java
+com/sun/media/sound/SCCS/s.FastSysexMessage.java
+com/sun/media/sound/SCCS/s.HeadspaceMixerProvider.java
+com/sun/media/sound/SCCS/s.HeadspaceMixer.java
+com/sun/media/sound/SCCS/s.HeadspaceSample.java
+com/sun/media/sound/SCCS/s.HeadspaceSoundbank.java
+com/sun/media/sound/SCCS/s.HsbParser.java
+com/sun/media/sound/SCCS/s.JDK13Services.java
+com/sun/media/sound/SCCS/s.RealTimeSequencerProvider.java
+com/sun/media/sound/SCCS/s.JSSecurityManager.java
+com/sun/media/sound/SCCS/s.JavaSoundAudioClip.java
+com/sun/media/sound/SCCS/s.MidiInDevice.java
+com/sun/media/sound/SCCS/s.MidiInDeviceProvider.java
+com/sun/media/sound/SCCS/s.MidiOutDevice.java
+com/sun/media/sound/SCCS/s.MidiOutDeviceProvider.java
+com/sun/media/sound/SCCS/s.MidiUtils.java
+com/sun/media/sound/SCCS/s.MixerClip.java
+com/sun/media/sound/SCCS/s.MixerMidiChannel.java
+com/sun/media/sound/SCCS/s.MixerSequencer.java
+com/sun/media/sound/SCCS/s.MixerSequencerProvider.java
+com/sun/media/sound/SCCS/s.MixerSourceLine.java
+com/sun/media/sound/SCCS/s.MixerSynth.java
+com/sun/media/sound/SCCS/s.MixerSynthProvider.java
+com/sun/media/sound/SCCS/s.MixerThread.java
+com/sun/media/sound/SCCS/s.PCMtoPCMCodec.java
+com/sun/media/sound/SCCS/s.Platform.java
+com/sun/media/sound/SCCS/s.PortMixer.java
+com/sun/media/sound/SCCS/s.PortMixerProvider.java
+com/sun/media/sound/SCCS/s.Printer.java
+com/sun/media/sound/SCCS/s.RealTimeSequencer.java
+com/sun/media/sound/SCCS/s.SimpleInputDeviceProvider.java
+com/sun/media/sound/SCCS/s.ReferenceCountingDevice.java
+com/sun/media/sound/SCCS/s.RmfFileReader.java
+com/sun/media/sound/SCCS/s.SimpleInputDevice.java
+com/sun/media/sound/SCCS/s.StandardMidiFileReader.java
+com/sun/media/sound/SCCS/s.StandardMidiFileWriter.java
+com/sun/media/sound/SCCS/s.SunCodec.java
+com/sun/media/sound/SCCS/s.SunFileReader.java
+com/sun/media/sound/SCCS/s.SunFileWriter.java
+com/sun/media/sound/SCCS/s.Toolkit.java
+com/sun/media/sound/SCCS/s.UlawCodec.java
+com/sun/media/sound/SCCS/s.WaveFileFormat.java
+com/sun/media/sound/SCCS/s.WaveFileReader.java
+com/sun/media/sound/SCCS/s.WaveFileWriter.java
+com/sun/media/sound/services
+com/sun/media/sound/services/SCCS
+com/sun/media/sound/services/SCCS/s.javax.sound.sampled.spi.FormatConversionProvider
+com/sun/media/sound/services/SCCS/s.javax.sound.midi.spi.MidiDeviceProvider
+com/sun/media/sound/services/SCCS/s.javax.sound.midi.spi.MidiFileReader
+com/sun/media/sound/services/SCCS/s.javax.sound.midi.spi.MidiFileWriter
+com/sun/media/sound/services/SCCS/s.javax.sound.midi.spi.SoundbankReader
+com/sun/media/sound/services/SCCS/s.javax.sound.sampled.spi.AudioFileReader
+com/sun/media/sound/services/SCCS/s.javax.sound.sampled.spi.AudioFileWriter
+com/sun/media/sound/services/SCCS/s.javax.sound.sampled.spi.MixerProvider
+com/sun/media/sound/services/linux-i586
+com/sun/media/sound/services/linux-i586/SCCS
+com/sun/media/sound/services/linux-i586/SCCS/s.javax.sound.sampled.spi.MixerProvider
+com/sun/media/sound/services/linux-i586/javax.sound.sampled.spi.MixerProvider
+com/sun/media/sound/services/windows-i586
+com/sun/media/sound/services/windows-i586/SCCS
+com/sun/media/sound/services/windows-i586/SCCS/s.javax.sound.sampled.spi.MixerProvider
+com/sun/media/sound/services/windows-i586/javax.sound.sampled.spi.MixerProvider
+com/sun/media/sound/services/windows-ia64
+com/sun/media/sound/services/windows-ia64/SCCS
+com/sun/media/sound/services/windows-ia64/SCCS/s.javax.sound.sampled.spi.MixerProvider
+com/sun/media/sound/services/windows-ia64/javax.sound.sampled.spi.MixerProvider
+com/sun/media/sound/services/javax.sound.midi.spi.MidiDeviceProvider
+com/sun/media/sound/services/javax.sound.midi.spi.MidiFileReader
+com/sun/media/sound/services/javax.sound.midi.spi.MidiFileWriter
+com/sun/media/sound/services/javax.sound.midi.spi.SoundbankReader
+com/sun/media/sound/services/javax.sound.sampled.spi.AudioFileReader
+com/sun/media/sound/services/javax.sound.sampled.spi.AudioFileWriter
+com/sun/media/sound/services/javax.sound.sampled.spi.MixerProvider
+com/sun/media/sound/services/javax.sound.sampled.spi.FormatConversionProvider
+com/sun/media/sound/AbstractMidiDeviceProvider.java
+com/sun/media/sound/AbstractDataLine.java
+com/sun/media/sound/AbstractLine.java
+com/sun/media/sound/AbstractMidiDevice.java
+com/sun/media/sound/AbstractMixer.java
+com/sun/media/sound/AbstractPlayer.java
+com/sun/media/sound/AiffFileFormat.java
+com/sun/media/sound/AiffFileReader.java
+com/sun/media/sound/AiffFileWriter.java
+com/sun/media/sound/AlawCodec.java
+com/sun/media/sound/AuFileFormat.java
+com/sun/media/sound/AuFileReader.java
+com/sun/media/sound/AuFileWriter.java
+com/sun/media/sound/AutoConnectSequencer.java
+com/sun/media/sound/AutoClosingClip.java
+com/sun/media/sound/DirectAudioDevice.java
+com/sun/media/sound/CircularBuffer.java
+com/sun/media/sound/DataPusher.java
+com/sun/media/sound/DirectAudioDeviceProvider.java
+com/sun/media/sound/EventDispatcher.java
+com/sun/media/sound/FastShortMessage.java
+com/sun/media/sound/FastSysexMessage.java
+com/sun/media/sound/HeadspaceInstrument.java
+com/sun/media/sound/HeadspaceMixer.java
+com/sun/media/sound/HeadspaceMixerProvider.java
+com/sun/media/sound/HeadspaceSample.java
+com/sun/media/sound/HeadspaceSoundbank.java
+com/sun/media/sound/HsbParser.java
+com/sun/media/sound/JDK13Services.java
+com/sun/media/sound/JSSecurityManager.java
+com/sun/media/sound/RealTimeSequencerProvider.java
+com/sun/media/sound/JavaSoundAudioClip.java
+com/sun/media/sound/MidiInDevice.java
+com/sun/media/sound/MidiInDeviceProvider.java
+com/sun/media/sound/MidiOutDevice.java
+com/sun/media/sound/MidiOutDeviceProvider.java
+com/sun/media/sound/MidiUtils.java
+com/sun/media/sound/MixerClip.java
+com/sun/media/sound/MixerMidiChannel.java
+com/sun/media/sound/MixerSequencer.java
+com/sun/media/sound/MixerSequencerProvider.java
+com/sun/media/sound/MixerSourceLine.java
+com/sun/media/sound/MixerSynth.java
+com/sun/media/sound/MixerSynthProvider.java
+com/sun/media/sound/MixerThread.java
+com/sun/media/sound/PCMtoPCMCodec.java
+com/sun/media/sound/Platform.java
+com/sun/media/sound/PortMixer.java
+com/sun/media/sound/PortMixerProvider.java
+com/sun/media/sound/Printer.java
+com/sun/media/sound/RealTimeSequencer.java
+com/sun/media/sound/ReferenceCountingDevice.java
+com/sun/media/sound/RmfFileReader.java
+com/sun/media/sound/SimpleInputDevice.java
+com/sun/media/sound/SimpleInputDeviceProvider.java
+com/sun/media/sound/StandardMidiFileReader.java
+com/sun/media/sound/StandardMidiFileWriter.java
+com/sun/media/sound/SunCodec.java
+com/sun/media/sound/SunFileReader.java
+com/sun/media/sound/SunFileWriter.java
+com/sun/media/sound/Toolkit.java
+com/sun/media/sound/UlawCodec.java
+com/sun/media/sound/WaveFileFormat.java
+com/sun/media/sound/WaveFileReader.java
+com/sun/media/sound/WaveFileWriter.java
+com/sun/mirror
+com/sun/mirror/SCCS
+com/sun/mirror/SCCS/s.overview.html
+com/sun/mirror/apt
+com/sun/mirror/apt/SCCS
+com/sun/mirror/apt/SCCS/s.AnnotationProcessorFactory.java
+com/sun/mirror/apt/SCCS/s.AnnotationProcessor.java
+com/sun/mirror/apt/SCCS/s.Filer.java
+com/sun/mirror/apt/SCCS/s.AnnotationProcessorEnvironment.java
+com/sun/mirror/apt/SCCS/s.AnnotationProcessorListener.java
+com/sun/mirror/apt/SCCS/s.AnnotationProcessors.java
+com/sun/mirror/apt/SCCS/s.Messager.java
+com/sun/mirror/apt/SCCS/s.RoundState.java
+com/sun/mirror/apt/SCCS/s.RoundCompleteEvent.java
+com/sun/mirror/apt/SCCS/s.RoundCompleteListener.java
+com/sun/mirror/apt/SCCS/s.package.html
+com/sun/mirror/apt/AnnotationProcessorEnvironment.java
+com/sun/mirror/apt/AnnotationProcessor.java
+com/sun/mirror/apt/AnnotationProcessorListener.java
+com/sun/mirror/apt/AnnotationProcessorFactory.java
+com/sun/mirror/apt/AnnotationProcessors.java
+com/sun/mirror/apt/Filer.java
+com/sun/mirror/apt/Messager.java
+com/sun/mirror/apt/RoundCompleteEvent.java
+com/sun/mirror/apt/RoundCompleteListener.java
+com/sun/mirror/apt/RoundState.java
+com/sun/mirror/apt/package.html
+com/sun/mirror/declaration
+com/sun/mirror/declaration/SCCS
+com/sun/mirror/declaration/SCCS/s.AnnotationMirror.java
+com/sun/mirror/declaration/SCCS/s.AnnotationValue.java
+com/sun/mirror/declaration/SCCS/s.AnnotationTypeDeclaration.java
+com/sun/mirror/declaration/SCCS/s.AnnotationTypeElementDeclaration.java
+com/sun/mirror/declaration/SCCS/s.ClassDeclaration.java
+com/sun/mirror/declaration/SCCS/s.ConstructorDeclaration.java
+com/sun/mirror/declaration/SCCS/s.Declaration.java
+com/sun/mirror/declaration/SCCS/s.EnumConstantDeclaration.java
+com/sun/mirror/declaration/SCCS/s.EnumDeclaration.java
+com/sun/mirror/declaration/SCCS/s.ExecutableDeclaration.java
+com/sun/mirror/declaration/SCCS/s.FieldDeclaration.java
+com/sun/mirror/declaration/SCCS/s.InterfaceDeclaration.java
+com/sun/mirror/declaration/SCCS/s.MemberDeclaration.java
+com/sun/mirror/declaration/SCCS/s.MethodDeclaration.java
+com/sun/mirror/declaration/SCCS/s.Modifier.java
+com/sun/mirror/declaration/SCCS/s.PackageDeclaration.java
+com/sun/mirror/declaration/SCCS/s.ParameterDeclaration.java
+com/sun/mirror/declaration/SCCS/s.TypeDeclaration.java
+com/sun/mirror/declaration/SCCS/s.TypeParameterDeclaration.java
+com/sun/mirror/declaration/SCCS/s.package.html
+com/sun/mirror/declaration/AnnotationTypeDeclaration.java
+com/sun/mirror/declaration/AnnotationMirror.java
+com/sun/mirror/declaration/AnnotationTypeElementDeclaration.java
+com/sun/mirror/declaration/AnnotationValue.java
+com/sun/mirror/declaration/ClassDeclaration.java
+com/sun/mirror/declaration/ConstructorDeclaration.java
+com/sun/mirror/declaration/Declaration.java
+com/sun/mirror/declaration/EnumConstantDeclaration.java
+com/sun/mirror/declaration/EnumDeclaration.java
+com/sun/mirror/declaration/ExecutableDeclaration.java
+com/sun/mirror/declaration/FieldDeclaration.java
+com/sun/mirror/declaration/InterfaceDeclaration.java
+com/sun/mirror/declaration/MemberDeclaration.java
+com/sun/mirror/declaration/MethodDeclaration.java
+com/sun/mirror/declaration/Modifier.java
+com/sun/mirror/declaration/PackageDeclaration.java
+com/sun/mirror/declaration/ParameterDeclaration.java
+com/sun/mirror/declaration/TypeDeclaration.java
+com/sun/mirror/declaration/TypeParameterDeclaration.java
+com/sun/mirror/declaration/package.html
+com/sun/mirror/type
+com/sun/mirror/type/SCCS
+com/sun/mirror/type/SCCS/s.MirroredTypeException.java
+com/sun/mirror/type/SCCS/s.AnnotationType.java
+com/sun/mirror/type/SCCS/s.ArrayType.java
+com/sun/mirror/type/SCCS/s.ClassType.java
+com/sun/mirror/type/SCCS/s.DeclaredType.java
+com/sun/mirror/type/SCCS/s.EnumType.java
+com/sun/mirror/type/SCCS/s.InterfaceType.java
+com/sun/mirror/type/SCCS/s.MirroredTypesException.java
+com/sun/mirror/type/SCCS/s.PrimitiveType.java
+com/sun/mirror/type/SCCS/s.ReferenceType.java
+com/sun/mirror/type/SCCS/s.TypeMirror.java
+com/sun/mirror/type/SCCS/s.TypeVariable.java
+com/sun/mirror/type/SCCS/s.VoidType.java
+com/sun/mirror/type/SCCS/s.WildcardType.java
+com/sun/mirror/type/SCCS/s.package.html
+com/sun/mirror/type/MirroredTypeException.java
+com/sun/mirror/type/AnnotationType.java
+com/sun/mirror/type/ArrayType.java
+com/sun/mirror/type/ClassType.java
+com/sun/mirror/type/DeclaredType.java
+com/sun/mirror/type/EnumType.java
+com/sun/mirror/type/InterfaceType.java
+com/sun/mirror/type/MirroredTypesException.java
+com/sun/mirror/type/PrimitiveType.java
+com/sun/mirror/type/ReferenceType.java
+com/sun/mirror/type/TypeMirror.java
+com/sun/mirror/type/TypeVariable.java
+com/sun/mirror/type/VoidType.java
+com/sun/mirror/type/WildcardType.java
+com/sun/mirror/type/package.html
+com/sun/mirror/util
+com/sun/mirror/util/SCCS
+com/sun/mirror/util/SCCS/s.SimpleDeclarationVisitor.java
+com/sun/mirror/util/SCCS/s.DeclarationFilter.java
+com/sun/mirror/util/SCCS/s.DeclarationScanner.java
+com/sun/mirror/util/SCCS/s.DeclarationVisitor.java
+com/sun/mirror/util/SCCS/s.DeclarationVisitors.java
+com/sun/mirror/util/SCCS/s.Declarations.java
+com/sun/mirror/util/SCCS/s.SimpleTypeVisitor.java
+com/sun/mirror/util/SCCS/s.SourceOrderDeclScanner.java
+com/sun/mirror/util/SCCS/s.SourcePosition.java
+com/sun/mirror/util/SCCS/s.TypeVisitor.java
+com/sun/mirror/util/SCCS/s.Types.java
+com/sun/mirror/util/SCCS/s.package.html
+com/sun/mirror/util/DeclarationVisitors.java
+com/sun/mirror/util/DeclarationFilter.java
+com/sun/mirror/util/DeclarationScanner.java
+com/sun/mirror/util/DeclarationVisitor.java
+com/sun/mirror/util/Declarations.java
+com/sun/mirror/util/SimpleTypeVisitor.java
+com/sun/mirror/util/Types.java
+com/sun/mirror/util/SimpleDeclarationVisitor.java
+com/sun/mirror/util/SourceOrderDeclScanner.java
+com/sun/mirror/util/SourcePosition.java
+com/sun/mirror/util/TypeVisitor.java
+com/sun/mirror/util/package.html
+com/sun/mirror/overview.html
+com/sun/naming
+com/sun/naming/internal
+com/sun/naming/internal/SCCS
+com/sun/naming/internal/SCCS/s.FactoryEnumeration.java
+com/sun/naming/internal/SCCS/s.NamedWeakReference.java
+com/sun/naming/internal/SCCS/s.ResourceManager.java
+com/sun/naming/internal/SCCS/s.VersionHelper.java
+com/sun/naming/internal/SCCS/s.VersionHelper12.java
+com/sun/naming/internal/FactoryEnumeration.java
+com/sun/naming/internal/NamedWeakReference.java
+com/sun/naming/internal/ResourceManager.java
+com/sun/naming/internal/VersionHelper.java
+com/sun/naming/internal/VersionHelper12.java
+com/sun/org
+com/sun/org/apache
+com/sun/org/apache/bcel
+com/sun/org/apache/bcel/internal
+com/sun/org/apache/bcel/internal/SCCS
+com/sun/org/apache/bcel/internal/SCCS/s.ExceptionConstants.java
+com/sun/org/apache/bcel/internal/SCCS/s.Constants.java
+com/sun/org/apache/bcel/internal/SCCS/s.Repository.java
+com/sun/org/apache/bcel/internal/SCCS/s.package.html
+com/sun/org/apache/bcel/internal/classfile
+com/sun/org/apache/bcel/internal/classfile/SCCS
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.CodeException.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.AccessFlags.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.Attribute.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.ClassParser.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.Code.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.ConstantClass.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.Constant.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.ConstantCP.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.package.html
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.lic
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.ConstantDouble.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.ConstantFieldref.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.ConstantFloat.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.ConstantInteger.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.ConstantLong.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.Field.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.ConstantInterfaceMethodref.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.ConstantMethodref.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.ConstantNameAndType.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.ConstantObject.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.ConstantPool.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.ConstantString.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.ConstantUtf8.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.ConstantValue.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.Deprecated.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.DescendingVisitor.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.EmptyVisitor.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.ExceptionTable.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.FieldOrMethod.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.InnerClass.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.InnerClasses.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.JavaClass.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.LineNumber.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.Node.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.LineNumberTable.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.LocalVariable.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.LocalVariableTable.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.Method.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.PMGClass.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.Signature.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.SourceFile.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.StackMap.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.StackMapEntry.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.StackMapType.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.Synthetic.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.Unknown.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.Utility.java
+com/sun/org/apache/bcel/internal/classfile/SCCS/s.Visitor.java
+com/sun/org/apache/bcel/internal/classfile/ConstantFieldref.java
+com/sun/org/apache/bcel/internal/classfile/AccessFlags.java
+com/sun/org/apache/bcel/internal/classfile/Attribute.java
+com/sun/org/apache/bcel/internal/classfile/ClassParser.java
+com/sun/org/apache/bcel/internal/classfile/Code.java
+com/sun/org/apache/bcel/internal/classfile/CodeException.java
+com/sun/org/apache/bcel/internal/classfile/Constant.java
+com/sun/org/apache/bcel/internal/classfile/ConstantCP.java
+com/sun/org/apache/bcel/internal/classfile/ConstantClass.java
+com/sun/org/apache/bcel/internal/classfile/ConstantDouble.java
+com/sun/org/apache/bcel/internal/classfile/ConstantInterfaceMethodref.java
+com/sun/org/apache/bcel/internal/classfile/ConstantFloat.java
+com/sun/org/apache/bcel/internal/classfile/ConstantInteger.java
+com/sun/org/apache/bcel/internal/classfile/ConstantMethodref.java
+com/sun/org/apache/bcel/internal/classfile/ConstantLong.java
+com/sun/org/apache/bcel/internal/classfile/lic
+com/sun/org/apache/bcel/internal/classfile/ConstantNameAndType.java
+com/sun/org/apache/bcel/internal/classfile/ConstantObject.java
+com/sun/org/apache/bcel/internal/classfile/ConstantPool.java
+com/sun/org/apache/bcel/internal/classfile/ConstantString.java
+com/sun/org/apache/bcel/internal/classfile/ConstantUtf8.java
+com/sun/org/apache/bcel/internal/classfile/ConstantValue.java
+com/sun/org/apache/bcel/internal/classfile/Deprecated.java
+com/sun/org/apache/bcel/internal/classfile/DescendingVisitor.java
+com/sun/org/apache/bcel/internal/classfile/EmptyVisitor.java
+com/sun/org/apache/bcel/internal/classfile/ExceptionTable.java
+com/sun/org/apache/bcel/internal/classfile/Field.java
+com/sun/org/apache/bcel/internal/classfile/FieldOrMethod.java
+com/sun/org/apache/bcel/internal/classfile/InnerClass.java
+com/sun/org/apache/bcel/internal/classfile/InnerClasses.java
+com/sun/org/apache/bcel/internal/classfile/JavaClass.java
+com/sun/org/apache/bcel/internal/classfile/LineNumber.java
+com/sun/org/apache/bcel/internal/classfile/LineNumberTable.java
+com/sun/org/apache/bcel/internal/classfile/LocalVariable.java
+com/sun/org/apache/bcel/internal/classfile/LocalVariableTable.java
+com/sun/org/apache/bcel/internal/classfile/Method.java
+com/sun/org/apache/bcel/internal/classfile/Node.java
+com/sun/org/apache/bcel/internal/classfile/PMGClass.java
+com/sun/org/apache/bcel/internal/classfile/Signature.java
+com/sun/org/apache/bcel/internal/classfile/SourceFile.java
+com/sun/org/apache/bcel/internal/classfile/StackMap.java
+com/sun/org/apache/bcel/internal/classfile/StackMapEntry.java
+com/sun/org/apache/bcel/internal/classfile/StackMapType.java
+com/sun/org/apache/bcel/internal/classfile/Synthetic.java
+com/sun/org/apache/bcel/internal/classfile/Unknown.java
+com/sun/org/apache/bcel/internal/classfile/Utility.java
+com/sun/org/apache/bcel/internal/classfile/Visitor.java
+com/sun/org/apache/bcel/internal/classfile/package.html
+com/sun/org/apache/bcel/internal/generic
+com/sun/org/apache/bcel/internal/generic/SCCS
+com/sun/org/apache/bcel/internal/generic/SCCS/s.ACONST_NULL.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.AALOAD.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.AASTORE.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.ArrayInstruction.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.ALOAD.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.ANEWARRAY.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.ARETURN.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.ARRAYLENGTH.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.ASTORE.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.ATHROW.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.AllocationInstruction.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.ArithmeticInstruction.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.ArrayType.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.BALOAD.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.BASTORE.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.BIPUSH.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.DALOAD.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.D2F.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.BREAKPOINT.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.BasicType.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.BranchHandle.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.BranchInstruction.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.CALOAD.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.CASTORE.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.CHECKCAST.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.CPInstruction.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.ClassGen.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.ClassGenException.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.ClassObserver.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.CodeExceptionGen.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.CompoundInstruction.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.ConstantPoolGen.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.ConstantPushInstruction.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.ConversionInstruction.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.D2I.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.D2L.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.DADD.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.DASTORE.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.DCMPG.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.DCMPL.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.DCONST.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.DDIV.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.DLOAD.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.DMUL.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.DNEG.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.DREM.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.DRETURN.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.DSTORE.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.DSUB.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.DUP.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.DUP2.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.DUP2_X1.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.DUP2_X2.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.DUP_X1.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.DUP_X2.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.FALOAD.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.F2D.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.EmptyVisitor.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.ExceptionThrower.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.F2I.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.F2L.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.FADD.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.FASTORE.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.FCMPG.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.FCMPL.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.FCONST.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.FDIV.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.FLOAD.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.FMUL.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.FNEG.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.FREM.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.FRETURN.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.FSTORE.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.FSUB.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.FieldGen.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.InstructionListObserver.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.FieldGenOrMethodGen.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.GOTO.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.FieldInstruction.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.FieldObserver.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.FieldOrMethod.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.GETFIELD.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.GETSTATIC.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.GOTO_W.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.GotoInstruction.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.I2B.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.I2C.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.I2D.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.I2F.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.I2L.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.I2S.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.IADD.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.IALOAD.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.IAND.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.IASTORE.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.ICONST.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.IDIV.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.IFEQ.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.IFGE.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.IFGT.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.IFLE.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.IFLT.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.IFNE.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.IFNONNULL.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.IFNULL.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.IF_ACMPEQ.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.IF_ACMPNE.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.IF_ICMPEQ.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.IF_ICMPGE.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.IF_ICMPGT.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.IF_ICMPLE.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.IF_ICMPLT.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.IF_ICMPNE.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.IINC.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.ILOAD.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.IMPDEP1.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.IMPDEP2.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.IMUL.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.INEG.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.IOR.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.INSTANCEOF.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.INVOKEINTERFACE.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.INVOKESPECIAL.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.INVOKESTATIC.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.INVOKEVIRTUAL.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.IREM.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.IRETURN.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.ISHL.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.ISHR.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.ISTORE.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.ISUB.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.IUSHR.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.IXOR.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.IfInstruction.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.IndexedInstruction.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.Instruction.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.InstructionConstants.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.InstructionFactory.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.JSR.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.InstructionHandle.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.InstructionList.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.InstructionTargeter.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.InvokeInstruction.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.JSR_W.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.JsrInstruction.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.L2D.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.L2F.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.L2I.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.LADD.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.LALOAD.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.LAND.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.LASTORE.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.LCMP.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.LCONST.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.LDC.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.LDC2_W.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.LDC_W.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.LDIV.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.LineNumberGen.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.LLOAD.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.LMUL.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.LNEG.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.LOOKUPSWITCH.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.LOR.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.LREM.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.LRETURN.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.LSHL.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.LSHR.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.LSTORE.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.LSUB.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.LUSHR.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.LXOR.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.LoadInstruction.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.LoadClass.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.LocalVariableInstruction.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.LocalVariableGen.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.ReturnInstruction.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.MONITORENTER.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.MONITOREXIT.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.MULTIANEWARRAY.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.MethodGen.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.MethodObserver.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.NEW.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.NEWARRAY.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.NOP.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.NamedAndTyped.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.ObjectType.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.POP.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.POP2.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.PUSH.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.PUTFIELD.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.PUTSTATIC.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.PopInstruction.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.PushInstruction.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.RET.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.RETURN.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.ReferenceType.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.VariableLengthInstruction.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.ReturnaddressType.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.SALOAD.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.SASTORE.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.SIPUSH.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.SWAP.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.SWITCH.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.Select.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.StackConsumer.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.StackInstruction.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.StackProducer.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.StoreInstruction.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.TABLESWITCH.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.TargetLostException.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.Type.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.TypedInstruction.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.UnconditionalBranch.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.Visitor.java
+com/sun/org/apache/bcel/internal/generic/SCCS/s.package.html
+com/sun/org/apache/bcel/internal/generic/AASTORE.java
+com/sun/org/apache/bcel/internal/generic/AALOAD.java
+com/sun/org/apache/bcel/internal/generic/AllocationInstruction.java
+com/sun/org/apache/bcel/internal/generic/ACONST_NULL.java
+com/sun/org/apache/bcel/internal/generic/ALOAD.java
+com/sun/org/apache/bcel/internal/generic/ANEWARRAY.java
+com/sun/org/apache/bcel/internal/generic/ARETURN.java
+com/sun/org/apache/bcel/internal/generic/ARRAYLENGTH.java
+com/sun/org/apache/bcel/internal/generic/ASTORE.java
+com/sun/org/apache/bcel/internal/generic/ATHROW.java
+com/sun/org/apache/bcel/internal/generic/DASTORE.java
+com/sun/org/apache/bcel/internal/generic/D2F.java
+com/sun/org/apache/bcel/internal/generic/ArithmeticInstruction.java
+com/sun/org/apache/bcel/internal/generic/ArrayInstruction.java
+com/sun/org/apache/bcel/internal/generic/ArrayType.java
+com/sun/org/apache/bcel/internal/generic/BALOAD.java
+com/sun/org/apache/bcel/internal/generic/BASTORE.java
+com/sun/org/apache/bcel/internal/generic/BIPUSH.java
+com/sun/org/apache/bcel/internal/generic/BREAKPOINT.java
+com/sun/org/apache/bcel/internal/generic/BasicType.java
+com/sun/org/apache/bcel/internal/generic/BranchHandle.java
+com/sun/org/apache/bcel/internal/generic/BranchInstruction.java
+com/sun/org/apache/bcel/internal/generic/CALOAD.java
+com/sun/org/apache/bcel/internal/generic/CASTORE.java
+com/sun/org/apache/bcel/internal/generic/CHECKCAST.java
+com/sun/org/apache/bcel/internal/generic/CPInstruction.java
+com/sun/org/apache/bcel/internal/generic/ClassGen.java
+com/sun/org/apache/bcel/internal/generic/ClassGenException.java
+com/sun/org/apache/bcel/internal/generic/ClassObserver.java
+com/sun/org/apache/bcel/internal/generic/CodeExceptionGen.java
+com/sun/org/apache/bcel/internal/generic/CompoundInstruction.java
+com/sun/org/apache/bcel/internal/generic/ConstantPoolGen.java
+com/sun/org/apache/bcel/internal/generic/ConstantPushInstruction.java
+com/sun/org/apache/bcel/internal/generic/ConversionInstruction.java
+com/sun/org/apache/bcel/internal/generic/D2I.java
+com/sun/org/apache/bcel/internal/generic/D2L.java
+com/sun/org/apache/bcel/internal/generic/DADD.java
+com/sun/org/apache/bcel/internal/generic/DALOAD.java
+com/sun/org/apache/bcel/internal/generic/DRETURN.java
+com/sun/org/apache/bcel/internal/generic/DCMPG.java
+com/sun/org/apache/bcel/internal/generic/DCMPL.java
+com/sun/org/apache/bcel/internal/generic/DCONST.java
+com/sun/org/apache/bcel/internal/generic/DDIV.java
+com/sun/org/apache/bcel/internal/generic/DLOAD.java
+com/sun/org/apache/bcel/internal/generic/DMUL.java
+com/sun/org/apache/bcel/internal/generic/DNEG.java
+com/sun/org/apache/bcel/internal/generic/DREM.java
+com/sun/org/apache/bcel/internal/generic/EmptyVisitor.java
+com/sun/org/apache/bcel/internal/generic/DSTORE.java
+com/sun/org/apache/bcel/internal/generic/DSUB.java
+com/sun/org/apache/bcel/internal/generic/DUP.java
+com/sun/org/apache/bcel/internal/generic/DUP2.java
+com/sun/org/apache/bcel/internal/generic/DUP2_X1.java
+com/sun/org/apache/bcel/internal/generic/DUP2_X2.java
+com/sun/org/apache/bcel/internal/generic/DUP_X1.java
+com/sun/org/apache/bcel/internal/generic/DUP_X2.java
+com/sun/org/apache/bcel/internal/generic/ExceptionThrower.java
+com/sun/org/apache/bcel/internal/generic/F2D.java
+com/sun/org/apache/bcel/internal/generic/F2I.java
+com/sun/org/apache/bcel/internal/generic/FieldGenOrMethodGen.java
+com/sun/org/apache/bcel/internal/generic/F2L.java
+com/sun/org/apache/bcel/internal/generic/FADD.java
+com/sun/org/apache/bcel/internal/generic/FALOAD.java
+com/sun/org/apache/bcel/internal/generic/FASTORE.java
+com/sun/org/apache/bcel/internal/generic/FCMPG.java
+com/sun/org/apache/bcel/internal/generic/FCMPL.java
+com/sun/org/apache/bcel/internal/generic/FCONST.java
+com/sun/org/apache/bcel/internal/generic/FDIV.java
+com/sun/org/apache/bcel/internal/generic/FLOAD.java
+com/sun/org/apache/bcel/internal/generic/FMUL.java
+com/sun/org/apache/bcel/internal/generic/FNEG.java
+com/sun/org/apache/bcel/internal/generic/FREM.java
+com/sun/org/apache/bcel/internal/generic/FRETURN.java
+com/sun/org/apache/bcel/internal/generic/FSTORE.java
+com/sun/org/apache/bcel/internal/generic/FSUB.java
+com/sun/org/apache/bcel/internal/generic/FieldGen.java
+com/sun/org/apache/bcel/internal/generic/FieldInstruction.java
+com/sun/org/apache/bcel/internal/generic/FieldObserver.java
+com/sun/org/apache/bcel/internal/generic/FieldOrMethod.java
+com/sun/org/apache/bcel/internal/generic/GETFIELD.java
+com/sun/org/apache/bcel/internal/generic/GETSTATIC.java
+com/sun/org/apache/bcel/internal/generic/InstructionListObserver.java
+com/sun/org/apache/bcel/internal/generic/GOTO.java
+com/sun/org/apache/bcel/internal/generic/GOTO_W.java
+com/sun/org/apache/bcel/internal/generic/GotoInstruction.java
+com/sun/org/apache/bcel/internal/generic/I2B.java
+com/sun/org/apache/bcel/internal/generic/I2C.java
+com/sun/org/apache/bcel/internal/generic/I2D.java
+com/sun/org/apache/bcel/internal/generic/I2F.java
+com/sun/org/apache/bcel/internal/generic/I2L.java
+com/sun/org/apache/bcel/internal/generic/I2S.java
+com/sun/org/apache/bcel/internal/generic/IADD.java
+com/sun/org/apache/bcel/internal/generic/IALOAD.java
+com/sun/org/apache/bcel/internal/generic/IAND.java
+com/sun/org/apache/bcel/internal/generic/IASTORE.java
+com/sun/org/apache/bcel/internal/generic/ICONST.java
+com/sun/org/apache/bcel/internal/generic/IDIV.java
+com/sun/org/apache/bcel/internal/generic/IFEQ.java
+com/sun/org/apache/bcel/internal/generic/IFGE.java
+com/sun/org/apache/bcel/internal/generic/IFGT.java
+com/sun/org/apache/bcel/internal/generic/IFLE.java
+com/sun/org/apache/bcel/internal/generic/IFLT.java
+com/sun/org/apache/bcel/internal/generic/IFNE.java
+com/sun/org/apache/bcel/internal/generic/IFNONNULL.java
+com/sun/org/apache/bcel/internal/generic/IFNULL.java
+com/sun/org/apache/bcel/internal/generic/IF_ACMPEQ.java
+com/sun/org/apache/bcel/internal/generic/IF_ACMPNE.java
+com/sun/org/apache/bcel/internal/generic/IF_ICMPEQ.java
+com/sun/org/apache/bcel/internal/generic/IF_ICMPGE.java
+com/sun/org/apache/bcel/internal/generic/IF_ICMPGT.java
+com/sun/org/apache/bcel/internal/generic/IF_ICMPLE.java
+com/sun/org/apache/bcel/internal/generic/IF_ICMPLT.java
+com/sun/org/apache/bcel/internal/generic/IF_ICMPNE.java
+com/sun/org/apache/bcel/internal/generic/IINC.java
+com/sun/org/apache/bcel/internal/generic/ILOAD.java
+com/sun/org/apache/bcel/internal/generic/IMPDEP1.java
+com/sun/org/apache/bcel/internal/generic/IMPDEP2.java
+com/sun/org/apache/bcel/internal/generic/IMUL.java
+com/sun/org/apache/bcel/internal/generic/INEG.java
+com/sun/org/apache/bcel/internal/generic/INSTANCEOF.java
+com/sun/org/apache/bcel/internal/generic/INVOKEINTERFACE.java
+com/sun/org/apache/bcel/internal/generic/INVOKESPECIAL.java
+com/sun/org/apache/bcel/internal/generic/INVOKESTATIC.java
+com/sun/org/apache/bcel/internal/generic/INVOKEVIRTUAL.java
+com/sun/org/apache/bcel/internal/generic/IOR.java
+com/sun/org/apache/bcel/internal/generic/IREM.java
+com/sun/org/apache/bcel/internal/generic/IRETURN.java
+com/sun/org/apache/bcel/internal/generic/ISHL.java
+com/sun/org/apache/bcel/internal/generic/ISHR.java
+com/sun/org/apache/bcel/internal/generic/ISTORE.java
+com/sun/org/apache/bcel/internal/generic/ISUB.java
+com/sun/org/apache/bcel/internal/generic/IUSHR.java
+com/sun/org/apache/bcel/internal/generic/IXOR.java
+com/sun/org/apache/bcel/internal/generic/IfInstruction.java
+com/sun/org/apache/bcel/internal/generic/IndexedInstruction.java
+com/sun/org/apache/bcel/internal/generic/Instruction.java
+com/sun/org/apache/bcel/internal/generic/InstructionConstants.java
+com/sun/org/apache/bcel/internal/generic/InstructionFactory.java
+com/sun/org/apache/bcel/internal/generic/InstructionHandle.java
+com/sun/org/apache/bcel/internal/generic/InstructionList.java
+com/sun/org/apache/bcel/internal/generic/LoadInstruction.java
+com/sun/org/apache/bcel/internal/generic/InstructionTargeter.java
+com/sun/org/apache/bcel/internal/generic/InvokeInstruction.java
+com/sun/org/apache/bcel/internal/generic/JSR.java
+com/sun/org/apache/bcel/internal/generic/JSR_W.java
+com/sun/org/apache/bcel/internal/generic/JsrInstruction.java
+com/sun/org/apache/bcel/internal/generic/L2D.java
+com/sun/org/apache/bcel/internal/generic/L2F.java
+com/sun/org/apache/bcel/internal/generic/L2I.java
+com/sun/org/apache/bcel/internal/generic/LADD.java
+com/sun/org/apache/bcel/internal/generic/LALOAD.java
+com/sun/org/apache/bcel/internal/generic/LAND.java
+com/sun/org/apache/bcel/internal/generic/LASTORE.java
+com/sun/org/apache/bcel/internal/generic/LCMP.java
+com/sun/org/apache/bcel/internal/generic/LCONST.java
+com/sun/org/apache/bcel/internal/generic/LDC.java
+com/sun/org/apache/bcel/internal/generic/LDC2_W.java
+com/sun/org/apache/bcel/internal/generic/LDC_W.java
+com/sun/org/apache/bcel/internal/generic/LDIV.java
+com/sun/org/apache/bcel/internal/generic/LLOAD.java
+com/sun/org/apache/bcel/internal/generic/LMUL.java
+com/sun/org/apache/bcel/internal/generic/LNEG.java
+com/sun/org/apache/bcel/internal/generic/LOOKUPSWITCH.java
+com/sun/org/apache/bcel/internal/generic/LOR.java
+com/sun/org/apache/bcel/internal/generic/LREM.java
+com/sun/org/apache/bcel/internal/generic/LRETURN.java
+com/sun/org/apache/bcel/internal/generic/LSHL.java
+com/sun/org/apache/bcel/internal/generic/LSHR.java
+com/sun/org/apache/bcel/internal/generic/LSTORE.java
+com/sun/org/apache/bcel/internal/generic/LSUB.java
+com/sun/org/apache/bcel/internal/generic/LUSHR.java
+com/sun/org/apache/bcel/internal/generic/LXOR.java
+com/sun/org/apache/bcel/internal/generic/LineNumberGen.java
+com/sun/org/apache/bcel/internal/generic/LoadClass.java
+com/sun/org/apache/bcel/internal/generic/LocalVariableInstruction.java
+com/sun/org/apache/bcel/internal/generic/LocalVariableGen.java
+com/sun/org/apache/bcel/internal/generic/PushInstruction.java
+com/sun/org/apache/bcel/internal/generic/MONITORENTER.java
+com/sun/org/apache/bcel/internal/generic/MONITOREXIT.java
+com/sun/org/apache/bcel/internal/generic/MULTIANEWARRAY.java
+com/sun/org/apache/bcel/internal/generic/MethodGen.java
+com/sun/org/apache/bcel/internal/generic/MethodObserver.java
+com/sun/org/apache/bcel/internal/generic/NEW.java
+com/sun/org/apache/bcel/internal/generic/NEWARRAY.java
+com/sun/org/apache/bcel/internal/generic/NOP.java
+com/sun/org/apache/bcel/internal/generic/NamedAndTyped.java
+com/sun/org/apache/bcel/internal/generic/ObjectType.java
+com/sun/org/apache/bcel/internal/generic/POP.java
+com/sun/org/apache/bcel/internal/generic/POP2.java
+com/sun/org/apache/bcel/internal/generic/PUSH.java
+com/sun/org/apache/bcel/internal/generic/PUTFIELD.java
+com/sun/org/apache/bcel/internal/generic/PUTSTATIC.java
+com/sun/org/apache/bcel/internal/generic/PopInstruction.java
+com/sun/org/apache/bcel/internal/generic/ReferenceType.java
+com/sun/org/apache/bcel/internal/generic/RET.java
+com/sun/org/apache/bcel/internal/generic/RETURN.java
+com/sun/org/apache/bcel/internal/generic/ReturnInstruction.java
+com/sun/org/apache/bcel/internal/generic/ReturnaddressType.java
+com/sun/org/apache/bcel/internal/generic/SALOAD.java
+com/sun/org/apache/bcel/internal/generic/SASTORE.java
+com/sun/org/apache/bcel/internal/generic/SIPUSH.java
+com/sun/org/apache/bcel/internal/generic/SWAP.java
+com/sun/org/apache/bcel/internal/generic/SWITCH.java
+com/sun/org/apache/bcel/internal/generic/Select.java
+com/sun/org/apache/bcel/internal/generic/StackConsumer.java
+com/sun/org/apache/bcel/internal/generic/StackInstruction.java
+com/sun/org/apache/bcel/internal/generic/StackProducer.java
+com/sun/org/apache/bcel/internal/generic/StoreInstruction.java
+com/sun/org/apache/bcel/internal/generic/Type.java
+com/sun/org/apache/bcel/internal/generic/UnconditionalBranch.java
+com/sun/org/apache/bcel/internal/generic/TABLESWITCH.java
+com/sun/org/apache/bcel/internal/generic/TargetLostException.java
+com/sun/org/apache/bcel/internal/generic/TypedInstruction.java
+com/sun/org/apache/bcel/internal/generic/VariableLengthInstruction.java
+com/sun/org/apache/bcel/internal/generic/Visitor.java
+com/sun/org/apache/bcel/internal/generic/package.html
+com/sun/org/apache/bcel/internal/util
+com/sun/org/apache/bcel/internal/util/SCCS
+com/sun/org/apache/bcel/internal/util/SCCS/s.InstructionFinder.java
+com/sun/org/apache/bcel/internal/util/SCCS/s.AttributeHTML.java
+com/sun/org/apache/bcel/internal/util/SCCS/s.ByteSequence.java
+com/sun/org/apache/bcel/internal/util/SCCS/s.Class2HTML.java
+com/sun/org/apache/bcel/internal/util/SCCS/s.ClassLoader.java
+com/sun/org/apache/bcel/internal/util/SCCS/s.ClassPath.java
+com/sun/org/apache/bcel/internal/util/SCCS/s.ClassQueue.java
+com/sun/org/apache/bcel/internal/util/SCCS/s.ClassStack.java
+com/sun/org/apache/bcel/internal/util/SCCS/s.ClassVector.java
+com/sun/org/apache/bcel/internal/util/SCCS/s.CodeHTML.java
+com/sun/org/apache/bcel/internal/util/SCCS/s.ConstantHTML.java
+com/sun/org/apache/bcel/internal/util/SCCS/s.MethodHTML.java
+com/sun/org/apache/bcel/internal/util/SCCS/s.package.html
+com/sun/org/apache/bcel/internal/util/InstructionFinder.java
+com/sun/org/apache/bcel/internal/util/AttributeHTML.java
+com/sun/org/apache/bcel/internal/util/ByteSequence.java
+com/sun/org/apache/bcel/internal/util/Class2HTML.java
+com/sun/org/apache/bcel/internal/util/ClassLoader.java
+com/sun/org/apache/bcel/internal/util/ClassPath.java
+com/sun/org/apache/bcel/internal/util/ClassQueue.java
+com/sun/org/apache/bcel/internal/util/ClassStack.java
+com/sun/org/apache/bcel/internal/util/ClassVector.java
+com/sun/org/apache/bcel/internal/util/CodeHTML.java
+com/sun/org/apache/bcel/internal/util/ConstantHTML.java
+com/sun/org/apache/bcel/internal/util/MethodHTML.java
+com/sun/org/apache/bcel/internal/util/package.html
+com/sun/org/apache/bcel/internal/verifier
+com/sun/org/apache/bcel/internal/verifier/SCCS
+com/sun/org/apache/bcel/internal/verifier/SCCS/s.VerifierFactoryListModel.java
+com/sun/org/apache/bcel/internal/verifier/SCCS/s.GraphicalVerifier.java
+com/sun/org/apache/bcel/internal/verifier/SCCS/s.NativeVerifier.java
+com/sun/org/apache/bcel/internal/verifier/SCCS/s.PassVerifier.java
+com/sun/org/apache/bcel/internal/verifier/SCCS/s.TransitiveHull.java
+com/sun/org/apache/bcel/internal/verifier/SCCS/s.VerificationResult.java
+com/sun/org/apache/bcel/internal/verifier/SCCS/s.Verifier.java
+com/sun/org/apache/bcel/internal/verifier/SCCS/s.VerifierAppFrame.java
+com/sun/org/apache/bcel/internal/verifier/SCCS/s.VerifierFactory.java
+com/sun/org/apache/bcel/internal/verifier/SCCS/s.VerifierFactoryObserver.java
+com/sun/org/apache/bcel/internal/verifier/SCCS/s.VerifyDialog.java
+com/sun/org/apache/bcel/internal/verifier/SCCS/s.package.html
+com/sun/org/apache/bcel/internal/verifier/exc
+com/sun/org/apache/bcel/internal/verifier/exc/SCCS
+com/sun/org/apache/bcel/internal/verifier/exc/SCCS/s.StaticCodeConstraintException.java
+com/sun/org/apache/bcel/internal/verifier/exc/SCCS/s.AssertionViolatedException.java
+com/sun/org/apache/bcel/internal/verifier/exc/SCCS/s.ClassConstraintException.java
+com/sun/org/apache/bcel/internal/verifier/exc/SCCS/s.CodeConstraintException.java
+com/sun/org/apache/bcel/internal/verifier/exc/SCCS/s.InvalidMethodException.java
+com/sun/org/apache/bcel/internal/verifier/exc/SCCS/s.LinkingConstraintException.java
+com/sun/org/apache/bcel/internal/verifier/exc/SCCS/s.LoadingException.java
+com/sun/org/apache/bcel/internal/verifier/exc/SCCS/s.LocalVariableInfoInconsistentException.java
+com/sun/org/apache/bcel/internal/verifier/exc/SCCS/s.StaticCodeInstructionConstraintException.java
+com/sun/org/apache/bcel/internal/verifier/exc/SCCS/s.Utility.java
+com/sun/org/apache/bcel/internal/verifier/exc/SCCS/s.package.html
+com/sun/org/apache/bcel/internal/verifier/exc/SCCS/s.VerificationException.java
+com/sun/org/apache/bcel/internal/verifier/exc/SCCS/s.StaticCodeInstructionOperandConstraintException.java
+com/sun/org/apache/bcel/internal/verifier/exc/SCCS/s.StructuralCodeConstraintException.java
+com/sun/org/apache/bcel/internal/verifier/exc/SCCS/s.VerifierConstraintViolatedException.java
+com/sun/org/apache/bcel/internal/verifier/exc/StaticCodeConstraintException.java
+com/sun/org/apache/bcel/internal/verifier/exc/AssertionViolatedException.java
+com/sun/org/apache/bcel/internal/verifier/exc/ClassConstraintException.java
+com/sun/org/apache/bcel/internal/verifier/exc/CodeConstraintException.java
+com/sun/org/apache/bcel/internal/verifier/exc/InvalidMethodException.java
+com/sun/org/apache/bcel/internal/verifier/exc/LinkingConstraintException.java
+com/sun/org/apache/bcel/internal/verifier/exc/LoadingException.java
+com/sun/org/apache/bcel/internal/verifier/exc/LocalVariableInfoInconsistentException.java
+com/sun/org/apache/bcel/internal/verifier/exc/StaticCodeInstructionConstraintException.java
+com/sun/org/apache/bcel/internal/verifier/exc/Utility.java
+com/sun/org/apache/bcel/internal/verifier/exc/package.html
+com/sun/org/apache/bcel/internal/verifier/exc/VerificationException.java
+com/sun/org/apache/bcel/internal/verifier/exc/StaticCodeInstructionOperandConstraintException.java
+com/sun/org/apache/bcel/internal/verifier/exc/StructuralCodeConstraintException.java
+com/sun/org/apache/bcel/internal/verifier/exc/VerifierConstraintViolatedException.java
+com/sun/org/apache/bcel/internal/verifier/statics
+com/sun/org/apache/bcel/internal/verifier/statics/SCCS
+com/sun/org/apache/bcel/internal/verifier/statics/SCCS/s.LocalVariableInfo.java
+com/sun/org/apache/bcel/internal/verifier/statics/SCCS/s.DOUBLE_Upper.java
+com/sun/org/apache/bcel/internal/verifier/statics/SCCS/s.IntList.java
+com/sun/org/apache/bcel/internal/verifier/statics/SCCS/s.LONG_Upper.java
+com/sun/org/apache/bcel/internal/verifier/statics/SCCS/s.LocalVariablesInfo.java
+com/sun/org/apache/bcel/internal/verifier/statics/SCCS/s.Pass1Verifier.java
+com/sun/org/apache/bcel/internal/verifier/statics/SCCS/s.Pass2Verifier.java
+com/sun/org/apache/bcel/internal/verifier/statics/SCCS/s.Pass3aVerifier.java
+com/sun/org/apache/bcel/internal/verifier/statics/SCCS/s.StringRepresentation.java
+com/sun/org/apache/bcel/internal/verifier/statics/SCCS/s.package.html
+com/sun/org/apache/bcel/internal/verifier/statics/LocalVariableInfo.java
+com/sun/org/apache/bcel/internal/verifier/statics/DOUBLE_Upper.java
+com/sun/org/apache/bcel/internal/verifier/statics/IntList.java
+com/sun/org/apache/bcel/internal/verifier/statics/LONG_Upper.java
+com/sun/org/apache/bcel/internal/verifier/statics/LocalVariablesInfo.java
+com/sun/org/apache/bcel/internal/verifier/statics/Pass1Verifier.java
+com/sun/org/apache/bcel/internal/verifier/statics/Pass2Verifier.java
+com/sun/org/apache/bcel/internal/verifier/statics/Pass3aVerifier.java
+com/sun/org/apache/bcel/internal/verifier/statics/StringRepresentation.java
+com/sun/org/apache/bcel/internal/verifier/statics/package.html
+com/sun/org/apache/bcel/internal/verifier/structurals
+com/sun/org/apache/bcel/internal/verifier/structurals/SCCS
+com/sun/org/apache/bcel/internal/verifier/structurals/SCCS/s.ExceptionHandlers.java
+com/sun/org/apache/bcel/internal/verifier/structurals/SCCS/s.ControlFlowGraph.java
+com/sun/org/apache/bcel/internal/verifier/structurals/SCCS/s.ExceptionHandler.java
+com/sun/org/apache/bcel/internal/verifier/structurals/SCCS/s.InstConstraintVisitor.java
+com/sun/org/apache/bcel/internal/verifier/structurals/SCCS/s.ExecutionVisitor.java
+com/sun/org/apache/bcel/internal/verifier/structurals/SCCS/s.Frame.java
+com/sun/org/apache/bcel/internal/verifier/structurals/SCCS/s.GenericArray.java
+com/sun/org/apache/bcel/internal/verifier/structurals/SCCS/s.InstructionContext.java
+com/sun/org/apache/bcel/internal/verifier/structurals/SCCS/s.LocalVariables.java
+com/sun/org/apache/bcel/internal/verifier/structurals/SCCS/s.OperandStack.java
+com/sun/org/apache/bcel/internal/verifier/structurals/SCCS/s.Pass3bVerifier.java
+com/sun/org/apache/bcel/internal/verifier/structurals/SCCS/s.Subroutine.java
+com/sun/org/apache/bcel/internal/verifier/structurals/SCCS/s.Subroutines.java
+com/sun/org/apache/bcel/internal/verifier/structurals/SCCS/s.package.html
+com/sun/org/apache/bcel/internal/verifier/structurals/SCCS/s.UninitializedObjectType.java
+com/sun/org/apache/bcel/internal/verifier/structurals/InstConstraintVisitor.java
+com/sun/org/apache/bcel/internal/verifier/structurals/ControlFlowGraph.java
+com/sun/org/apache/bcel/internal/verifier/structurals/ExceptionHandler.java
+com/sun/org/apache/bcel/internal/verifier/structurals/ExceptionHandlers.java
+com/sun/org/apache/bcel/internal/verifier/structurals/ExecutionVisitor.java
+com/sun/org/apache/bcel/internal/verifier/structurals/Frame.java
+com/sun/org/apache/bcel/internal/verifier/structurals/GenericArray.java
+com/sun/org/apache/bcel/internal/verifier/structurals/UninitializedObjectType.java
+com/sun/org/apache/bcel/internal/verifier/structurals/InstructionContext.java
+com/sun/org/apache/bcel/internal/verifier/structurals/LocalVariables.java
+com/sun/org/apache/bcel/internal/verifier/structurals/OperandStack.java
+com/sun/org/apache/bcel/internal/verifier/structurals/Pass3bVerifier.java
+com/sun/org/apache/bcel/internal/verifier/structurals/Subroutine.java
+com/sun/org/apache/bcel/internal/verifier/structurals/Subroutines.java
+com/sun/org/apache/bcel/internal/verifier/structurals/package.html
+com/sun/org/apache/bcel/internal/verifier/VerifierFactoryListModel.java
+com/sun/org/apache/bcel/internal/verifier/GraphicalVerifier.java
+com/sun/org/apache/bcel/internal/verifier/NativeVerifier.java
+com/sun/org/apache/bcel/internal/verifier/PassVerifier.java
+com/sun/org/apache/bcel/internal/verifier/TransitiveHull.java
+com/sun/org/apache/bcel/internal/verifier/VerificationResult.java
+com/sun/org/apache/bcel/internal/verifier/Verifier.java
+com/sun/org/apache/bcel/internal/verifier/VerifierAppFrame.java
+com/sun/org/apache/bcel/internal/verifier/VerifierFactory.java
+com/sun/org/apache/bcel/internal/verifier/VerifierFactoryObserver.java
+com/sun/org/apache/bcel/internal/verifier/VerifyDialog.java
+com/sun/org/apache/bcel/internal/verifier/package.html
+com/sun/org/apache/bcel/internal/ExceptionConstants.java
+com/sun/org/apache/bcel/internal/Constants.java
+com/sun/org/apache/bcel/internal/Repository.java
+com/sun/org/apache/bcel/internal/package.html
+com/sun/org/apache/html
+com/sun/org/apache/html/internal
+com/sun/org/apache/html/internal/dom
+com/sun/org/apache/html/internal/dom/SCCS
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLAnchorElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLAppletElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLAreaElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLBRElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLBaseElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLBaseFontElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLBodyElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLBuilder.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLButtonElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLCollectionImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLDListElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLDivElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLTableCaptionElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLDOMImplementationImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLDirectoryElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLDocumentImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLFieldSetElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLFontElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLFormControl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLFormElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLFrameElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLFrameSetElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLHRElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLHeadElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLHeadingElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.NameNodeListImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLHtmlElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLIFrameElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLImageElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLInputElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLIsIndexElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLLIElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLLabelElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLLegendElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLLinkElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLMapElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLMenuElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLMetaElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLModElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.ObjectFactory.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLOListElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLObjectElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLOptGroupElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLOptionElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLParagraphElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLParamElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLPreElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLQuoteElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLScriptElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLSelectElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLStyleElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLTableCellElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLTableColElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLTableElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLTableRowElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLTableSectionElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLTextAreaElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLTitleElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.HTMLUListElementImpl.java
+com/sun/org/apache/html/internal/dom/SCCS/s.SecuritySupport.java
+com/sun/org/apache/html/internal/dom/SCCS/s.SecuritySupport12.java
+com/sun/org/apache/html/internal/dom/HTMLBaseFontElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLAnchorElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLAppletElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLAreaElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLBRElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLBaseElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLTableCaptionElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLBodyElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLBuilder.java
+com/sun/org/apache/html/internal/dom/HTMLButtonElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLCollectionImpl.java
+com/sun/org/apache/html/internal/dom/HTMLDListElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLDOMImplementationImpl.java
+com/sun/org/apache/html/internal/dom/HTMLDirectoryElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLDivElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLDocumentImpl.java
+com/sun/org/apache/html/internal/dom/HTMLElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLFieldSetElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLFontElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLFormControl.java
+com/sun/org/apache/html/internal/dom/HTMLFormElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLFrameElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLFrameSetElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLHRElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLHeadElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLHeadingElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLHtmlElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLIFrameElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLImageElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLInputElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLIsIndexElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLLIElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLLabelElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLLegendElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLLinkElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLMapElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLMenuElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLMetaElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLModElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLOListElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLObjectElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLOptGroupElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLOptionElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLParagraphElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLParamElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLPreElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLQuoteElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLScriptElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLSelectElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLStyleElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLTableCellElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLTableColElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLTableElementImpl.java
+com/sun/org/apache/html/internal/dom/ObjectFactory.java
+com/sun/org/apache/html/internal/dom/HTMLTableRowElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLTableSectionElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLTextAreaElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLTitleElementImpl.java
+com/sun/org/apache/html/internal/dom/HTMLUListElementImpl.java
+com/sun/org/apache/html/internal/dom/NameNodeListImpl.java
+com/sun/org/apache/html/internal/dom/SecuritySupport.java
+com/sun/org/apache/html/internal/dom/SecuritySupport12.java
+com/sun/org/apache/regexp
+com/sun/org/apache/regexp/internal
+com/sun/org/apache/regexp/internal/SCCS
+com/sun/org/apache/regexp/internal/SCCS/s.RE.java
+com/sun/org/apache/regexp/internal/SCCS/s.REDebugCompiler.java
+com/sun/org/apache/regexp/internal/SCCS/s.CharacterArrayCharacterIterator.java
+com/sun/org/apache/regexp/internal/SCCS/s.CharacterIterator.java
+com/sun/org/apache/regexp/internal/SCCS/s.RECompiler.java
+com/sun/org/apache/regexp/internal/SCCS/s.RESyntaxException.java
+com/sun/org/apache/regexp/internal/SCCS/s.REDemo.java
+com/sun/org/apache/regexp/internal/SCCS/s.REProgram.java
+com/sun/org/apache/regexp/internal/SCCS/s.RETest.java
+com/sun/org/apache/regexp/internal/SCCS/s.REUtil.java
+com/sun/org/apache/regexp/internal/SCCS/s.ReaderCharacterIterator.java
+com/sun/org/apache/regexp/internal/SCCS/s.StreamCharacterIterator.java
+com/sun/org/apache/regexp/internal/SCCS/s.StringCharacterIterator.java
+com/sun/org/apache/regexp/internal/SCCS/s.recompile.java
+com/sun/org/apache/regexp/internal/RE.java
+com/sun/org/apache/regexp/internal/ReaderCharacterIterator.java
+com/sun/org/apache/regexp/internal/CharacterArrayCharacterIterator.java
+com/sun/org/apache/regexp/internal/CharacterIterator.java
+com/sun/org/apache/regexp/internal/RECompiler.java
+com/sun/org/apache/regexp/internal/REDebugCompiler.java
+com/sun/org/apache/regexp/internal/REDemo.java
+com/sun/org/apache/regexp/internal/REProgram.java
+com/sun/org/apache/regexp/internal/RESyntaxException.java
+com/sun/org/apache/regexp/internal/RETest.java
+com/sun/org/apache/regexp/internal/REUtil.java
+com/sun/org/apache/regexp/internal/StreamCharacterIterator.java
+com/sun/org/apache/regexp/internal/StringCharacterIterator.java
+com/sun/org/apache/regexp/internal/recompile.java
+com/sun/org/apache/wml
+com/sun/org/apache/wml/internal
+com/sun/org/apache/wml/internal/SCCS
+com/sun/org/apache/wml/internal/SCCS/s.WMLAccessElement.java
+com/sun/org/apache/wml/internal/SCCS/s.WMLAElement.java
+com/sun/org/apache/wml/internal/SCCS/s.WMLAnchorElement.java
+com/sun/org/apache/wml/internal/SCCS/s.WMLBElement.java
+com/sun/org/apache/wml/internal/SCCS/s.WMLBigElement.java
+com/sun/org/apache/wml/internal/SCCS/s.WMLBrElement.java
+com/sun/org/apache/wml/internal/SCCS/s.WMLCardElement.java
+com/sun/org/apache/wml/internal/SCCS/s.WMLDOMImplementation.java
+com/sun/org/apache/wml/internal/SCCS/s.WMLDoElement.java
+com/sun/org/apache/wml/internal/SCCS/s.WMLDocument.java
+com/sun/org/apache/wml/internal/SCCS/s.WMLElement.java
+com/sun/org/apache/wml/internal/SCCS/s.WMLEmElement.java
+com/sun/org/apache/wml/internal/SCCS/s.WMLFieldsetElement.java
+com/sun/org/apache/wml/internal/SCCS/s.WMLGoElement.java
+com/sun/org/apache/wml/internal/SCCS/s.WMLHeadElement.java
+com/sun/org/apache/wml/internal/SCCS/s.WMLIElement.java
+com/sun/org/apache/wml/internal/SCCS/s.WMLImgElement.java
+com/sun/org/apache/wml/internal/SCCS/s.WMLInputElement.java
+com/sun/org/apache/wml/internal/SCCS/s.WMLMetaElement.java
+com/sun/org/apache/wml/internal/SCCS/s.WMLNoopElement.java
+com/sun/org/apache/wml/internal/SCCS/s.WMLOneventElement.java
+com/sun/org/apache/wml/internal/SCCS/s.WMLOptgroupElement.java
+com/sun/org/apache/wml/internal/SCCS/s.WMLOptionElement.java
+com/sun/org/apache/wml/internal/SCCS/s.WMLPElement.java
+com/sun/org/apache/wml/internal/SCCS/s.WMLPostfieldElement.java
+com/sun/org/apache/wml/internal/SCCS/s.WMLPrevElement.java
+com/sun/org/apache/wml/internal/SCCS/s.WMLRefreshElement.java
+com/sun/org/apache/wml/internal/SCCS/s.WMLSelectElement.java
+com/sun/org/apache/wml/internal/SCCS/s.WMLSetvarElement.java
+com/sun/org/apache/wml/internal/SCCS/s.WMLSmallElement.java
+com/sun/org/apache/wml/internal/SCCS/s.WMLStrongElement.java
+com/sun/org/apache/wml/internal/SCCS/s.WMLTableElement.java
+com/sun/org/apache/wml/internal/SCCS/s.WMLTdElement.java
+com/sun/org/apache/wml/internal/SCCS/s.WMLTemplateElement.java
+com/sun/org/apache/wml/internal/SCCS/s.WMLTimerElement.java
+com/sun/org/apache/wml/internal/SCCS/s.WMLTrElement.java
+com/sun/org/apache/wml/internal/SCCS/s.WMLUElement.java
+com/sun/org/apache/wml/internal/SCCS/s.WMLWmlElement.java
+com/sun/org/apache/wml/internal/dom
+com/sun/org/apache/wml/internal/dom/SCCS
+com/sun/org/apache/wml/internal/dom/SCCS/s.WMLAccessElementImpl.java
+com/sun/org/apache/wml/internal/dom/SCCS/s.WMLAElementImpl.java
+com/sun/org/apache/wml/internal/dom/SCCS/s.WMLAnchorElementImpl.java
+com/sun/org/apache/wml/internal/dom/SCCS/s.WMLBElementImpl.java
+com/sun/org/apache/wml/internal/dom/SCCS/s.WMLBigElementImpl.java
+com/sun/org/apache/wml/internal/dom/SCCS/s.WMLBrElementImpl.java
+com/sun/org/apache/wml/internal/dom/SCCS/s.WMLCardElementImpl.java
+com/sun/org/apache/wml/internal/dom/SCCS/s.WMLDOMImplementationImpl.java
+com/sun/org/apache/wml/internal/dom/SCCS/s.WMLDoElementImpl.java
+com/sun/org/apache/wml/internal/dom/SCCS/s.WMLDocumentImpl.java
+com/sun/org/apache/wml/internal/dom/SCCS/s.WMLElementImpl.java
+com/sun/org/apache/wml/internal/dom/SCCS/s.WMLEmElementImpl.java
+com/sun/org/apache/wml/internal/dom/SCCS/s.WMLGoElementImpl.java
+com/sun/org/apache/wml/internal/dom/SCCS/s.WMLFieldsetElementImpl.java
+com/sun/org/apache/wml/internal/dom/SCCS/s.WMLHeadElementImpl.java
+com/sun/org/apache/wml/internal/dom/SCCS/s.WMLIElementImpl.java
+com/sun/org/apache/wml/internal/dom/SCCS/s.WMLImgElementImpl.java
+com/sun/org/apache/wml/internal/dom/SCCS/s.WMLInputElementImpl.java
+com/sun/org/apache/wml/internal/dom/SCCS/s.WMLMetaElementImpl.java
+com/sun/org/apache/wml/internal/dom/SCCS/s.WMLNoopElementImpl.java
+com/sun/org/apache/wml/internal/dom/SCCS/s.WMLOneventElementImpl.java
+com/sun/org/apache/wml/internal/dom/SCCS/s.WMLOptgroupElementImpl.java
+com/sun/org/apache/wml/internal/dom/SCCS/s.WMLOptionElementImpl.java
+com/sun/org/apache/wml/internal/dom/SCCS/s.WMLPElementImpl.java
+com/sun/org/apache/wml/internal/dom/SCCS/s.WMLPostfieldElementImpl.java
+com/sun/org/apache/wml/internal/dom/SCCS/s.WMLPrevElementImpl.java
+com/sun/org/apache/wml/internal/dom/SCCS/s.WMLSelectElementImpl.java
+com/sun/org/apache/wml/internal/dom/SCCS/s.WMLRefreshElementImpl.java
+com/sun/org/apache/wml/internal/dom/SCCS/s.WMLSetvarElementImpl.java
+com/sun/org/apache/wml/internal/dom/SCCS/s.WMLSmallElementImpl.java
+com/sun/org/apache/wml/internal/dom/SCCS/s.WMLStrongElementImpl.java
+com/sun/org/apache/wml/internal/dom/SCCS/s.WMLTableElementImpl.java
+com/sun/org/apache/wml/internal/dom/SCCS/s.WMLTdElementImpl.java
+com/sun/org/apache/wml/internal/dom/SCCS/s.WMLTemplateElementImpl.java
+com/sun/org/apache/wml/internal/dom/SCCS/s.WMLTimerElementImpl.java
+com/sun/org/apache/wml/internal/dom/SCCS/s.WMLTrElementImpl.java
+com/sun/org/apache/wml/internal/dom/SCCS/s.WMLUElementImpl.java
+com/sun/org/apache/wml/internal/dom/SCCS/s.WMLWmlElementImpl.java
+com/sun/org/apache/wml/internal/dom/WMLAccessElementImpl.java
+com/sun/org/apache/wml/internal/dom/WMLAElementImpl.java
+com/sun/org/apache/wml/internal/dom/WMLAnchorElementImpl.java
+com/sun/org/apache/wml/internal/dom/WMLBElementImpl.java
+com/sun/org/apache/wml/internal/dom/WMLBigElementImpl.java
+com/sun/org/apache/wml/internal/dom/WMLBrElementImpl.java
+com/sun/org/apache/wml/internal/dom/WMLCardElementImpl.java
+com/sun/org/apache/wml/internal/dom/WMLDOMImplementationImpl.java
+com/sun/org/apache/wml/internal/dom/WMLDoElementImpl.java
+com/sun/org/apache/wml/internal/dom/WMLDocumentImpl.java
+com/sun/org/apache/wml/internal/dom/WMLElementImpl.java
+com/sun/org/apache/wml/internal/dom/WMLEmElementImpl.java
+com/sun/org/apache/wml/internal/dom/WMLFieldsetElementImpl.java
+com/sun/org/apache/wml/internal/dom/WMLGoElementImpl.java
+com/sun/org/apache/wml/internal/dom/WMLHeadElementImpl.java
+com/sun/org/apache/wml/internal/dom/WMLIElementImpl.java
+com/sun/org/apache/wml/internal/dom/WMLImgElementImpl.java
+com/sun/org/apache/wml/internal/dom/WMLInputElementImpl.java
+com/sun/org/apache/wml/internal/dom/WMLMetaElementImpl.java
+com/sun/org/apache/wml/internal/dom/WMLNoopElementImpl.java
+com/sun/org/apache/wml/internal/dom/WMLOneventElementImpl.java
+com/sun/org/apache/wml/internal/dom/WMLOptgroupElementImpl.java
+com/sun/org/apache/wml/internal/dom/WMLOptionElementImpl.java
+com/sun/org/apache/wml/internal/dom/WMLPElementImpl.java
+com/sun/org/apache/wml/internal/dom/WMLPostfieldElementImpl.java
+com/sun/org/apache/wml/internal/dom/WMLPrevElementImpl.java
+com/sun/org/apache/wml/internal/dom/WMLRefreshElementImpl.java
+com/sun/org/apache/wml/internal/dom/WMLSelectElementImpl.java
+com/sun/org/apache/wml/internal/dom/WMLTdElementImpl.java
+com/sun/org/apache/wml/internal/dom/WMLSetvarElementImpl.java
+com/sun/org/apache/wml/internal/dom/WMLSmallElementImpl.java
+com/sun/org/apache/wml/internal/dom/WMLStrongElementImpl.java
+com/sun/org/apache/wml/internal/dom/WMLTableElementImpl.java
+com/sun/org/apache/wml/internal/dom/WMLTemplateElementImpl.java
+com/sun/org/apache/wml/internal/dom/WMLTimerElementImpl.java
+com/sun/org/apache/wml/internal/dom/WMLTrElementImpl.java
+com/sun/org/apache/wml/internal/dom/WMLUElementImpl.java
+com/sun/org/apache/wml/internal/dom/WMLWmlElementImpl.java
+com/sun/org/apache/wml/internal/WMLAccessElement.java
+com/sun/org/apache/wml/internal/WMLAElement.java
+com/sun/org/apache/wml/internal/WMLAnchorElement.java
+com/sun/org/apache/wml/internal/WMLBElement.java
+com/sun/org/apache/wml/internal/WMLBigElement.java
+com/sun/org/apache/wml/internal/WMLBrElement.java
+com/sun/org/apache/wml/internal/WMLCardElement.java
+com/sun/org/apache/wml/internal/WMLDOMImplementation.java
+com/sun/org/apache/wml/internal/WMLDoElement.java
+com/sun/org/apache/wml/internal/WMLDocument.java
+com/sun/org/apache/wml/internal/WMLElement.java
+com/sun/org/apache/wml/internal/WMLEmElement.java
+com/sun/org/apache/wml/internal/WMLFieldsetElement.java
+com/sun/org/apache/wml/internal/WMLGoElement.java
+com/sun/org/apache/wml/internal/WMLHeadElement.java
+com/sun/org/apache/wml/internal/WMLIElement.java
+com/sun/org/apache/wml/internal/WMLImgElement.java
+com/sun/org/apache/wml/internal/WMLInputElement.java
+com/sun/org/apache/wml/internal/WMLMetaElement.java
+com/sun/org/apache/wml/internal/WMLNoopElement.java
+com/sun/org/apache/wml/internal/WMLOneventElement.java
+com/sun/org/apache/wml/internal/WMLOptgroupElement.java
+com/sun/org/apache/wml/internal/WMLOptionElement.java
+com/sun/org/apache/wml/internal/WMLPElement.java
+com/sun/org/apache/wml/internal/WMLPostfieldElement.java
+com/sun/org/apache/wml/internal/WMLPrevElement.java
+com/sun/org/apache/wml/internal/WMLRefreshElement.java
+com/sun/org/apache/wml/internal/WMLSelectElement.java
+com/sun/org/apache/wml/internal/WMLSetvarElement.java
+com/sun/org/apache/wml/internal/WMLSmallElement.java
+com/sun/org/apache/wml/internal/WMLStrongElement.java
+com/sun/org/apache/wml/internal/WMLTableElement.java
+com/sun/org/apache/wml/internal/WMLTdElement.java
+com/sun/org/apache/wml/internal/WMLTemplateElement.java
+com/sun/org/apache/wml/internal/WMLTimerElement.java
+com/sun/org/apache/wml/internal/WMLTrElement.java
+com/sun/org/apache/wml/internal/WMLUElement.java
+com/sun/org/apache/wml/internal/WMLWmlElement.java
+com/sun/org/apache/xalan
+com/sun/org/apache/xalan/internal
+com/sun/org/apache/xalan/internal/SCCS
+com/sun/org/apache/xalan/internal/SCCS/s.Version.java
+com/sun/org/apache/xalan/internal/client
+com/sun/org/apache/xalan/internal/client/SCCS
+com/sun/org/apache/xalan/internal/client/SCCS/s.XSLTProcessorApplet.java
+com/sun/org/apache/xalan/internal/client/SCCS/s.package.html
+com/sun/org/apache/xalan/internal/client/XSLTProcessorApplet.java
+com/sun/org/apache/xalan/internal/client/package.html
+com/sun/org/apache/xalan/internal/extensions
+com/sun/org/apache/xalan/internal/extensions/SCCS
+com/sun/org/apache/xalan/internal/extensions/SCCS/s.ExpressionContext.java
+com/sun/org/apache/xalan/internal/extensions/SCCS/s.package.html
+com/sun/org/apache/xalan/internal/extensions/ExpressionContext.java
+com/sun/org/apache/xalan/internal/extensions/package.html
+com/sun/org/apache/xalan/internal/lib
+com/sun/org/apache/xalan/internal/lib/SCCS
+com/sun/org/apache/xalan/internal/lib/SCCS/s.ExsltDatetime.java
+com/sun/org/apache/xalan/internal/lib/SCCS/s.ExsltBase.java
+com/sun/org/apache/xalan/internal/lib/SCCS/s.ExsltCommon.java
+com/sun/org/apache/xalan/internal/lib/SCCS/s.SecuritySupport12.java
+com/sun/org/apache/xalan/internal/lib/SCCS/s.ExsltDynamic.java
+com/sun/org/apache/xalan/internal/lib/SCCS/s.ExsltMath.java
+com/sun/org/apache/xalan/internal/lib/SCCS/s.ExsltSets.java
+com/sun/org/apache/xalan/internal/lib/SCCS/s.ExsltStrings.java
+com/sun/org/apache/xalan/internal/lib/SCCS/s.Extensions.java
+com/sun/org/apache/xalan/internal/lib/SCCS/s.ObjectFactory.java
+com/sun/org/apache/xalan/internal/lib/SCCS/s.SecuritySupport.java
+com/sun/org/apache/xalan/internal/lib/sql
+com/sun/org/apache/xalan/internal/lib/sql/SCCS
+com/sun/org/apache/xalan/internal/lib/ExsltCommon.java
+com/sun/org/apache/xalan/internal/lib/ExsltBase.java
+com/sun/org/apache/xalan/internal/lib/ExsltDatetime.java
+com/sun/org/apache/xalan/internal/lib/ExsltDynamic.java
+com/sun/org/apache/xalan/internal/lib/ExsltMath.java
+com/sun/org/apache/xalan/internal/lib/ExsltSets.java
+com/sun/org/apache/xalan/internal/lib/ExsltStrings.java
+com/sun/org/apache/xalan/internal/lib/Extensions.java
+com/sun/org/apache/xalan/internal/lib/ObjectFactory.java
+com/sun/org/apache/xalan/internal/lib/SecuritySupport.java
+com/sun/org/apache/xalan/internal/lib/SecuritySupport12.java
+com/sun/org/apache/xalan/internal/processor
+com/sun/org/apache/xalan/internal/processor/SCCS
+com/sun/org/apache/xalan/internal/res
+com/sun/org/apache/xalan/internal/res/SCCS
+com/sun/org/apache/xalan/internal/res/SCCS/s.XSLTErrorResources.java
+com/sun/org/apache/xalan/internal/res/SCCS/s.XSLMessages.java
+com/sun/org/apache/xalan/internal/res/SCCS/s.XSLTErrorResources_de.java
+com/sun/org/apache/xalan/internal/res/SCCS/s.XSLTErrorResources_en.java
+com/sun/org/apache/xalan/internal/res/SCCS/s.XSLTErrorResources_es.java
+com/sun/org/apache/xalan/internal/res/SCCS/s.XSLTErrorResources_fr.java
+com/sun/org/apache/xalan/internal/res/SCCS/s.XSLTErrorResources_it.java
+com/sun/org/apache/xalan/internal/res/SCCS/s.XSLTErrorResources_ja.java
+com/sun/org/apache/xalan/internal/res/SCCS/s.XSLTErrorResources_ko.java
+com/sun/org/apache/xalan/internal/res/SCCS/s.XSLTErrorResources_sv.java
+com/sun/org/apache/xalan/internal/res/SCCS/s.XSLTErrorResources_zh_CN.java
+com/sun/org/apache/xalan/internal/res/SCCS/s.XSLTErrorResources_zh_HK.java
+com/sun/org/apache/xalan/internal/res/SCCS/s.package.html
+com/sun/org/apache/xalan/internal/res/SCCS/s.XSLTErrorResources_zh_TW.java
+com/sun/org/apache/xalan/internal/res/SCCS/s.XSLTInfo.properties
+com/sun/org/apache/xalan/internal/res/XSLTErrorResources.java
+com/sun/org/apache/xalan/internal/res/XSLMessages.java
+com/sun/org/apache/xalan/internal/res/XSLTErrorResources_de.java
+com/sun/org/apache/xalan/internal/res/XSLTErrorResources_en.java
+com/sun/org/apache/xalan/internal/res/XSLTErrorResources_es.java
+com/sun/org/apache/xalan/internal/res/XSLTErrorResources_fr.java
+com/sun/org/apache/xalan/internal/res/XSLTErrorResources_it.java
+com/sun/org/apache/xalan/internal/res/XSLTErrorResources_ja.java
+com/sun/org/apache/xalan/internal/res/XSLTErrorResources_ko.java
+com/sun/org/apache/xalan/internal/res/XSLTErrorResources_sv.java
+com/sun/org/apache/xalan/internal/res/XSLTErrorResources_zh_CN.java
+com/sun/org/apache/xalan/internal/res/XSLTInfo.properties
+com/sun/org/apache/xalan/internal/res/XSLTErrorResources_zh_HK.java
+com/sun/org/apache/xalan/internal/res/XSLTErrorResources_zh_TW.java
+com/sun/org/apache/xalan/internal/res/package.html
+com/sun/org/apache/xalan/internal/serialize
+com/sun/org/apache/xalan/internal/serialize/SCCS
+com/sun/org/apache/xalan/internal/templates
+com/sun/org/apache/xalan/internal/templates/SCCS
+com/sun/org/apache/xalan/internal/templates/SCCS/s.Constants.java
+com/sun/org/apache/xalan/internal/templates/SCCS/s.package.html
+com/sun/org/apache/xalan/internal/templates/Constants.java
+com/sun/org/apache/xalan/internal/templates/package.html
+com/sun/org/apache/xalan/internal/trace
+com/sun/org/apache/xalan/internal/trace/SCCS
+com/sun/org/apache/xalan/internal/transformer
+com/sun/org/apache/xalan/internal/transformer/SCCS
+com/sun/org/apache/xalan/internal/xslt
+com/sun/org/apache/xalan/internal/xslt/SCCS
+com/sun/org/apache/xalan/internal/xslt/SCCS/s.SecuritySupport12.java
+com/sun/org/apache/xalan/internal/xslt/SCCS/s.EnvironmentCheck.java
+com/sun/org/apache/xalan/internal/xslt/SCCS/s.ObjectFactory.java
+com/sun/org/apache/xalan/internal/xslt/SCCS/s.Process.java
+com/sun/org/apache/xalan/internal/xslt/SCCS/s.SecuritySupport.java
+com/sun/org/apache/xalan/internal/xslt/SCCS/s.package.html
+com/sun/org/apache/xalan/internal/xslt/EnvironmentCheck.java
+com/sun/org/apache/xalan/internal/xslt/ObjectFactory.java
+com/sun/org/apache/xalan/internal/xslt/Process.java
+com/sun/org/apache/xalan/internal/xslt/SecuritySupport.java
+com/sun/org/apache/xalan/internal/xslt/SecuritySupport12.java
+com/sun/org/apache/xalan/internal/xslt/package.html
+com/sun/org/apache/xalan/internal/xsltc
+com/sun/org/apache/xalan/internal/xsltc/SCCS
+com/sun/org/apache/xalan/internal/xsltc/SCCS/s.DOMEnhancedForDTM.java
+com/sun/org/apache/xalan/internal/xsltc/SCCS/s.CollatorFactory.java
+com/sun/org/apache/xalan/internal/xsltc/SCCS/s.DOM.java
+com/sun/org/apache/xalan/internal/xsltc/SCCS/s.DOMCache.java
+com/sun/org/apache/xalan/internal/xsltc/SCCS/s.TransletException.java
+com/sun/org/apache/xalan/internal/xsltc/SCCS/s.NodeIterator.java
+com/sun/org/apache/xalan/internal/xsltc/SCCS/s.ProcessorVersion.java
+com/sun/org/apache/xalan/internal/xsltc/SCCS/s.StripFilter.java
+com/sun/org/apache/xalan/internal/xsltc/SCCS/s.Translet.java
+com/sun/org/apache/xalan/internal/xsltc/SCCS/s.javax.xml.transform.TransformerFactory
+com/sun/org/apache/xalan/internal/xsltc/cmdline
+com/sun/org/apache/xalan/internal/xsltc/cmdline/SCCS
+com/sun/org/apache/xalan/internal/xsltc/cmdline/SCCS/s.ObjectFactory.java
+com/sun/org/apache/xalan/internal/xsltc/cmdline/SCCS/s.Compile.java
+com/sun/org/apache/xalan/internal/xsltc/cmdline/SCCS/s.SecuritySupport12.java
+com/sun/org/apache/xalan/internal/xsltc/cmdline/SCCS/s.SecuritySupport.java
+com/sun/org/apache/xalan/internal/xsltc/cmdline/SCCS/s.Transform.java
+com/sun/org/apache/xalan/internal/xsltc/cmdline/getopt
+com/sun/org/apache/xalan/internal/xsltc/cmdline/getopt/SCCS
+com/sun/org/apache/xalan/internal/xsltc/cmdline/getopt/SCCS/s.GetOptsException.java
+com/sun/org/apache/xalan/internal/xsltc/cmdline/getopt/SCCS/s.GetOpt.java
+com/sun/org/apache/xalan/internal/xsltc/cmdline/getopt/SCCS/s.IllegalArgumentException.java
+com/sun/org/apache/xalan/internal/xsltc/cmdline/getopt/SCCS/s.MissingOptArgException.java
+com/sun/org/apache/xalan/internal/xsltc/cmdline/getopt/GetOpt.java
+com/sun/org/apache/xalan/internal/xsltc/cmdline/getopt/GetOptsException.java
+com/sun/org/apache/xalan/internal/xsltc/cmdline/getopt/IllegalArgumentException.java
+com/sun/org/apache/xalan/internal/xsltc/cmdline/getopt/MissingOptArgException.java
+com/sun/org/apache/xalan/internal/xsltc/cmdline/ObjectFactory.java
+com/sun/org/apache/xalan/internal/xsltc/cmdline/Compile.java
+com/sun/org/apache/xalan/internal/xsltc/cmdline/SecuritySupport.java
+com/sun/org/apache/xalan/internal/xsltc/cmdline/SecuritySupport12.java
+com/sun/org/apache/xalan/internal/xsltc/cmdline/Transform.java
+com/sun/org/apache/xalan/internal/xsltc/compiler
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.AttributeValueTemplate.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.AbsoluteLocationPath.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.AbsolutePathPattern.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.AlternativePattern.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.AncestorPattern.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.ApplyImports.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.ApplyTemplates.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.ArgumentList.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.Attribute.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.AttributeSet.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.AttributeValue.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.BinOpExpr.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.BooleanCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.BooleanExpr.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.CopyOf.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.Copy.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.CallTemplate.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.CastCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.CastExpr.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.CeilingCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.Choose.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.Closure.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.Comment.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.CompilerException.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.ConcatCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.Constants.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.ContainsCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.DecimalFormatting.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.CurrentCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.ElementAvailableCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.DocumentCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.FilterParentPath.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.EqualityExpr.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.Fallback.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.Expression.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.FilterExpr.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.If.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.FilteredAbsoluteLocationPath.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.FloorCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.FlowList.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.ForEach.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.FormatNumberCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.FunctionAvailableCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.FunctionCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.GenerateIdCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.IdKeyPattern.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.IdPattern.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.Import.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.IllegalCharException.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.Include.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.ProcessingInstruction.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.Instruction.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.IntExpr.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.Key.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.KeyCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.KeyPattern.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.LangCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.LastCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.LiteralAttribute.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.LiteralElement.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.LiteralExpr.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.LocalNameCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.LocationPathPattern.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.LogicalExpr.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.Makefile.inc
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.Message.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.Mode.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.NameBase.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.NameCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.NamespaceAlias.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.NamespaceUriCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.NodeTest.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.NotCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.Number.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.NumberCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.ObjectFactory.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.Otherwise.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.Output.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.Param.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.ParameterRef.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.ParentLocationPath.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.ParentPattern.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.Parser.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.Pattern.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.PositionCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.PositionCall.java.inuse
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.Predicate.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.RelationalExpr.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.QName.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.RealExpr.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.ProcessingInstructionPattern.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.When.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.RelativeLocationPath.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.RelativePathPattern.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.RoundCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.SecuritySupport.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.SecuritySupport12.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.SimpleAttributeValue.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.Sort.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.SourceLoader.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.StartsWithCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.Step.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.StepPattern.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.StringCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.StringLengthCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.Stylesheet.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.SymbolTable.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.SyntaxTreeNode.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.Template.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.TestSeq.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.Text.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.TopLevelElement.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.TransletOutput.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.UnaryOpExpr.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.UnionPathExpr.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.UnparsedEntityUriCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.UnresolvedRef.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.UnsupportedElement.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.UseAttributeSets.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.ValueOf.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.Variable.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.VariableBase.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.VariableRef.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.VariableRefBase.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.Whitespace.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.WithParam.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.XPathLexer.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.XPathParser.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.XSLTC.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.XslAttribute.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.XslElement.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.sym.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.xpath.cup
+com/sun/org/apache/xalan/internal/xsltc/compiler/SCCS/s.xpath.lex
+com/sun/org/apache/xalan/internal/xsltc/compiler/util
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.AttributeSetMethodGenerator.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.BooleanType.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.ClassGenerator.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.CompareGenerator.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.ErrorMessages.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.ErrorMessages_ca.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.ErrorMessages_cs.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.ErrorMessages_de.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.ErrorMessages_es.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.ErrorMessages_fr.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.ErrorMessages_it.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.ErrorMessages_ja.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.ErrorMessages_ko.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.NodeType.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.RtMethodGenerator.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.ErrorMessages_sk.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.ErrorMessages_zh_CN.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.ErrorMessages_zh_TW.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.ErrorMsg.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.FilterGenerator.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.IntType.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.MatchGenerator.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.MethodGenerator.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.MethodType.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.MultiHashtable.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.NamedMethodGenerator.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.NodeCounterGenerator.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.NodeSetType.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.NodeSortRecordFactGenerator.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.NodeSortRecordGenerator.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.Type.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.NumberType.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.ObjectFactory.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.ObjectType.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.RealType.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.ReferenceType.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.ResultTreeType.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.SecuritySupport12.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.SecuritySupport.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.SlotAllocator.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.StringStack.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.StringType.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.TestGenerator.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.TypeCheckError.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.Util.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SCCS/s.VoidType.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/ObjectFactory.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/AttributeSetMethodGenerator.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/BooleanType.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/ClassGenerator.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/CompareGenerator.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages_ca.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages_cs.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages_de.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages_es.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages_fr.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages_it.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages_ja.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages_ko.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/NumberType.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages_sk.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages_zh_CN.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages_zh_TW.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMsg.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/FilterGenerator.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/IntType.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/MatchGenerator.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/MethodGenerator.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/MethodType.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/MultiHashtable.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/NamedMethodGenerator.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/NodeCounterGenerator.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/NodeSetType.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/NodeSortRecordFactGenerator.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/NodeSortRecordGenerator.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/NodeType.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/ReferenceType.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/ObjectType.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/RealType.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/ResultTreeType.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/RtMethodGenerator.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SecuritySupport.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SecuritySupport12.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/SlotAllocator.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/StringStack.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/StringType.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/TestGenerator.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/Type.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/TypeCheckError.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/Util.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/util/VoidType.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/AbsoluteLocationPath.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/AbsolutePathPattern.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/AlternativePattern.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/AncestorPattern.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/ApplyImports.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/ApplyTemplates.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/ArgumentList.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/Attribute.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/AttributeSet.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/AttributeValue.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/AttributeValueTemplate.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/BinOpExpr.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/BooleanCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/BooleanExpr.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/ElementAvailableCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/CallTemplate.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/CastCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/CastExpr.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/CeilingCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/Choose.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/Closure.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/Comment.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/CompilerException.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/ConcatCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/Constants.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/ContainsCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/Copy.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/CopyOf.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/CurrentCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/DecimalFormatting.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/DocumentCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/EqualityExpr.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/Expression.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/If.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/LiteralAttribute.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/Fallback.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/FilterExpr.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/FilterParentPath.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/FilteredAbsoluteLocationPath.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/FloorCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/FlowList.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/ForEach.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/FormatNumberCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/FunctionAvailableCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/FunctionCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/GenerateIdCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/IdKeyPattern.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/IdPattern.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/Import.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/Include.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/IllegalCharException.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/Instruction.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/IntExpr.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/Key.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/KeyCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/KeyPattern.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/LangCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/LastCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/LocationPathPattern.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/LiteralElement.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/LiteralExpr.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/LocalNameCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/NamespaceUriCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/LogicalExpr.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/Makefile.inc
+com/sun/org/apache/xalan/internal/xsltc/compiler/Message.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/Mode.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/NameBase.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/NameCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/NamespaceAlias.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/NodeTest.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/Pattern.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/Parser.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/NotCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/Number.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/NumberCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/ObjectFactory.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/Otherwise.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/Output.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/Param.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/ParameterRef.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/ParentLocationPath.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/ParentPattern.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/PositionCall.java.inuse
+com/sun/org/apache/xalan/internal/xsltc/compiler/PositionCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/Predicate.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/RealExpr.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/QName.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/ProcessingInstruction.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/ProcessingInstructionPattern.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SecuritySupport.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/RoundCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/RelationalExpr.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/RelativeLocationPath.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/RelativePathPattern.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SimpleAttributeValue.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SecuritySupport12.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SourceLoader.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/Sort.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/TopLevelElement.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/StartsWithCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/Step.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/StepPattern.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/StringCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/StringLengthCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/Stylesheet.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SymbolTable.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/SyntaxTreeNode.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/Template.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/TestSeq.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/Text.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/UnparsedEntityUriCall.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/TransletOutput.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/UnaryOpExpr.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/UnionPathExpr.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/UnsupportedElement.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/UnresolvedRef.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/UseAttributeSets.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/ValueOf.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/Variable.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/VariableBase.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/VariableRef.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/VariableRefBase.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/When.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/Whitespace.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/WithParam.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/XPathLexer.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/XPathParser.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/XSLTC.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/XslAttribute.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/XslElement.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/sym.java
+com/sun/org/apache/xalan/internal/xsltc/compiler/xpath.cup
+com/sun/org/apache/xalan/internal/xsltc/compiler/xpath.lex
+com/sun/org/apache/xalan/internal/xsltc/dom
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.AdaptiveResultTreeImpl.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.AbsoluteIterator.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.CachedNodeListIterator.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.AnyNodeCounter.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.Axis.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.BitArray.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.DocumentCache.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.ClonedNodeListIterator.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.CollatorFactoryBase.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.CurrentNodeListFilter.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.CurrentNodeListIterator.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.DOM.java.Palm
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.DOMAdapter.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.DOMBuilder.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.DOMWSFilter.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.ForwardPositionIterator.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.DupFilterIterator.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.EmptyFilter.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.ExtendedSAX.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.Filter.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.FilterIterator.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.FilteredStepIterator.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.MatchingIterator.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.KeyIndex.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.LoadDocument.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.MultiDOM.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.NodeCounter.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.MultipleNodeCounter.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.NodeIteratorBase.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.NodeSortRecord.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.NodeSortRecordFactory.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.NthIterator.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.ObjectFactory.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.SAXImpl.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.SecuritySupport.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.SecuritySupport12.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.SimpleResultTreeImpl.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.SingleNodeCounter.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.SingletonIterator.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.SortSettings.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.SortingIterator.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.StepIterator.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.StripWhitespaceFilter.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.UnionIterator.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SCCS/s.XSLTCDTMManager.java
+com/sun/org/apache/xalan/internal/xsltc/dom/AdaptiveResultTreeImpl.java
+com/sun/org/apache/xalan/internal/xsltc/dom/AbsoluteIterator.java
+com/sun/org/apache/xalan/internal/xsltc/dom/CachedNodeListIterator.java
+com/sun/org/apache/xalan/internal/xsltc/dom/AnyNodeCounter.java
+com/sun/org/apache/xalan/internal/xsltc/dom/Axis.java
+com/sun/org/apache/xalan/internal/xsltc/dom/BitArray.java
+com/sun/org/apache/xalan/internal/xsltc/dom/FilterIterator.java
+com/sun/org/apache/xalan/internal/xsltc/dom/Filter.java
+com/sun/org/apache/xalan/internal/xsltc/dom/ClonedNodeListIterator.java
+com/sun/org/apache/xalan/internal/xsltc/dom/CollatorFactoryBase.java
+com/sun/org/apache/xalan/internal/xsltc/dom/CurrentNodeListFilter.java
+com/sun/org/apache/xalan/internal/xsltc/dom/CurrentNodeListIterator.java
+com/sun/org/apache/xalan/internal/xsltc/dom/DOM.java.Palm
+com/sun/org/apache/xalan/internal/xsltc/dom/DOMAdapter.java
+com/sun/org/apache/xalan/internal/xsltc/dom/DOMBuilder.java
+com/sun/org/apache/xalan/internal/xsltc/dom/DOMWSFilter.java
+com/sun/org/apache/xalan/internal/xsltc/dom/DocumentCache.java
+com/sun/org/apache/xalan/internal/xsltc/dom/DupFilterIterator.java
+com/sun/org/apache/xalan/internal/xsltc/dom/EmptyFilter.java
+com/sun/org/apache/xalan/internal/xsltc/dom/ExtendedSAX.java
+com/sun/org/apache/xalan/internal/xsltc/dom/ForwardPositionIterator.java
+com/sun/org/apache/xalan/internal/xsltc/dom/FilteredStepIterator.java
+com/sun/org/apache/xalan/internal/xsltc/dom/MatchingIterator.java
+com/sun/org/apache/xalan/internal/xsltc/dom/KeyIndex.java
+com/sun/org/apache/xalan/internal/xsltc/dom/LoadDocument.java
+com/sun/org/apache/xalan/internal/xsltc/dom/MultiDOM.java
+com/sun/org/apache/xalan/internal/xsltc/dom/NodeCounter.java
+com/sun/org/apache/xalan/internal/xsltc/dom/MultipleNodeCounter.java
+com/sun/org/apache/xalan/internal/xsltc/dom/NodeIteratorBase.java
+com/sun/org/apache/xalan/internal/xsltc/dom/NodeSortRecord.java
+com/sun/org/apache/xalan/internal/xsltc/dom/NodeSortRecordFactory.java
+com/sun/org/apache/xalan/internal/xsltc/dom/NthIterator.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SAXImpl.java
+com/sun/org/apache/xalan/internal/xsltc/dom/ObjectFactory.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SecuritySupport.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SecuritySupport12.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SimpleResultTreeImpl.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SingleNodeCounter.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SingletonIterator.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SortSettings.java
+com/sun/org/apache/xalan/internal/xsltc/dom/SortingIterator.java
+com/sun/org/apache/xalan/internal/xsltc/dom/StepIterator.java
+com/sun/org/apache/xalan/internal/xsltc/dom/StripWhitespaceFilter.java
+com/sun/org/apache/xalan/internal/xsltc/dom/UnionIterator.java
+com/sun/org/apache/xalan/internal/xsltc/dom/XSLTCDTMManager.java
+com/sun/org/apache/xalan/internal/xsltc/runtime
+com/sun/org/apache/xalan/internal/xsltc/runtime/SCCS
+com/sun/org/apache/xalan/internal/xsltc/runtime/SCCS/s.AbstractTranslet.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/SCCS/s.AttributeList.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/SCCS/s.Attributes.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/SCCS/s.BasisLibrary.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/SCCS/s.CallFunction.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/SCCS/s.Constants.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/SCCS/s.ErrorMessages.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/SCCS/s.ErrorMessages_ca.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/SCCS/s.ErrorMessages_cs.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/SCCS/s.ErrorMessages_de.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/SCCS/s.ErrorMessages_es.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/SCCS/s.ErrorMessages_fr.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/SCCS/s.ErrorMessages_it.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/SCCS/s.ErrorMessages_ja.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/SCCS/s.Node.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/SCCS/s.SecuritySupport.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/SCCS/s.ErrorMessages_ko.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/SCCS/s.ErrorMessages_sk.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/SCCS/s.ErrorMessages_zh_CN.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/SCCS/s.ErrorMessages_zh_TW.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/SCCS/s.Hashtable.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/SCCS/s.MessageHandler.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/SCCS/s.Operators.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/SCCS/s.ObjectFactory.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/SCCS/s.Parameter.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/SCCS/s.SecuritySupport12.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/SCCS/s.StringValueHandler.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/output
+com/sun/org/apache/xalan/internal/xsltc/runtime/output/SCCS
+com/sun/org/apache/xalan/internal/xsltc/runtime/output/SCCS/s.StringOutputBuffer.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/output/SCCS/s.OutputBuffer.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/output/SCCS/s.TransletOutputHandlerFactory.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/output/SCCS/s.WriterOutputBuffer.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/output/StringOutputBuffer.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/output/OutputBuffer.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/output/TransletOutputHandlerFactory.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/output/WriterOutputBuffer.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/ErrorMessages_zh_CN.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/AbstractTranslet.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/AttributeList.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/Attributes.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/BasisLibrary.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/CallFunction.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/Constants.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/ErrorMessages.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/ErrorMessages_ca.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/ErrorMessages_cs.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/ErrorMessages_de.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/ErrorMessages_es.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/ErrorMessages_fr.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/ErrorMessages_it.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/ErrorMessages_ja.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/ErrorMessages_ko.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/ErrorMessages_sk.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/ErrorMessages_zh_TW.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/Hashtable.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/MessageHandler.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/Node.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/ObjectFactory.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/Operators.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/Parameter.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/SecuritySupport.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/SecuritySupport12.java
+com/sun/org/apache/xalan/internal/xsltc/runtime/StringValueHandler.java
+com/sun/org/apache/xalan/internal/xsltc/trax
+com/sun/org/apache/xalan/internal/xsltc/trax/SCCS
+com/sun/org/apache/xalan/internal/xsltc/trax/SCCS/s.ObjectFactory.java
+com/sun/org/apache/xalan/internal/xsltc/trax/SCCS/s.DOM2SAX.java
+com/sun/org/apache/xalan/internal/xsltc/trax/SCCS/s.DOM2TO.java
+com/sun/org/apache/xalan/internal/xsltc/trax/SCCS/s.SecuritySupport12.java
+com/sun/org/apache/xalan/internal/xsltc/trax/SCCS/s.OutputSettings.java
+com/sun/org/apache/xalan/internal/xsltc/trax/SCCS/s.SAX2DOM.java
+com/sun/org/apache/xalan/internal/xsltc/trax/SCCS/s.SecuritySupport.java
+com/sun/org/apache/xalan/internal/xsltc/trax/SCCS/s.Util.java
+com/sun/org/apache/xalan/internal/xsltc/trax/SCCS/s.SmartTransformerFactoryImpl.java
+com/sun/org/apache/xalan/internal/xsltc/trax/SCCS/s.TemplatesHandlerImpl.java
+com/sun/org/apache/xalan/internal/xsltc/trax/SCCS/s.TemplatesImpl.java
+com/sun/org/apache/xalan/internal/xsltc/trax/SCCS/s.TrAXFilter.java
+com/sun/org/apache/xalan/internal/xsltc/trax/SCCS/s.TransformerFactoryImpl.java
+com/sun/org/apache/xalan/internal/xsltc/trax/SCCS/s.TransformerHandlerImpl.java
+com/sun/org/apache/xalan/internal/xsltc/trax/SCCS/s.TransformerImpl.java
+com/sun/org/apache/xalan/internal/xsltc/trax/SCCS/s.XSLTCSource.java
+com/sun/org/apache/xalan/internal/xsltc/trax/ObjectFactory.java
+com/sun/org/apache/xalan/internal/xsltc/trax/DOM2SAX.java
+com/sun/org/apache/xalan/internal/xsltc/trax/DOM2TO.java
+com/sun/org/apache/xalan/internal/xsltc/trax/TemplatesHandlerImpl.java
+com/sun/org/apache/xalan/internal/xsltc/trax/OutputSettings.java
+com/sun/org/apache/xalan/internal/xsltc/trax/SAX2DOM.java
+com/sun/org/apache/xalan/internal/xsltc/trax/SecuritySupport.java
+com/sun/org/apache/xalan/internal/xsltc/trax/SecuritySupport12.java
+com/sun/org/apache/xalan/internal/xsltc/trax/XSLTCSource.java
+com/sun/org/apache/xalan/internal/xsltc/trax/SmartTransformerFactoryImpl.java
+com/sun/org/apache/xalan/internal/xsltc/trax/TemplatesImpl.java
+com/sun/org/apache/xalan/internal/xsltc/trax/TrAXFilter.java
+com/sun/org/apache/xalan/internal/xsltc/trax/TransformerFactoryImpl.java
+com/sun/org/apache/xalan/internal/xsltc/trax/TransformerHandlerImpl.java
+com/sun/org/apache/xalan/internal/xsltc/trax/TransformerImpl.java
+com/sun/org/apache/xalan/internal/xsltc/trax/Util.java
+com/sun/org/apache/xalan/internal/xsltc/util
+com/sun/org/apache/xalan/internal/xsltc/util/SCCS
+com/sun/org/apache/xalan/internal/xsltc/util/SCCS/s.JavaCupRedirect.java
+com/sun/org/apache/xalan/internal/xsltc/util/SCCS/s.IntegerArray.java
+com/sun/org/apache/xalan/internal/xsltc/util/JavaCupRedirect.java
+com/sun/org/apache/xalan/internal/xsltc/util/IntegerArray.java
+com/sun/org/apache/xalan/internal/xsltc/CollatorFactory.java
+com/sun/org/apache/xalan/internal/xsltc/DOM.java
+com/sun/org/apache/xalan/internal/xsltc/DOMCache.java
+com/sun/org/apache/xalan/internal/xsltc/DOMEnhancedForDTM.java
+com/sun/org/apache/xalan/internal/xsltc/NodeIterator.java
+com/sun/org/apache/xalan/internal/xsltc/ProcessorVersion.java
+com/sun/org/apache/xalan/internal/xsltc/StripFilter.java
+com/sun/org/apache/xalan/internal/xsltc/Translet.java
+com/sun/org/apache/xalan/internal/xsltc/TransletException.java
+com/sun/org/apache/xalan/internal/xsltc/javax.xml.transform.TransformerFactory
+com/sun/org/apache/xalan/internal/Version.java
+com/sun/org/apache/xerces
+com/sun/org/apache/xerces/internal
+com/sun/org/apache/xerces/internal/dom
+com/sun/org/apache/xerces/internal/dom/SCCS
+com/sun/org/apache/xerces/internal/dom/SCCS/s.CoreDOMImplementationImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.ASDOMImplementationImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.ASModelImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.AttrImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.AttrNSImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.AttributeMap.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.CDATASectionImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.CharacterDataImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.ChildNode.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.CommentImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.CoreDocumentImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.DOMConfigurationImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.DOMErrorImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.DOMInputImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.DOMXSImplementationSourceImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.DOMImplementationImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.DOMImplementationListImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.DOMImplementationSourceImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.DOMLocatorImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.DOMMessageFormatter.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.DOMNormalizer.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.DOMOutputImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.DOMStringListImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.DeferredAttrNSImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.DeepNodeListImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.DeferredAttrImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.DeferredCDATASectionImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.DeferredNode.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.PSVIDOMImplementationImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.DeferredCommentImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.DeferredDocumentImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.DeferredDocumentTypeImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.DeferredElementDefinitionImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.DeferredElementImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.DeferredElementNSImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.DeferredEntityImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.DeferredEntityReferenceImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.DeferredNotationImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.DeferredTextImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.DocumentImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.DeferredProcessingInstructionImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.DocumentFragmentImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.DocumentTypeImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.ElementDefinitionImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.ElementImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.ElementNSImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.EntityImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.EntityReferenceImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.LCount.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.NamedNodeMapImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.NodeImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.NodeIteratorImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.NodeListCache.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.NotationImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.ObjectFactory.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.PSVIAttrNSImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.PSVIDocumentImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.ProcessingInstructionImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.PSVIElementNSImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.ParentNode.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.RangeExceptionImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.RangeImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.SecuritySupport.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.SecuritySupport12.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.TextImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.TreeWalkerImpl.java
+com/sun/org/apache/xerces/internal/dom/SCCS/s.org.apache.xerces.dom.DOMImplementationSourceImpl
+com/sun/org/apache/xerces/internal/dom/SCCS/s.org.w3c.dom.DOMImplementationSourceList
+com/sun/org/apache/xerces/internal/dom/events
+com/sun/org/apache/xerces/internal/dom/events/SCCS
+com/sun/org/apache/xerces/internal/dom/events/SCCS/s.MutationEventImpl.java
+com/sun/org/apache/xerces/internal/dom/events/SCCS/s.EventImpl.java
+com/sun/org/apache/xerces/internal/dom/events/MutationEventImpl.java
+com/sun/org/apache/xerces/internal/dom/events/EventImpl.java
+com/sun/org/apache/xerces/internal/dom/ASDOMImplementationImpl.java
+com/sun/org/apache/xerces/internal/dom/ASModelImpl.java
+com/sun/org/apache/xerces/internal/dom/AttrImpl.java
+com/sun/org/apache/xerces/internal/dom/AttrNSImpl.java
+com/sun/org/apache/xerces/internal/dom/AttributeMap.java
+com/sun/org/apache/xerces/internal/dom/CDATASectionImpl.java
+com/sun/org/apache/xerces/internal/dom/CharacterDataImpl.java
+com/sun/org/apache/xerces/internal/dom/ChildNode.java
+com/sun/org/apache/xerces/internal/dom/CommentImpl.java
+com/sun/org/apache/xerces/internal/dom/CoreDOMImplementationImpl.java
+com/sun/org/apache/xerces/internal/dom/CoreDocumentImpl.java
+com/sun/org/apache/xerces/internal/dom/DOMConfigurationImpl.java
+com/sun/org/apache/xerces/internal/dom/DOMErrorImpl.java
+com/sun/org/apache/xerces/internal/dom/NamedNodeMapImpl.java
+com/sun/org/apache/xerces/internal/dom/EntityImpl.java
+com/sun/org/apache/xerces/internal/dom/DOMImplementationImpl.java
+com/sun/org/apache/xerces/internal/dom/DOMImplementationListImpl.java
+com/sun/org/apache/xerces/internal/dom/DOMImplementationSourceImpl.java
+com/sun/org/apache/xerces/internal/dom/DOMInputImpl.java
+com/sun/org/apache/xerces/internal/dom/DOMLocatorImpl.java
+com/sun/org/apache/xerces/internal/dom/DOMMessageFormatter.java
+com/sun/org/apache/xerces/internal/dom/DOMNormalizer.java
+com/sun/org/apache/xerces/internal/dom/DOMOutputImpl.java
+com/sun/org/apache/xerces/internal/dom/DOMStringListImpl.java
+com/sun/org/apache/xerces/internal/dom/DOMXSImplementationSourceImpl.java
+com/sun/org/apache/xerces/internal/dom/DeepNodeListImpl.java
+com/sun/org/apache/xerces/internal/dom/DeferredAttrImpl.java
+com/sun/org/apache/xerces/internal/dom/DeferredAttrNSImpl.java
+com/sun/org/apache/xerces/internal/dom/DeferredCDATASectionImpl.java
+com/sun/org/apache/xerces/internal/dom/DeferredEntityImpl.java
+com/sun/org/apache/xerces/internal/dom/DeferredCommentImpl.java
+com/sun/org/apache/xerces/internal/dom/DeferredDocumentImpl.java
+com/sun/org/apache/xerces/internal/dom/DeferredDocumentTypeImpl.java
+com/sun/org/apache/xerces/internal/dom/DeferredElementDefinitionImpl.java
+com/sun/org/apache/xerces/internal/dom/DeferredElementImpl.java
+com/sun/org/apache/xerces/internal/dom/DeferredElementNSImpl.java
+com/sun/org/apache/xerces/internal/dom/DeferredEntityReferenceImpl.java
+com/sun/org/apache/xerces/internal/dom/DeferredNode.java
+com/sun/org/apache/xerces/internal/dom/DeferredNotationImpl.java
+com/sun/org/apache/xerces/internal/dom/DeferredProcessingInstructionImpl.java
+com/sun/org/apache/xerces/internal/dom/DeferredTextImpl.java
+com/sun/org/apache/xerces/internal/dom/DocumentFragmentImpl.java
+com/sun/org/apache/xerces/internal/dom/DocumentImpl.java
+com/sun/org/apache/xerces/internal/dom/DocumentTypeImpl.java
+com/sun/org/apache/xerces/internal/dom/ElementDefinitionImpl.java
+com/sun/org/apache/xerces/internal/dom/ElementImpl.java
+com/sun/org/apache/xerces/internal/dom/ElementNSImpl.java
+com/sun/org/apache/xerces/internal/dom/LCount.java
+com/sun/org/apache/xerces/internal/dom/NodeImpl.java
+com/sun/org/apache/xerces/internal/dom/EntityReferenceImpl.java
+com/sun/org/apache/xerces/internal/dom/PSVIDOMImplementationImpl.java
+com/sun/org/apache/xerces/internal/dom/NodeIteratorImpl.java
+com/sun/org/apache/xerces/internal/dom/NodeListCache.java
+com/sun/org/apache/xerces/internal/dom/NotationImpl.java
+com/sun/org/apache/xerces/internal/dom/ObjectFactory.java
+com/sun/org/apache/xerces/internal/dom/PSVIAttrNSImpl.java
+com/sun/org/apache/xerces/internal/dom/PSVIDocumentImpl.java
+com/sun/org/apache/xerces/internal/dom/PSVIElementNSImpl.java
+com/sun/org/apache/xerces/internal/dom/ParentNode.java
+com/sun/org/apache/xerces/internal/dom/RangeImpl.java
+com/sun/org/apache/xerces/internal/dom/ProcessingInstructionImpl.java
+com/sun/org/apache/xerces/internal/dom/RangeExceptionImpl.java
+com/sun/org/apache/xerces/internal/dom/SecuritySupport.java
+com/sun/org/apache/xerces/internal/dom/SecuritySupport12.java
+com/sun/org/apache/xerces/internal/dom/TextImpl.java
+com/sun/org/apache/xerces/internal/dom/TreeWalkerImpl.java
+com/sun/org/apache/xerces/internal/dom/org.apache.xerces.dom.DOMImplementationSourceImpl
+com/sun/org/apache/xerces/internal/dom/org.w3c.dom.DOMImplementationSourceList
+com/sun/org/apache/xerces/internal/dom3
+com/sun/org/apache/xerces/internal/dom3/as
+com/sun/org/apache/xerces/internal/dom3/as/SCCS
+com/sun/org/apache/xerces/internal/dom3/as/SCCS/s.ASAttributeDeclaration.java
+com/sun/org/apache/xerces/internal/dom3/as/SCCS/s.ASContentModel.java
+com/sun/org/apache/xerces/internal/dom3/as/SCCS/s.ASDataType.java
+com/sun/org/apache/xerces/internal/dom3/as/SCCS/s.ASElementDeclaration.java
+com/sun/org/apache/xerces/internal/dom3/as/SCCS/s.ASEntityDeclaration.java
+com/sun/org/apache/xerces/internal/dom3/as/SCCS/s.ASModel.java
+com/sun/org/apache/xerces/internal/dom3/as/SCCS/s.ASNamedObjectMap.java
+com/sun/org/apache/xerces/internal/dom3/as/SCCS/s.ASNotationDeclaration.java
+com/sun/org/apache/xerces/internal/dom3/as/SCCS/s.ASObject.java
+com/sun/org/apache/xerces/internal/dom3/as/SCCS/s.ASObjectList.java
+com/sun/org/apache/xerces/internal/dom3/as/SCCS/s.CharacterDataEditAS.java
+com/sun/org/apache/xerces/internal/dom3/as/SCCS/s.DOMASBuilder.java
+com/sun/org/apache/xerces/internal/dom3/as/SCCS/s.DOMASException.java
+com/sun/org/apache/xerces/internal/dom3/as/SCCS/s.DOMASWriter.java
+com/sun/org/apache/xerces/internal/dom3/as/SCCS/s.DOMImplementationAS.java
+com/sun/org/apache/xerces/internal/dom3/as/SCCS/s.DocumentAS.java
+com/sun/org/apache/xerces/internal/dom3/as/SCCS/s.DocumentEditAS.java
+com/sun/org/apache/xerces/internal/dom3/as/SCCS/s.ElementEditAS.java
+com/sun/org/apache/xerces/internal/dom3/as/SCCS/s.NodeEditAS.java
+com/sun/org/apache/xerces/internal/dom3/as/ASAttributeDeclaration.java
+com/sun/org/apache/xerces/internal/dom3/as/ASContentModel.java
+com/sun/org/apache/xerces/internal/dom3/as/ASDataType.java
+com/sun/org/apache/xerces/internal/dom3/as/ASElementDeclaration.java
+com/sun/org/apache/xerces/internal/dom3/as/ASEntityDeclaration.java
+com/sun/org/apache/xerces/internal/dom3/as/ASModel.java
+com/sun/org/apache/xerces/internal/dom3/as/ASNamedObjectMap.java
+com/sun/org/apache/xerces/internal/dom3/as/ASNotationDeclaration.java
+com/sun/org/apache/xerces/internal/dom3/as/ASObject.java
+com/sun/org/apache/xerces/internal/dom3/as/ASObjectList.java
+com/sun/org/apache/xerces/internal/dom3/as/CharacterDataEditAS.java
+com/sun/org/apache/xerces/internal/dom3/as/DOMASBuilder.java
+com/sun/org/apache/xerces/internal/dom3/as/DOMASException.java
+com/sun/org/apache/xerces/internal/dom3/as/DOMASWriter.java
+com/sun/org/apache/xerces/internal/dom3/as/DOMImplementationAS.java
+com/sun/org/apache/xerces/internal/dom3/as/DocumentAS.java
+com/sun/org/apache/xerces/internal/dom3/as/DocumentEditAS.java
+com/sun/org/apache/xerces/internal/dom3/as/ElementEditAS.java
+com/sun/org/apache/xerces/internal/dom3/as/NodeEditAS.java
+com/sun/org/apache/xerces/internal/impl
+com/sun/org/apache/xerces/internal/impl/SCCS
+com/sun/org/apache/xerces/internal/impl/SCCS/s.RevalidationHandler.java
+com/sun/org/apache/xerces/internal/impl/SCCS/s.Constants.java
+com/sun/org/apache/xerces/internal/impl/SCCS/s.XML11NSDocumentScannerImpl.java
+com/sun/org/apache/xerces/internal/impl/SCCS/s.ExternalSubsetResolver.java
+com/sun/org/apache/xerces/internal/impl/SCCS/s.Version.java
+com/sun/org/apache/xerces/internal/impl/SCCS/s.XML11DTDScannerImpl.java
+com/sun/org/apache/xerces/internal/impl/SCCS/s.XML11DocumentScannerImpl.java
+com/sun/org/apache/xerces/internal/impl/SCCS/s.XML11EntityScanner.java
+com/sun/org/apache/xerces/internal/impl/SCCS/s.XMLDocumentFragmentScannerImpl.java
+com/sun/org/apache/xerces/internal/impl/SCCS/s.XML11NamespaceBinder.java
+com/sun/org/apache/xerces/internal/impl/SCCS/s.XMLDTDScannerImpl.java
+com/sun/org/apache/xerces/internal/impl/SCCS/s.XMLEntityDescription.java
+com/sun/org/apache/xerces/internal/impl/SCCS/s.XMLDocumentScannerImpl.java
+com/sun/org/apache/xerces/internal/impl/SCCS/s.XMLEntityHandler.java
+com/sun/org/apache/xerces/internal/impl/SCCS/s.XMLEntityManager.java
+com/sun/org/apache/xerces/internal/impl/SCCS/s.XMLEntityScanner.java
+com/sun/org/apache/xerces/internal/impl/SCCS/s.XMLErrorReporter.java
+com/sun/org/apache/xerces/internal/impl/SCCS/s.XMLNSDocumentScannerImpl.java
+com/sun/org/apache/xerces/internal/impl/SCCS/s.XMLNamespaceBinder.java
+com/sun/org/apache/xerces/internal/impl/SCCS/s.XMLScanner.java
+com/sun/org/apache/xerces/internal/impl/SCCS/s.XMLVersionDetector.java
+com/sun/org/apache/xerces/internal/impl/dtd
+com/sun/org/apache/xerces/internal/impl/dtd/SCCS
+com/sun/org/apache/xerces/internal/impl/dtd/SCCS/s.DTDGrammarBucket.java
+com/sun/org/apache/xerces/internal/impl/dtd/SCCS/s.DTDGrammar.java
+com/sun/org/apache/xerces/internal/impl/dtd/SCCS/s.XML11DTDProcessor.java
+com/sun/org/apache/xerces/internal/impl/dtd/SCCS/s.XML11DTDValidator.java
+com/sun/org/apache/xerces/internal/impl/dtd/SCCS/s.XML11NSDTDValidator.java
+com/sun/org/apache/xerces/internal/impl/dtd/SCCS/s.XMLAttributeDecl.java
+com/sun/org/apache/xerces/internal/impl/dtd/SCCS/s.XMLContentSpec.java
+com/sun/org/apache/xerces/internal/impl/dtd/SCCS/s.XMLDTDDescription.java
+com/sun/org/apache/xerces/internal/impl/dtd/SCCS/s.XMLDTDLoader.java
+com/sun/org/apache/xerces/internal/impl/dtd/SCCS/s.XMLDTDProcessor.java
+com/sun/org/apache/xerces/internal/impl/dtd/SCCS/s.XMLDTDValidator.java
+com/sun/org/apache/xerces/internal/impl/dtd/SCCS/s.XMLDTDValidatorFilter.java
+com/sun/org/apache/xerces/internal/impl/dtd/SCCS/s.XMLElementDecl.java
+com/sun/org/apache/xerces/internal/impl/dtd/SCCS/s.XMLEntityDecl.java
+com/sun/org/apache/xerces/internal/impl/dtd/SCCS/s.XMLNSDTDValidator.java
+com/sun/org/apache/xerces/internal/impl/dtd/SCCS/s.XMLNotationDecl.java
+com/sun/org/apache/xerces/internal/impl/dtd/SCCS/s.XMLSimpleType.java
+com/sun/org/apache/xerces/internal/impl/dtd/models
+com/sun/org/apache/xerces/internal/impl/dtd/models/SCCS
+com/sun/org/apache/xerces/internal/impl/dtd/models/SCCS/s.CMStateSet.java
+com/sun/org/apache/xerces/internal/impl/dtd/models/SCCS/s.CMAny.java
+com/sun/org/apache/xerces/internal/impl/dtd/models/SCCS/s.CMBinOp.java
+com/sun/org/apache/xerces/internal/impl/dtd/models/SCCS/s.CMLeaf.java
+com/sun/org/apache/xerces/internal/impl/dtd/models/SCCS/s.CMNode.java
+com/sun/org/apache/xerces/internal/impl/dtd/models/SCCS/s.DFAContentModel.java
+com/sun/org/apache/xerces/internal/impl/dtd/models/SCCS/s.CMUniOp.java
+com/sun/org/apache/xerces/internal/impl/dtd/models/SCCS/s.ContentModelValidator.java
+com/sun/org/apache/xerces/internal/impl/dtd/models/SCCS/s.MixedContentModel.java
+com/sun/org/apache/xerces/internal/impl/dtd/models/SCCS/s.SimpleContentModel.java
+com/sun/org/apache/xerces/internal/impl/dtd/models/CMBinOp.java
+com/sun/org/apache/xerces/internal/impl/dtd/models/CMAny.java
+com/sun/org/apache/xerces/internal/impl/dtd/models/DFAContentModel.java
+com/sun/org/apache/xerces/internal/impl/dtd/models/CMLeaf.java
+com/sun/org/apache/xerces/internal/impl/dtd/models/CMNode.java
+com/sun/org/apache/xerces/internal/impl/dtd/models/CMStateSet.java
+com/sun/org/apache/xerces/internal/impl/dtd/models/CMUniOp.java
+com/sun/org/apache/xerces/internal/impl/dtd/models/ContentModelValidator.java
+com/sun/org/apache/xerces/internal/impl/dtd/models/MixedContentModel.java
+com/sun/org/apache/xerces/internal/impl/dtd/models/SimpleContentModel.java
+com/sun/org/apache/xerces/internal/impl/dtd/DTDGrammarBucket.java
+com/sun/org/apache/xerces/internal/impl/dtd/DTDGrammar.java
+com/sun/org/apache/xerces/internal/impl/dtd/XML11NSDTDValidator.java
+com/sun/org/apache/xerces/internal/impl/dtd/XML11DTDProcessor.java
+com/sun/org/apache/xerces/internal/impl/dtd/XML11DTDValidator.java
+com/sun/org/apache/xerces/internal/impl/dtd/XMLAttributeDecl.java
+com/sun/org/apache/xerces/internal/impl/dtd/XMLContentSpec.java
+com/sun/org/apache/xerces/internal/impl/dtd/XMLDTDDescription.java
+com/sun/org/apache/xerces/internal/impl/dtd/XMLDTDLoader.java
+com/sun/org/apache/xerces/internal/impl/dtd/XMLDTDProcessor.java
+com/sun/org/apache/xerces/internal/impl/dtd/XMLDTDValidator.java
+com/sun/org/apache/xerces/internal/impl/dtd/XMLDTDValidatorFilter.java
+com/sun/org/apache/xerces/internal/impl/dtd/XMLElementDecl.java
+com/sun/org/apache/xerces/internal/impl/dtd/XMLEntityDecl.java
+com/sun/org/apache/xerces/internal/impl/dtd/XMLNSDTDValidator.java
+com/sun/org/apache/xerces/internal/impl/dtd/XMLNotationDecl.java
+com/sun/org/apache/xerces/internal/impl/dtd/XMLSimpleType.java
+com/sun/org/apache/xerces/internal/impl/dv
+com/sun/org/apache/xerces/internal/impl/dv/SCCS
+com/sun/org/apache/xerces/internal/impl/dv/SCCS/s.DVFactoryException.java
+com/sun/org/apache/xerces/internal/impl/dv/SCCS/s.DTDDVFactory.java
+com/sun/org/apache/xerces/internal/impl/dv/SCCS/s.XSSimpleType.java
+com/sun/org/apache/xerces/internal/impl/dv/SCCS/s.DatatypeException.java
+com/sun/org/apache/xerces/internal/impl/dv/SCCS/s.DatatypeValidator.java
+com/sun/org/apache/xerces/internal/impl/dv/SCCS/s.ObjectFactory.java
+com/sun/org/apache/xerces/internal/impl/dv/SCCS/s.InvalidDatatypeFacetException.java
+com/sun/org/apache/xerces/internal/impl/dv/SCCS/s.InvalidDatatypeValueException.java
+com/sun/org/apache/xerces/internal/impl/dv/SCCS/s.SchemaDVFactory.java
+com/sun/org/apache/xerces/internal/impl/dv/SCCS/s.SecuritySupport.java
+com/sun/org/apache/xerces/internal/impl/dv/SCCS/s.SecuritySupport12.java
+com/sun/org/apache/xerces/internal/impl/dv/SCCS/s.ValidatedInfo.java
+com/sun/org/apache/xerces/internal/impl/dv/SCCS/s.ValidationContext.java
+com/sun/org/apache/xerces/internal/impl/dv/SCCS/s.XSFacets.java
+com/sun/org/apache/xerces/internal/impl/dv/dtd
+com/sun/org/apache/xerces/internal/impl/dv/dtd/SCCS
+com/sun/org/apache/xerces/internal/impl/dv/dtd/SCCS/s.ENTITYDatatypeValidator.java
+com/sun/org/apache/xerces/internal/impl/dv/dtd/SCCS/s.DTDDVFactoryImpl.java
+com/sun/org/apache/xerces/internal/impl/dv/dtd/SCCS/s.IDREFDatatypeValidator.java
+com/sun/org/apache/xerces/internal/impl/dv/dtd/SCCS/s.IDDatatypeValidator.java
+com/sun/org/apache/xerces/internal/impl/dv/dtd/SCCS/s.XML11NMTOKENDatatypeValidator.java
+com/sun/org/apache/xerces/internal/impl/dv/dtd/SCCS/s.ListDatatypeValidator.java
+com/sun/org/apache/xerces/internal/impl/dv/dtd/SCCS/s.NMTOKENDatatypeValidator.java
+com/sun/org/apache/xerces/internal/impl/dv/dtd/SCCS/s.NOTATIONDatatypeValidator.java
+com/sun/org/apache/xerces/internal/impl/dv/dtd/SCCS/s.StringDatatypeValidator.java
+com/sun/org/apache/xerces/internal/impl/dv/dtd/SCCS/s.XML11DTDDVFactoryImpl.java
+com/sun/org/apache/xerces/internal/impl/dv/dtd/SCCS/s.XML11IDDatatypeValidator.java
+com/sun/org/apache/xerces/internal/impl/dv/dtd/SCCS/s.XML11IDREFDatatypeValidator.java
+com/sun/org/apache/xerces/internal/impl/dv/dtd/ENTITYDatatypeValidator.java
+com/sun/org/apache/xerces/internal/impl/dv/dtd/DTDDVFactoryImpl.java
+com/sun/org/apache/xerces/internal/impl/dv/dtd/NMTOKENDatatypeValidator.java
+com/sun/org/apache/xerces/internal/impl/dv/dtd/IDDatatypeValidator.java
+com/sun/org/apache/xerces/internal/impl/dv/dtd/IDREFDatatypeValidator.java
+com/sun/org/apache/xerces/internal/impl/dv/dtd/ListDatatypeValidator.java
+com/sun/org/apache/xerces/internal/impl/dv/dtd/NOTATIONDatatypeValidator.java
+com/sun/org/apache/xerces/internal/impl/dv/dtd/StringDatatypeValidator.java
+com/sun/org/apache/xerces/internal/impl/dv/dtd/XML11DTDDVFactoryImpl.java
+com/sun/org/apache/xerces/internal/impl/dv/dtd/XML11IDDatatypeValidator.java
+com/sun/org/apache/xerces/internal/impl/dv/dtd/XML11IDREFDatatypeValidator.java
+com/sun/org/apache/xerces/internal/impl/dv/dtd/XML11NMTOKENDatatypeValidator.java
+com/sun/org/apache/xerces/internal/impl/dv/util
+com/sun/org/apache/xerces/internal/impl/dv/util/SCCS
+com/sun/org/apache/xerces/internal/impl/dv/util/SCCS/s.Base64.java
+com/sun/org/apache/xerces/internal/impl/dv/util/SCCS/s.HexBin.java
+com/sun/org/apache/xerces/internal/impl/dv/util/Base64.java
+com/sun/org/apache/xerces/internal/impl/dv/util/HexBin.java
+com/sun/org/apache/xerces/internal/impl/dv/xs
+com/sun/org/apache/xerces/internal/impl/dv/xs/SCCS
+com/sun/org/apache/xerces/internal/impl/dv/xs/SCCS/s.SchemaDateTimeException.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/SCCS/s.AbstractDateTimeDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/SCCS/s.AnySimpleDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/SCCS/s.AnyURIDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/SCCS/s.Base64BinaryDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/SCCS/s.BaseDVFactory.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/SCCS/s.BooleanDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/SCCS/s.DateDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/SCCS/s.DateTimeDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/SCCS/s.DayDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/SCCS/s.DecimalDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/SCCS/s.DoubleDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/SCCS/s.DurationDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/SCCS/s.EntityDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/SCCS/s.FloatDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/SCCS/s.FullDVFactory.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/SCCS/s.HexBinaryDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/SCCS/s.IDDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/SCCS/s.IDREFDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/SCCS/s.IntegerDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/SCCS/s.ListDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/SCCS/s.MonthDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/SCCS/s.MonthDayDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/SCCS/s.QNameDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/SCCS/s.SchemaDVFactoryImpl.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/SCCS/s.TypeValidator.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/SCCS/s.StringDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/SCCS/s.TimeDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/SCCS/s.XSSimpleTypeDecl.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/SCCS/s.UnionDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/SCCS/s.YearMonthDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/SCCS/s.YearDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/AbstractDateTimeDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/AnySimpleDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/AnyURIDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/Base64BinaryDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/BaseDVFactory.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/BooleanDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/DateDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/DateTimeDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/DayDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/DecimalDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/DoubleDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/DurationDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/EntityDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/FloatDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/FullDVFactory.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/HexBinaryDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/IDDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/TypeValidator.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/TimeDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/IDREFDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/IntegerDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/ListDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/MonthDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/MonthDayDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/QNameDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/SchemaDVFactoryImpl.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/SchemaDateTimeException.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/StringDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/XSSimpleTypeDecl.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/UnionDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/YearMonthDV.java
+com/sun/org/apache/xerces/internal/impl/dv/xs/YearDV.java
+com/sun/org/apache/xerces/internal/impl/dv/DVFactoryException.java
+com/sun/org/apache/xerces/internal/impl/dv/DTDDVFactory.java
+com/sun/org/apache/xerces/internal/impl/dv/DatatypeException.java
+com/sun/org/apache/xerces/internal/impl/dv/DatatypeValidator.java
+com/sun/org/apache/xerces/internal/impl/dv/ObjectFactory.java
+com/sun/org/apache/xerces/internal/impl/dv/XSFacets.java
+com/sun/org/apache/xerces/internal/impl/dv/InvalidDatatypeFacetException.java
+com/sun/org/apache/xerces/internal/impl/dv/InvalidDatatypeValueException.java
+com/sun/org/apache/xerces/internal/impl/dv/SchemaDVFactory.java
+com/sun/org/apache/xerces/internal/impl/dv/SecuritySupport.java
+com/sun/org/apache/xerces/internal/impl/dv/SecuritySupport12.java
+com/sun/org/apache/xerces/internal/impl/dv/ValidatedInfo.java
+com/sun/org/apache/xerces/internal/impl/dv/ValidationContext.java
+com/sun/org/apache/xerces/internal/impl/dv/XSSimpleType.java
+com/sun/org/apache/xerces/internal/impl/io
+com/sun/org/apache/xerces/internal/impl/io/SCCS
+com/sun/org/apache/xerces/internal/impl/io/SCCS/s.ASCIIReader.java
+com/sun/org/apache/xerces/internal/impl/io/SCCS/s.UCSReader.java
+com/sun/org/apache/xerces/internal/impl/io/SCCS/s.UTF8Reader.java
+com/sun/org/apache/xerces/internal/impl/io/SCCS/s.MalformedByteSequenceException.java
+com/sun/org/apache/xerces/internal/impl/io/ASCIIReader.java
+com/sun/org/apache/xerces/internal/impl/io/UCSReader.java
+com/sun/org/apache/xerces/internal/impl/io/UTF8Reader.java
+com/sun/org/apache/xerces/internal/impl/io/MalformedByteSequenceException.java
+com/sun/org/apache/xerces/internal/impl/msg
+com/sun/org/apache/xerces/internal/impl/msg/SCCS
+com/sun/org/apache/xerces/internal/impl/msg/SCCS/s.DatatypeMessages.properties
+com/sun/org/apache/xerces/internal/impl/msg/SCCS/s.DOMMessages.properties
+com/sun/org/apache/xerces/internal/impl/msg/SCCS/s.XMLSerializerMessages.properties
+com/sun/org/apache/xerces/internal/impl/msg/SCCS/s.SAXMessages.properties
+com/sun/org/apache/xerces/internal/impl/msg/SCCS/s.XIncludeMessages.properties
+com/sun/org/apache/xerces/internal/impl/msg/SCCS/s.XMLMessageFormatter.java
+com/sun/org/apache/xerces/internal/impl/msg/SCCS/s.XMLMessages.properties
+com/sun/org/apache/xerces/internal/impl/msg/SCCS/s.XMLSchemaMessages.properties
+com/sun/org/apache/xerces/internal/impl/msg/DatatypeMessages.properties
+com/sun/org/apache/xerces/internal/impl/msg/DOMMessages.properties
+com/sun/org/apache/xerces/internal/impl/msg/XMLSchemaMessages.properties
+com/sun/org/apache/xerces/internal/impl/msg/SAXMessages.properties
+com/sun/org/apache/xerces/internal/impl/msg/XIncludeMessages.properties
+com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter.java
+com/sun/org/apache/xerces/internal/impl/msg/XMLMessages.properties
+com/sun/org/apache/xerces/internal/impl/msg/XMLSerializerMessages.properties
+com/sun/org/apache/xerces/internal/impl/validation
+com/sun/org/apache/xerces/internal/impl/validation/SCCS
+com/sun/org/apache/xerces/internal/impl/validation/SCCS/s.ValidationManager.java
+com/sun/org/apache/xerces/internal/impl/validation/SCCS/s.EntityState.java
+com/sun/org/apache/xerces/internal/impl/validation/SCCS/s.ValidationState.java
+com/sun/org/apache/xerces/internal/impl/validation/ValidationManager.java
+com/sun/org/apache/xerces/internal/impl/validation/EntityState.java
+com/sun/org/apache/xerces/internal/impl/validation/ValidationState.java
+com/sun/org/apache/xerces/internal/impl/xpath
+com/sun/org/apache/xerces/internal/impl/xpath/SCCS
+com/sun/org/apache/xerces/internal/impl/xpath/SCCS/s.XPathException.java
+com/sun/org/apache/xerces/internal/impl/xpath/SCCS/s.XPath.java
+com/sun/org/apache/xerces/internal/impl/xpath/regex
+com/sun/org/apache/xerces/internal/impl/xpath/regex/SCCS
+com/sun/org/apache/xerces/internal/impl/xpath/regex/SCCS/s.ParseException.java
+com/sun/org/apache/xerces/internal/impl/xpath/regex/SCCS/s.BMPattern.java
+com/sun/org/apache/xerces/internal/impl/xpath/regex/SCCS/s.Match.java
+com/sun/org/apache/xerces/internal/impl/xpath/regex/SCCS/s.Op.java
+com/sun/org/apache/xerces/internal/impl/xpath/regex/SCCS/s.ParserForXMLSchema.java
+com/sun/org/apache/xerces/internal/impl/xpath/regex/SCCS/s.REUtil.java
+com/sun/org/apache/xerces/internal/impl/xpath/regex/SCCS/s.RangeToken.java
+com/sun/org/apache/xerces/internal/impl/xpath/regex/SCCS/s.RegexParser.java
+com/sun/org/apache/xerces/internal/impl/xpath/regex/SCCS/s.RegularExpression.java
+com/sun/org/apache/xerces/internal/impl/xpath/regex/SCCS/s.RegularExpression.orig
+com/sun/org/apache/xerces/internal/impl/xpath/regex/SCCS/s.Token.java
+com/sun/org/apache/xerces/internal/impl/xpath/regex/SCCS/s.message.properties
+com/sun/org/apache/xerces/internal/impl/xpath/regex/SCCS/s.message_fr.properties
+com/sun/org/apache/xerces/internal/impl/xpath/regex/SCCS/s.message_ja.properties
+com/sun/org/apache/xerces/internal/impl/xpath/regex/ParseException.java
+com/sun/org/apache/xerces/internal/impl/xpath/regex/BMPattern.java
+com/sun/org/apache/xerces/internal/impl/xpath/regex/Match.java
+com/sun/org/apache/xerces/internal/impl/xpath/regex/Op.java
+com/sun/org/apache/xerces/internal/impl/xpath/regex/ParserForXMLSchema.java
+com/sun/org/apache/xerces/internal/impl/xpath/regex/REUtil.java
+com/sun/org/apache/xerces/internal/impl/xpath/regex/RangeToken.java
+com/sun/org/apache/xerces/internal/impl/xpath/regex/RegexParser.java
+com/sun/org/apache/xerces/internal/impl/xpath/regex/RegularExpression.java
+com/sun/org/apache/xerces/internal/impl/xpath/regex/RegularExpression.orig
+com/sun/org/apache/xerces/internal/impl/xpath/regex/Token.java
+com/sun/org/apache/xerces/internal/impl/xpath/regex/message.properties
+com/sun/org/apache/xerces/internal/impl/xpath/regex/message_fr.properties
+com/sun/org/apache/xerces/internal/impl/xpath/regex/message_ja.properties
+com/sun/org/apache/xerces/internal/impl/xpath/XPathException.java
+com/sun/org/apache/xerces/internal/impl/xpath/XPath.java
+com/sun/org/apache/xerces/internal/impl/xs
+com/sun/org/apache/xerces/internal/impl/xs/SCCS
+com/sun/org/apache/xerces/internal/impl/xs/SCCS/s.SchemaNamespaceSupport.java
+com/sun/org/apache/xerces/internal/impl/xs/SCCS/s.AttributePSVImpl.java
+com/sun/org/apache/xerces/internal/impl/xs/SCCS/s.ElementPSVImpl.java
+com/sun/org/apache/xerces/internal/impl/xs/SCCS/s.SchemaGrammar.java
+com/sun/org/apache/xerces/internal/impl/xs/SCCS/s.SubstitutionGroupHandler.java
+com/sun/org/apache/xerces/internal/impl/xs/SCCS/s.SchemaSymbols.java
+com/sun/org/apache/xerces/internal/impl/xs/SCCS/s.XMLSchemaException.java
+com/sun/org/apache/xerces/internal/impl/xs/SCCS/s.XMLSchemaLoader.java
+com/sun/org/apache/xerces/internal/impl/xs/SCCS/s.XMLSchemaValidator.java
+com/sun/org/apache/xerces/internal/impl/xs/SCCS/s.XSAnnotationImpl.java
+com/sun/org/apache/xerces/internal/impl/xs/SCCS/s.XSAttributeDecl.java
+com/sun/org/apache/xerces/internal/impl/xs/SCCS/s.XSAttributeGroupDecl.java
+com/sun/org/apache/xerces/internal/impl/xs/SCCS/s.XSConstraints.java
+com/sun/org/apache/xerces/internal/impl/xs/SCCS/s.XSAttributeUseImpl.java
+com/sun/org/apache/xerces/internal/impl/xs/SCCS/s.XSComplexTypeDecl.java
+com/sun/org/apache/xerces/internal/impl/xs/SCCS/s.XSDDescription.java
+com/sun/org/apache/xerces/internal/impl/xs/SCCS/s.XSDeclarationPool.java
+com/sun/org/apache/xerces/internal/impl/xs/SCCS/s.XSElementDecl.java
+com/sun/org/apache/xerces/internal/impl/xs/SCCS/s.XSGrammarBucket.java
+com/sun/org/apache/xerces/internal/impl/xs/SCCS/s.XSGroupDecl.java
+com/sun/org/apache/xerces/internal/impl/xs/SCCS/s.XSImplementationImpl.java
+com/sun/org/apache/xerces/internal/impl/xs/SCCS/s.XSMessageFormatter.java
+com/sun/org/apache/xerces/internal/impl/xs/SCCS/s.XSModelGroupImpl.java
+com/sun/org/apache/xerces/internal/impl/xs/SCCS/s.XSModelImpl.java
+com/sun/org/apache/xerces/internal/impl/xs/SCCS/s.XSNotationDecl.java
+com/sun/org/apache/xerces/internal/impl/xs/SCCS/s.XSParticleDecl.java
+com/sun/org/apache/xerces/internal/impl/xs/SCCS/s.XSWildcardDecl.java
+com/sun/org/apache/xerces/internal/impl/xs/dom
+com/sun/org/apache/xerces/internal/impl/xs/dom/SCCS
+com/sun/org/apache/xerces/internal/impl/xs/dom/SCCS/s.ElementNSImpl.java
+com/sun/org/apache/xerces/internal/impl/xs/dom/SCCS/s.DOMNodePool.java
+com/sun/org/apache/xerces/internal/impl/xs/dom/SCCS/s.DOMParser.java
+com/sun/org/apache/xerces/internal/impl/xs/dom/SCCS/s.DocumentImpl.java
+com/sun/org/apache/xerces/internal/impl/xs/dom/DOMNodePool.java
+com/sun/org/apache/xerces/internal/impl/xs/dom/DOMParser.java
+com/sun/org/apache/xerces/internal/impl/xs/dom/DocumentImpl.java
+com/sun/org/apache/xerces/internal/impl/xs/dom/ElementNSImpl.java
+com/sun/org/apache/xerces/internal/impl/xs/identity
+com/sun/org/apache/xerces/internal/impl/xs/identity/SCCS
+com/sun/org/apache/xerces/internal/impl/xs/identity/SCCS/s.FieldActivator.java
+com/sun/org/apache/xerces/internal/impl/xs/identity/SCCS/s.Field.java
+com/sun/org/apache/xerces/internal/impl/xs/identity/SCCS/s.IDValue.java
+com/sun/org/apache/xerces/internal/impl/xs/identity/SCCS/s.KeyRef.java
+com/sun/org/apache/xerces/internal/impl/xs/identity/SCCS/s.IdentityConstraint.java
+com/sun/org/apache/xerces/internal/impl/xs/identity/SCCS/s.Selector.java
+com/sun/org/apache/xerces/internal/impl/xs/identity/SCCS/s.UniqueOrKey.java
+com/sun/org/apache/xerces/internal/impl/xs/identity/SCCS/s.ValueStore.java
+com/sun/org/apache/xerces/internal/impl/xs/identity/SCCS/s.XPathMatcher.java
+com/sun/org/apache/xerces/internal/impl/xs/identity/FieldActivator.java
+com/sun/org/apache/xerces/internal/impl/xs/identity/Field.java
+com/sun/org/apache/xerces/internal/impl/xs/identity/IdentityConstraint.java
+com/sun/org/apache/xerces/internal/impl/xs/identity/IDValue.java
+com/sun/org/apache/xerces/internal/impl/xs/identity/Selector.java
+com/sun/org/apache/xerces/internal/impl/xs/identity/KeyRef.java
+com/sun/org/apache/xerces/internal/impl/xs/identity/UniqueOrKey.java
+com/sun/org/apache/xerces/internal/impl/xs/identity/ValueStore.java
+com/sun/org/apache/xerces/internal/impl/xs/identity/XPathMatcher.java
+com/sun/org/apache/xerces/internal/impl/xs/models
+com/sun/org/apache/xerces/internal/impl/xs/models/SCCS
+com/sun/org/apache/xerces/internal/impl/xs/models/SCCS/s.CMNodeFactory.java
+com/sun/org/apache/xerces/internal/impl/xs/models/SCCS/s.CMBuilder.java
+com/sun/org/apache/xerces/internal/impl/xs/models/SCCS/s.XSCMValidator.java
+com/sun/org/apache/xerces/internal/impl/xs/models/SCCS/s.XSAllCM.java
+com/sun/org/apache/xerces/internal/impl/xs/models/SCCS/s.XSCMBinOp.java
+com/sun/org/apache/xerces/internal/impl/xs/models/SCCS/s.XSCMLeaf.java
+com/sun/org/apache/xerces/internal/impl/xs/models/SCCS/s.XSCMUniOp.java
+com/sun/org/apache/xerces/internal/impl/xs/models/SCCS/s.XSDFACM.java
+com/sun/org/apache/xerces/internal/impl/xs/models/SCCS/s.XSEmptyCM.java
+com/sun/org/apache/xerces/internal/impl/xs/models/CMNodeFactory.java
+com/sun/org/apache/xerces/internal/impl/xs/models/CMBuilder.java
+com/sun/org/apache/xerces/internal/impl/xs/models/XSAllCM.java
+com/sun/org/apache/xerces/internal/impl/xs/models/XSCMBinOp.java
+com/sun/org/apache/xerces/internal/impl/xs/models/XSCMLeaf.java
+com/sun/org/apache/xerces/internal/impl/xs/models/XSCMUniOp.java
+com/sun/org/apache/xerces/internal/impl/xs/models/XSCMValidator.java
+com/sun/org/apache/xerces/internal/impl/xs/models/XSDFACM.java
+com/sun/org/apache/xerces/internal/impl/xs/models/XSEmptyCM.java
+com/sun/org/apache/xerces/internal/impl/xs/opti
+com/sun/org/apache/xerces/internal/impl/xs/opti/SCCS
+com/sun/org/apache/xerces/internal/impl/xs/opti/SCCS/s.DefaultDocument.java
+com/sun/org/apache/xerces/internal/impl/xs/opti/SCCS/s.AttrImpl.java
+com/sun/org/apache/xerces/internal/impl/xs/opti/SCCS/s.SchemaParsingConfig.java
+com/sun/org/apache/xerces/internal/impl/xs/opti/SCCS/s.DefaultElement.java
+com/sun/org/apache/xerces/internal/impl/xs/opti/SCCS/s.DefaultNode.java
+com/sun/org/apache/xerces/internal/impl/xs/opti/SCCS/s.DefaultText.java
+com/sun/org/apache/xerces/internal/impl/xs/opti/SCCS/s.ElementImpl.java
+com/sun/org/apache/xerces/internal/impl/xs/opti/SCCS/s.NodeImpl.java
+com/sun/org/apache/xerces/internal/impl/xs/opti/SCCS/s.DefaultXMLDocumentHandler.java
+com/sun/org/apache/xerces/internal/impl/xs/opti/SCCS/s.NamedNodeMapImpl.java
+com/sun/org/apache/xerces/internal/impl/xs/opti/SCCS/s.SchemaDOM.java
+com/sun/org/apache/xerces/internal/impl/xs/opti/SCCS/s.SchemaDOMParser.java
+com/sun/org/apache/xerces/internal/impl/xs/opti/SCCS/s.TextImpl.java
+com/sun/org/apache/xerces/internal/impl/xs/opti/DefaultDocument.java
+com/sun/org/apache/xerces/internal/impl/xs/opti/AttrImpl.java
+com/sun/org/apache/xerces/internal/impl/xs/opti/DefaultElement.java
+com/sun/org/apache/xerces/internal/impl/xs/opti/DefaultNode.java
+com/sun/org/apache/xerces/internal/impl/xs/opti/DefaultText.java
+com/sun/org/apache/xerces/internal/impl/xs/opti/ElementImpl.java
+com/sun/org/apache/xerces/internal/impl/xs/opti/SchemaDOMParser.java
+com/sun/org/apache/xerces/internal/impl/xs/opti/NodeImpl.java
+com/sun/org/apache/xerces/internal/impl/xs/opti/DefaultXMLDocumentHandler.java
+com/sun/org/apache/xerces/internal/impl/xs/opti/NamedNodeMapImpl.java
+com/sun/org/apache/xerces/internal/impl/xs/opti/SchemaDOM.java
+com/sun/org/apache/xerces/internal/impl/xs/opti/SchemaParsingConfig.java
+com/sun/org/apache/xerces/internal/impl/xs/opti/TextImpl.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi
+com/sun/org/apache/xerces/internal/impl/xs/psvi/SCCS
+com/sun/org/apache/xerces/internal/impl/xs/psvi/SCCS/s.PSVIProvider.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/SCCS/s.StringList.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/SCCS/s.XSAnnotation.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/SCCS/s.XSAttributeUse.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/SCCS/s.XSAttributeDeclaration.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/SCCS/s.XSAttributeGroupDefinition.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/SCCS/s.XSComplexTypeDefinition.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/SCCS/s.XSConstants.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/SCCS/s.XSElementDeclaration.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/SCCS/s.XSFacet.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/SCCS/s.XSIDCDefinition.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/SCCS/s.XSModel.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/SCCS/s.XSModelGroup.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/SCCS/s.XSObject.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/SCCS/s.XSModelGroupDefinition.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/SCCS/s.XSMultiValueFacet.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/SCCS/s.XSNamedMap.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/SCCS/s.XSNamespaceItem.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/SCCS/s.XSNamespaceItemList.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/SCCS/s.XSNotationDeclaration.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/SCCS/s.XSObjectList.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/SCCS/s.XSParticle.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/SCCS/s.XSSimpleTypeDefinition.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/SCCS/s.XSTerm.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/SCCS/s.XSTypeDefinition.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/SCCS/s.XSWildcard.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/XSAttributeDeclaration.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/PSVIProvider.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/StringList.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/XSAnnotation.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/XSTerm.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/XSAttributeGroupDefinition.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/XSAttributeUse.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/XSComplexTypeDefinition.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/XSConstants.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/XSElementDeclaration.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/XSFacet.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/XSIDCDefinition.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/XSModel.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/XSModelGroup.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/XSNamedMap.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/XSMultiValueFacet.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/XSModelGroupDefinition.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/XSNamespaceItem.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/XSNamespaceItemList.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/XSNotationDeclaration.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/XSObject.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/XSObjectList.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/XSParticle.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/XSSimpleTypeDefinition.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/XSWildcard.java
+com/sun/org/apache/xerces/internal/impl/xs/psvi/XSTypeDefinition.java
+com/sun/org/apache/xerces/internal/impl/xs/traversers
+com/sun/org/apache/xerces/internal/impl/xs/traversers/SCCS
+com/sun/org/apache/xerces/internal/impl/xs/traversers/SCCS/s.XSDAbstractParticleTraverser.java
+com/sun/org/apache/xerces/internal/impl/xs/traversers/SCCS/s.XSAttributeChecker.java
+com/sun/org/apache/xerces/internal/impl/xs/traversers/SCCS/s.XSDAbstractIDConstraintTraverser.java
+com/sun/org/apache/xerces/internal/impl/xs/traversers/SCCS/s.XSDAbstractTraverser.java
+com/sun/org/apache/xerces/internal/impl/xs/traversers/SCCS/s.XSDAttributeGroupTraverser.java
+com/sun/org/apache/xerces/internal/impl/xs/traversers/SCCS/s.XSDAttributeTraverser.java
+com/sun/org/apache/xerces/internal/impl/xs/traversers/SCCS/s.XSDComplexTypeTraverser.java
+com/sun/org/apache/xerces/internal/impl/xs/traversers/SCCS/s.XSDElementTraverser.java
+com/sun/org/apache/xerces/internal/impl/xs/traversers/SCCS/s.XSDGroupTraverser.java
+com/sun/org/apache/xerces/internal/impl/xs/traversers/SCCS/s.XSDHandler.java
+com/sun/org/apache/xerces/internal/impl/xs/traversers/SCCS/s.XSDKeyrefTraverser.java
+com/sun/org/apache/xerces/internal/impl/xs/traversers/SCCS/s.XSDNotationTraverser.java
+com/sun/org/apache/xerces/internal/impl/xs/traversers/SCCS/s.XSDSimpleTypeTraverser.java
+com/sun/org/apache/xerces/internal/impl/xs/traversers/SCCS/s.XSDUniqueOrKeyTraverser.java
+com/sun/org/apache/xerces/internal/impl/xs/traversers/SCCS/s.XSDWildcardTraverser.java
+com/sun/org/apache/xerces/internal/impl/xs/traversers/SCCS/s.XSDocumentInfo.java
+com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDAbstractTraverser.java
+com/sun/org/apache/xerces/internal/impl/xs/traversers/XSAttributeChecker.java
+com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDKeyrefTraverser.java
+com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDHandler.java
+com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDAbstractIDConstraintTraverser.java
+com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDAbstractParticleTraverser.java
+com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDAttributeGroupTraverser.java
+com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDAttributeTraverser.java
+com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDComplexTypeTraverser.java
+com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDElementTraverser.java
+com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDGroupTraverser.java
+com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDocumentInfo.java
+com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDNotationTraverser.java
+com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDSimpleTypeTraverser.java
+com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDUniqueOrKeyTraverser.java
+com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDWildcardTraverser.java
+com/sun/org/apache/xerces/internal/impl/xs/util
+com/sun/org/apache/xerces/internal/impl/xs/util/SCCS
+com/sun/org/apache/xerces/internal/impl/xs/util/SCCS/s.NSItemListImpl.java
+com/sun/org/apache/xerces/internal/impl/xs/util/SCCS/s.ShortListImpl.java
+com/sun/org/apache/xerces/internal/impl/xs/util/SCCS/s.SimpleLocator.java
+com/sun/org/apache/xerces/internal/impl/xs/util/SCCS/s.StringListImpl.java
+com/sun/org/apache/xerces/internal/impl/xs/util/SCCS/s.XInt.java
+com/sun/org/apache/xerces/internal/impl/xs/util/SCCS/s.XIntPool.java
+com/sun/org/apache/xerces/internal/impl/xs/util/SCCS/s.XSGrammarPool.java
+com/sun/org/apache/xerces/internal/impl/xs/util/SCCS/s.XSNamedMap4Types.java
+com/sun/org/apache/xerces/internal/impl/xs/util/SCCS/s.XSNamedMapImpl.java
+com/sun/org/apache/xerces/internal/impl/xs/util/SCCS/s.XSObjectListImpl.java
+com/sun/org/apache/xerces/internal/impl/xs/util/XSNamedMap4Types.java
+com/sun/org/apache/xerces/internal/impl/xs/util/NSItemListImpl.java
+com/sun/org/apache/xerces/internal/impl/xs/util/ShortListImpl.java
+com/sun/org/apache/xerces/internal/impl/xs/util/SimpleLocator.java
+com/sun/org/apache/xerces/internal/impl/xs/util/StringListImpl.java
+com/sun/org/apache/xerces/internal/impl/xs/util/XInt.java
+com/sun/org/apache/xerces/internal/impl/xs/util/XIntPool.java
+com/sun/org/apache/xerces/internal/impl/xs/util/XSGrammarPool.java
+com/sun/org/apache/xerces/internal/impl/xs/util/XSNamedMapImpl.java
+com/sun/org/apache/xerces/internal/impl/xs/util/XSObjectListImpl.java
+com/sun/org/apache/xerces/internal/impl/xs/SchemaNamespaceSupport.java
+com/sun/org/apache/xerces/internal/impl/xs/AttributePSVImpl.java
+com/sun/org/apache/xerces/internal/impl/xs/ElementPSVImpl.java
+com/sun/org/apache/xerces/internal/impl/xs/SchemaGrammar.java
+com/sun/org/apache/xerces/internal/impl/xs/SchemaSymbols.java
+com/sun/org/apache/xerces/internal/impl/xs/XMLSchemaException.java
+com/sun/org/apache/xerces/internal/impl/xs/SubstitutionGroupHandler.java
+com/sun/org/apache/xerces/internal/impl/xs/XMLSchemaLoader.java
+com/sun/org/apache/xerces/internal/impl/xs/XMLSchemaValidator.java
+com/sun/org/apache/xerces/internal/impl/xs/XSParticleDecl.java
+com/sun/org/apache/xerces/internal/impl/xs/XSAnnotationImpl.java
+com/sun/org/apache/xerces/internal/impl/xs/XSAttributeDecl.java
+com/sun/org/apache/xerces/internal/impl/xs/XSAttributeGroupDecl.java
+com/sun/org/apache/xerces/internal/impl/xs/XSAttributeUseImpl.java
+com/sun/org/apache/xerces/internal/impl/xs/XSComplexTypeDecl.java
+com/sun/org/apache/xerces/internal/impl/xs/XSConstraints.java
+com/sun/org/apache/xerces/internal/impl/xs/XSDDescription.java
+com/sun/org/apache/xerces/internal/impl/xs/XSDeclarationPool.java
+com/sun/org/apache/xerces/internal/impl/xs/XSElementDecl.java
+com/sun/org/apache/xerces/internal/impl/xs/XSGrammarBucket.java
+com/sun/org/apache/xerces/internal/impl/xs/XSGroupDecl.java
+com/sun/org/apache/xerces/internal/impl/xs/XSImplementationImpl.java
+com/sun/org/apache/xerces/internal/impl/xs/XSMessageFormatter.java
+com/sun/org/apache/xerces/internal/impl/xs/XSModelGroupImpl.java
+com/sun/org/apache/xerces/internal/impl/xs/XSModelImpl.java
+com/sun/org/apache/xerces/internal/impl/xs/XSNotationDecl.java
+com/sun/org/apache/xerces/internal/impl/xs/XSWildcardDecl.java
+com/sun/org/apache/xerces/internal/impl/Constants.java
+com/sun/org/apache/xerces/internal/impl/Version.java
+com/sun/org/apache/xerces/internal/impl/XMLDocumentScannerImpl.java
+com/sun/org/apache/xerces/internal/impl/ExternalSubsetResolver.java
+com/sun/org/apache/xerces/internal/impl/RevalidationHandler.java
+com/sun/org/apache/xerces/internal/impl/XML11DTDScannerImpl.java
+com/sun/org/apache/xerces/internal/impl/XML11DocumentScannerImpl.java
+com/sun/org/apache/xerces/internal/impl/XML11EntityScanner.java
+com/sun/org/apache/xerces/internal/impl/XML11NSDocumentScannerImpl.java
+com/sun/org/apache/xerces/internal/impl/XML11NamespaceBinder.java
+com/sun/org/apache/xerces/internal/impl/XMLDTDScannerImpl.java
+com/sun/org/apache/xerces/internal/impl/XMLDocumentFragmentScannerImpl.java
+com/sun/org/apache/xerces/internal/impl/XMLEntityDescription.java
+com/sun/org/apache/xerces/internal/impl/XMLEntityHandler.java
+com/sun/org/apache/xerces/internal/impl/XMLEntityManager.java
+com/sun/org/apache/xerces/internal/impl/XMLEntityScanner.java
+com/sun/org/apache/xerces/internal/impl/XMLErrorReporter.java
+com/sun/org/apache/xerces/internal/impl/XMLNSDocumentScannerImpl.java
+com/sun/org/apache/xerces/internal/impl/XMLNamespaceBinder.java
+com/sun/org/apache/xerces/internal/impl/XMLScanner.java
+com/sun/org/apache/xerces/internal/impl/XMLVersionDetector.java
+com/sun/org/apache/xerces/internal/jaxp
+com/sun/org/apache/xerces/internal/jaxp/SCCS
+com/sun/org/apache/xerces/internal/jaxp/SCCS/s.XNI2SAX.java
+com/sun/org/apache/xerces/internal/jaxp/SCCS/s.DefaultValidationErrorHandler.java
+com/sun/org/apache/xerces/internal/jaxp/SCCS/s.DocumentBuilderFactoryImpl.java
+com/sun/org/apache/xerces/internal/jaxp/SCCS/s.DocumentBuilderImpl.java
+com/sun/org/apache/xerces/internal/jaxp/SCCS/s.JAXPConstants.java
+com/sun/org/apache/xerces/internal/jaxp/SCCS/s.JAXPValidatorComponent.java
+com/sun/org/apache/xerces/internal/jaxp/SCCS/s.SAXParserFactoryImpl.java
+com/sun/org/apache/xerces/internal/jaxp/SCCS/s.SAXParserImpl.java
+com/sun/org/apache/xerces/internal/jaxp/SCCS/s.javax.xml.parsers.DocumentBuilderFactory
+com/sun/org/apache/xerces/internal/jaxp/SCCS/s.javax.xml.parsers.SAXParserFactory
+com/sun/org/apache/xerces/internal/jaxp/datatype
+com/sun/org/apache/xerces/internal/jaxp/datatype/SCCS
+com/sun/org/apache/xerces/internal/jaxp/datatype/SCCS/s.XMLGregorianCalendarImpl.java
+com/sun/org/apache/xerces/internal/jaxp/datatype/SCCS/s.DatatypeFactoryImpl.java
+com/sun/org/apache/xerces/internal/jaxp/datatype/SCCS/s.DurationImpl.java
+com/sun/org/apache/xerces/internal/jaxp/datatype/XMLGregorianCalendarImpl.java
+com/sun/org/apache/xerces/internal/jaxp/datatype/DatatypeFactoryImpl.java
+com/sun/org/apache/xerces/internal/jaxp/datatype/DurationImpl.java
+com/sun/org/apache/xerces/internal/jaxp/validation
+com/sun/org/apache/xerces/internal/jaxp/validation/SCCS
+com/sun/org/apache/xerces/internal/jaxp/validation/SCCS/s.InsulatedValidatorComponent.java
+com/sun/org/apache/xerces/internal/jaxp/validation/SCCS/s.ErrorHandlerAdaptor.java
+com/sun/org/apache/xerces/internal/jaxp/validation/SCCS/s.ReadonlyGrammarPool.java
+com/sun/org/apache/xerces/internal/jaxp/validation/SCCS/s.Util.java
+com/sun/org/apache/xerces/internal/jaxp/validation/SCCS/s.ValidatorHandlerImpl.java
+com/sun/org/apache/xerces/internal/jaxp/validation/SCCS/s.ValidatorImpl.java
+com/sun/org/apache/xerces/internal/jaxp/validation/SCCS/s.WrappedSAXException.java
+com/sun/org/apache/xerces/internal/jaxp/validation/SCCS/s.XNI2SAXEx.java
+com/sun/org/apache/xerces/internal/jaxp/validation/SCCS/s.XercesConstants.java
+com/sun/org/apache/xerces/internal/jaxp/validation/SCCS/s.XercesSchema.java
+com/sun/org/apache/xerces/internal/jaxp/validation/SCCS/s.javax.xml.validation.SchemaFactory
+com/sun/org/apache/xerces/internal/jaxp/validation/xs
+com/sun/org/apache/xerces/internal/jaxp/validation/xs/SCCS
+com/sun/org/apache/xerces/internal/jaxp/validation/xs/SCCS/s.InsulatedSchemaValidator.java
+com/sun/org/apache/xerces/internal/jaxp/validation/xs/SCCS/s.SchemaFactoryImpl.java
+com/sun/org/apache/xerces/internal/jaxp/validation/xs/SCCS/s.SchemaImpl.java
+com/sun/org/apache/xerces/internal/jaxp/validation/xs/InsulatedSchemaValidator.java
+com/sun/org/apache/xerces/internal/jaxp/validation/xs/SchemaFactoryImpl.java
+com/sun/org/apache/xerces/internal/jaxp/validation/xs/SchemaImpl.java
+com/sun/org/apache/xerces/internal/jaxp/validation/InsulatedValidatorComponent.java
+com/sun/org/apache/xerces/internal/jaxp/validation/ErrorHandlerAdaptor.java
+com/sun/org/apache/xerces/internal/jaxp/validation/javax.xml.validation.SchemaFactory
+com/sun/org/apache/xerces/internal/jaxp/validation/ReadonlyGrammarPool.java
+com/sun/org/apache/xerces/internal/jaxp/validation/Util.java
+com/sun/org/apache/xerces/internal/jaxp/validation/ValidatorHandlerImpl.java
+com/sun/org/apache/xerces/internal/jaxp/validation/ValidatorImpl.java
+com/sun/org/apache/xerces/internal/jaxp/validation/WrappedSAXException.java
+com/sun/org/apache/xerces/internal/jaxp/validation/XNI2SAXEx.java
+com/sun/org/apache/xerces/internal/jaxp/validation/XercesConstants.java
+com/sun/org/apache/xerces/internal/jaxp/validation/XercesSchema.java
+com/sun/org/apache/xerces/internal/jaxp/javax.xml.parsers.DocumentBuilderFactory
+com/sun/org/apache/xerces/internal/jaxp/DefaultValidationErrorHandler.java
+com/sun/org/apache/xerces/internal/jaxp/DocumentBuilderFactoryImpl.java
+com/sun/org/apache/xerces/internal/jaxp/DocumentBuilderImpl.java
+com/sun/org/apache/xerces/internal/jaxp/JAXPConstants.java
+com/sun/org/apache/xerces/internal/jaxp/JAXPValidatorComponent.java
+com/sun/org/apache/xerces/internal/jaxp/SAXParserFactoryImpl.java
+com/sun/org/apache/xerces/internal/jaxp/SAXParserImpl.java
+com/sun/org/apache/xerces/internal/jaxp/XNI2SAX.java
+com/sun/org/apache/xerces/internal/jaxp/javax.xml.parsers.SAXParserFactory
+com/sun/org/apache/xerces/internal/parsers
+com/sun/org/apache/xerces/internal/parsers/SCCS
+com/sun/org/apache/xerces/internal/parsers/SCCS/s.AbstractXMLDocumentParser.java
+com/sun/org/apache/xerces/internal/parsers/SCCS/s.AbstractDOMParser.java
+com/sun/org/apache/xerces/internal/parsers/SCCS/s.AbstractSAXParser.java
+com/sun/org/apache/xerces/internal/parsers/SCCS/s.IntegratedParserConfiguration.java
+com/sun/org/apache/xerces/internal/parsers/SCCS/s.BasicParserConfiguration.java
+com/sun/org/apache/xerces/internal/parsers/SCCS/s.CachingParserPool.java
+com/sun/org/apache/xerces/internal/parsers/SCCS/s.DOMASBuilderImpl.java
+com/sun/org/apache/xerces/internal/parsers/SCCS/s.DOMParser.java
+com/sun/org/apache/xerces/internal/parsers/SCCS/s.DOMParserImpl.java
+com/sun/org/apache/xerces/internal/parsers/SCCS/s.DTDConfiguration.java
+com/sun/org/apache/xerces/internal/parsers/SCCS/s.DTDParser.java
+com/sun/org/apache/xerces/internal/parsers/SCCS/s.JAXPConfiguration.java
+com/sun/org/apache/xerces/internal/parsers/SCCS/s.org.apache.xerces.xni.parser.DTDConfiguration
+com/sun/org/apache/xerces/internal/parsers/SCCS/s.NonValidatingConfiguration.java
+com/sun/org/apache/xerces/internal/parsers/SCCS/s.ObjectFactory.java
+com/sun/org/apache/xerces/internal/parsers/SCCS/s.SAXParser.java
+com/sun/org/apache/xerces/internal/parsers/SCCS/s.SecurityConfiguration.java
+com/sun/org/apache/xerces/internal/parsers/SCCS/s.SecuritySupport.java
+com/sun/org/apache/xerces/internal/parsers/SCCS/s.SecuritySupport12.java
+com/sun/org/apache/xerces/internal/parsers/SCCS/s.StandardParserConfiguration.java
+com/sun/org/apache/xerces/internal/parsers/SCCS/s.XIncludeParserConfiguration.java
+com/sun/org/apache/xerces/internal/parsers/SCCS/s.XML11Configuration.java
+com/sun/org/apache/xerces/internal/parsers/SCCS/s.XMLDocumentParser.java
+com/sun/org/apache/xerces/internal/parsers/SCCS/s.XMLGrammarCachingConfiguration.java
+com/sun/org/apache/xerces/internal/parsers/SCCS/s.XMLGrammarParser.java
+com/sun/org/apache/xerces/internal/parsers/SCCS/s.XMLGrammarPreparser.java
+com/sun/org/apache/xerces/internal/parsers/SCCS/s.XMLParser.java
+com/sun/org/apache/xerces/internal/parsers/SCCS/s.XPointerParserConfiguration.java
+com/sun/org/apache/xerces/internal/parsers/SCCS/s.org.apache.xerces.xni.parser.XMLParserConfiguration
+com/sun/org/apache/xerces/internal/parsers/SCCS/s.org.apache.xerces.xni.parser.XML11Configuration
+com/sun/org/apache/xerces/internal/parsers/SCCS/s.org.xml.sax.driver
+com/sun/org/apache/xerces/internal/parsers/AbstractXMLDocumentParser.java
+com/sun/org/apache/xerces/internal/parsers/AbstractDOMParser.java
+com/sun/org/apache/xerces/internal/parsers/AbstractSAXParser.java
+com/sun/org/apache/xerces/internal/parsers/IntegratedParserConfiguration.java
+com/sun/org/apache/xerces/internal/parsers/BasicParserConfiguration.java
+com/sun/org/apache/xerces/internal/parsers/CachingParserPool.java
+com/sun/org/apache/xerces/internal/parsers/DOMASBuilderImpl.java
+com/sun/org/apache/xerces/internal/parsers/DOMParser.java
+com/sun/org/apache/xerces/internal/parsers/DOMParserImpl.java
+com/sun/org/apache/xerces/internal/parsers/DTDConfiguration.java
+com/sun/org/apache/xerces/internal/parsers/DTDParser.java
+com/sun/org/apache/xerces/internal/parsers/JAXPConfiguration.java
+com/sun/org/apache/xerces/internal/parsers/ObjectFactory.java
+com/sun/org/apache/xerces/internal/parsers/NonValidatingConfiguration.java
+com/sun/org/apache/xerces/internal/parsers/SAXParser.java
+com/sun/org/apache/xerces/internal/parsers/SecurityConfiguration.java
+com/sun/org/apache/xerces/internal/parsers/SecuritySupport.java
+com/sun/org/apache/xerces/internal/parsers/SecuritySupport12.java
+com/sun/org/apache/xerces/internal/parsers/StandardParserConfiguration.java
+com/sun/org/apache/xerces/internal/parsers/XIncludeParserConfiguration.java
+com/sun/org/apache/xerces/internal/parsers/XML11Configuration.java
+com/sun/org/apache/xerces/internal/parsers/XMLDocumentParser.java
+com/sun/org/apache/xerces/internal/parsers/XMLGrammarCachingConfiguration.java
+com/sun/org/apache/xerces/internal/parsers/XMLGrammarParser.java
+com/sun/org/apache/xerces/internal/parsers/XMLGrammarPreparser.java
+com/sun/org/apache/xerces/internal/parsers/XMLParser.java
+com/sun/org/apache/xerces/internal/parsers/XPointerParserConfiguration.java
+com/sun/org/apache/xerces/internal/parsers/org.apache.xerces.xni.parser.DTDConfiguration
+com/sun/org/apache/xerces/internal/parsers/org.apache.xerces.xni.parser.XMLParserConfiguration
+com/sun/org/apache/xerces/internal/parsers/org.apache.xerces.xni.parser.XML11Configuration
+com/sun/org/apache/xerces/internal/parsers/org.xml.sax.driver
+com/sun/org/apache/xerces/internal/util
+com/sun/org/apache/xerces/internal/util/SCCS
+com/sun/org/apache/xerces/internal/util/SCCS/s.AugmentationsImpl.java
+com/sun/org/apache/xerces/internal/util/SCCS/s.AttributesProxy.java
+com/sun/org/apache/xerces/internal/util/SCCS/s.URI.java
+com/sun/org/apache/xerces/internal/util/SCCS/s.DOMEntityResolverWrapper.java
+com/sun/org/apache/xerces/internal/util/SCCS/s.DOMErrorHandlerWrapper.java
+com/sun/org/apache/xerces/internal/util/SCCS/s.DOMUtil.java
+com/sun/org/apache/xerces/internal/util/SCCS/s.DatatypeMessageFormatter.java
+com/sun/org/apache/xerces/internal/util/SCCS/s.DefaultErrorHandler.java
+com/sun/org/apache/xerces/internal/util/SCCS/s.DraconianErrorHandler.java
+com/sun/org/apache/xerces/internal/util/SCCS/s.EncodingMap.java
+com/sun/org/apache/xerces/internal/util/SCCS/s.EntityResolver2Wrapper.java
+com/sun/org/apache/xerces/internal/util/SCCS/s.EntityResolverWrapper.java
+com/sun/org/apache/xerces/internal/util/SCCS/s.ErrorHandlerProxy.java
+com/sun/org/apache/xerces/internal/util/SCCS/s.XMLAttributesImpl.java
+com/sun/org/apache/xerces/internal/util/SCCS/s.ErrorHandlerWrapper.java
+com/sun/org/apache/xerces/internal/util/SCCS/s.IntStack.java
+com/sun/org/apache/xerces/internal/util/SCCS/s.LocatorProxy.java
+com/sun/org/apache/xerces/internal/util/SCCS/s.LocatorWrapper.java
+com/sun/org/apache/xerces/internal/util/SCCS/s.MessageFormatter.java
+com/sun/org/apache/xerces/internal/util/SCCS/s.NamespaceSupport.java
+com/sun/org/apache/xerces/internal/util/SCCS/s.ParserConfigurationSettings.java
+com/sun/org/apache/xerces/internal/util/SCCS/s.SAX2XNI.java
+com/sun/org/apache/xerces/internal/util/SCCS/s.SAXMessageFormatter.java
+com/sun/org/apache/xerces/internal/util/SCCS/s.SecurityManager.java
+com/sun/org/apache/xerces/internal/util/SCCS/s.ShadowedSymbolTable.java
+com/sun/org/apache/xerces/internal/util/SCCS/s.SymbolHash.java
+com/sun/org/apache/xerces/internal/util/SCCS/s.SymbolTable.java
+com/sun/org/apache/xerces/internal/util/SCCS/s.SynchronizedSymbolTable.java
+com/sun/org/apache/xerces/internal/util/SCCS/s.TeeXMLDocumentFilterImpl.java
+com/sun/org/apache/xerces/internal/util/SCCS/s.TypeInfoImpl.java
+com/sun/org/apache/xerces/internal/util/SCCS/s.XML11Char.java
+com/sun/org/apache/xerces/internal/util/SCCS/s.XMLErrorCode.java
+com/sun/org/apache/xerces/internal/util/SCCS/s.XMLChar.java
+com/sun/org/apache/xerces/internal/util/SCCS/s.XMLDocumentFilterImpl.java
+com/sun/org/apache/xerces/internal/util/SCCS/s.XMLEntityDescriptionImpl.java
+com/sun/org/apache/xerces/internal/util/SCCS/s.XMLGrammarPoolImpl.java
+com/sun/org/apache/xerces/internal/util/SCCS/s.XMLInputSourceAdaptor.java
+com/sun/org/apache/xerces/internal/util/SCCS/s.XMLResourceIdentifierImpl.java
+com/sun/org/apache/xerces/internal/util/SCCS/s.XMLStringBuffer.java
+com/sun/org/apache/xerces/internal/util/SCCS/s.XMLSymbols.java
+com/sun/org/apache/xerces/internal/util/DOMEntityResolverWrapper.java
+com/sun/org/apache/xerces/internal/util/AttributesProxy.java
+com/sun/org/apache/xerces/internal/util/AugmentationsImpl.java
+com/sun/org/apache/xerces/internal/util/DatatypeMessageFormatter.java
+com/sun/org/apache/xerces/internal/util/DOMErrorHandlerWrapper.java
+com/sun/org/apache/xerces/internal/util/DOMUtil.java
+com/sun/org/apache/xerces/internal/util/DefaultErrorHandler.java
+com/sun/org/apache/xerces/internal/util/DraconianErrorHandler.java
+com/sun/org/apache/xerces/internal/util/EncodingMap.java
+com/sun/org/apache/xerces/internal/util/EntityResolver2Wrapper.java
+com/sun/org/apache/xerces/internal/util/EntityResolverWrapper.java
+com/sun/org/apache/xerces/internal/util/ErrorHandlerProxy.java
+com/sun/org/apache/xerces/internal/util/SAX2XNI.java
+com/sun/org/apache/xerces/internal/util/ShadowedSymbolTable.java
+com/sun/org/apache/xerces/internal/util/ErrorHandlerWrapper.java
+com/sun/org/apache/xerces/internal/util/IntStack.java
+com/sun/org/apache/xerces/internal/util/LocatorProxy.java
+com/sun/org/apache/xerces/internal/util/LocatorWrapper.java
+com/sun/org/apache/xerces/internal/util/MessageFormatter.java
+com/sun/org/apache/xerces/internal/util/NamespaceSupport.java
+com/sun/org/apache/xerces/internal/util/ParserConfigurationSettings.java
+com/sun/org/apache/xerces/internal/util/SecurityManager.java
+com/sun/org/apache/xerces/internal/util/SAXMessageFormatter.java
+com/sun/org/apache/xerces/internal/util/SynchronizedSymbolTable.java
+com/sun/org/apache/xerces/internal/util/SymbolHash.java
+com/sun/org/apache/xerces/internal/util/SymbolTable.java
+com/sun/org/apache/xerces/internal/util/URI.java
+com/sun/org/apache/xerces/internal/util/TeeXMLDocumentFilterImpl.java
+com/sun/org/apache/xerces/internal/util/TypeInfoImpl.java
+com/sun/org/apache/xerces/internal/util/XMLDocumentFilterImpl.java
+com/sun/org/apache/xerces/internal/util/XML11Char.java
+com/sun/org/apache/xerces/internal/util/XMLAttributesImpl.java
+com/sun/org/apache/xerces/internal/util/XMLChar.java
+com/sun/org/apache/xerces/internal/util/XMLEntityDescriptionImpl.java
+com/sun/org/apache/xerces/internal/util/XMLErrorCode.java
+com/sun/org/apache/xerces/internal/util/XMLGrammarPoolImpl.java
+com/sun/org/apache/xerces/internal/util/XMLInputSourceAdaptor.java
+com/sun/org/apache/xerces/internal/util/XMLResourceIdentifierImpl.java
+com/sun/org/apache/xerces/internal/util/XMLStringBuffer.java
+com/sun/org/apache/xerces/internal/util/XMLSymbols.java
+com/sun/org/apache/xerces/internal/xinclude
+com/sun/org/apache/xerces/internal/xinclude/SCCS
+com/sun/org/apache/xerces/internal/xinclude/SCCS/s.XPointerElementHandler.java
+com/sun/org/apache/xerces/internal/xinclude/SCCS/s.MultipleScopeNamespaceSupport.java
+com/sun/org/apache/xerces/internal/xinclude/SCCS/s.ObjectFactory.java
+com/sun/org/apache/xerces/internal/xinclude/SCCS/s.SecuritySupport.java
+com/sun/org/apache/xerces/internal/xinclude/SCCS/s.SecuritySupport12.java
+com/sun/org/apache/xerces/internal/xinclude/SCCS/s.XInclude11TextReader.java
+com/sun/org/apache/xerces/internal/xinclude/SCCS/s.XIncludeFatalError.java
+com/sun/org/apache/xerces/internal/xinclude/SCCS/s.XIncludeHandler.java
+com/sun/org/apache/xerces/internal/xinclude/SCCS/s.XIncludeInputSource.java
+com/sun/org/apache/xerces/internal/xinclude/SCCS/s.XIncludeMessageFormatter.java
+com/sun/org/apache/xerces/internal/xinclude/SCCS/s.XIncludeNamespaceSupport.java
+com/sun/org/apache/xerces/internal/xinclude/SCCS/s.XIncludeResourceError.java
+com/sun/org/apache/xerces/internal/xinclude/SCCS/s.XIncludeTextReader.java
+com/sun/org/apache/xerces/internal/xinclude/SCCS/s.XPointerFramework.java
+com/sun/org/apache/xerces/internal/xinclude/SCCS/s.XPointerSchema.java
+com/sun/org/apache/xerces/internal/xinclude/MultipleScopeNamespaceSupport.java
+com/sun/org/apache/xerces/internal/xinclude/ObjectFactory.java
+com/sun/org/apache/xerces/internal/xinclude/SecuritySupport.java
+com/sun/org/apache/xerces/internal/xinclude/SecuritySupport12.java
+com/sun/org/apache/xerces/internal/xinclude/XInclude11TextReader.java
+com/sun/org/apache/xerces/internal/xinclude/XIncludeFatalError.java
+com/sun/org/apache/xerces/internal/xinclude/XIncludeHandler.java
+com/sun/org/apache/xerces/internal/xinclude/XIncludeInputSource.java
+com/sun/org/apache/xerces/internal/xinclude/XIncludeMessageFormatter.java
+com/sun/org/apache/xerces/internal/xinclude/XIncludeNamespaceSupport.java
+com/sun/org/apache/xerces/internal/xinclude/XIncludeResourceError.java
+com/sun/org/apache/xerces/internal/xinclude/XIncludeTextReader.java
+com/sun/org/apache/xerces/internal/xinclude/XPointerElementHandler.java
+com/sun/org/apache/xerces/internal/xinclude/XPointerFramework.java
+com/sun/org/apache/xerces/internal/xinclude/XPointerSchema.java
+com/sun/org/apache/xerces/internal/xni
+com/sun/org/apache/xerces/internal/xni/SCCS
+com/sun/org/apache/xerces/internal/xni/SCCS/s.Augmentations.java
+com/sun/org/apache/xerces/internal/xni/SCCS/s.NamespaceContext.java
+com/sun/org/apache/xerces/internal/xni/SCCS/s.QName.java
+com/sun/org/apache/xerces/internal/xni/SCCS/s.XMLAttributes.java
+com/sun/org/apache/xerces/internal/xni/SCCS/s.XMLDTDHandler.java
+com/sun/org/apache/xerces/internal/xni/SCCS/s.XMLDTDContentModelHandler.java
+com/sun/org/apache/xerces/internal/xni/SCCS/s.XMLDocumentFragmentHandler.java
+com/sun/org/apache/xerces/internal/xni/SCCS/s.XMLDocumentHandler.java
+com/sun/org/apache/xerces/internal/xni/SCCS/s.XMLLocator.java
+com/sun/org/apache/xerces/internal/xni/SCCS/s.XMLResourceIdentifier.java
+com/sun/org/apache/xerces/internal/xni/SCCS/s.XMLString.java
+com/sun/org/apache/xerces/internal/xni/SCCS/s.XNIException.java
+com/sun/org/apache/xerces/internal/xni/grammars
+com/sun/org/apache/xerces/internal/xni/grammars/SCCS
+com/sun/org/apache/xerces/internal/xni/grammars/SCCS/s.Grammar.java
+com/sun/org/apache/xerces/internal/xni/grammars/SCCS/s.XMLGrammarLoader.java
+com/sun/org/apache/xerces/internal/xni/grammars/SCCS/s.XMLDTDDescription.java
+com/sun/org/apache/xerces/internal/xni/grammars/SCCS/s.XMLGrammarDescription.java
+com/sun/org/apache/xerces/internal/xni/grammars/SCCS/s.XMLGrammarPool.java
+com/sun/org/apache/xerces/internal/xni/grammars/SCCS/s.XMLSchemaDescription.java
+com/sun/org/apache/xerces/internal/xni/grammars/SCCS/s.XSGrammar.java
+com/sun/org/apache/xerces/internal/xni/grammars/XMLDTDDescription.java
+com/sun/org/apache/xerces/internal/xni/grammars/Grammar.java
+com/sun/org/apache/xerces/internal/xni/grammars/XMLGrammarDescription.java
+com/sun/org/apache/xerces/internal/xni/grammars/XMLGrammarLoader.java
+com/sun/org/apache/xerces/internal/xni/grammars/XMLGrammarPool.java
+com/sun/org/apache/xerces/internal/xni/grammars/XMLSchemaDescription.java
+com/sun/org/apache/xerces/internal/xni/grammars/XSGrammar.java
+com/sun/org/apache/xerces/internal/xni/parser
+com/sun/org/apache/xerces/internal/xni/parser/SCCS
+com/sun/org/apache/xerces/internal/xni/parser/SCCS/s.XMLComponentManager.java
+com/sun/org/apache/xerces/internal/xni/parser/SCCS/s.XMLComponent.java
+com/sun/org/apache/xerces/internal/xni/parser/SCCS/s.XMLConfigurationException.java
+com/sun/org/apache/xerces/internal/xni/parser/SCCS/s.XMLDTDContentModelFilter.java
+com/sun/org/apache/xerces/internal/xni/parser/SCCS/s.XMLDTDContentModelSource.java
+com/sun/org/apache/xerces/internal/xni/parser/SCCS/s.XMLDTDFilter.java
+com/sun/org/apache/xerces/internal/xni/parser/SCCS/s.XMLDTDScanner.java
+com/sun/org/apache/xerces/internal/xni/parser/SCCS/s.XMLDTDSource.java
+com/sun/org/apache/xerces/internal/xni/parser/SCCS/s.XMLDocumentFilter.java
+com/sun/org/apache/xerces/internal/xni/parser/SCCS/s.XMLDocumentScanner.java
+com/sun/org/apache/xerces/internal/xni/parser/SCCS/s.XMLDocumentSource.java
+com/sun/org/apache/xerces/internal/xni/parser/SCCS/s.XMLEntityResolver.java
+com/sun/org/apache/xerces/internal/xni/parser/SCCS/s.XMLErrorHandler.java
+com/sun/org/apache/xerces/internal/xni/parser/SCCS/s.XMLInputSource.java
+com/sun/org/apache/xerces/internal/xni/parser/SCCS/s.XMLParseException.java
+com/sun/org/apache/xerces/internal/xni/parser/SCCS/s.XMLParserConfiguration.java
+com/sun/org/apache/xerces/internal/xni/parser/SCCS/s.XMLPullParserConfiguration.java
+com/sun/org/apache/xerces/internal/xni/parser/XMLComponentManager.java
+com/sun/org/apache/xerces/internal/xni/parser/XMLComponent.java
+com/sun/org/apache/xerces/internal/xni/parser/XMLConfigurationException.java
+com/sun/org/apache/xerces/internal/xni/parser/XMLDTDContentModelFilter.java
+com/sun/org/apache/xerces/internal/xni/parser/XMLDTDContentModelSource.java
+com/sun/org/apache/xerces/internal/xni/parser/XMLDTDFilter.java
+com/sun/org/apache/xerces/internal/xni/parser/XMLDTDScanner.java
+com/sun/org/apache/xerces/internal/xni/parser/XMLDTDSource.java
+com/sun/org/apache/xerces/internal/xni/parser/XMLDocumentFilter.java
+com/sun/org/apache/xerces/internal/xni/parser/XMLDocumentScanner.java
+com/sun/org/apache/xerces/internal/xni/parser/XMLDocumentSource.java
+com/sun/org/apache/xerces/internal/xni/parser/XMLEntityResolver.java
+com/sun/org/apache/xerces/internal/xni/parser/XMLErrorHandler.java
+com/sun/org/apache/xerces/internal/xni/parser/XMLPullParserConfiguration.java
+com/sun/org/apache/xerces/internal/xni/parser/XMLInputSource.java
+com/sun/org/apache/xerces/internal/xni/parser/XMLParseException.java
+com/sun/org/apache/xerces/internal/xni/parser/XMLParserConfiguration.java
+com/sun/org/apache/xerces/internal/xni/NamespaceContext.java
+com/sun/org/apache/xerces/internal/xni/Augmentations.java
+com/sun/org/apache/xerces/internal/xni/XMLAttributes.java
+com/sun/org/apache/xerces/internal/xni/QName.java
+com/sun/org/apache/xerces/internal/xni/XMLDTDContentModelHandler.java
+com/sun/org/apache/xerces/internal/xni/XMLDTDHandler.java
+com/sun/org/apache/xerces/internal/xni/XMLDocumentFragmentHandler.java
+com/sun/org/apache/xerces/internal/xni/XMLDocumentHandler.java
+com/sun/org/apache/xerces/internal/xni/XMLLocator.java
+com/sun/org/apache/xerces/internal/xni/XMLResourceIdentifier.java
+com/sun/org/apache/xerces/internal/xni/XMLString.java
+com/sun/org/apache/xerces/internal/xni/XNIException.java
+com/sun/org/apache/xerces/internal/xs
+com/sun/org/apache/xerces/internal/xs/SCCS
+com/sun/org/apache/xerces/internal/xs/SCCS/s.XSAttributeDeclaration.java
+com/sun/org/apache/xerces/internal/xs/SCCS/s.AttributePSVI.java
+com/sun/org/apache/xerces/internal/xs/SCCS/s.ElementPSVI.java
+com/sun/org/apache/xerces/internal/xs/SCCS/s.ItemPSVI.java
+com/sun/org/apache/xerces/internal/xs/SCCS/s.LSInputList.java
+com/sun/org/apache/xerces/internal/xs/SCCS/s.PSVIProvider.java
+com/sun/org/apache/xerces/internal/xs/SCCS/s.ShortList.java
+com/sun/org/apache/xerces/internal/xs/SCCS/s.StringList.java
+com/sun/org/apache/xerces/internal/xs/SCCS/s.XSAnnotation.java
+com/sun/org/apache/xerces/internal/xs/SCCS/s.XSModelGroupDefinition.java
+com/sun/org/apache/xerces/internal/xs/SCCS/s.XSAttributeGroupDefinition.java
+com/sun/org/apache/xerces/internal/xs/SCCS/s.XSAttributeUse.java
+com/sun/org/apache/xerces/internal/xs/SCCS/s.XSComplexTypeDefinition.java
+com/sun/org/apache/xerces/internal/xs/SCCS/s.XSConstants.java
+com/sun/org/apache/xerces/internal/xs/SCCS/s.XSElementDeclaration.java
+com/sun/org/apache/xerces/internal/xs/SCCS/s.XSException.java
+com/sun/org/apache/xerces/internal/xs/SCCS/s.XSFacet.java
+com/sun/org/apache/xerces/internal/xs/SCCS/s.XSIDCDefinition.java
+com/sun/org/apache/xerces/internal/xs/SCCS/s.XSImplementation.java
+com/sun/org/apache/xerces/internal/xs/SCCS/s.XSLoader.java
+com/sun/org/apache/xerces/internal/xs/SCCS/s.XSModel.java
+com/sun/org/apache/xerces/internal/xs/SCCS/s.XSModelGroup.java
+com/sun/org/apache/xerces/internal/xs/SCCS/s.XSNotationDeclaration.java
+com/sun/org/apache/xerces/internal/xs/SCCS/s.XSMultiValueFacet.java
+com/sun/org/apache/xerces/internal/xs/SCCS/s.XSNamedMap.java
+com/sun/org/apache/xerces/internal/xs/SCCS/s.XSNamespaceItem.java
+com/sun/org/apache/xerces/internal/xs/SCCS/s.XSNamespaceItemList.java
+com/sun/org/apache/xerces/internal/xs/SCCS/s.XSObject.java
+com/sun/org/apache/xerces/internal/xs/SCCS/s.XSObjectList.java
+com/sun/org/apache/xerces/internal/xs/SCCS/s.XSParticle.java
+com/sun/org/apache/xerces/internal/xs/SCCS/s.XSTerm.java
+com/sun/org/apache/xerces/internal/xs/SCCS/s.XSSimpleTypeDefinition.java
+com/sun/org/apache/xerces/internal/xs/SCCS/s.XSTypeDefinition.java
+com/sun/org/apache/xerces/internal/xs/SCCS/s.XSWildcard.java
+com/sun/org/apache/xerces/internal/xs/XSAttributeDeclaration.java
+com/sun/org/apache/xerces/internal/xs/AttributePSVI.java
+com/sun/org/apache/xerces/internal/xs/ElementPSVI.java
+com/sun/org/apache/xerces/internal/xs/ItemPSVI.java
+com/sun/org/apache/xerces/internal/xs/LSInputList.java
+com/sun/org/apache/xerces/internal/xs/PSVIProvider.java
+com/sun/org/apache/xerces/internal/xs/ShortList.java
+com/sun/org/apache/xerces/internal/xs/StringList.java
+com/sun/org/apache/xerces/internal/xs/XSAnnotation.java
+com/sun/org/apache/xerces/internal/xs/XSTerm.java
+com/sun/org/apache/xerces/internal/xs/XSAttributeGroupDefinition.java
+com/sun/org/apache/xerces/internal/xs/XSAttributeUse.java
+com/sun/org/apache/xerces/internal/xs/XSComplexTypeDefinition.java
+com/sun/org/apache/xerces/internal/xs/XSConstants.java
+com/sun/org/apache/xerces/internal/xs/XSElementDeclaration.java
+com/sun/org/apache/xerces/internal/xs/XSException.java
+com/sun/org/apache/xerces/internal/xs/XSFacet.java
+com/sun/org/apache/xerces/internal/xs/XSIDCDefinition.java
+com/sun/org/apache/xerces/internal/xs/XSImplementation.java
+com/sun/org/apache/xerces/internal/xs/XSLoader.java
+com/sun/org/apache/xerces/internal/xs/XSModel.java
+com/sun/org/apache/xerces/internal/xs/XSModelGroup.java
+com/sun/org/apache/xerces/internal/xs/XSModelGroupDefinition.java
+com/sun/org/apache/xerces/internal/xs/XSMultiValueFacet.java
+com/sun/org/apache/xerces/internal/xs/XSNamedMap.java
+com/sun/org/apache/xerces/internal/xs/XSNamespaceItem.java
+com/sun/org/apache/xerces/internal/xs/XSNamespaceItemList.java
+com/sun/org/apache/xerces/internal/xs/XSNotationDeclaration.java
+com/sun/org/apache/xerces/internal/xs/XSObject.java
+com/sun/org/apache/xerces/internal/xs/XSObjectList.java
+com/sun/org/apache/xerces/internal/xs/XSParticle.java
+com/sun/org/apache/xerces/internal/xs/XSSimpleTypeDefinition.java
+com/sun/org/apache/xerces/internal/xs/XSWildcard.java
+com/sun/org/apache/xerces/internal/xs/XSTypeDefinition.java
+com/sun/org/apache/xml
+com/sun/org/apache/xml/internal
+com/sun/org/apache/xml/internal/dtm
+com/sun/org/apache/xml/internal/dtm/SCCS
+com/sun/org/apache/xml/internal/dtm/SCCS/s.Axis.java
+com/sun/org/apache/xml/internal/dtm/SCCS/s.DTM.java
+com/sun/org/apache/xml/internal/dtm/SCCS/s.DTMException.java
+com/sun/org/apache/xml/internal/dtm/SCCS/s.DTMAxisIterator.java
+com/sun/org/apache/xml/internal/dtm/SCCS/s.DTMAxisTraverser.java
+com/sun/org/apache/xml/internal/dtm/SCCS/s.DTMConfigurationException.java
+com/sun/org/apache/xml/internal/dtm/SCCS/s.DTMDOMException.java
+com/sun/org/apache/xml/internal/dtm/SCCS/s.DTMFilter.java
+com/sun/org/apache/xml/internal/dtm/SCCS/s.DTMIterator.java
+com/sun/org/apache/xml/internal/dtm/SCCS/s.DTMManager.java
+com/sun/org/apache/xml/internal/dtm/SCCS/s.DTMWSFilter.java
+com/sun/org/apache/xml/internal/dtm/SCCS/s.FactoryFinder.java
+com/sun/org/apache/xml/internal/dtm/SCCS/s.ObjectFactory.java
+com/sun/org/apache/xml/internal/dtm/SCCS/s.SecuritySupport.java
+com/sun/org/apache/xml/internal/dtm/SCCS/s.SecuritySupport12.java
+com/sun/org/apache/xml/internal/dtm/ref
+com/sun/org/apache/xml/internal/dtm/ref/SCCS
+com/sun/org/apache/xml/internal/dtm/ref/SCCS/s.DTMAxisIterNodeList.java
+com/sun/org/apache/xml/internal/dtm/ref/SCCS/s.ChunkedIntArray.java
+com/sun/org/apache/xml/internal/dtm/ref/SCCS/s.CoroutineManager.java
+com/sun/org/apache/xml/internal/dtm/ref/SCCS/s.CoroutineParser.java
+com/sun/org/apache/xml/internal/dtm/ref/SCCS/s.CustomStringPool.java
+com/sun/org/apache/xml/internal/dtm/ref/SCCS/s.DTMSafeStringPool.java
+com/sun/org/apache/xml/internal/dtm/ref/SCCS/s.DTMAxisIteratorBase.java
+com/sun/org/apache/xml/internal/dtm/ref/SCCS/s.DTMChildIterNodeList.java
+com/sun/org/apache/xml/internal/dtm/ref/SCCS/s.DTMDefaultBase.java
+com/sun/org/apache/xml/internal/dtm/ref/SCCS/s.DTMDefaultBaseIterators.java
+com/sun/org/apache/xml/internal/dtm/ref/SCCS/s.DTMDefaultBaseTraversers.java
+com/sun/org/apache/xml/internal/dtm/ref/SCCS/s.DTMDocumentImpl.java
+com/sun/org/apache/xml/internal/dtm/ref/SCCS/s.DTMManagerDefault.java
+com/sun/org/apache/xml/internal/dtm/ref/SCCS/s.DTMNamedNodeMap.java
+com/sun/org/apache/xml/internal/dtm/ref/SCCS/s.DTMNodeIterator.java
+com/sun/org/apache/xml/internal/dtm/ref/SCCS/s.DTMNodeList.java
+com/sun/org/apache/xml/internal/dtm/ref/SCCS/s.DTMNodeListBase.java
+com/sun/org/apache/xml/internal/dtm/ref/SCCS/s.DTMNodeProxy.java
+com/sun/org/apache/xml/internal/dtm/ref/SCCS/s.ExpandedNameTable.java
+com/sun/org/apache/xml/internal/dtm/ref/SCCS/s.DTMStringPool.java
+com/sun/org/apache/xml/internal/dtm/ref/SCCS/s.DTMTreeWalker.java
+com/sun/org/apache/xml/internal/dtm/ref/SCCS/s.EmptyIterator.java
+com/sun/org/apache/xml/internal/dtm/ref/SCCS/s.IncrementalSAXSource.java
+com/sun/org/apache/xml/internal/dtm/ref/SCCS/s.ExtendedType.java
+com/sun/org/apache/xml/internal/dtm/ref/SCCS/s.IncrementalSAXSource_Filter.java
+com/sun/org/apache/xml/internal/dtm/ref/SCCS/s.IncrementalSAXSource_Xerces.java
+com/sun/org/apache/xml/internal/dtm/ref/SCCS/s.NodeLocator.java
+com/sun/org/apache/xml/internal/dtm/ref/SCCS/s.ObjectFactory.java
+com/sun/org/apache/xml/internal/dtm/ref/SCCS/s.SecuritySupport.java
+com/sun/org/apache/xml/internal/dtm/ref/SCCS/s.SecuritySupport12.java
+com/sun/org/apache/xml/internal/dtm/ref/dom2dtm
+com/sun/org/apache/xml/internal/dtm/ref/dom2dtm/SCCS
+com/sun/org/apache/xml/internal/dtm/ref/dom2dtm/SCCS/s.DOM2DTM.java
+com/sun/org/apache/xml/internal/dtm/ref/dom2dtm/SCCS/s.DOM2DTMdefaultNamespaceDeclarationNode.java
+com/sun/org/apache/xml/internal/dtm/ref/dom2dtm/DOM2DTM.java
+com/sun/org/apache/xml/internal/dtm/ref/dom2dtm/DOM2DTMdefaultNamespaceDeclarationNode.java
+com/sun/org/apache/xml/internal/dtm/ref/sax2dtm
+com/sun/org/apache/xml/internal/dtm/ref/sax2dtm/SCCS
+com/sun/org/apache/xml/internal/dtm/ref/sax2dtm/SCCS/s.SAX2RTFDTM.java
+com/sun/org/apache/xml/internal/dtm/ref/sax2dtm/SCCS/s.SAX2DTM.java
+com/sun/org/apache/xml/internal/dtm/ref/sax2dtm/SCCS/s.SAX2DTM2.java
+com/sun/org/apache/xml/internal/dtm/ref/sax2dtm/SAX2DTM.java
+com/sun/org/apache/xml/internal/dtm/ref/sax2dtm/SAX2DTM2.java
+com/sun/org/apache/xml/internal/dtm/ref/sax2dtm/SAX2RTFDTM.java
+com/sun/org/apache/xml/internal/dtm/ref/DTMAxisIterNodeList.java
+com/sun/org/apache/xml/internal/dtm/ref/ChunkedIntArray.java
+com/sun/org/apache/xml/internal/dtm/ref/CoroutineManager.java
+com/sun/org/apache/xml/internal/dtm/ref/CoroutineParser.java
+com/sun/org/apache/xml/internal/dtm/ref/CustomStringPool.java
+com/sun/org/apache/xml/internal/dtm/ref/DTMAxisIteratorBase.java
+com/sun/org/apache/xml/internal/dtm/ref/DTMChildIterNodeList.java
+com/sun/org/apache/xml/internal/dtm/ref/DTMDefaultBase.java
+com/sun/org/apache/xml/internal/dtm/ref/DTMDefaultBaseIterators.java
+com/sun/org/apache/xml/internal/dtm/ref/DTMDefaultBaseTraversers.java
+com/sun/org/apache/xml/internal/dtm/ref/DTMDocumentImpl.java
+com/sun/org/apache/xml/internal/dtm/ref/SecuritySupport.java
+com/sun/org/apache/xml/internal/dtm/ref/NodeLocator.java
+com/sun/org/apache/xml/internal/dtm/ref/DTMManagerDefault.java
+com/sun/org/apache/xml/internal/dtm/ref/DTMNamedNodeMap.java
+com/sun/org/apache/xml/internal/dtm/ref/DTMNodeIterator.java
+com/sun/org/apache/xml/internal/dtm/ref/DTMNodeList.java
+com/sun/org/apache/xml/internal/dtm/ref/DTMNodeListBase.java
+com/sun/org/apache/xml/internal/dtm/ref/DTMNodeProxy.java
+com/sun/org/apache/xml/internal/dtm/ref/DTMSafeStringPool.java
+com/sun/org/apache/xml/internal/dtm/ref/DTMStringPool.java
+com/sun/org/apache/xml/internal/dtm/ref/DTMTreeWalker.java
+com/sun/org/apache/xml/internal/dtm/ref/EmptyIterator.java
+com/sun/org/apache/xml/internal/dtm/ref/ExpandedNameTable.java
+com/sun/org/apache/xml/internal/dtm/ref/ExtendedType.java
+com/sun/org/apache/xml/internal/dtm/ref/IncrementalSAXSource.java
+com/sun/org/apache/xml/internal/dtm/ref/IncrementalSAXSource_Filter.java
+com/sun/org/apache/xml/internal/dtm/ref/IncrementalSAXSource_Xerces.java
+com/sun/org/apache/xml/internal/dtm/ref/ObjectFactory.java
+com/sun/org/apache/xml/internal/dtm/ref/SecuritySupport12.java
+com/sun/org/apache/xml/internal/dtm/Axis.java
+com/sun/org/apache/xml/internal/dtm/DTM.java
+com/sun/org/apache/xml/internal/dtm/DTMException.java
+com/sun/org/apache/xml/internal/dtm/DTMAxisIterator.java
+com/sun/org/apache/xml/internal/dtm/DTMAxisTraverser.java
+com/sun/org/apache/xml/internal/dtm/DTMConfigurationException.java
+com/sun/org/apache/xml/internal/dtm/DTMDOMException.java
+com/sun/org/apache/xml/internal/dtm/DTMFilter.java
+com/sun/org/apache/xml/internal/dtm/DTMIterator.java
+com/sun/org/apache/xml/internal/dtm/DTMManager.java
+com/sun/org/apache/xml/internal/dtm/DTMWSFilter.java
+com/sun/org/apache/xml/internal/dtm/FactoryFinder.java
+com/sun/org/apache/xml/internal/dtm/ObjectFactory.java
+com/sun/org/apache/xml/internal/dtm/SecuritySupport.java
+com/sun/org/apache/xml/internal/dtm/SecuritySupport12.java
+com/sun/org/apache/xml/internal/res
+com/sun/org/apache/xml/internal/res/SCCS
+com/sun/org/apache/xml/internal/res/SCCS/s.XMLErrorResources.java
+com/sun/org/apache/xml/internal/res/SCCS/s.XMLErrorResources_ca.java
+com/sun/org/apache/xml/internal/res/SCCS/s.XMLErrorResources_cs.java
+com/sun/org/apache/xml/internal/res/SCCS/s.XMLErrorResources_de.java
+com/sun/org/apache/xml/internal/res/SCCS/s.XMLErrorResources_en.java
+com/sun/org/apache/xml/internal/res/SCCS/s.XMLErrorResources_es.java
+com/sun/org/apache/xml/internal/res/SCCS/s.XMLErrorResources_fr.java
+com/sun/org/apache/xml/internal/res/SCCS/s.XMLErrorResources_it.java
+com/sun/org/apache/xml/internal/res/SCCS/s.XMLErrorResources_ja.java
+com/sun/org/apache/xml/internal/res/SCCS/s.XMLErrorResources_ko.java
+com/sun/org/apache/xml/internal/res/SCCS/s.XMLErrorResources_sk.java
+com/sun/org/apache/xml/internal/res/SCCS/s.XMLErrorResources_sv.java
+com/sun/org/apache/xml/internal/res/SCCS/s.XMLErrorResources_tr.java
+com/sun/org/apache/xml/internal/res/SCCS/s.XMLErrorResources_zh_CN.java
+com/sun/org/apache/xml/internal/res/SCCS/s.XMLErrorResources_zh_HK.java
+com/sun/org/apache/xml/internal/res/SCCS/s.XMLErrorResources_zh_TW.java
+com/sun/org/apache/xml/internal/res/SCCS/s.XMLMessages.java
+com/sun/org/apache/xml/internal/res/XMLErrorResources_ca.java
+com/sun/org/apache/xml/internal/res/XMLErrorResources.java
+com/sun/org/apache/xml/internal/res/XMLErrorResources_zh_CN.java
+com/sun/org/apache/xml/internal/res/XMLErrorResources_cs.java
+com/sun/org/apache/xml/internal/res/XMLErrorResources_de.java
+com/sun/org/apache/xml/internal/res/XMLErrorResources_en.java
+com/sun/org/apache/xml/internal/res/XMLErrorResources_es.java
+com/sun/org/apache/xml/internal/res/XMLErrorResources_fr.java
+com/sun/org/apache/xml/internal/res/XMLErrorResources_it.java
+com/sun/org/apache/xml/internal/res/XMLErrorResources_ja.java
+com/sun/org/apache/xml/internal/res/XMLErrorResources_ko.java
+com/sun/org/apache/xml/internal/res/XMLErrorResources_sk.java
+com/sun/org/apache/xml/internal/res/XMLErrorResources_sv.java
+com/sun/org/apache/xml/internal/res/XMLErrorResources_tr.java
+com/sun/org/apache/xml/internal/res/XMLErrorResources_zh_HK.java
+com/sun/org/apache/xml/internal/res/XMLErrorResources_zh_TW.java
+com/sun/org/apache/xml/internal/res/XMLMessages.java
+com/sun/org/apache/xml/internal/serialize
+com/sun/org/apache/xml/internal/serialize/SCCS
+com/sun/org/apache/xml/internal/serialize/SCCS/s.SerializerFactoryImpl.java
+com/sun/org/apache/xml/internal/serialize/SCCS/s.BaseMarkupSerializer.java
+com/sun/org/apache/xml/internal/serialize/SCCS/s.DOMSerializer.java
+com/sun/org/apache/xml/internal/serialize/SCCS/s.DOMSerializerImpl.java
+com/sun/org/apache/xml/internal/serialize/SCCS/s.ElementState.java
+com/sun/org/apache/xml/internal/serialize/SCCS/s.EncodingInfo.java
+com/sun/org/apache/xml/internal/serialize/SCCS/s.Encodings.java
+com/sun/org/apache/xml/internal/serialize/SCCS/s.HTMLEntities.res
+com/sun/org/apache/xml/internal/serialize/SCCS/s.HTMLSerializer.java
+com/sun/org/apache/xml/internal/serialize/SCCS/s.HTMLdtd.java
+com/sun/org/apache/xml/internal/serialize/SCCS/s.IndentPrinter.java
+com/sun/org/apache/xml/internal/serialize/SCCS/s.LineSeparator.java
+com/sun/org/apache/xml/internal/serialize/SCCS/s.Method.java
+com/sun/org/apache/xml/internal/serialize/SCCS/s.ObjectFactory.java
+com/sun/org/apache/xml/internal/serialize/SCCS/s.OutputFormat.java
+com/sun/org/apache/xml/internal/serialize/SCCS/s.Printer.java
+com/sun/org/apache/xml/internal/serialize/SCCS/s.SecuritySupport.java
+com/sun/org/apache/xml/internal/serialize/SCCS/s.SecuritySupport12.java
+com/sun/org/apache/xml/internal/serialize/SCCS/s.Serializer.java
+com/sun/org/apache/xml/internal/serialize/SCCS/s.SerializerFactory.java
+com/sun/org/apache/xml/internal/serialize/SCCS/s.TextSerializer.java
+com/sun/org/apache/xml/internal/serialize/SCCS/s.XHTMLSerializer.java
+com/sun/org/apache/xml/internal/serialize/SCCS/s.XML11Serializer.java
+com/sun/org/apache/xml/internal/serialize/SCCS/s.XMLSerializer.java
+com/sun/org/apache/xml/internal/serialize/BaseMarkupSerializer.java
+com/sun/org/apache/xml/internal/serialize/DOMSerializer.java
+com/sun/org/apache/xml/internal/serialize/DOMSerializerImpl.java
+com/sun/org/apache/xml/internal/serialize/ElementState.java
+com/sun/org/apache/xml/internal/serialize/EncodingInfo.java
+com/sun/org/apache/xml/internal/serialize/Encodings.java
+com/sun/org/apache/xml/internal/serialize/HTMLEntities.res
+com/sun/org/apache/xml/internal/serialize/HTMLSerializer.java
+com/sun/org/apache/xml/internal/serialize/HTMLdtd.java
+com/sun/org/apache/xml/internal/serialize/IndentPrinter.java
+com/sun/org/apache/xml/internal/serialize/LineSeparator.java
+com/sun/org/apache/xml/internal/serialize/Method.java
+com/sun/org/apache/xml/internal/serialize/ObjectFactory.java
+com/sun/org/apache/xml/internal/serialize/OutputFormat.java
+com/sun/org/apache/xml/internal/serialize/Printer.java
+com/sun/org/apache/xml/internal/serialize/SecuritySupport.java
+com/sun/org/apache/xml/internal/serialize/Serializer.java
+com/sun/org/apache/xml/internal/serialize/SecuritySupport12.java
+com/sun/org/apache/xml/internal/serialize/SerializerFactory.java
+com/sun/org/apache/xml/internal/serialize/SerializerFactoryImpl.java
+com/sun/org/apache/xml/internal/serialize/TextSerializer.java
+com/sun/org/apache/xml/internal/serialize/XHTMLSerializer.java
+com/sun/org/apache/xml/internal/serialize/XML11Serializer.java
+com/sun/org/apache/xml/internal/serialize/XMLSerializer.java
+com/sun/org/apache/xml/internal/serializer
+com/sun/org/apache/xml/internal/serializer/SCCS
+com/sun/org/apache/xml/internal/serializer/SCCS/s.OutputPropertiesFactory.java
+com/sun/org/apache/xml/internal/serializer/SCCS/s.AttributesImplSerializer.java
+com/sun/org/apache/xml/internal/serializer/SCCS/s.CharInfo.java
+com/sun/org/apache/xml/internal/serializer/SCCS/s.DOMSerializer.java
+com/sun/org/apache/xml/internal/serializer/SCCS/s.ElemContext.java
+com/sun/org/apache/xml/internal/serializer/SCCS/s.ElemDesc.java
+com/sun/org/apache/xml/internal/serializer/SCCS/s.EmptySerializer.java
+com/sun/org/apache/xml/internal/serializer/SCCS/s.EncodingInfo.java
+com/sun/org/apache/xml/internal/serializer/SCCS/s.Encodings.java
+com/sun/org/apache/xml/internal/serializer/SCCS/s.Encodings.properties
+com/sun/org/apache/xml/internal/serializer/SCCS/s.ExtendedContentHandler.java
+com/sun/org/apache/xml/internal/serializer/SCCS/s.ExtendedLexicalHandler.java
+com/sun/org/apache/xml/internal/serializer/SCCS/s.HTMLEntities.properties
+com/sun/org/apache/xml/internal/serializer/SCCS/s.Method.java
+com/sun/org/apache/xml/internal/serializer/SCCS/s.NamespaceMappings.java
+com/sun/org/apache/xml/internal/serializer/SCCS/s.ObjectFactory.java
+com/sun/org/apache/xml/internal/serializer/SCCS/s.SerializerTraceWriter.java
+com/sun/org/apache/xml/internal/serializer/SCCS/s.OutputPropertyUtils.java
+com/sun/org/apache/xml/internal/serializer/SCCS/s.SecuritySupport.java
+com/sun/org/apache/xml/internal/serializer/SCCS/s.SecuritySupport12.java
+com/sun/org/apache/xml/internal/serializer/SCCS/s.SerializationHandler.java
+com/sun/org/apache/xml/internal/serializer/SCCS/s.Serializer.java
+com/sun/org/apache/xml/internal/serializer/SCCS/s.SerializerBase.java
+com/sun/org/apache/xml/internal/serializer/SCCS/s.SerializerConstants.java
+com/sun/org/apache/xml/internal/serializer/SCCS/s.SerializerFactory.java
+com/sun/org/apache/xml/internal/serializer/SCCS/s.SerializerTrace.java
+com/sun/org/apache/xml/internal/serializer/SCCS/s.ToHTMLSAXHandler.java
+com/sun/org/apache/xml/internal/serializer/SCCS/s.ToHTMLStream.java
+com/sun/org/apache/xml/internal/serializer/SCCS/s.ToSAXHandler.java
+com/sun/org/apache/xml/internal/serializer/SCCS/s.ToStream.java
+com/sun/org/apache/xml/internal/serializer/SCCS/s.Utils.java
+com/sun/org/apache/xml/internal/serializer/SCCS/s.ToTextSAXHandler.java
+com/sun/org/apache/xml/internal/serializer/SCCS/s.ToTextStream.java
+com/sun/org/apache/xml/internal/serializer/SCCS/s.ToUnknownStream.java
+com/sun/org/apache/xml/internal/serializer/SCCS/s.ToXMLSAXHandler.java
+com/sun/org/apache/xml/internal/serializer/SCCS/s.ToXMLStream.java
+com/sun/org/apache/xml/internal/serializer/SCCS/s.TransformStateSetter.java
+com/sun/org/apache/xml/internal/serializer/SCCS/s.WriterToASCI.java
+com/sun/org/apache/xml/internal/serializer/SCCS/s.WriterToUTF8.java
+com/sun/org/apache/xml/internal/serializer/SCCS/s.WriterToUTF8Buffered.java
+com/sun/org/apache/xml/internal/serializer/SCCS/s.XMLEntities.properties
+com/sun/org/apache/xml/internal/serializer/SCCS/s.XSLOutputAttributes.java
+com/sun/org/apache/xml/internal/serializer/SCCS/s.output_html.properties
+com/sun/org/apache/xml/internal/serializer/SCCS/s.output_text.properties
+com/sun/org/apache/xml/internal/serializer/SCCS/s.output_unknown.properties
+com/sun/org/apache/xml/internal/serializer/SCCS/s.output_xml.properties
+com/sun/org/apache/xml/internal/serializer/SCCS/s.package.html
+com/sun/org/apache/xml/internal/serializer/Method.java
+com/sun/org/apache/xml/internal/serializer/AttributesImplSerializer.java
+com/sun/org/apache/xml/internal/serializer/CharInfo.java
+com/sun/org/apache/xml/internal/serializer/DOMSerializer.java
+com/sun/org/apache/xml/internal/serializer/ElemContext.java
+com/sun/org/apache/xml/internal/serializer/ElemDesc.java
+com/sun/org/apache/xml/internal/serializer/EmptySerializer.java
+com/sun/org/apache/xml/internal/serializer/EncodingInfo.java
+com/sun/org/apache/xml/internal/serializer/Encodings.java
+com/sun/org/apache/xml/internal/serializer/Encodings.properties
+com/sun/org/apache/xml/internal/serializer/ExtendedContentHandler.java
+com/sun/org/apache/xml/internal/serializer/ExtendedLexicalHandler.java
+com/sun/org/apache/xml/internal/serializer/HTMLEntities.properties
+com/sun/org/apache/xml/internal/serializer/NamespaceMappings.java
+com/sun/org/apache/xml/internal/serializer/SerializerBase.java
+com/sun/org/apache/xml/internal/serializer/Serializer.java
+com/sun/org/apache/xml/internal/serializer/ObjectFactory.java
+com/sun/org/apache/xml/internal/serializer/OutputPropertiesFactory.java
+com/sun/org/apache/xml/internal/serializer/OutputPropertyUtils.java
+com/sun/org/apache/xml/internal/serializer/SecuritySupport.java
+com/sun/org/apache/xml/internal/serializer/SecuritySupport12.java
+com/sun/org/apache/xml/internal/serializer/SerializationHandler.java
+com/sun/org/apache/xml/internal/serializer/SerializerConstants.java
+com/sun/org/apache/xml/internal/serializer/SerializerFactory.java
+com/sun/org/apache/xml/internal/serializer/SerializerTrace.java
+com/sun/org/apache/xml/internal/serializer/SerializerTraceWriter.java
+com/sun/org/apache/xml/internal/serializer/ToHTMLSAXHandler.java
+com/sun/org/apache/xml/internal/serializer/ToHTMLStream.java
+com/sun/org/apache/xml/internal/serializer/ToSAXHandler.java
+com/sun/org/apache/xml/internal/serializer/ToStream.java
+com/sun/org/apache/xml/internal/serializer/package.html
+com/sun/org/apache/xml/internal/serializer/ToTextSAXHandler.java
+com/sun/org/apache/xml/internal/serializer/ToTextStream.java
+com/sun/org/apache/xml/internal/serializer/ToUnknownStream.java
+com/sun/org/apache/xml/internal/serializer/ToXMLSAXHandler.java
+com/sun/org/apache/xml/internal/serializer/ToXMLStream.java
+com/sun/org/apache/xml/internal/serializer/TransformStateSetter.java
+com/sun/org/apache/xml/internal/serializer/Utils.java
+com/sun/org/apache/xml/internal/serializer/WriterToASCI.java
+com/sun/org/apache/xml/internal/serializer/WriterToUTF8.java
+com/sun/org/apache/xml/internal/serializer/WriterToUTF8Buffered.java
+com/sun/org/apache/xml/internal/serializer/XMLEntities.properties
+com/sun/org/apache/xml/internal/serializer/XSLOutputAttributes.java
+com/sun/org/apache/xml/internal/serializer/output_html.properties
+com/sun/org/apache/xml/internal/serializer/output_text.properties
+com/sun/org/apache/xml/internal/serializer/output_unknown.properties
+com/sun/org/apache/xml/internal/serializer/output_xml.properties
+com/sun/org/apache/xml/internal/utils
+com/sun/org/apache/xml/internal/utils/SCCS
+com/sun/org/apache/xml/internal/utils/SCCS/s.BoolStack.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.AttList.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.DefaultErrorHandler.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.CharKey.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.Constants.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.DOM2Helper.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.DOMBuilder.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.DOMHelper.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.DOMOrder.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.FastStringBuffer.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.ElemDesc.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.ListingErrorHandler.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.Hashtree2Node.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.IntStack.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.IntVector.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.NamespaceSupport2.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.NSInfo.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.LocaleUtility.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.MutableAttrListImpl.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.NameSpace.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.ObjectFactory.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.NodeConsumer.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.NodeVector.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.PrefixResolverDefault.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.ObjectPool.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.ObjectStack.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.ObjectVector.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.PrefixResolver.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.SAXSourceLocator.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.QName.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.RawCharacterHandler.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.SecuritySupport.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.StringToStringTableVector.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.SecuritySupport12.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.SerializableLocatorImpl.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.StopParseException.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.StringBufferPool.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.StringComparable.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.StringToIntTable.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.StringToStringTable.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.StylesheetPIHandler.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.StringVector.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.UnImplNode.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.Trie.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.SuballocatedByteVector.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.SuballocatedIntVector.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.SystemIDResolver.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.ThreadControllerWrapper.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.TreeWalker.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.URI.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.WrappedRuntimeException.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.WrongParserException.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.XMLChar.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.XMLCharacterRecognizer.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.XMLReaderManager.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.XMLString.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.XMLStringDefault.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.XMLStringFactory.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.XMLStringFactoryDefault.java
+com/sun/org/apache/xml/internal/utils/SCCS/s.package.html
+com/sun/org/apache/xml/internal/utils/res
+com/sun/org/apache/xml/internal/utils/res/SCCS
+com/sun/org/apache/xml/internal/utils/res/SCCS/s.XResourceBundleBase.java
+com/sun/org/apache/xml/internal/utils/res/SCCS/s.XResourceBundle.java
+com/sun/org/apache/xml/internal/utils/res/SCCS/s.XResources_de.java
+com/sun/org/apache/xml/internal/utils/res/SCCS/s.XResources_en.java
+com/sun/org/apache/xml/internal/utils/res/SCCS/s.XResources_es.java
+com/sun/org/apache/xml/internal/utils/res/SCCS/s.XResources_fr.java
+com/sun/org/apache/xml/internal/utils/res/SCCS/s.XResources_it.java
+com/sun/org/apache/xml/internal/utils/res/SCCS/s.XResources_ja_JP_A.java
+com/sun/org/apache/xml/internal/utils/res/SCCS/s.XResources_ja_JP_HA.java
+com/sun/org/apache/xml/internal/utils/res/SCCS/s.XResources_ja_JP_HI.java
+com/sun/org/apache/xml/internal/utils/res/SCCS/s.XResources_ja_JP_I.java
+com/sun/org/apache/xml/internal/utils/res/SCCS/s.XResources_ko.java
+com/sun/org/apache/xml/internal/utils/res/SCCS/s.XResources_sv.java
+com/sun/org/apache/xml/internal/utils/res/SCCS/s.XResources_zh_CN.java
+com/sun/org/apache/xml/internal/utils/res/SCCS/s.XResources_zh_HK.java
+com/sun/org/apache/xml/internal/utils/res/SCCS/s.XResources_zh_TW.java
+com/sun/org/apache/xml/internal/utils/res/XResourceBundleBase.java
+com/sun/org/apache/xml/internal/utils/res/XResourceBundle.java
+com/sun/org/apache/xml/internal/utils/res/XResources_ja_JP_HA.java
+com/sun/org/apache/xml/internal/utils/res/XResources_de.java
+com/sun/org/apache/xml/internal/utils/res/XResources_en.java
+com/sun/org/apache/xml/internal/utils/res/XResources_es.java
+com/sun/org/apache/xml/internal/utils/res/XResources_fr.java
+com/sun/org/apache/xml/internal/utils/res/XResources_it.java
+com/sun/org/apache/xml/internal/utils/res/XResources_ja_JP_A.java
+com/sun/org/apache/xml/internal/utils/res/XResources_ja_JP_HI.java
+com/sun/org/apache/xml/internal/utils/res/XResources_ja_JP_I.java
+com/sun/org/apache/xml/internal/utils/res/XResources_ko.java
+com/sun/org/apache/xml/internal/utils/res/XResources_sv.java
+com/sun/org/apache/xml/internal/utils/res/XResources_zh_CN.java
+com/sun/org/apache/xml/internal/utils/res/XResources_zh_HK.java
+com/sun/org/apache/xml/internal/utils/res/XResources_zh_TW.java
+com/sun/org/apache/xml/internal/utils/synthetic
+com/sun/org/apache/xml/internal/utils/synthetic/SCCS
+com/sun/org/apache/xml/internal/utils/synthetic/SCCS/s.JavaUtils.java
+com/sun/org/apache/xml/internal/utils/synthetic/SCCS/s.Class.java
+com/sun/org/apache/xml/internal/utils/synthetic/SCCS/s.SynthesisException.java
+com/sun/org/apache/xml/internal/utils/synthetic/SCCS/s.TestDriver.java
+com/sun/org/apache/xml/internal/utils/synthetic/reflection
+com/sun/org/apache/xml/internal/utils/synthetic/reflection/SCCS
+com/sun/org/apache/xml/internal/utils/synthetic/reflection/SCCS/s.Constructor.java
+com/sun/org/apache/xml/internal/utils/synthetic/reflection/SCCS/s.EntryPoint.java
+com/sun/org/apache/xml/internal/utils/synthetic/reflection/SCCS/s.Field.java
+com/sun/org/apache/xml/internal/utils/synthetic/reflection/SCCS/s.Member.java
+com/sun/org/apache/xml/internal/utils/synthetic/reflection/SCCS/s.Method.java
+com/sun/org/apache/xml/internal/utils/synthetic/reflection/Constructor.java
+com/sun/org/apache/xml/internal/utils/synthetic/reflection/EntryPoint.java
+com/sun/org/apache/xml/internal/utils/synthetic/reflection/Field.java
+com/sun/org/apache/xml/internal/utils/synthetic/reflection/Member.java
+com/sun/org/apache/xml/internal/utils/synthetic/reflection/Method.java
+com/sun/org/apache/xml/internal/utils/synthetic/JavaUtils.java
+com/sun/org/apache/xml/internal/utils/synthetic/Class.java
+com/sun/org/apache/xml/internal/utils/synthetic/SynthesisException.java
+com/sun/org/apache/xml/internal/utils/synthetic/TestDriver.java
+com/sun/org/apache/xml/internal/utils/AttList.java
+com/sun/org/apache/xml/internal/utils/BoolStack.java
+com/sun/org/apache/xml/internal/utils/CharKey.java
+com/sun/org/apache/xml/internal/utils/Constants.java
+com/sun/org/apache/xml/internal/utils/DOM2Helper.java
+com/sun/org/apache/xml/internal/utils/DOMBuilder.java
+com/sun/org/apache/xml/internal/utils/DOMHelper.java
+com/sun/org/apache/xml/internal/utils/DOMOrder.java
+com/sun/org/apache/xml/internal/utils/ElemDesc.java
+com/sun/org/apache/xml/internal/utils/SerializableLocatorImpl.java
+com/sun/org/apache/xml/internal/utils/DefaultErrorHandler.java
+com/sun/org/apache/xml/internal/utils/FastStringBuffer.java
+com/sun/org/apache/xml/internal/utils/Hashtree2Node.java
+com/sun/org/apache/xml/internal/utils/IntStack.java
+com/sun/org/apache/xml/internal/utils/IntVector.java
+com/sun/org/apache/xml/internal/utils/ListingErrorHandler.java
+com/sun/org/apache/xml/internal/utils/LocaleUtility.java
+com/sun/org/apache/xml/internal/utils/MutableAttrListImpl.java
+com/sun/org/apache/xml/internal/utils/NSInfo.java
+com/sun/org/apache/xml/internal/utils/NameSpace.java
+com/sun/org/apache/xml/internal/utils/NamespaceSupport2.java
+com/sun/org/apache/xml/internal/utils/NodeConsumer.java
+com/sun/org/apache/xml/internal/utils/NodeVector.java
+com/sun/org/apache/xml/internal/utils/ObjectFactory.java
+com/sun/org/apache/xml/internal/utils/ObjectPool.java
+com/sun/org/apache/xml/internal/utils/ObjectStack.java
+com/sun/org/apache/xml/internal/utils/ObjectVector.java
+com/sun/org/apache/xml/internal/utils/PrefixResolver.java
+com/sun/org/apache/xml/internal/utils/PrefixResolverDefault.java
+com/sun/org/apache/xml/internal/utils/QName.java
+com/sun/org/apache/xml/internal/utils/RawCharacterHandler.java
+com/sun/org/apache/xml/internal/utils/SAXSourceLocator.java
+com/sun/org/apache/xml/internal/utils/SecuritySupport.java
+com/sun/org/apache/xml/internal/utils/StringVector.java
+com/sun/org/apache/xml/internal/utils/SecuritySupport12.java
+com/sun/org/apache/xml/internal/utils/StringToStringTable.java
+com/sun/org/apache/xml/internal/utils/StopParseException.java
+com/sun/org/apache/xml/internal/utils/StringBufferPool.java
+com/sun/org/apache/xml/internal/utils/StringComparable.java
+com/sun/org/apache/xml/internal/utils/StringToIntTable.java
+com/sun/org/apache/xml/internal/utils/XMLReaderManager.java
+com/sun/org/apache/xml/internal/utils/Trie.java
+com/sun/org/apache/xml/internal/utils/StringToStringTableVector.java
+com/sun/org/apache/xml/internal/utils/StylesheetPIHandler.java
+com/sun/org/apache/xml/internal/utils/SuballocatedByteVector.java
+com/sun/org/apache/xml/internal/utils/SuballocatedIntVector.java
+com/sun/org/apache/xml/internal/utils/SystemIDResolver.java
+com/sun/org/apache/xml/internal/utils/ThreadControllerWrapper.java
+com/sun/org/apache/xml/internal/utils/TreeWalker.java
+com/sun/org/apache/xml/internal/utils/URI.java
+com/sun/org/apache/xml/internal/utils/UnImplNode.java
+com/sun/org/apache/xml/internal/utils/XMLChar.java
+com/sun/org/apache/xml/internal/utils/XMLString.java
+com/sun/org/apache/xml/internal/utils/WrappedRuntimeException.java
+com/sun/org/apache/xml/internal/utils/WrongParserException.java
+com/sun/org/apache/xml/internal/utils/XMLStringFactoryDefault.java
+com/sun/org/apache/xml/internal/utils/XMLCharacterRecognizer.java
+com/sun/org/apache/xml/internal/utils/XMLStringDefault.java
+com/sun/org/apache/xml/internal/utils/XMLStringFactory.java
+com/sun/org/apache/xml/internal/utils/package.html
+com/sun/org/apache/xpath
+com/sun/org/apache/xpath/internal
+com/sun/org/apache/xpath/internal/SCCS
+com/sun/org/apache/xpath/internal/SCCS/s.Expression.java
+com/sun/org/apache/xpath/internal/SCCS/s.Arg.java
+com/sun/org/apache/xpath/internal/SCCS/s.ExtensionsProvider.java
+com/sun/org/apache/xpath/internal/SCCS/s.CachedXPathAPI.java
+com/sun/org/apache/xpath/internal/SCCS/s.ExpressionNode.java
+com/sun/org/apache/xpath/internal/SCCS/s.ExpressionOwner.java
+com/sun/org/apache/xpath/internal/SCCS/s.SourceTreeManager.java
+com/sun/org/apache/xpath/internal/SCCS/s.FoundIndex.java
+com/sun/org/apache/xpath/internal/SCCS/s.NodeSet.java
+com/sun/org/apache/xpath/internal/SCCS/s.NodeSetDTM.java
+com/sun/org/apache/xpath/internal/SCCS/s.SourceTree.java
+com/sun/org/apache/xpath/internal/SCCS/s.VariableStack.java
+com/sun/org/apache/xpath/internal/SCCS/s.XPathContext.java
+com/sun/org/apache/xpath/internal/SCCS/s.XPath.java
+com/sun/org/apache/xpath/internal/SCCS/s.WhitespaceStrippingElementMatcher.java
+com/sun/org/apache/xpath/internal/SCCS/s.XPathAPI.java
+com/sun/org/apache/xpath/internal/SCCS/s.XPathProcessorException.java
+com/sun/org/apache/xpath/internal/SCCS/s.XPathException.java
+com/sun/org/apache/xpath/internal/SCCS/s.XPathFactory.java
+com/sun/org/apache/xpath/internal/SCCS/s.XPathVisitable.java
+com/sun/org/apache/xpath/internal/SCCS/s.XPathVisitor.java
+com/sun/org/apache/xpath/internal/SCCS/s.package.html
+com/sun/org/apache/xpath/internal/axes
+com/sun/org/apache/xpath/internal/axes/SCCS
+com/sun/org/apache/xpath/internal/axes/SCCS/s.FilterExprIteratorSimple.java
+com/sun/org/apache/xpath/internal/axes/SCCS/s.AttributeIterator.java
+com/sun/org/apache/xpath/internal/axes/SCCS/s.AxesWalker.java
+com/sun/org/apache/xpath/internal/axes/SCCS/s.BasicTestIterator.java
+com/sun/org/apache/xpath/internal/axes/SCCS/s.ChildIterator.java
+com/sun/org/apache/xpath/internal/axes/SCCS/s.ChildTestIterator.java
+com/sun/org/apache/xpath/internal/axes/SCCS/s.ContextNodeList.java
+com/sun/org/apache/xpath/internal/axes/SCCS/s.DescendantIterator.java
+com/sun/org/apache/xpath/internal/axes/SCCS/s.FilterExprIterator.java
+com/sun/org/apache/xpath/internal/axes/SCCS/s.HasPositionalPredChecker.java
+com/sun/org/apache/xpath/internal/axes/SCCS/s.FilterExprWalker.java
+com/sun/org/apache/xpath/internal/axes/SCCS/s.IteratorPool.java
+com/sun/org/apache/xpath/internal/axes/SCCS/s.LocPathIterator.java
+com/sun/org/apache/xpath/internal/axes/SCCS/s.OneStepIteratorForward.java
+com/sun/org/apache/xpath/internal/axes/SCCS/s.MatchPatternIterator.java
+com/sun/org/apache/xpath/internal/axes/SCCS/s.NodeSequence.java
+com/sun/org/apache/xpath/internal/axes/SCCS/s.OneStepIterator.java
+com/sun/org/apache/xpath/internal/axes/SCCS/s.PredicatedNodeTest.java
+com/sun/org/apache/xpath/internal/axes/SCCS/s.PathComponent.java
+com/sun/org/apache/xpath/internal/axes/SCCS/s.ReverseAxesWalker.java
+com/sun/org/apache/xpath/internal/axes/SCCS/s.RTFIterator.java
+com/sun/org/apache/xpath/internal/axes/SCCS/s.SelfIteratorNoPredicate.java
+com/sun/org/apache/xpath/internal/axes/SCCS/s.SubContextList.java
+com/sun/org/apache/xpath/internal/axes/SCCS/s.UnionChildIterator.java
+com/sun/org/apache/xpath/internal/axes/SCCS/s.UnionPathIterator.java
+com/sun/org/apache/xpath/internal/axes/SCCS/s.WalkerFactory.java
+com/sun/org/apache/xpath/internal/axes/SCCS/s.WalkingIterator.java
+com/sun/org/apache/xpath/internal/axes/SCCS/s.package.html
+com/sun/org/apache/xpath/internal/axes/SCCS/s.WalkingIteratorSorted.java
+com/sun/org/apache/xpath/internal/axes/FilterExprIteratorSimple.java
+com/sun/org/apache/xpath/internal/axes/AttributeIterator.java
+com/sun/org/apache/xpath/internal/axes/AxesWalker.java
+com/sun/org/apache/xpath/internal/axes/BasicTestIterator.java
+com/sun/org/apache/xpath/internal/axes/ChildIterator.java
+com/sun/org/apache/xpath/internal/axes/ChildTestIterator.java
+com/sun/org/apache/xpath/internal/axes/ContextNodeList.java
+com/sun/org/apache/xpath/internal/axes/DescendantIterator.java
+com/sun/org/apache/xpath/internal/axes/FilterExprIterator.java
+com/sun/org/apache/xpath/internal/axes/HasPositionalPredChecker.java
+com/sun/org/apache/xpath/internal/axes/FilterExprWalker.java
+com/sun/org/apache/xpath/internal/axes/LocPathIterator.java
+com/sun/org/apache/xpath/internal/axes/IteratorPool.java
+com/sun/org/apache/xpath/internal/axes/MatchPatternIterator.java
+com/sun/org/apache/xpath/internal/axes/NodeSequence.java
+com/sun/org/apache/xpath/internal/axes/OneStepIterator.java
+com/sun/org/apache/xpath/internal/axes/OneStepIteratorForward.java
+com/sun/org/apache/xpath/internal/axes/PathComponent.java
+com/sun/org/apache/xpath/internal/axes/PredicatedNodeTest.java
+com/sun/org/apache/xpath/internal/axes/RTFIterator.java
+com/sun/org/apache/xpath/internal/axes/ReverseAxesWalker.java
+com/sun/org/apache/xpath/internal/axes/SelfIteratorNoPredicate.java
+com/sun/org/apache/xpath/internal/axes/SubContextList.java
+com/sun/org/apache/xpath/internal/axes/UnionChildIterator.java
+com/sun/org/apache/xpath/internal/axes/UnionPathIterator.java
+com/sun/org/apache/xpath/internal/axes/WalkerFactory.java
+com/sun/org/apache/xpath/internal/axes/WalkingIterator.java
+com/sun/org/apache/xpath/internal/axes/WalkingIteratorSorted.java
+com/sun/org/apache/xpath/internal/axes/package.html
+com/sun/org/apache/xpath/internal/compiler
+com/sun/org/apache/xpath/internal/compiler/SCCS
+com/sun/org/apache/xpath/internal/compiler/SCCS/s.FuncLoader.java
+com/sun/org/apache/xpath/internal/compiler/SCCS/s.Compiler.java
+com/sun/org/apache/xpath/internal/compiler/SCCS/s.FunctionTable.java
+com/sun/org/apache/xpath/internal/compiler/SCCS/s.Keywords.java
+com/sun/org/apache/xpath/internal/compiler/SCCS/s.Lexer.java
+com/sun/org/apache/xpath/internal/compiler/SCCS/s.ObjectFactory.java
+com/sun/org/apache/xpath/internal/compiler/SCCS/s.OpCodes.java
+com/sun/org/apache/xpath/internal/compiler/SCCS/s.OpMap.java
+com/sun/org/apache/xpath/internal/compiler/SCCS/s.OpMapVector.java
+com/sun/org/apache/xpath/internal/compiler/SCCS/s.PsuedoNames.java
+com/sun/org/apache/xpath/internal/compiler/SCCS/s.SecuritySupport.java
+com/sun/org/apache/xpath/internal/compiler/SCCS/s.SecuritySupport12.java
+com/sun/org/apache/xpath/internal/compiler/SCCS/s.XPathDumper.java
+com/sun/org/apache/xpath/internal/compiler/SCCS/s.XPathParser.java
+com/sun/org/apache/xpath/internal/compiler/SCCS/s.package.html
+com/sun/org/apache/xpath/internal/compiler/FunctionTable.java
+com/sun/org/apache/xpath/internal/compiler/Compiler.java
+com/sun/org/apache/xpath/internal/compiler/FuncLoader.java
+com/sun/org/apache/xpath/internal/compiler/SecuritySupport.java
+com/sun/org/apache/xpath/internal/compiler/Keywords.java
+com/sun/org/apache/xpath/internal/compiler/Lexer.java
+com/sun/org/apache/xpath/internal/compiler/ObjectFactory.java
+com/sun/org/apache/xpath/internal/compiler/OpCodes.java
+com/sun/org/apache/xpath/internal/compiler/OpMap.java
+com/sun/org/apache/xpath/internal/compiler/OpMapVector.java
+com/sun/org/apache/xpath/internal/compiler/PsuedoNames.java
+com/sun/org/apache/xpath/internal/compiler/SecuritySupport12.java
+com/sun/org/apache/xpath/internal/compiler/XPathDumper.java
+com/sun/org/apache/xpath/internal/compiler/XPathParser.java
+com/sun/org/apache/xpath/internal/compiler/package.html
+com/sun/org/apache/xpath/internal/functions
+com/sun/org/apache/xpath/internal/functions/SCCS
+com/sun/org/apache/xpath/internal/functions/SCCS/s.FuncDoclocation.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.FuncBoolean.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.FuncCeiling.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.FuncConcat.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.FuncContains.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.FuncCount.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.FuncCurrent.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.FuncExtElementAvailable.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.FuncExtFunction.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.FuncExtFunctionAvailable.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.FuncFalse.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.FuncFloor.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.FuncGenerateId.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.FuncId.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.FuncLang.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.FuncNormalizeSpace.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.FuncLast.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.FuncLocalPart.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.FuncNamespace.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.FuncNumber.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.FuncNot.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.FuncSubstringAfter.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.FuncPosition.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.FuncQname.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.FuncRound.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.FuncStartsWith.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.FuncString.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.FuncStringLength.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.FuncSubstring.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.FuncSubstringBefore.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.FuncSum.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.FuncSystemProperty.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.FuncTranslate.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.FuncTrue.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.FuncUnparsedEntityURI.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.Function.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.Function2Args.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.Function3Args.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.FunctionDef1Arg.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.FunctionMultiArgs.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.FunctionOneArg.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.ObjectFactory.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.SecuritySupport.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.SecuritySupport12.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.WrongNumberArgsException.java
+com/sun/org/apache/xpath/internal/functions/SCCS/s.package.html
+com/sun/org/apache/xpath/internal/functions/FuncDoclocation.java
+com/sun/org/apache/xpath/internal/functions/FuncBoolean.java
+com/sun/org/apache/xpath/internal/functions/FuncCeiling.java
+com/sun/org/apache/xpath/internal/functions/FuncConcat.java
+com/sun/org/apache/xpath/internal/functions/FuncContains.java
+com/sun/org/apache/xpath/internal/functions/FuncCount.java
+com/sun/org/apache/xpath/internal/functions/FuncCurrent.java
+com/sun/org/apache/xpath/internal/functions/FuncId.java
+com/sun/org/apache/xpath/internal/functions/FuncExtElementAvailable.java
+com/sun/org/apache/xpath/internal/functions/FuncExtFunction.java
+com/sun/org/apache/xpath/internal/functions/FuncExtFunctionAvailable.java
+com/sun/org/apache/xpath/internal/functions/FuncFalse.java
+com/sun/org/apache/xpath/internal/functions/FuncFloor.java
+com/sun/org/apache/xpath/internal/functions/FuncGenerateId.java
+com/sun/org/apache/xpath/internal/functions/FuncLang.java
+com/sun/org/apache/xpath/internal/functions/FuncLast.java
+com/sun/org/apache/xpath/internal/functions/FuncNot.java
+com/sun/org/apache/xpath/internal/functions/FuncLocalPart.java
+com/sun/org/apache/xpath/internal/functions/FuncNamespace.java
+com/sun/org/apache/xpath/internal/functions/FuncNormalizeSpace.java
+com/sun/org/apache/xpath/internal/functions/FuncNumber.java
+com/sun/org/apache/xpath/internal/functions/FuncPosition.java
+com/sun/org/apache/xpath/internal/functions/FuncQname.java
+com/sun/org/apache/xpath/internal/functions/FuncRound.java
+com/sun/org/apache/xpath/internal/functions/FuncStartsWith.java
+com/sun/org/apache/xpath/internal/functions/FuncString.java
+com/sun/org/apache/xpath/internal/functions/FuncStringLength.java
+com/sun/org/apache/xpath/internal/functions/FuncSubstring.java
+com/sun/org/apache/xpath/internal/functions/FuncSubstringAfter.java
+com/sun/org/apache/xpath/internal/functions/FuncSubstringBefore.java
+com/sun/org/apache/xpath/internal/functions/FuncSum.java
+com/sun/org/apache/xpath/internal/functions/FuncSystemProperty.java
+com/sun/org/apache/xpath/internal/functions/FuncTranslate.java
+com/sun/org/apache/xpath/internal/functions/FuncTrue.java
+com/sun/org/apache/xpath/internal/functions/FuncUnparsedEntityURI.java
+com/sun/org/apache/xpath/internal/functions/Function.java
+com/sun/org/apache/xpath/internal/functions/Function2Args.java
+com/sun/org/apache/xpath/internal/functions/Function3Args.java
+com/sun/org/apache/xpath/internal/functions/FunctionDef1Arg.java
+com/sun/org/apache/xpath/internal/functions/FunctionMultiArgs.java
+com/sun/org/apache/xpath/internal/functions/FunctionOneArg.java
+com/sun/org/apache/xpath/internal/functions/ObjectFactory.java
+com/sun/org/apache/xpath/internal/functions/SecuritySupport.java
+com/sun/org/apache/xpath/internal/functions/SecuritySupport12.java
+com/sun/org/apache/xpath/internal/functions/WrongNumberArgsException.java
+com/sun/org/apache/xpath/internal/functions/package.html
+com/sun/org/apache/xpath/internal/jaxp
+com/sun/org/apache/xpath/internal/jaxp/SCCS
+com/sun/org/apache/xpath/internal/jaxp/SCCS/s.JAXPExtensionsProvider.java
+com/sun/org/apache/xpath/internal/jaxp/SCCS/s.JAXPPrefixResolver.java
+com/sun/org/apache/xpath/internal/jaxp/SCCS/s.JAXPVariableStack.java
+com/sun/org/apache/xpath/internal/jaxp/SCCS/s.XPathExpressionImpl.java
+com/sun/org/apache/xpath/internal/jaxp/SCCS/s.XPathFactoryImpl.java
+com/sun/org/apache/xpath/internal/jaxp/SCCS/s.XPathImpl.java
+com/sun/org/apache/xpath/internal/jaxp/JAXPExtensionsProvider.java
+com/sun/org/apache/xpath/internal/jaxp/JAXPPrefixResolver.java
+com/sun/org/apache/xpath/internal/jaxp/JAXPVariableStack.java
+com/sun/org/apache/xpath/internal/jaxp/XPathExpressionImpl.java
+com/sun/org/apache/xpath/internal/jaxp/XPathFactoryImpl.java
+com/sun/org/apache/xpath/internal/jaxp/XPathImpl.java
+com/sun/org/apache/xpath/internal/objects
+com/sun/org/apache/xpath/internal/objects/SCCS
+com/sun/org/apache/xpath/internal/objects/SCCS/s.XBooleanStatic.java
+com/sun/org/apache/xpath/internal/objects/SCCS/s.XBoolean.java
+com/sun/org/apache/xpath/internal/objects/SCCS/s.XRTreeFragSelectWrapper.java
+com/sun/org/apache/xpath/internal/objects/SCCS/s.XMLStringFactoryImpl.java
+com/sun/org/apache/xpath/internal/objects/SCCS/s.XNodeSet.java
+com/sun/org/apache/xpath/internal/objects/SCCS/s.XNodeSetForDOM.java
+com/sun/org/apache/xpath/internal/objects/SCCS/s.XNull.java
+com/sun/org/apache/xpath/internal/objects/SCCS/s.XNumber.java
+com/sun/org/apache/xpath/internal/objects/SCCS/s.XObject.java
+com/sun/org/apache/xpath/internal/objects/SCCS/s.XObjectFactory.java
+com/sun/org/apache/xpath/internal/objects/SCCS/s.XRTreeFrag.java
+com/sun/org/apache/xpath/internal/objects/SCCS/s.XStringForChars.java
+com/sun/org/apache/xpath/internal/objects/SCCS/s.XString.java
+com/sun/org/apache/xpath/internal/objects/SCCS/s.XStringForFSB.java
+com/sun/org/apache/xpath/internal/objects/SCCS/s.package.html
+com/sun/org/apache/xpath/internal/objects/XBooleanStatic.java
+com/sun/org/apache/xpath/internal/objects/XBoolean.java
+com/sun/org/apache/xpath/internal/objects/XMLStringFactoryImpl.java
+com/sun/org/apache/xpath/internal/objects/XNodeSet.java
+com/sun/org/apache/xpath/internal/objects/XNodeSetForDOM.java
+com/sun/org/apache/xpath/internal/objects/XNull.java
+com/sun/org/apache/xpath/internal/objects/XNumber.java
+com/sun/org/apache/xpath/internal/objects/XObject.java
+com/sun/org/apache/xpath/internal/objects/XObjectFactory.java
+com/sun/org/apache/xpath/internal/objects/XRTreeFrag.java
+com/sun/org/apache/xpath/internal/objects/XRTreeFragSelectWrapper.java
+com/sun/org/apache/xpath/internal/objects/XString.java
+com/sun/org/apache/xpath/internal/objects/XStringForChars.java
+com/sun/org/apache/xpath/internal/objects/XStringForFSB.java
+com/sun/org/apache/xpath/internal/objects/package.html
+com/sun/org/apache/xpath/internal/operations
+com/sun/org/apache/xpath/internal/operations/SCCS
+com/sun/org/apache/xpath/internal/operations/SCCS/s.Equals.java
+com/sun/org/apache/xpath/internal/operations/SCCS/s.And.java
+com/sun/org/apache/xpath/internal/operations/SCCS/s.Bool.java
+com/sun/org/apache/xpath/internal/operations/SCCS/s.Div.java
+com/sun/org/apache/xpath/internal/operations/SCCS/s.NotEquals.java
+com/sun/org/apache/xpath/internal/operations/SCCS/s.Gt.java
+com/sun/org/apache/xpath/internal/operations/SCCS/s.Gte.java
+com/sun/org/apache/xpath/internal/operations/SCCS/s.Lt.java
+com/sun/org/apache/xpath/internal/operations/SCCS/s.Lte.java
+com/sun/org/apache/xpath/internal/operations/SCCS/s.Minus.java
+com/sun/org/apache/xpath/internal/operations/SCCS/s.Mod.java
+com/sun/org/apache/xpath/internal/operations/SCCS/s.Mult.java
+com/sun/org/apache/xpath/internal/operations/SCCS/s.Neg.java
+com/sun/org/apache/xpath/internal/operations/SCCS/s.UnaryOperation.java
+com/sun/org/apache/xpath/internal/operations/SCCS/s.Number.java
+com/sun/org/apache/xpath/internal/operations/SCCS/s.Operation.java
+com/sun/org/apache/xpath/internal/operations/SCCS/s.Or.java
+com/sun/org/apache/xpath/internal/operations/SCCS/s.Plus.java
+com/sun/org/apache/xpath/internal/operations/SCCS/s.Quo.java
+com/sun/org/apache/xpath/internal/operations/SCCS/s.String.java
+com/sun/org/apache/xpath/internal/operations/SCCS/s.Variable.java
+com/sun/org/apache/xpath/internal/operations/SCCS/s.VariableSafeAbsRef.java
+com/sun/org/apache/xpath/internal/operations/SCCS/s.package.html
+com/sun/org/apache/xpath/internal/operations/NotEquals.java
+com/sun/org/apache/xpath/internal/operations/And.java
+com/sun/org/apache/xpath/internal/operations/Bool.java
+com/sun/org/apache/xpath/internal/operations/Div.java
+com/sun/org/apache/xpath/internal/operations/Equals.java
+com/sun/org/apache/xpath/internal/operations/Gt.java
+com/sun/org/apache/xpath/internal/operations/Gte.java
+com/sun/org/apache/xpath/internal/operations/Lt.java
+com/sun/org/apache/xpath/internal/operations/Lte.java
+com/sun/org/apache/xpath/internal/operations/Minus.java
+com/sun/org/apache/xpath/internal/operations/Mod.java
+com/sun/org/apache/xpath/internal/operations/Mult.java
+com/sun/org/apache/xpath/internal/operations/Neg.java
+com/sun/org/apache/xpath/internal/operations/UnaryOperation.java
+com/sun/org/apache/xpath/internal/operations/Number.java
+com/sun/org/apache/xpath/internal/operations/Operation.java
+com/sun/org/apache/xpath/internal/operations/Or.java
+com/sun/org/apache/xpath/internal/operations/Plus.java
+com/sun/org/apache/xpath/internal/operations/Quo.java
+com/sun/org/apache/xpath/internal/operations/String.java
+com/sun/org/apache/xpath/internal/operations/Variable.java
+com/sun/org/apache/xpath/internal/operations/VariableSafeAbsRef.java
+com/sun/org/apache/xpath/internal/operations/package.html
+com/sun/org/apache/xpath/internal/patterns
+com/sun/org/apache/xpath/internal/patterns/SCCS
+com/sun/org/apache/xpath/internal/patterns/SCCS/s.ContextMatchStepPattern.java
+com/sun/org/apache/xpath/internal/patterns/SCCS/s.FunctionPattern.java
+com/sun/org/apache/xpath/internal/patterns/SCCS/s.NodeTest.java
+com/sun/org/apache/xpath/internal/patterns/SCCS/s.NodeTestFilter.java
+com/sun/org/apache/xpath/internal/patterns/SCCS/s.StepPattern.java
+com/sun/org/apache/xpath/internal/patterns/SCCS/s.UnionPattern.java
+com/sun/org/apache/xpath/internal/patterns/SCCS/s.package.html
+com/sun/org/apache/xpath/internal/patterns/ContextMatchStepPattern.java
+com/sun/org/apache/xpath/internal/patterns/FunctionPattern.java
+com/sun/org/apache/xpath/internal/patterns/NodeTest.java
+com/sun/org/apache/xpath/internal/patterns/NodeTestFilter.java
+com/sun/org/apache/xpath/internal/patterns/StepPattern.java
+com/sun/org/apache/xpath/internal/patterns/UnionPattern.java
+com/sun/org/apache/xpath/internal/patterns/package.html
+com/sun/org/apache/xpath/internal/res
+com/sun/org/apache/xpath/internal/res/SCCS
+com/sun/org/apache/xpath/internal/res/SCCS/s.XPATHErrorResources_de.java
+com/sun/org/apache/xpath/internal/res/SCCS/s.XPATHErrorResources.java
+com/sun/org/apache/xpath/internal/res/SCCS/s.XPATHErrorResources_en.java
+com/sun/org/apache/xpath/internal/res/SCCS/s.XPATHErrorResources_es.java
+com/sun/org/apache/xpath/internal/res/SCCS/s.XPATHErrorResources_fr.java
+com/sun/org/apache/xpath/internal/res/SCCS/s.XPATHErrorResources_it.java
+com/sun/org/apache/xpath/internal/res/SCCS/s.XPATHErrorResources_ja.java
+com/sun/org/apache/xpath/internal/res/SCCS/s.XPATHErrorResources_ko.java
+com/sun/org/apache/xpath/internal/res/SCCS/s.XPATHErrorResources_sv.java
+com/sun/org/apache/xpath/internal/res/SCCS/s.XPATHErrorResources_zh_CN.java
+com/sun/org/apache/xpath/internal/res/SCCS/s.XPATHMessages.java
+com/sun/org/apache/xpath/internal/res/SCCS/s.XPATHErrorResources_zh_HK.java
+com/sun/org/apache/xpath/internal/res/SCCS/s.XPATHErrorResources_zh_TW.java
+com/sun/org/apache/xpath/internal/res/SCCS/s.package.html
+com/sun/org/apache/xpath/internal/res/XPATHErrorResources_zh_CN.java
+com/sun/org/apache/xpath/internal/res/XPATHErrorResources.java
+com/sun/org/apache/xpath/internal/res/XPATHErrorResources_de.java
+com/sun/org/apache/xpath/internal/res/XPATHErrorResources_en.java
+com/sun/org/apache/xpath/internal/res/XPATHErrorResources_es.java
+com/sun/org/apache/xpath/internal/res/XPATHErrorResources_fr.java
+com/sun/org/apache/xpath/internal/res/XPATHErrorResources_it.java
+com/sun/org/apache/xpath/internal/res/XPATHErrorResources_ja.java
+com/sun/org/apache/xpath/internal/res/XPATHErrorResources_ko.java
+com/sun/org/apache/xpath/internal/res/XPATHErrorResources_sv.java
+com/sun/org/apache/xpath/internal/res/XPATHErrorResources_zh_HK.java
+com/sun/org/apache/xpath/internal/res/XPATHErrorResources_zh_TW.java
+com/sun/org/apache/xpath/internal/res/XPATHMessages.java
+com/sun/org/apache/xpath/internal/res/package.html
+com/sun/org/apache/xpath/internal/CachedXPathAPI.java
+com/sun/org/apache/xpath/internal/Arg.java
+com/sun/org/apache/xpath/internal/ExpressionNode.java
+com/sun/org/apache/xpath/internal/Expression.java
+com/sun/org/apache/xpath/internal/XPathProcessorException.java
+com/sun/org/apache/xpath/internal/ExpressionOwner.java
+com/sun/org/apache/xpath/internal/ExtensionsProvider.java
+com/sun/org/apache/xpath/internal/FoundIndex.java
+com/sun/org/apache/xpath/internal/NodeSet.java
+com/sun/org/apache/xpath/internal/NodeSetDTM.java
+com/sun/org/apache/xpath/internal/SourceTree.java
+com/sun/org/apache/xpath/internal/SourceTreeManager.java
+com/sun/org/apache/xpath/internal/VariableStack.java
+com/sun/org/apache/xpath/internal/XPath.java
+com/sun/org/apache/xpath/internal/XPathAPI.java
+com/sun/org/apache/xpath/internal/WhitespaceStrippingElementMatcher.java
+com/sun/org/apache/xpath/internal/XPathContext.java
+com/sun/org/apache/xpath/internal/XPathException.java
+com/sun/org/apache/xpath/internal/XPathFactory.java
+com/sun/org/apache/xpath/internal/XPathVisitable.java
+com/sun/org/apache/xpath/internal/XPathVisitor.java
+com/sun/org/apache/xpath/internal/package.html
+com/sun/org/omg
+com/sun/org/omg/CORBA
+com/sun/org/omg/CORBA/SCCS
+com/sun/org/omg/CORBA/SCCS/s.AttributeDescriptionHelper.java
+com/sun/org/omg/CORBA/SCCS/s.AttrDescriptionSeqHelper.java
+com/sun/org/omg/CORBA/SCCS/s.AttributeDescription.java
+com/sun/org/omg/CORBA/SCCS/s.ContextIdentifierHelper.java
+com/sun/org/omg/CORBA/SCCS/s.AttributeMode.java
+com/sun/org/omg/CORBA/SCCS/s.AttributeModeHelper.java
+com/sun/org/omg/CORBA/SCCS/s.ContextIdSeqHelper.java
+com/sun/org/omg/CORBA/SCCS/s.ExceptionDescriptionHelper.java
+com/sun/org/omg/CORBA/SCCS/s.DefinitionKindHelper.java
+com/sun/org/omg/CORBA/SCCS/s.ExcDescriptionSeqHelper.java
+com/sun/org/omg/CORBA/SCCS/s.ExceptionDescription.java
+com/sun/org/omg/CORBA/SCCS/s.InitializerHelper.java
+com/sun/org/omg/CORBA/SCCS/s.Initializer.java
+com/sun/org/omg/CORBA/SCCS/s.IDLTypeHelper.java
+com/sun/org/omg/CORBA/SCCS/s.IDLTypeOperations.java
+com/sun/org/omg/CORBA/SCCS/s.IRObjectOperations.java
+com/sun/org/omg/CORBA/SCCS/s.IdentifierHelper.java
+com/sun/org/omg/CORBA/SCCS/s.OpDescriptionSeqHelper.java
+com/sun/org/omg/CORBA/SCCS/s.InitializerSeqHelper.java
+com/sun/org/omg/CORBA/SCCS/s.OperationDescriptionHelper.java
+com/sun/org/omg/CORBA/SCCS/s.OperationDescription.java
+com/sun/org/omg/CORBA/SCCS/s.ParDescriptionSeqHelper.java
+com/sun/org/omg/CORBA/SCCS/s.OperationMode.java
+com/sun/org/omg/CORBA/SCCS/s.OperationModeHelper.java
+com/sun/org/omg/CORBA/SCCS/s.ParameterDescription.java
+com/sun/org/omg/CORBA/SCCS/s.ParameterMode.java
+com/sun/org/omg/CORBA/SCCS/s.RepositoryIdSeqHelper.java
+com/sun/org/omg/CORBA/SCCS/s.ParameterDescriptionHelper.java
+com/sun/org/omg/CORBA/SCCS/s.ParameterModeHelper.java
+com/sun/org/omg/CORBA/SCCS/s.Repository.java
+com/sun/org/omg/CORBA/SCCS/s.RepositoryHelper.java
+com/sun/org/omg/CORBA/SCCS/s.RepositoryIdHelper.java
+com/sun/org/omg/CORBA/SCCS/s.StructMemberSeqHelper.java
+com/sun/org/omg/CORBA/SCCS/s.StructMemberHelper.java
+com/sun/org/omg/CORBA/SCCS/s.ValueMemberHelper.java
+com/sun/org/omg/CORBA/SCCS/s.ValueMemberSeqHelper.java
+com/sun/org/omg/CORBA/SCCS/s.VersionSpecHelper.java
+com/sun/org/omg/CORBA/SCCS/s.VisibilityHelper.java
+com/sun/org/omg/CORBA/SCCS/s._IDLTypeStub.java
+com/sun/org/omg/CORBA/ValueDefPackage
+com/sun/org/omg/CORBA/ValueDefPackage/SCCS
+com/sun/org/omg/CORBA/ValueDefPackage/SCCS/s.FullValueDescriptionHelper.java
+com/sun/org/omg/CORBA/ValueDefPackage/SCCS/s.FullValueDescription.java
+com/sun/org/omg/CORBA/ValueDefPackage/FullValueDescriptionHelper.java
+com/sun/org/omg/CORBA/ValueDefPackage/FullValueDescription.java
+com/sun/org/omg/CORBA/portable
+com/sun/org/omg/CORBA/portable/SCCS
+com/sun/org/omg/CORBA/portable/SCCS/s.ValueHelper.java
+com/sun/org/omg/CORBA/portable/ValueHelper.java
+com/sun/org/omg/CORBA/AttrDescriptionSeqHelper.java
+com/sun/org/omg/CORBA/AttributeDescription.java
+com/sun/org/omg/CORBA/AttributeDescriptionHelper.java
+com/sun/org/omg/CORBA/AttributeMode.java
+com/sun/org/omg/CORBA/AttributeModeHelper.java
+com/sun/org/omg/CORBA/ContextIdSeqHelper.java
+com/sun/org/omg/CORBA/ContextIdentifierHelper.java
+com/sun/org/omg/CORBA/DefinitionKindHelper.java
+com/sun/org/omg/CORBA/ExcDescriptionSeqHelper.java
+com/sun/org/omg/CORBA/ExceptionDescription.java
+com/sun/org/omg/CORBA/ExceptionDescriptionHelper.java
+com/sun/org/omg/CORBA/Repository.java
+com/sun/org/omg/CORBA/IDLTypeHelper.java
+com/sun/org/omg/CORBA/IDLTypeOperations.java
+com/sun/org/omg/CORBA/IRObjectOperations.java
+com/sun/org/omg/CORBA/IdentifierHelper.java
+com/sun/org/omg/CORBA/Initializer.java
+com/sun/org/omg/CORBA/InitializerHelper.java
+com/sun/org/omg/CORBA/InitializerSeqHelper.java
+com/sun/org/omg/CORBA/OpDescriptionSeqHelper.java
+com/sun/org/omg/CORBA/OperationDescription.java
+com/sun/org/omg/CORBA/OperationDescriptionHelper.java
+com/sun/org/omg/CORBA/OperationMode.java
+com/sun/org/omg/CORBA/OperationModeHelper.java
+com/sun/org/omg/CORBA/ParDescriptionSeqHelper.java
+com/sun/org/omg/CORBA/ParameterDescription.java
+com/sun/org/omg/CORBA/ParameterDescriptionHelper.java
+com/sun/org/omg/CORBA/ParameterMode.java
+com/sun/org/omg/CORBA/ParameterModeHelper.java
+com/sun/org/omg/CORBA/RepositoryHelper.java
+com/sun/org/omg/CORBA/RepositoryIdHelper.java
+com/sun/org/omg/CORBA/RepositoryIdSeqHelper.java
+com/sun/org/omg/CORBA/StructMemberHelper.java
+com/sun/org/omg/CORBA/StructMemberSeqHelper.java
+com/sun/org/omg/CORBA/ValueMemberHelper.java
+com/sun/org/omg/CORBA/ValueMemberSeqHelper.java
+com/sun/org/omg/CORBA/VersionSpecHelper.java
+com/sun/org/omg/CORBA/VisibilityHelper.java
+com/sun/org/omg/CORBA/_IDLTypeStub.java
+com/sun/org/omg/SendingContext
+com/sun/org/omg/SendingContext/CodeBasePackage
+com/sun/org/omg/SendingContext/CodeBasePackage/SCCS
+com/sun/org/omg/SendingContext/CodeBasePackage/SCCS/s.ValueDescSeqHelper.java
+com/sun/org/omg/SendingContext/CodeBasePackage/SCCS/s.URLHelper.java
+com/sun/org/omg/SendingContext/CodeBasePackage/SCCS/s.URLSeqHelper.java
+com/sun/org/omg/SendingContext/CodeBasePackage/URLSeqHelper.java
+com/sun/org/omg/SendingContext/CodeBasePackage/URLHelper.java
+com/sun/org/omg/SendingContext/CodeBasePackage/ValueDescSeqHelper.java
+com/sun/org/omg/SendingContext/SCCS
+com/sun/org/omg/SendingContext/SCCS/s.CodeBaseHelper.java
+com/sun/org/omg/SendingContext/SCCS/s.CodeBase.java
+com/sun/org/omg/SendingContext/SCCS/s.CodeBaseOperations.java
+com/sun/org/omg/SendingContext/SCCS/s._CodeBaseImplBase.java
+com/sun/org/omg/SendingContext/SCCS/s._CodeBaseStub.java
+com/sun/org/omg/SendingContext/CodeBaseHelper.java
+com/sun/org/omg/SendingContext/CodeBase.java
+com/sun/org/omg/SendingContext/CodeBaseOperations.java
+com/sun/org/omg/SendingContext/_CodeBaseImplBase.java
+com/sun/org/omg/SendingContext/_CodeBaseStub.java
+com/sun/rmi
+com/sun/rmi/rmid
+com/sun/rmi/rmid/SCCS
+com/sun/rmi/rmid/SCCS/s.ExecOptionPermission.java
+com/sun/rmi/rmid/SCCS/s.ExecPermission.java
+com/sun/rmi/rmid/ExecOptionPermission.java
+com/sun/rmi/rmid/ExecPermission.java
+com/sun/rmi/ssl
+com/sun/rmi/ssl/SCCS
+com/sun/rowset
+com/sun/rowset/SCCS
+com/sun/rowset/SCCS/s.FilteredRowSetImpl.java
+com/sun/rowset/SCCS/s.CachedRowSetImpl.java
+com/sun/rowset/SCCS/s.JdbcRowSetImpl.java
+com/sun/rowset/SCCS/s.JoinRowSetImpl.java
+com/sun/rowset/SCCS/s.WebRowSetImpl.java
+com/sun/rowset/SCCS/s.package.html
+com/sun/rowset/internal
+com/sun/rowset/internal/SCCS
+com/sun/rowset/internal/SCCS/s.InsertRow.java
+com/sun/rowset/internal/SCCS/s.BaseRow.java
+com/sun/rowset/internal/SCCS/s.CachedRowSetReader.java
+com/sun/rowset/internal/SCCS/s.CachedRowSetWriter.java
+com/sun/rowset/internal/SCCS/s.Row.java
+com/sun/rowset/internal/SCCS/s.SyncResolverImpl.java
+com/sun/rowset/internal/SCCS/s.WebRowSetXmlReader.java
+com/sun/rowset/internal/SCCS/s.WebRowSetXmlWriter.java
+com/sun/rowset/internal/SCCS/s.XmlErrorHandler.java
+com/sun/rowset/internal/SCCS/s.XmlReaderContentHandler.java
+com/sun/rowset/internal/SCCS/s.XmlResolver.java
+com/sun/rowset/internal/CachedRowSetReader.java
+com/sun/rowset/internal/BaseRow.java
+com/sun/rowset/internal/XmlReaderContentHandler.java
+com/sun/rowset/internal/CachedRowSetWriter.java
+com/sun/rowset/internal/InsertRow.java
+com/sun/rowset/internal/Row.java
+com/sun/rowset/internal/SyncResolverImpl.java
+com/sun/rowset/internal/WebRowSetXmlReader.java
+com/sun/rowset/internal/WebRowSetXmlWriter.java
+com/sun/rowset/internal/XmlErrorHandler.java
+com/sun/rowset/internal/XmlResolver.java
+com/sun/rowset/providers
+com/sun/rowset/providers/SCCS
+com/sun/rowset/providers/SCCS/s.RIOptimisticProvider.java
+com/sun/rowset/providers/SCCS/s.RIXMLProvider.java
+com/sun/rowset/providers/SCCS/s.package.html
+com/sun/rowset/providers/RIOptimisticProvider.java
+com/sun/rowset/providers/RIXMLProvider.java
+com/sun/rowset/providers/package.html
+com/sun/rowset/CachedRowSetImpl.java
+com/sun/rowset/FilteredRowSetImpl.java
+com/sun/rowset/JdbcRowSetImpl.java
+com/sun/rowset/JoinRowSetImpl.java
+com/sun/rowset/WebRowSetImpl.java
+com/sun/rowset/package.html
+com/sun/security
+com/sun/security/auth
+com/sun/security/auth/SCCS
+com/sun/security/auth/SCCS/s.NTSidPrimaryGroupPrincipal.java
+com/sun/security/auth/SCCS/s.NTDomainPrincipal.java
+com/sun/security/auth/SCCS/s.NTNumericCredential.java
+com/sun/security/auth/SCCS/s.NTSid.java
+com/sun/security/auth/SCCS/s.NTSidDomainPrincipal.java
+com/sun/security/auth/SCCS/s.NTSidGroupPrincipal.java
+com/sun/security/auth/SCCS/s.SolarisNumericGroupPrincipal.java
+com/sun/security/auth/SCCS/s.NTSidUserPrincipal.java
+com/sun/security/auth/SCCS/s.NTUserPrincipal.java
+com/sun/security/auth/SCCS/s.PolicyFile.java
+com/sun/security/auth/SCCS/s.PolicyParser.java
+com/sun/security/auth/SCCS/s.PrincipalComparator.java
+com/sun/security/auth/SCCS/s.SubjectCodeSource.java
+com/sun/security/auth/SCCS/s.SolarisPrincipal.java
+com/sun/security/auth/SCCS/s.SolarisNumericUserPrincipal.java
+com/sun/security/auth/SCCS/s.UnixNumericGroupPrincipal.java
+com/sun/security/auth/SCCS/s.UnixNumericUserPrincipal.java
+com/sun/security/auth/SCCS/s.UnixPrincipal.java
+com/sun/security/auth/SCCS/s.X500Principal.java
+com/sun/security/auth/SCCS/s.jaas-overview.html
+com/sun/security/auth/callback
+com/sun/security/auth/callback/SCCS
+com/sun/security/auth/callback/SCCS/s.DialogCallbackHandler.java
+com/sun/security/auth/callback/SCCS/s.TextCallbackHandler.java
+com/sun/security/auth/callback/DialogCallbackHandler.java
+com/sun/security/auth/callback/TextCallbackHandler.java
+com/sun/security/auth/login
+com/sun/security/auth/login/SCCS
+com/sun/security/auth/login/SCCS/s.ConfigFile.java
+com/sun/security/auth/login/ConfigFile.java
+com/sun/security/auth/module
+com/sun/security/auth/module/SCCS
+com/sun/security/auth/module/SCCS/s.JndiLoginModule.java
+com/sun/security/auth/module/SCCS/s.Crypt.java
+com/sun/security/auth/module/SCCS/s.KeyStoreLoginModule.java
+com/sun/security/auth/module/SCCS/s.Krb5LoginModule.java
+com/sun/security/auth/module/SCCS/s.NTLoginModule.java
+com/sun/security/auth/module/SCCS/s.NTSystem.java
+com/sun/security/auth/module/SCCS/s.SolarisLoginModule.java
+com/sun/security/auth/module/SCCS/s.SolarisSystem.java
+com/sun/security/auth/module/SCCS/s.UnixLoginModule.java
+com/sun/security/auth/module/SCCS/s.UnixSystem.java
+com/sun/security/auth/module/Crypt.java
+com/sun/security/auth/module/NTLoginModule.java
+com/sun/security/auth/module/JndiLoginModule.java
+com/sun/security/auth/module/KeyStoreLoginModule.java
+com/sun/security/auth/module/Krb5LoginModule.java
+com/sun/security/auth/module/NTSystem.java
+com/sun/security/auth/module/SolarisLoginModule.java
+com/sun/security/auth/module/SolarisSystem.java
+com/sun/security/auth/module/UnixLoginModule.java
+com/sun/security/auth/module/UnixSystem.java
+com/sun/security/auth/NTNumericCredential.java
+com/sun/security/auth/NTDomainPrincipal.java
+com/sun/security/auth/NTSid.java
+com/sun/security/auth/NTSidUserPrincipal.java
+com/sun/security/auth/NTSidDomainPrincipal.java
+com/sun/security/auth/NTSidGroupPrincipal.java
+com/sun/security/auth/NTSidPrimaryGroupPrincipal.java
+com/sun/security/auth/NTUserPrincipal.java
+com/sun/security/auth/PolicyFile.java
+com/sun/security/auth/PolicyParser.java
+com/sun/security/auth/PrincipalComparator.java
+com/sun/security/auth/UnixPrincipal.java
+com/sun/security/auth/SolarisPrincipal.java
+com/sun/security/auth/SolarisNumericGroupPrincipal.java
+com/sun/security/auth/SolarisNumericUserPrincipal.java
+com/sun/security/auth/SubjectCodeSource.java
+com/sun/security/auth/UnixNumericGroupPrincipal.java
+com/sun/security/auth/UnixNumericUserPrincipal.java
+com/sun/security/auth/X500Principal.java
+com/sun/security/auth/jaas-overview.html
+com/sun/security/jgss
+com/sun/security/jgss/SCCS
+com/sun/security/jgss/SCCS/s.jgss-overview.html
+com/sun/security/jgss/SCCS/s.GSSUtil.java
+com/sun/security/jgss/jgss-overview.html
+com/sun/security/jgss/GSSUtil.java
+com/sun/security/sasl
+com/sun/security/sasl/SCCS
+com/sun/security/sasl/SCCS/s.ClientFactoryImpl.java
+com/sun/security/sasl/SCCS/s.CramMD5Base.java
+com/sun/security/sasl/SCCS/s.CramMD5Client.java
+com/sun/security/sasl/SCCS/s.CramMD5Server.java
+com/sun/security/sasl/SCCS/s.ExternalClient.java
+com/sun/security/sasl/SCCS/s.PlainClient.java
+com/sun/security/sasl/SCCS/s.Provider.java
+com/sun/security/sasl/SCCS/s.ServerFactoryImpl.java
+com/sun/security/sasl/digest
+com/sun/security/sasl/digest/SCCS
+com/sun/security/sasl/digest/SCCS/s.DigestMD5Base.java
+com/sun/security/sasl/digest/SCCS/s.DigestMD5Client.java
+com/sun/security/sasl/digest/SCCS/s.DigestMD5Server.java
+com/sun/security/sasl/digest/SCCS/s.FactoryImpl.java
+com/sun/security/sasl/digest/SCCS/s.SecurityCtx.java
+com/sun/security/sasl/digest/DigestMD5Client.java
+com/sun/security/sasl/digest/DigestMD5Base.java
+com/sun/security/sasl/digest/DigestMD5Server.java
+com/sun/security/sasl/digest/FactoryImpl.java
+com/sun/security/sasl/digest/SecurityCtx.java
+com/sun/security/sasl/gsskerb
+com/sun/security/sasl/gsskerb/SCCS
+com/sun/security/sasl/gsskerb/SCCS/s.GssKrb5Client.java
+com/sun/security/sasl/gsskerb/SCCS/s.FactoryImpl.java
+com/sun/security/sasl/gsskerb/SCCS/s.GssKrb5Base.java
+com/sun/security/sasl/gsskerb/SCCS/s.GssKrb5Server.java
+com/sun/security/sasl/gsskerb/FactoryImpl.java
+com/sun/security/sasl/gsskerb/GssKrb5Base.java
+com/sun/security/sasl/gsskerb/GssKrb5Client.java
+com/sun/security/sasl/gsskerb/GssKrb5Server.java
+com/sun/security/sasl/util
+com/sun/security/sasl/util/SCCS
+com/sun/security/sasl/util/SCCS/s.AbstractSaslImpl.java
+com/sun/security/sasl/util/SCCS/s.PolicyUtils.java
+com/sun/security/sasl/util/AbstractSaslImpl.java
+com/sun/security/sasl/util/PolicyUtils.java
+com/sun/security/sasl/ClientFactoryImpl.java
+com/sun/security/sasl/CramMD5Base.java
+com/sun/security/sasl/CramMD5Client.java
+com/sun/security/sasl/CramMD5Server.java
+com/sun/security/sasl/ExternalClient.java
+com/sun/security/sasl/PlainClient.java
+com/sun/security/sasl/Provider.java
+com/sun/security/sasl/ServerFactoryImpl.java
+com/sun/swing
+com/sun/swing/internal
+com/sun/swing/internal/plaf
+com/sun/swing/internal/plaf/basic
+com/sun/swing/internal/plaf/basic/resources
+com/sun/swing/internal/plaf/basic/resources/SCCS
+com/sun/swing/internal/plaf/basic/resources/SCCS/s.basic_de.properties
+com/sun/swing/internal/plaf/basic/resources/SCCS/s.basic.properties
+com/sun/swing/internal/plaf/basic/resources/SCCS/s.basic_es.properties
+com/sun/swing/internal/plaf/basic/resources/SCCS/s.basic_fr.properties
+com/sun/swing/internal/plaf/basic/resources/SCCS/s.basic_it.properties
+com/sun/swing/internal/plaf/basic/resources/SCCS/s.basic_ja.properties
+com/sun/swing/internal/plaf/basic/resources/SCCS/s.basic_ko.properties
+com/sun/swing/internal/plaf/basic/resources/SCCS/s.basic_sv.properties
+com/sun/swing/internal/plaf/basic/resources/SCCS/s.basic_zh_CN.properties
+com/sun/swing/internal/plaf/basic/resources/SCCS/s.basic_zh_TW.properties
+com/sun/swing/internal/plaf/basic/resources/basic_zh_CN.properties
+com/sun/swing/internal/plaf/basic/resources/basic.properties
+com/sun/swing/internal/plaf/basic/resources/basic_de.properties
+com/sun/swing/internal/plaf/basic/resources/basic_es.properties
+com/sun/swing/internal/plaf/basic/resources/basic_fr.properties
+com/sun/swing/internal/plaf/basic/resources/basic_it.properties
+com/sun/swing/internal/plaf/basic/resources/basic_ja.properties
+com/sun/swing/internal/plaf/basic/resources/basic_ko.properties
+com/sun/swing/internal/plaf/basic/resources/basic_sv.properties
+com/sun/swing/internal/plaf/basic/resources/basic_zh_TW.properties
+com/sun/swing/internal/plaf/metal
+com/sun/swing/internal/plaf/metal/resources
+com/sun/swing/internal/plaf/metal/resources/SCCS
+com/sun/swing/internal/plaf/metal/resources/SCCS/s.metal_de.properties
+com/sun/swing/internal/plaf/metal/resources/SCCS/s.metal.properties
+com/sun/swing/internal/plaf/metal/resources/SCCS/s.metal_es.properties
+com/sun/swing/internal/plaf/metal/resources/SCCS/s.metal_fr.properties
+com/sun/swing/internal/plaf/metal/resources/SCCS/s.metal_it.properties
+com/sun/swing/internal/plaf/metal/resources/SCCS/s.metal_ja.properties
+com/sun/swing/internal/plaf/metal/resources/SCCS/s.metal_ko.properties
+com/sun/swing/internal/plaf/metal/resources/SCCS/s.metal_sv.properties
+com/sun/swing/internal/plaf/metal/resources/SCCS/s.metal_zh_CN.properties
+com/sun/swing/internal/plaf/metal/resources/SCCS/s.metal_zh_TW.properties
+com/sun/swing/internal/plaf/metal/resources/metal_zh_CN.properties
+com/sun/swing/internal/plaf/metal/resources/metal.properties
+com/sun/swing/internal/plaf/metal/resources/metal_de.properties
+com/sun/swing/internal/plaf/metal/resources/metal_es.properties
+com/sun/swing/internal/plaf/metal/resources/metal_fr.properties
+com/sun/swing/internal/plaf/metal/resources/metal_it.properties
+com/sun/swing/internal/plaf/metal/resources/metal_ja.properties
+com/sun/swing/internal/plaf/metal/resources/metal_ko.properties
+com/sun/swing/internal/plaf/metal/resources/metal_sv.properties
+com/sun/swing/internal/plaf/metal/resources/metal_zh_TW.properties
+com/sun/swing/internal/plaf/synth
+com/sun/swing/internal/plaf/synth/resources
+com/sun/swing/internal/plaf/synth/resources/SCCS
+com/sun/swing/internal/plaf/synth/resources/SCCS/s.synth_de.properties
+com/sun/swing/internal/plaf/synth/resources/SCCS/s.synth.properties
+com/sun/swing/internal/plaf/synth/resources/SCCS/s.synth_es.properties
+com/sun/swing/internal/plaf/synth/resources/SCCS/s.synth_fr.properties
+com/sun/swing/internal/plaf/synth/resources/SCCS/s.synth_it.properties
+com/sun/swing/internal/plaf/synth/resources/SCCS/s.synth_ja.properties
+com/sun/swing/internal/plaf/synth/resources/SCCS/s.synth_ko.properties
+com/sun/swing/internal/plaf/synth/resources/SCCS/s.synth_sv.properties
+com/sun/swing/internal/plaf/synth/resources/SCCS/s.synth_zh_CN.properties
+com/sun/swing/internal/plaf/synth/resources/SCCS/s.synth_zh_TW.properties
+com/sun/swing/internal/plaf/synth/resources/synth_zh_CN.properties
+com/sun/swing/internal/plaf/synth/resources/synth.properties
+com/sun/swing/internal/plaf/synth/resources/synth_de.properties
+com/sun/swing/internal/plaf/synth/resources/synth_es.properties
+com/sun/swing/internal/plaf/synth/resources/synth_fr.properties
+com/sun/swing/internal/plaf/synth/resources/synth_it.properties
+com/sun/swing/internal/plaf/synth/resources/synth_ja.properties
+com/sun/swing/internal/plaf/synth/resources/synth_ko.properties
+com/sun/swing/internal/plaf/synth/resources/synth_sv.properties
+com/sun/swing/internal/plaf/synth/resources/synth_zh_TW.properties
+com/sun/tools
+com/sun/tools/apt
+com/sun/tools/apt/SCCS
+com/sun/tools/apt/SCCS/s.Main.java
+com/sun/tools/apt/comp
+com/sun/tools/apt/comp/SCCS
+com/sun/tools/apt/comp/SCCS/s.BootstrapAPF.java
+com/sun/tools/apt/comp/SCCS/s.Apt.java
+com/sun/tools/apt/comp/SCCS/s.AnnotationProcessingError.java
+com/sun/tools/apt/comp/SCCS/s.PrintAP.java
+com/sun/tools/apt/comp/SCCS/s.UsageMessageNeededException.java
+com/sun/tools/apt/comp/BootstrapAPF.java
+com/sun/tools/apt/comp/Apt.java
+com/sun/tools/apt/comp/AnnotationProcessingError.java
+com/sun/tools/apt/comp/PrintAP.java
+com/sun/tools/apt/comp/UsageMessageNeededException.java
+com/sun/tools/apt/main
+com/sun/tools/apt/main/SCCS
+com/sun/tools/apt/main/SCCS/s.CommandLine.java
+com/sun/tools/apt/main/SCCS/s.JavaCompiler.java
+com/sun/tools/apt/main/SCCS/s.Main.java
+com/sun/tools/apt/main/CommandLine.java
+com/sun/tools/apt/main/JavaCompiler.java
+com/sun/tools/apt/main/Main.java
+com/sun/tools/apt/mirror
+com/sun/tools/apt/mirror/SCCS
+com/sun/tools/apt/mirror/SCCS/s.AptEnv.java
+com/sun/tools/apt/mirror/apt
+com/sun/tools/apt/mirror/apt/SCCS
+com/sun/tools/apt/mirror/apt/SCCS/s.AnnotationProcessorEnvironmentImpl.java
+com/sun/tools/apt/mirror/apt/SCCS/s.FilerImpl.java
+com/sun/tools/apt/mirror/apt/SCCS/s.MessagerImpl.java
+com/sun/tools/apt/mirror/apt/SCCS/s.RoundCompleteEventImpl.java
+com/sun/tools/apt/mirror/apt/SCCS/s.RoundStateImpl.java
+com/sun/tools/apt/mirror/apt/MessagerImpl.java
+com/sun/tools/apt/mirror/apt/FilerImpl.java
+com/sun/tools/apt/mirror/apt/AnnotationProcessorEnvironmentImpl.java
+com/sun/tools/apt/mirror/apt/RoundCompleteEventImpl.java
+com/sun/tools/apt/mirror/apt/RoundStateImpl.java
+com/sun/tools/apt/mirror/declaration
+com/sun/tools/apt/mirror/declaration/SCCS
+com/sun/tools/apt/mirror/declaration/SCCS/s.AnnotationMirrorImpl.java
+com/sun/tools/apt/mirror/declaration/SCCS/s.AnnotationProxyMaker.java
+com/sun/tools/apt/mirror/declaration/SCCS/s.AnnotationValueImpl.java
+com/sun/tools/apt/mirror/declaration/SCCS/s.AnnotationTypeDeclarationImpl.java
+com/sun/tools/apt/mirror/declaration/SCCS/s.AnnotationTypeElementDeclarationImpl.java
+com/sun/tools/apt/mirror/declaration/SCCS/s.ClassDeclarationImpl.java
+com/sun/tools/apt/mirror/declaration/SCCS/s.Constants.java
+com/sun/tools/apt/mirror/declaration/SCCS/s.ConstructorDeclarationImpl.java
+com/sun/tools/apt/mirror/declaration/SCCS/s.DeclarationImpl.java
+com/sun/tools/apt/mirror/declaration/SCCS/s.DeclarationMaker.java
+com/sun/tools/apt/mirror/declaration/SCCS/s.EnumConstantDeclarationImpl.java
+com/sun/tools/apt/mirror/declaration/SCCS/s.EnumDeclarationImpl.java
+com/sun/tools/apt/mirror/declaration/SCCS/s.ExecutableDeclarationImpl.java
+com/sun/tools/apt/mirror/declaration/SCCS/s.FieldDeclarationImpl.java
+com/sun/tools/apt/mirror/declaration/SCCS/s.InterfaceDeclarationImpl.java
+com/sun/tools/apt/mirror/declaration/SCCS/s.MemberDeclarationImpl.java
+com/sun/tools/apt/mirror/declaration/SCCS/s.MethodDeclarationImpl.java
+com/sun/tools/apt/mirror/declaration/SCCS/s.PackageDeclarationImpl.java
+com/sun/tools/apt/mirror/declaration/SCCS/s.ParameterDeclarationImpl.java
+com/sun/tools/apt/mirror/declaration/SCCS/s.TypeDeclarationImpl.java
+com/sun/tools/apt/mirror/declaration/SCCS/s.TypeParameterDeclarationImpl.java
+com/sun/tools/apt/mirror/declaration/AnnotationTypeDeclarationImpl.java
+com/sun/tools/apt/mirror/declaration/AnnotationMirrorImpl.java
+com/sun/tools/apt/mirror/declaration/AnnotationProxyMaker.java
+com/sun/tools/apt/mirror/declaration/DeclarationImpl.java
+com/sun/tools/apt/mirror/declaration/Constants.java
+com/sun/tools/apt/mirror/declaration/AnnotationTypeElementDeclarationImpl.java
+com/sun/tools/apt/mirror/declaration/AnnotationValueImpl.java
+com/sun/tools/apt/mirror/declaration/ClassDeclarationImpl.java
+com/sun/tools/apt/mirror/declaration/ConstructorDeclarationImpl.java
+com/sun/tools/apt/mirror/declaration/DeclarationMaker.java
+com/sun/tools/apt/mirror/declaration/EnumConstantDeclarationImpl.java
+com/sun/tools/apt/mirror/declaration/EnumDeclarationImpl.java
+com/sun/tools/apt/mirror/declaration/ExecutableDeclarationImpl.java
+com/sun/tools/apt/mirror/declaration/FieldDeclarationImpl.java
+com/sun/tools/apt/mirror/declaration/InterfaceDeclarationImpl.java
+com/sun/tools/apt/mirror/declaration/MemberDeclarationImpl.java
+com/sun/tools/apt/mirror/declaration/MethodDeclarationImpl.java
+com/sun/tools/apt/mirror/declaration/PackageDeclarationImpl.java
+com/sun/tools/apt/mirror/declaration/ParameterDeclarationImpl.java
+com/sun/tools/apt/mirror/declaration/TypeDeclarationImpl.java
+com/sun/tools/apt/mirror/declaration/TypeParameterDeclarationImpl.java
+com/sun/tools/apt/mirror/type
+com/sun/tools/apt/mirror/type/SCCS
+com/sun/tools/apt/mirror/type/SCCS/s.AnnotationTypeImpl.java
+com/sun/tools/apt/mirror/type/SCCS/s.ArrayTypeImpl.java
+com/sun/tools/apt/mirror/type/SCCS/s.ClassTypeImpl.java
+com/sun/tools/apt/mirror/type/SCCS/s.DeclaredTypeImpl.java
+com/sun/tools/apt/mirror/type/SCCS/s.EnumTypeImpl.java
+com/sun/tools/apt/mirror/type/SCCS/s.InterfaceTypeImpl.java
+com/sun/tools/apt/mirror/type/SCCS/s.PrimitiveTypeImpl.java
+com/sun/tools/apt/mirror/type/SCCS/s.TypeMaker.java
+com/sun/tools/apt/mirror/type/SCCS/s.TypeMirrorImpl.java
+com/sun/tools/apt/mirror/type/SCCS/s.TypeVariableImpl.java
+com/sun/tools/apt/mirror/type/SCCS/s.VoidTypeImpl.java
+com/sun/tools/apt/mirror/type/SCCS/s.WildcardTypeImpl.java
+com/sun/tools/apt/mirror/type/AnnotationTypeImpl.java
+com/sun/tools/apt/mirror/type/ArrayTypeImpl.java
+com/sun/tools/apt/mirror/type/ClassTypeImpl.java
+com/sun/tools/apt/mirror/type/DeclaredTypeImpl.java
+com/sun/tools/apt/mirror/type/EnumTypeImpl.java
+com/sun/tools/apt/mirror/type/InterfaceTypeImpl.java
+com/sun/tools/apt/mirror/type/PrimitiveTypeImpl.java
+com/sun/tools/apt/mirror/type/TypeMaker.java
+com/sun/tools/apt/mirror/type/TypeMirrorImpl.java
+com/sun/tools/apt/mirror/type/TypeVariableImpl.java
+com/sun/tools/apt/mirror/type/VoidTypeImpl.java
+com/sun/tools/apt/mirror/type/WildcardTypeImpl.java
+com/sun/tools/apt/mirror/util
+com/sun/tools/apt/mirror/util/SCCS
+com/sun/tools/apt/mirror/util/SCCS/s.SourcePositionImpl.java
+com/sun/tools/apt/mirror/util/SCCS/s.DeclarationsImpl.java
+com/sun/tools/apt/mirror/util/SCCS/s.TypesImpl.java
+com/sun/tools/apt/mirror/util/DeclarationsImpl.java
+com/sun/tools/apt/mirror/util/SourcePositionImpl.java
+com/sun/tools/apt/mirror/util/TypesImpl.java
+com/sun/tools/apt/mirror/AptEnv.java
+com/sun/tools/apt/resources
+com/sun/tools/apt/resources/SCCS
+com/sun/tools/apt/resources/SCCS/s.apt.properties
+com/sun/tools/apt/resources/SCCS/s.apt_ja.properties
+com/sun/tools/apt/resources/apt_ja.properties
+com/sun/tools/apt/resources/apt.properties
+com/sun/tools/apt/util
+com/sun/tools/apt/util/SCCS
+com/sun/tools/apt/util/SCCS/s.Bark.java
+com/sun/tools/apt/util/Bark.java
+com/sun/tools/apt/Main.java
+com/sun/tools/corba
+com/sun/tools/corba/se
+com/sun/tools/corba/se/idl
+com/sun/tools/corba/se/idl/SCCS
+com/sun/tools/corba/se/idl/SCCS/s.AttributeEntry.java
+com/sun/tools/corba/se/idl/SCCS/s.Arguments.java
+com/sun/tools/corba/se/idl/SCCS/s.DefaultSymtabFactory.java
+com/sun/tools/corba/se/idl/SCCS/s.AttributeGen.java
+com/sun/tools/corba/se/idl/SCCS/s.Comment.java
+com/sun/tools/corba/se/idl/SCCS/s.Compile.java
+com/sun/tools/corba/se/idl/SCCS/s.ConstEntry.java
+com/sun/tools/corba/se/idl/SCCS/s.ConstGen.java
+com/sun/tools/corba/se/idl/SCCS/s.EnumEntry.java
+com/sun/tools/corba/se/idl/SCCS/s.EnumGen.java
+com/sun/tools/corba/se/idl/SCCS/s.ExceptionEntry.java
+com/sun/tools/corba/se/idl/SCCS/s.ExceptionGen.java
+com/sun/tools/corba/se/idl/SCCS/s.Factories.java
+com/sun/tools/corba/se/idl/SCCS/s.ForwardEntry.java
+com/sun/tools/corba/se/idl/SCCS/s.ForwardGen.java
+com/sun/tools/corba/se/idl/SCCS/s.GenFactory.java
+com/sun/tools/corba/se/idl/SCCS/s.ResourceBundleUtil.java
+com/sun/tools/corba/se/idl/SCCS/s.ForwardValueEntry.java
+com/sun/tools/corba/se/idl/SCCS/s.ForwardValueGen.java
+com/sun/tools/corba/se/idl/SCCS/s.GenFileStream.java
+com/sun/tools/corba/se/idl/SCCS/s.Generator.java
+com/sun/tools/corba/se/idl/SCCS/s.IDLID.java
+com/sun/tools/corba/se/idl/SCCS/s.IncludeEntry.java
+com/sun/tools/corba/se/idl/SCCS/s.IncludeGen.java
+com/sun/tools/corba/se/idl/SCCS/s.InterfaceEntry.java
+com/sun/tools/corba/se/idl/SCCS/s.InterfaceGen.java
+com/sun/tools/corba/se/idl/SCCS/s.InterfaceState.java
+com/sun/tools/corba/se/idl/SCCS/s.InterfaceType.java
+com/sun/tools/corba/se/idl/SCCS/s.InvalidArgument.java
+com/sun/tools/corba/se/idl/SCCS/s.InvalidCharacter.java
+com/sun/tools/corba/se/idl/SCCS/s.MethodEntry.java
+com/sun/tools/corba/se/idl/SCCS/s.MethodGen.java
+com/sun/tools/corba/se/idl/SCCS/s.ModuleEntry.java
+com/sun/tools/corba/se/idl/SCCS/s.ModuleGen.java
+com/sun/tools/corba/se/idl/SCCS/s.NativeEntry.java
+com/sun/tools/corba/se/idl/SCCS/s.NativeGen.java
+com/sun/tools/corba/se/idl/SCCS/s.NoPragma.java
+com/sun/tools/corba/se/idl/SCCS/s.Noop.java
+com/sun/tools/corba/se/idl/SCCS/s.ParameterEntry.java
+com/sun/tools/corba/se/idl/SCCS/s.ParameterGen.java
+com/sun/tools/corba/se/idl/SCCS/s.ParseException.java
+com/sun/tools/corba/se/idl/SCCS/s.Parser.java
+com/sun/tools/corba/se/idl/SCCS/s.PragmaEntry.java
+com/sun/tools/corba/se/idl/SCCS/s.PragmaGen.java
+com/sun/tools/corba/se/idl/SCCS/s.PragmaHandler.java
+com/sun/tools/corba/se/idl/SCCS/s.Preprocessor.java
+com/sun/tools/corba/se/idl/SCCS/s.PrimitiveEntry.java
+com/sun/tools/corba/se/idl/SCCS/s.PrimitiveGen.java
+com/sun/tools/corba/se/idl/SCCS/s.RepositoryID.java
+com/sun/tools/corba/se/idl/SCCS/s.Scanner.java
+com/sun/tools/corba/se/idl/SCCS/s.SequenceGen.java
+com/sun/tools/corba/se/idl/SCCS/s.ValueRepositoryId.java
+com/sun/tools/corba/se/idl/SCCS/s.SequenceEntry.java
+com/sun/tools/corba/se/idl/SCCS/s.StringEntry.java
+com/sun/tools/corba/se/idl/SCCS/s.StringGen.java
+com/sun/tools/corba/se/idl/SCCS/s.StructEntry.java
+com/sun/tools/corba/se/idl/SCCS/s.StructGen.java
+com/sun/tools/corba/se/idl/SCCS/s.SymtabEntry.java
+com/sun/tools/corba/se/idl/SCCS/s.SymtabFactory.java
+com/sun/tools/corba/se/idl/SCCS/s.Token.java
+com/sun/tools/corba/se/idl/SCCS/s.TokenBuffer.java
+com/sun/tools/corba/se/idl/SCCS/s.TypedefEntry.java
+com/sun/tools/corba/se/idl/SCCS/s.TypedefGen.java
+com/sun/tools/corba/se/idl/SCCS/s.UnionBranch.java
+com/sun/tools/corba/se/idl/SCCS/s.UnionEntry.java
+com/sun/tools/corba/se/idl/SCCS/s.UnionGen.java
+com/sun/tools/corba/se/idl/SCCS/s.Util.java
+com/sun/tools/corba/se/idl/SCCS/s.ValueBoxEntry.java
+com/sun/tools/corba/se/idl/SCCS/s.ValueBoxGen.java
+com/sun/tools/corba/se/idl/SCCS/s.ValueEntry.java
+com/sun/tools/corba/se/idl/SCCS/s.ValueGen.java
+com/sun/tools/corba/se/idl/SCCS/s.follow.set
+com/sun/tools/corba/se/idl/SCCS/s.first.set
+com/sun/tools/corba/se/idl/SCCS/s.grammar.idl
+com/sun/tools/corba/se/idl/SCCS/s.grammar3.idl
+com/sun/tools/corba/se/idl/SCCS/s.idl.prp
+com/sun/tools/corba/se/idl/SCCS/s.idl_ja.prp
+com/sun/tools/corba/se/idl/SCCS/s.ir.idl
+com/sun/tools/corba/se/idl/SCCS/s.keywords
+com/sun/tools/corba/se/idl/SCCS/s.orb.idl
+com/sun/tools/corba/se/idl/constExpr
+com/sun/tools/corba/se/idl/constExpr/SCCS
+com/sun/tools/corba/se/idl/constExpr/SCCS/s.BinaryExpr.java
+com/sun/tools/corba/se/idl/constExpr/SCCS/s.And.java
+com/sun/tools/corba/se/idl/constExpr/SCCS/s.DefaultExprFactory.java
+com/sun/tools/corba/se/idl/constExpr/SCCS/s.BooleanAnd.java
+com/sun/tools/corba/se/idl/constExpr/SCCS/s.BooleanNot.java
+com/sun/tools/corba/se/idl/constExpr/SCCS/s.BooleanOr.java
+com/sun/tools/corba/se/idl/constExpr/SCCS/s.ExprFactory.java
+com/sun/tools/corba/se/idl/constExpr/SCCS/s.Divide.java
+com/sun/tools/corba/se/idl/constExpr/SCCS/s.Equal.java
+com/sun/tools/corba/se/idl/constExpr/SCCS/s.EvaluationException.java
+com/sun/tools/corba/se/idl/constExpr/SCCS/s.Expression.java
+com/sun/tools/corba/se/idl/constExpr/SCCS/s.GreaterEqual.java
+com/sun/tools/corba/se/idl/constExpr/SCCS/s.GreaterThan.java
+com/sun/tools/corba/se/idl/constExpr/SCCS/s.LessEqual.java
+com/sun/tools/corba/se/idl/constExpr/SCCS/s.LessThan.java
+com/sun/tools/corba/se/idl/constExpr/SCCS/s.Minus.java
+com/sun/tools/corba/se/idl/constExpr/SCCS/s.Modulo.java
+com/sun/tools/corba/se/idl/constExpr/SCCS/s.Negative.java
+com/sun/tools/corba/se/idl/constExpr/SCCS/s.Not.java
+com/sun/tools/corba/se/idl/constExpr/SCCS/s.NotEqual.java
+com/sun/tools/corba/se/idl/constExpr/SCCS/s.Or.java
+com/sun/tools/corba/se/idl/constExpr/SCCS/s.Plus.java
+com/sun/tools/corba/se/idl/constExpr/SCCS/s.Positive.java
+com/sun/tools/corba/se/idl/constExpr/SCCS/s.ShiftLeft.java
+com/sun/tools/corba/se/idl/constExpr/SCCS/s.ShiftRight.java
+com/sun/tools/corba/se/idl/constExpr/SCCS/s.Terminal.java
+com/sun/tools/corba/se/idl/constExpr/SCCS/s.Times.java
+com/sun/tools/corba/se/idl/constExpr/SCCS/s.UnaryExpr.java
+com/sun/tools/corba/se/idl/constExpr/SCCS/s.Xor.java
+com/sun/tools/corba/se/idl/constExpr/BinaryExpr.java
+com/sun/tools/corba/se/idl/constExpr/And.java
+com/sun/tools/corba/se/idl/constExpr/DefaultExprFactory.java
+com/sun/tools/corba/se/idl/constExpr/BooleanAnd.java
+com/sun/tools/corba/se/idl/constExpr/BooleanNot.java
+com/sun/tools/corba/se/idl/constExpr/BooleanOr.java
+com/sun/tools/corba/se/idl/constExpr/ExprFactory.java
+com/sun/tools/corba/se/idl/constExpr/Divide.java
+com/sun/tools/corba/se/idl/constExpr/Equal.java
+com/sun/tools/corba/se/idl/constExpr/Or.java
+com/sun/tools/corba/se/idl/constExpr/EvaluationException.java
+com/sun/tools/corba/se/idl/constExpr/Expression.java
+com/sun/tools/corba/se/idl/constExpr/GreaterEqual.java
+com/sun/tools/corba/se/idl/constExpr/GreaterThan.java
+com/sun/tools/corba/se/idl/constExpr/LessEqual.java
+com/sun/tools/corba/se/idl/constExpr/LessThan.java
+com/sun/tools/corba/se/idl/constExpr/Minus.java
+com/sun/tools/corba/se/idl/constExpr/Modulo.java
+com/sun/tools/corba/se/idl/constExpr/Negative.java
+com/sun/tools/corba/se/idl/constExpr/Not.java
+com/sun/tools/corba/se/idl/constExpr/NotEqual.java
+com/sun/tools/corba/se/idl/constExpr/Plus.java
+com/sun/tools/corba/se/idl/constExpr/Positive.java
+com/sun/tools/corba/se/idl/constExpr/ShiftLeft.java
+com/sun/tools/corba/se/idl/constExpr/ShiftRight.java
+com/sun/tools/corba/se/idl/constExpr/Terminal.java
+com/sun/tools/corba/se/idl/constExpr/Times.java
+com/sun/tools/corba/se/idl/constExpr/UnaryExpr.java
+com/sun/tools/corba/se/idl/constExpr/Xor.java
+com/sun/tools/corba/se/idl/som
+com/sun/tools/corba/se/idl/som/cff
+com/sun/tools/corba/se/idl/som/cff/SCCS
+com/sun/tools/corba/se/idl/som/cff/SCCS/s.FileLocator.java
+com/sun/tools/corba/se/idl/som/cff/SCCS/s.Messages.java
+com/sun/tools/corba/se/idl/som/cff/FileLocator.java
+com/sun/tools/corba/se/idl/som/cff/Messages.java
+com/sun/tools/corba/se/idl/som/idlemit
+com/sun/tools/corba/se/idl/som/idlemit/SCCS
+com/sun/tools/corba/se/idl/som/idlemit/SCCS/s.MetaPragma.java
+com/sun/tools/corba/se/idl/som/idlemit/MetaPragma.java
+com/sun/tools/corba/se/idl/toJavaPortable
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS/s.AttributeGen24.java
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS/s.Arguments.java
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS/s.AttributeGen.java
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS/s.DefaultFactory.java
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS/s.AuxGen.java
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS/s.Compile.java
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS/s.ConstGen.java
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS/s.ForwardValueGen.java
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS/s.EnumGen.java
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS/s.ExceptionGen.java
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS/s.Factories.java
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS/s.GenFactory.java
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS/s.Helper.java
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS/s.Helper24.java
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS/s.Holder.java
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS/s.InterfaceGen.java
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS/s.JavaGenerator.java
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS/s.Skeleton.java
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS/s.MethodGen.java
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS/s.MethodGen24.java
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS/s.MethodGenClone24.java
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS/s.ModuleGen.java
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS/s.NameModifier.java
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS/s.NameModifierImpl.java
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS/s.NativeGen.java
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS/s.PrimitiveGen.java
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS/s.SequenceGen.java
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS/s.StringGen.java
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS/s.StructGen.java
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS/s.Stub.java
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS/s.TCOffsets.java
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS/s.TypedefGen.java
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS/s.UnionGen.java
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS/s.Util.java
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS/s.ValueBoxGen.java
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS/s.ValueBoxGen24.java
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS/s.ValueFactory.java
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS/s.ValueGen.java
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS/s.ValueGen24.java
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS/s.toJavaPortable.prp
+com/sun/tools/corba/se/idl/toJavaPortable/SCCS/s.toJavaPortable_ja.prp
+com/sun/tools/corba/se/idl/toJavaPortable/AttributeGen.java
+com/sun/tools/corba/se/idl/toJavaPortable/Arguments.java
+com/sun/tools/corba/se/idl/toJavaPortable/AttributeGen24.java
+com/sun/tools/corba/se/idl/toJavaPortable/AuxGen.java
+com/sun/tools/corba/se/idl/toJavaPortable/Compile.java
+com/sun/tools/corba/se/idl/toJavaPortable/ConstGen.java
+com/sun/tools/corba/se/idl/toJavaPortable/DefaultFactory.java
+com/sun/tools/corba/se/idl/toJavaPortable/EnumGen.java
+com/sun/tools/corba/se/idl/toJavaPortable/ExceptionGen.java
+com/sun/tools/corba/se/idl/toJavaPortable/Factories.java
+com/sun/tools/corba/se/idl/toJavaPortable/ForwardValueGen.java
+com/sun/tools/corba/se/idl/toJavaPortable/GenFactory.java
+com/sun/tools/corba/se/idl/toJavaPortable/Helper.java
+com/sun/tools/corba/se/idl/toJavaPortable/Helper24.java
+com/sun/tools/corba/se/idl/toJavaPortable/Holder.java
+com/sun/tools/corba/se/idl/toJavaPortable/InterfaceGen.java
+com/sun/tools/corba/se/idl/toJavaPortable/JavaGenerator.java
+com/sun/tools/corba/se/idl/toJavaPortable/MethodGen.java
+com/sun/tools/corba/se/idl/toJavaPortable/Stub.java
+com/sun/tools/corba/se/idl/toJavaPortable/MethodGen24.java
+com/sun/tools/corba/se/idl/toJavaPortable/MethodGenClone24.java
+com/sun/tools/corba/se/idl/toJavaPortable/ModuleGen.java
+com/sun/tools/corba/se/idl/toJavaPortable/NameModifier.java
+com/sun/tools/corba/se/idl/toJavaPortable/NameModifierImpl.java
+com/sun/tools/corba/se/idl/toJavaPortable/NativeGen.java
+com/sun/tools/corba/se/idl/toJavaPortable/PrimitiveGen.java
+com/sun/tools/corba/se/idl/toJavaPortable/SequenceGen.java
+com/sun/tools/corba/se/idl/toJavaPortable/Skeleton.java
+com/sun/tools/corba/se/idl/toJavaPortable/StringGen.java
+com/sun/tools/corba/se/idl/toJavaPortable/StructGen.java
+com/sun/tools/corba/se/idl/toJavaPortable/TCOffsets.java
+com/sun/tools/corba/se/idl/toJavaPortable/TypedefGen.java
+com/sun/tools/corba/se/idl/toJavaPortable/UnionGen.java
+com/sun/tools/corba/se/idl/toJavaPortable/Util.java
+com/sun/tools/corba/se/idl/toJavaPortable/ValueBoxGen.java
+com/sun/tools/corba/se/idl/toJavaPortable/ValueBoxGen24.java
+com/sun/tools/corba/se/idl/toJavaPortable/ValueGen.java
+com/sun/tools/corba/se/idl/toJavaPortable/ValueFactory.java
+com/sun/tools/corba/se/idl/toJavaPortable/ValueGen24.java
+com/sun/tools/corba/se/idl/toJavaPortable/toJavaPortable.prp
+com/sun/tools/corba/se/idl/toJavaPortable/toJavaPortable_ja.prp
+com/sun/tools/corba/se/idl/AttributeEntry.java
+com/sun/tools/corba/se/idl/Arguments.java
+com/sun/tools/corba/se/idl/DefaultSymtabFactory.java
+com/sun/tools/corba/se/idl/AttributeGen.java
+com/sun/tools/corba/se/idl/Comment.java
+com/sun/tools/corba/se/idl/Compile.java
+com/sun/tools/corba/se/idl/ConstEntry.java
+com/sun/tools/corba/se/idl/ConstGen.java
+com/sun/tools/corba/se/idl/EnumEntry.java
+com/sun/tools/corba/se/idl/EnumGen.java
+com/sun/tools/corba/se/idl/ExceptionEntry.java
+com/sun/tools/corba/se/idl/ExceptionGen.java
+com/sun/tools/corba/se/idl/Factories.java
+com/sun/tools/corba/se/idl/ForwardEntry.java
+com/sun/tools/corba/se/idl/IncludeEntry.java
+com/sun/tools/corba/se/idl/IDLID.java
+com/sun/tools/corba/se/idl/ForwardGen.java
+com/sun/tools/corba/se/idl/ForwardValueEntry.java
+com/sun/tools/corba/se/idl/ForwardValueGen.java
+com/sun/tools/corba/se/idl/GenFactory.java
+com/sun/tools/corba/se/idl/GenFileStream.java
+com/sun/tools/corba/se/idl/Generator.java
+com/sun/tools/corba/se/idl/InterfaceEntry.java
+com/sun/tools/corba/se/idl/IncludeGen.java
+com/sun/tools/corba/se/idl/idl.prp
+com/sun/tools/corba/se/idl/InterfaceGen.java
+com/sun/tools/corba/se/idl/InterfaceState.java
+com/sun/tools/corba/se/idl/InterfaceType.java
+com/sun/tools/corba/se/idl/InvalidArgument.java
+com/sun/tools/corba/se/idl/InvalidCharacter.java
+com/sun/tools/corba/se/idl/MethodEntry.java
+com/sun/tools/corba/se/idl/MethodGen.java
+com/sun/tools/corba/se/idl/ModuleEntry.java
+com/sun/tools/corba/se/idl/ModuleGen.java
+com/sun/tools/corba/se/idl/NativeEntry.java
+com/sun/tools/corba/se/idl/NativeGen.java
+com/sun/tools/corba/se/idl/NoPragma.java
+com/sun/tools/corba/se/idl/Noop.java
+com/sun/tools/corba/se/idl/ParameterEntry.java
+com/sun/tools/corba/se/idl/ParameterGen.java
+com/sun/tools/corba/se/idl/ParseException.java
+com/sun/tools/corba/se/idl/Parser.java
+com/sun/tools/corba/se/idl/PragmaEntry.java
+com/sun/tools/corba/se/idl/PragmaGen.java
+com/sun/tools/corba/se/idl/PragmaHandler.java
+com/sun/tools/corba/se/idl/Preprocessor.java
+com/sun/tools/corba/se/idl/PrimitiveEntry.java
+com/sun/tools/corba/se/idl/PrimitiveGen.java
+com/sun/tools/corba/se/idl/RepositoryID.java
+com/sun/tools/corba/se/idl/ResourceBundleUtil.java
+com/sun/tools/corba/se/idl/Scanner.java
+com/sun/tools/corba/se/idl/SequenceEntry.java
+com/sun/tools/corba/se/idl/SequenceGen.java
+com/sun/tools/corba/se/idl/StringEntry.java
+com/sun/tools/corba/se/idl/StringGen.java
+com/sun/tools/corba/se/idl/StructEntry.java
+com/sun/tools/corba/se/idl/StructGen.java
+com/sun/tools/corba/se/idl/SymtabEntry.java
+com/sun/tools/corba/se/idl/SymtabFactory.java
+com/sun/tools/corba/se/idl/Token.java
+com/sun/tools/corba/se/idl/TokenBuffer.java
+com/sun/tools/corba/se/idl/TypedefEntry.java
+com/sun/tools/corba/se/idl/TypedefGen.java
+com/sun/tools/corba/se/idl/UnionBranch.java
+com/sun/tools/corba/se/idl/UnionEntry.java
+com/sun/tools/corba/se/idl/UnionGen.java
+com/sun/tools/corba/se/idl/Util.java
+com/sun/tools/corba/se/idl/ValueBoxEntry.java
+com/sun/tools/corba/se/idl/ValueBoxGen.java
+com/sun/tools/corba/se/idl/ValueEntry.java
+com/sun/tools/corba/se/idl/ValueGen.java
+com/sun/tools/corba/se/idl/ValueRepositoryId.java
+com/sun/tools/corba/se/idl/first.set
+com/sun/tools/corba/se/idl/follow.set
+com/sun/tools/corba/se/idl/grammar.idl
+com/sun/tools/corba/se/idl/grammar3.idl
+com/sun/tools/corba/se/idl/idl_ja.prp
+com/sun/tools/corba/se/idl/ir.idl
+com/sun/tools/corba/se/idl/keywords
+com/sun/tools/corba/se/idl/orb.idl
+com/sun/tools/corba/se/logutil
+com/sun/tools/corba/se/logutil/SCCS
+com/sun/tools/corba/se/logutil/SCCS/s.IndentingPrintWriter.java
+com/sun/tools/corba/se/logutil/SCCS/s.Makefile
+com/sun/tools/corba/se/logutil/SCCS/s.StringUtil.java
+com/sun/tools/corba/se/logutil/lib
+com/sun/tools/corba/se/logutil/lib/SCCS
+com/sun/tools/corba/se/logutil/lib/SCCS/s.jschemelogutil.jar
+com/sun/tools/corba/se/logutil/lib/SCCS/s.jscheme.jar
+com/sun/tools/corba/se/logutil/lib/jschemelogutil.jar
+com/sun/tools/corba/se/logutil/lib/jscheme.jar
+com/sun/tools/corba/se/logutil/scripts
+com/sun/tools/corba/se/logutil/scripts/SCCS
+com/sun/tools/corba/se/logutil/scripts/SCCS/s.mc.scm
+com/sun/tools/corba/se/logutil/scripts/SCCS/s.mc
+com/sun/tools/corba/se/logutil/scripts/SCCS/s.run
+com/sun/tools/corba/se/logutil/scripts/mc.scm
+com/sun/tools/corba/se/logutil/scripts/mc
+com/sun/tools/corba/se/logutil/scripts/run
+com/sun/tools/corba/se/logutil/IndentingPrintWriter.java
+com/sun/tools/corba/se/logutil/Makefile
+com/sun/tools/corba/se/logutil/StringUtil.java
+com/sun/tools/doclets
+com/sun/tools/doclets/SCCS
+com/sun/tools/doclets/SCCS/s.Taglet.java
+com/sun/tools/doclets/SCCS/s.package.html
+com/sun/tools/doclets/formats
+com/sun/tools/doclets/formats/html
+com/sun/tools/doclets/formats/html/SCCS
+com/sun/tools/doclets/formats/html/SCCS/s.AnnotationTypeOptionalMemberWriterImpl.java
+com/sun/tools/doclets/formats/html/SCCS/s.AbstractExecutableMemberWriter.java
+com/sun/tools/doclets/formats/html/SCCS/s.AbstractIndexWriter.java
+com/sun/tools/doclets/formats/html/SCCS/s.AbstractMemberWriter.java
+com/sun/tools/doclets/formats/html/SCCS/s.AbstractPackageIndexWriter.java
+com/sun/tools/doclets/formats/html/SCCS/s.AbstractTreeWriter.java
+com/sun/tools/doclets/formats/html/SCCS/s.AllClassesFrameWriter.java
+com/sun/tools/doclets/formats/html/SCCS/s.HtmlDocletWriter.java
+com/sun/tools/doclets/formats/html/SCCS/s.HelpWriter.java
+com/sun/tools/doclets/formats/html/SCCS/s.AnnotationTypeRequiredMemberWriterImpl.java
+com/sun/tools/doclets/formats/html/SCCS/s.AnnotationTypeWriterImpl.java
+com/sun/tools/doclets/formats/html/SCCS/s.ClassUseWriter.java
+com/sun/tools/doclets/formats/html/SCCS/s.ClassWriterImpl.java
+com/sun/tools/doclets/formats/html/SCCS/s.ConfigurationImpl.java
+com/sun/tools/doclets/formats/html/SCCS/s.ConstantsSummaryWriterImpl.java
+com/sun/tools/doclets/formats/html/SCCS/s.ConstructorWriterImpl.java
+com/sun/tools/doclets/formats/html/SCCS/s.DeprecatedListWriter.java
+com/sun/tools/doclets/formats/html/SCCS/s.EnumConstantWriterImpl.java
+com/sun/tools/doclets/formats/html/SCCS/s.FieldWriterImpl.java
+com/sun/tools/doclets/formats/html/SCCS/s.FrameOutputWriter.java
+com/sun/tools/doclets/formats/html/SCCS/s.HtmlDoclet.java
+com/sun/tools/doclets/formats/html/SCCS/s.HtmlSerialFieldWriter.java
+com/sun/tools/doclets/formats/html/SCCS/s.HtmlSerialMethodWriter.java
+com/sun/tools/doclets/formats/html/SCCS/s.LinkFactoryImpl.java
+com/sun/tools/doclets/formats/html/SCCS/s.LinkInfoImpl.java
+com/sun/tools/doclets/formats/html/SCCS/s.LinkOutputImpl.java
+com/sun/tools/doclets/formats/html/SCCS/s.MethodWriterImpl.java
+com/sun/tools/doclets/formats/html/SCCS/s.NestedClassWriterImpl.java
+com/sun/tools/doclets/formats/html/SCCS/s.PackageFrameWriter.java
+com/sun/tools/doclets/formats/html/SCCS/s.PackageIndexFrameWriter.java
+com/sun/tools/doclets/formats/html/SCCS/s.PackageIndexWriter.java
+com/sun/tools/doclets/formats/html/SCCS/s.PackageTreeWriter.java
+com/sun/tools/doclets/formats/html/SCCS/s.PackageUseWriter.java
+com/sun/tools/doclets/formats/html/SCCS/s.PackageWriterImpl.java
+com/sun/tools/doclets/formats/html/SCCS/s.SerializedFormWriterImpl.java
+com/sun/tools/doclets/formats/html/SCCS/s.SingleIndexWriter.java
+com/sun/tools/doclets/formats/html/SCCS/s.SplitIndexWriter.java
+com/sun/tools/doclets/formats/html/SCCS/s.StylesheetWriter.java
+com/sun/tools/doclets/formats/html/SCCS/s.SubWriterHolderWriter.java
+com/sun/tools/doclets/formats/html/SCCS/s.TagletOutputImpl.java
+com/sun/tools/doclets/formats/html/SCCS/s.TagletWriterImpl.java
+com/sun/tools/doclets/formats/html/SCCS/s.TreeWriter.java
+com/sun/tools/doclets/formats/html/SCCS/s.WriterFactoryImpl.java
+com/sun/tools/doclets/formats/html/SCCS/s.package.html
+com/sun/tools/doclets/formats/html/markup
+com/sun/tools/doclets/formats/html/markup/SCCS
+com/sun/tools/doclets/formats/html/markup/SCCS/s.HtmlDocWriter.java
+com/sun/tools/doclets/formats/html/markup/SCCS/s.HtmlWriter.java
+com/sun/tools/doclets/formats/html/markup/SCCS/s.package.html
+com/sun/tools/doclets/formats/html/markup/HtmlDocWriter.java
+com/sun/tools/doclets/formats/html/markup/HtmlWriter.java
+com/sun/tools/doclets/formats/html/markup/package.html
+com/sun/tools/doclets/formats/html/resources
+com/sun/tools/doclets/formats/html/resources/SCCS
+com/sun/tools/doclets/formats/html/resources/SCCS/s.standard_ja.properties
+com/sun/tools/doclets/formats/html/resources/SCCS/s.standard.properties
+com/sun/tools/doclets/formats/html/resources/standard_ja.properties
+com/sun/tools/doclets/formats/html/resources/standard.properties
+com/sun/tools/doclets/formats/html/AnnotationTypeOptionalMemberWriterImpl.java
+com/sun/tools/doclets/formats/html/AbstractExecutableMemberWriter.java
+com/sun/tools/doclets/formats/html/AbstractIndexWriter.java
+com/sun/tools/doclets/formats/html/AbstractMemberWriter.java
+com/sun/tools/doclets/formats/html/AbstractPackageIndexWriter.java
+com/sun/tools/doclets/formats/html/AbstractTreeWriter.java
+com/sun/tools/doclets/formats/html/AllClassesFrameWriter.java
+com/sun/tools/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java
+com/sun/tools/doclets/formats/html/AnnotationTypeWriterImpl.java
+com/sun/tools/doclets/formats/html/ClassUseWriter.java
+com/sun/tools/doclets/formats/html/ConstantsSummaryWriterImpl.java
+com/sun/tools/doclets/formats/html/ClassWriterImpl.java
+com/sun/tools/doclets/formats/html/ConfigurationImpl.java
+com/sun/tools/doclets/formats/html/MethodWriterImpl.java
+com/sun/tools/doclets/formats/html/ConstructorWriterImpl.java
+com/sun/tools/doclets/formats/html/DeprecatedListWriter.java
+com/sun/tools/doclets/formats/html/EnumConstantWriterImpl.java
+com/sun/tools/doclets/formats/html/FieldWriterImpl.java
+com/sun/tools/doclets/formats/html/FrameOutputWriter.java
+com/sun/tools/doclets/formats/html/HelpWriter.java
+com/sun/tools/doclets/formats/html/HtmlDoclet.java
+com/sun/tools/doclets/formats/html/HtmlDocletWriter.java
+com/sun/tools/doclets/formats/html/HtmlSerialFieldWriter.java
+com/sun/tools/doclets/formats/html/HtmlSerialMethodWriter.java
+com/sun/tools/doclets/formats/html/LinkFactoryImpl.java
+com/sun/tools/doclets/formats/html/LinkInfoImpl.java
+com/sun/tools/doclets/formats/html/LinkOutputImpl.java
+com/sun/tools/doclets/formats/html/PackageIndexFrameWriter.java
+com/sun/tools/doclets/formats/html/NestedClassWriterImpl.java
+com/sun/tools/doclets/formats/html/PackageFrameWriter.java
+com/sun/tools/doclets/formats/html/SerializedFormWriterImpl.java
+com/sun/tools/doclets/formats/html/PackageIndexWriter.java
+com/sun/tools/doclets/formats/html/PackageTreeWriter.java
+com/sun/tools/doclets/formats/html/PackageUseWriter.java
+com/sun/tools/doclets/formats/html/PackageWriterImpl.java
+com/sun/tools/doclets/formats/html/SingleIndexWriter.java
+com/sun/tools/doclets/formats/html/SplitIndexWriter.java
+com/sun/tools/doclets/formats/html/StylesheetWriter.java
+com/sun/tools/doclets/formats/html/SubWriterHolderWriter.java
+com/sun/tools/doclets/formats/html/TagletOutputImpl.java
+com/sun/tools/doclets/formats/html/TagletWriterImpl.java
+com/sun/tools/doclets/formats/html/TreeWriter.java
+com/sun/tools/doclets/formats/html/WriterFactoryImpl.java
+com/sun/tools/doclets/formats/html/package.html
+com/sun/tools/doclets/internal
+com/sun/tools/doclets/internal/toolkit
+com/sun/tools/doclets/internal/toolkit/SCCS
+com/sun/tools/doclets/internal/toolkit/SCCS/s.AnnotationTypeWriter.java
+com/sun/tools/doclets/internal/toolkit/SCCS/s.AbstractDoclet.java
+com/sun/tools/doclets/internal/toolkit/SCCS/s.MethodWriter.java
+com/sun/tools/doclets/internal/toolkit/SCCS/s.AnnotationTypeOptionalMemberWriter.java
+com/sun/tools/doclets/internal/toolkit/SCCS/s.AnnotationTypeRequiredMemberWriter.java
+com/sun/tools/doclets/internal/toolkit/SCCS/s.ClassWriter.java
+com/sun/tools/doclets/internal/toolkit/SCCS/s.Configuration.java
+com/sun/tools/doclets/internal/toolkit/SCCS/s.ConstantsSummaryWriter.java
+com/sun/tools/doclets/internal/toolkit/SCCS/s.ConstructorWriter.java
+com/sun/tools/doclets/internal/toolkit/SCCS/s.EnumConstantWriter.java
+com/sun/tools/doclets/internal/toolkit/SCCS/s.FieldWriter.java
+com/sun/tools/doclets/internal/toolkit/SCCS/s.MemberSummaryWriter.java
+com/sun/tools/doclets/internal/toolkit/SCCS/s.NestedClassWriter.java
+com/sun/tools/doclets/internal/toolkit/SCCS/s.PackageSummaryWriter.java
+com/sun/tools/doclets/internal/toolkit/SCCS/s.SerializedFormWriter.java
+com/sun/tools/doclets/internal/toolkit/SCCS/s.WriterFactory.java
+com/sun/tools/doclets/internal/toolkit/SCCS/s.package.html
+com/sun/tools/doclets/internal/toolkit/builders
+com/sun/tools/doclets/internal/toolkit/builders/SCCS
+com/sun/tools/doclets/internal/toolkit/builders/SCCS/s.AbstractMemberBuilder.java
+com/sun/tools/doclets/internal/toolkit/builders/SCCS/s.AbstractBuilder.java
+com/sun/tools/doclets/internal/toolkit/builders/SCCS/s.AnnotationTypeBuilder.java
+com/sun/tools/doclets/internal/toolkit/builders/SCCS/s.BuilderFactory.java
+com/sun/tools/doclets/internal/toolkit/builders/SCCS/s.ClassBuilder.java
+com/sun/tools/doclets/internal/toolkit/builders/SCCS/s.AnnotationTypeOptionalMemberBuilder.java
+com/sun/tools/doclets/internal/toolkit/builders/SCCS/s.AnnotationTypeRequiredMemberBuilder.java
+com/sun/tools/doclets/internal/toolkit/builders/SCCS/s.ConstantsSummaryBuilder.java
+com/sun/tools/doclets/internal/toolkit/builders/SCCS/s.ConstructorBuilder.java
+com/sun/tools/doclets/internal/toolkit/builders/SCCS/s.EnumConstantBuilder.java
+com/sun/tools/doclets/internal/toolkit/builders/SCCS/s.FieldBuilder.java
+com/sun/tools/doclets/internal/toolkit/builders/SCCS/s.LayoutParser.java
+com/sun/tools/doclets/internal/toolkit/builders/SCCS/s.PackageSummaryBuilder.java
+com/sun/tools/doclets/internal/toolkit/builders/SCCS/s.MemberSummaryBuilder.java
+com/sun/tools/doclets/internal/toolkit/builders/SCCS/s.MethodBuilder.java
+com/sun/tools/doclets/internal/toolkit/builders/SCCS/s.SerializedFormBuilder.java
+com/sun/tools/doclets/internal/toolkit/builders/SCCS/s.package.html
+com/sun/tools/doclets/internal/toolkit/builders/AbstractMemberBuilder.java
+com/sun/tools/doclets/internal/toolkit/builders/AbstractBuilder.java
+com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeBuilder.java
+com/sun/tools/doclets/internal/toolkit/builders/BuilderFactory.java
+com/sun/tools/doclets/internal/toolkit/builders/ClassBuilder.java
+com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeOptionalMemberBuilder.java
+com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeRequiredMemberBuilder.java
+com/sun/tools/doclets/internal/toolkit/builders/ConstantsSummaryBuilder.java
+com/sun/tools/doclets/internal/toolkit/builders/ConstructorBuilder.java
+com/sun/tools/doclets/internal/toolkit/builders/EnumConstantBuilder.java
+com/sun/tools/doclets/internal/toolkit/builders/FieldBuilder.java
+com/sun/tools/doclets/internal/toolkit/builders/LayoutParser.java
+com/sun/tools/doclets/internal/toolkit/builders/MemberSummaryBuilder.java
+com/sun/tools/doclets/internal/toolkit/builders/MethodBuilder.java
+com/sun/tools/doclets/internal/toolkit/builders/PackageSummaryBuilder.java
+com/sun/tools/doclets/internal/toolkit/builders/SerializedFormBuilder.java
+com/sun/tools/doclets/internal/toolkit/builders/package.html
+com/sun/tools/doclets/internal/toolkit/resources
+com/sun/tools/doclets/internal/toolkit/resources/SCCS
+com/sun/tools/doclets/internal/toolkit/resources/SCCS/s.doclets.properties
+com/sun/tools/doclets/internal/toolkit/resources/SCCS/s.doclet.xml
+com/sun/tools/doclets/internal/toolkit/resources/SCCS/s.doclets_ja.properties
+com/sun/tools/doclets/internal/toolkit/resources/SCCS/s.inherit.gif
+com/sun/tools/doclets/internal/toolkit/resources/doclets.properties
+com/sun/tools/doclets/internal/toolkit/resources/doclet.xml
+com/sun/tools/doclets/internal/toolkit/resources/doclets_ja.properties
+com/sun/tools/doclets/internal/toolkit/resources/inherit.gif
+com/sun/tools/doclets/internal/toolkit/taglets
+com/sun/tools/doclets/internal/toolkit/taglets/SCCS
+com/sun/tools/doclets/internal/toolkit/taglets/SCCS/s.BaseExecutableMemberTaglet.java
+com/sun/tools/doclets/internal/toolkit/taglets/SCCS/s.BaseInlineTaglet.java
+com/sun/tools/doclets/internal/toolkit/taglets/SCCS/s.BaseTaglet.java
+com/sun/tools/doclets/internal/toolkit/taglets/SCCS/s.CodeTaglet.java
+com/sun/tools/doclets/internal/toolkit/taglets/SCCS/s.DeprecatedTaglet.java
+com/sun/tools/doclets/internal/toolkit/taglets/SCCS/s.DocRootTaglet.java
+com/sun/tools/doclets/internal/toolkit/taglets/SCCS/s.InheritDocTaglet.java
+com/sun/tools/doclets/internal/toolkit/taglets/SCCS/s.InheritableTaglet.java
+com/sun/tools/doclets/internal/toolkit/taglets/SCCS/s.LegacyTaglet.java
+com/sun/tools/doclets/internal/toolkit/taglets/SCCS/s.LiteralTaglet.java
+com/sun/tools/doclets/internal/toolkit/taglets/SCCS/s.ParamTaglet.java
+com/sun/tools/doclets/internal/toolkit/taglets/SCCS/s.ReturnTaglet.java
+com/sun/tools/doclets/internal/toolkit/taglets/SCCS/s.SeeTaglet.java
+com/sun/tools/doclets/internal/toolkit/taglets/SCCS/s.SimpleTaglet.java
+com/sun/tools/doclets/internal/toolkit/taglets/SCCS/s.Taglet.java
+com/sun/tools/doclets/internal/toolkit/taglets/SCCS/s.TagletOutput.java
+com/sun/tools/doclets/internal/toolkit/taglets/SCCS/s.TagletManager.java
+com/sun/tools/doclets/internal/toolkit/taglets/SCCS/s.TagletWriter.java
+com/sun/tools/doclets/internal/toolkit/taglets/SCCS/s.ThrowsTaglet.java
+com/sun/tools/doclets/internal/toolkit/taglets/SCCS/s.ValueTaglet.java
+com/sun/tools/doclets/internal/toolkit/taglets/SCCS/s.package.html
+com/sun/tools/doclets/internal/toolkit/taglets/Taglet.java
+com/sun/tools/doclets/internal/toolkit/taglets/BaseExecutableMemberTaglet.java
+com/sun/tools/doclets/internal/toolkit/taglets/BaseInlineTaglet.java
+com/sun/tools/doclets/internal/toolkit/taglets/BaseTaglet.java
+com/sun/tools/doclets/internal/toolkit/taglets/CodeTaglet.java
+com/sun/tools/doclets/internal/toolkit/taglets/DeprecatedTaglet.java
+com/sun/tools/doclets/internal/toolkit/taglets/DocRootTaglet.java
+com/sun/tools/doclets/internal/toolkit/taglets/InheritDocTaglet.java
+com/sun/tools/doclets/internal/toolkit/taglets/InheritableTaglet.java
+com/sun/tools/doclets/internal/toolkit/taglets/LegacyTaglet.java
+com/sun/tools/doclets/internal/toolkit/taglets/LiteralTaglet.java
+com/sun/tools/doclets/internal/toolkit/taglets/ParamTaglet.java
+com/sun/tools/doclets/internal/toolkit/taglets/ReturnTaglet.java
+com/sun/tools/doclets/internal/toolkit/taglets/SeeTaglet.java
+com/sun/tools/doclets/internal/toolkit/taglets/SimpleTaglet.java
+com/sun/tools/doclets/internal/toolkit/taglets/TagletManager.java
+com/sun/tools/doclets/internal/toolkit/taglets/TagletOutput.java
+com/sun/tools/doclets/internal/toolkit/taglets/TagletWriter.java
+com/sun/tools/doclets/internal/toolkit/taglets/ThrowsTaglet.java
+com/sun/tools/doclets/internal/toolkit/taglets/ValueTaglet.java
+com/sun/tools/doclets/internal/toolkit/taglets/package.html
+com/sun/tools/doclets/internal/toolkit/util
+com/sun/tools/doclets/internal/toolkit/util/SCCS
+com/sun/tools/doclets/internal/toolkit/util/SCCS/s.CommentedMethodFinder.java
+com/sun/tools/doclets/internal/toolkit/util/SCCS/s.ClassDocCatalog.java
+com/sun/tools/doclets/internal/toolkit/util/SCCS/s.ClassTree.java
+com/sun/tools/doclets/internal/toolkit/util/SCCS/s.ClassUseMapper.java
+com/sun/tools/doclets/internal/toolkit/util/SCCS/s.DeprecatedAPIListBuilder.java
+com/sun/tools/doclets/internal/toolkit/util/SCCS/s.DirectoryManager.java
+com/sun/tools/doclets/internal/toolkit/util/SCCS/s.DocFinder.java
+com/sun/tools/doclets/internal/toolkit/util/SCCS/s.DocletAbortException.java
+com/sun/tools/doclets/internal/toolkit/util/SCCS/s.DocletConstants.java
+com/sun/tools/doclets/internal/toolkit/util/SCCS/s.Extern.java
+com/sun/tools/doclets/internal/toolkit/util/SCCS/s.Group.java
+com/sun/tools/doclets/internal/toolkit/util/SCCS/s.ImplementedMethods.java
+com/sun/tools/doclets/internal/toolkit/util/SCCS/s.IndexBuilder.java
+com/sun/tools/doclets/internal/toolkit/util/SCCS/s.MessageRetriever.java
+com/sun/tools/doclets/internal/toolkit/util/SCCS/s.SourceToHTMLConverter.java
+com/sun/tools/doclets/internal/toolkit/util/SCCS/s.MetaKeywords.java
+com/sun/tools/doclets/internal/toolkit/util/SCCS/s.MethodFinder.java
+com/sun/tools/doclets/internal/toolkit/util/SCCS/s.PackageListWriter.java
+com/sun/tools/doclets/internal/toolkit/util/SCCS/s.SourcePath.java
+com/sun/tools/doclets/internal/toolkit/util/SCCS/s.TaggedMethodFinder.java
+com/sun/tools/doclets/internal/toolkit/util/SCCS/s.TextTag.java
+com/sun/tools/doclets/internal/toolkit/util/SCCS/s.Util.java
+com/sun/tools/doclets/internal/toolkit/util/SCCS/s.VisibleMemberMap.java
+com/sun/tools/doclets/internal/toolkit/util/SCCS/s.package.html
+com/sun/tools/doclets/internal/toolkit/util/links
+com/sun/tools/doclets/internal/toolkit/util/links/SCCS
+com/sun/tools/doclets/internal/toolkit/util/links/SCCS/s.LinkFactory.java
+com/sun/tools/doclets/internal/toolkit/util/links/SCCS/s.LinkInfo.java
+com/sun/tools/doclets/internal/toolkit/util/links/SCCS/s.LinkOutput.java
+com/sun/tools/doclets/internal/toolkit/util/links/SCCS/s.package.html
+com/sun/tools/doclets/internal/toolkit/util/links/LinkFactory.java
+com/sun/tools/doclets/internal/toolkit/util/links/LinkInfo.java
+com/sun/tools/doclets/internal/toolkit/util/links/LinkOutput.java
+com/sun/tools/doclets/internal/toolkit/util/links/package.html
+com/sun/tools/doclets/internal/toolkit/util/CommentedMethodFinder.java
+com/sun/tools/doclets/internal/toolkit/util/ClassDocCatalog.java
+com/sun/tools/doclets/internal/toolkit/util/ClassTree.java
+com/sun/tools/doclets/internal/toolkit/util/ClassUseMapper.java
+com/sun/tools/doclets/internal/toolkit/util/IndexBuilder.java
+com/sun/tools/doclets/internal/toolkit/util/Extern.java
+com/sun/tools/doclets/internal/toolkit/util/DeprecatedAPIListBuilder.java
+com/sun/tools/doclets/internal/toolkit/util/DirectoryManager.java
+com/sun/tools/doclets/internal/toolkit/util/DocFinder.java
+com/sun/tools/doclets/internal/toolkit/util/DocletAbortException.java
+com/sun/tools/doclets/internal/toolkit/util/DocletConstants.java
+com/sun/tools/doclets/internal/toolkit/util/Group.java
+com/sun/tools/doclets/internal/toolkit/util/SourceToHTMLConverter.java
+com/sun/tools/doclets/internal/toolkit/util/ImplementedMethods.java
+com/sun/tools/doclets/internal/toolkit/util/MessageRetriever.java
+com/sun/tools/doclets/internal/toolkit/util/MetaKeywords.java
+com/sun/tools/doclets/internal/toolkit/util/MethodFinder.java
+com/sun/tools/doclets/internal/toolkit/util/PackageListWriter.java
+com/sun/tools/doclets/internal/toolkit/util/SourcePath.java
+com/sun/tools/doclets/internal/toolkit/util/TaggedMethodFinder.java
+com/sun/tools/doclets/internal/toolkit/util/TextTag.java
+com/sun/tools/doclets/internal/toolkit/util/Util.java
+com/sun/tools/doclets/internal/toolkit/util/VisibleMemberMap.java
+com/sun/tools/doclets/internal/toolkit/util/package.html
+com/sun/tools/doclets/internal/toolkit/AnnotationTypeWriter.java
+com/sun/tools/doclets/internal/toolkit/AbstractDoclet.java
+com/sun/tools/doclets/internal/toolkit/package.html
+com/sun/tools/doclets/internal/toolkit/AnnotationTypeOptionalMemberWriter.java
+com/sun/tools/doclets/internal/toolkit/AnnotationTypeRequiredMemberWriter.java
+com/sun/tools/doclets/internal/toolkit/ClassWriter.java
+com/sun/tools/doclets/internal/toolkit/Configuration.java
+com/sun/tools/doclets/internal/toolkit/ConstantsSummaryWriter.java
+com/sun/tools/doclets/internal/toolkit/ConstructorWriter.java
+com/sun/tools/doclets/internal/toolkit/EnumConstantWriter.java
+com/sun/tools/doclets/internal/toolkit/FieldWriter.java
+com/sun/tools/doclets/internal/toolkit/MethodWriter.java
+com/sun/tools/doclets/internal/toolkit/MemberSummaryWriter.java
+com/sun/tools/doclets/internal/toolkit/NestedClassWriter.java
+com/sun/tools/doclets/internal/toolkit/PackageSummaryWriter.java
+com/sun/tools/doclets/internal/toolkit/SerializedFormWriter.java
+com/sun/tools/doclets/internal/toolkit/WriterFactory.java
+com/sun/tools/doclets/standard
+com/sun/tools/doclets/standard/SCCS
+com/sun/tools/doclets/standard/SCCS/s.Standard.java
+com/sun/tools/doclets/standard/Standard.java
+com/sun/tools/doclets/package.html
+com/sun/tools/doclets/Taglet.java
+com/sun/tools/example
+com/sun/tools/example/SCCS
+com/sun/tools/example/SCCS/s.README
+com/sun/tools/example/debug
+com/sun/tools/example/debug/bdi
+com/sun/tools/example/debug/bdi/SCCS
+com/sun/tools/example/debug/bdi/SCCS/s.AmbiguousMethodException.java
+com/sun/tools/example/debug/bdi/SCCS/s.AccessWatchpointSpec.java
+com/sun/tools/example/debug/bdi/SCCS/s.BreakpointSpec.java
+com/sun/tools/example/debug/bdi/SCCS/s.ChildSession.java
+com/sun/tools/example/debug/bdi/SCCS/s.EvaluationException.java
+com/sun/tools/example/debug/bdi/SCCS/s.EventRequestSpec.java
+com/sun/tools/example/debug/bdi/SCCS/s.EventRequestSpecList.java
+com/sun/tools/example/debug/bdi/SCCS/s.ExceptionSpec.java
+com/sun/tools/example/debug/bdi/SCCS/s.ExecutionManager.java
+com/sun/tools/example/debug/bdi/SCCS/s.InputListener.java
+com/sun/tools/example/debug/bdi/SCCS/s.Session.java
+com/sun/tools/example/debug/bdi/SCCS/s.SourceNameReferenceTypeSpec.java
+com/sun/tools/example/debug/bdi/SCCS/s.FrameIndexOutOfBoundsException.java
+com/sun/tools/example/debug/bdi/SCCS/s.JDIEventSource.java
+com/sun/tools/example/debug/bdi/SCCS/s.LineBreakpointSpec.java
+com/sun/tools/example/debug/bdi/SCCS/s.LineNotFoundException.java
+com/sun/tools/example/debug/bdi/SCCS/s.MalformedMemberNameException.java
+com/sun/tools/example/debug/bdi/SCCS/s.MethodBreakpointSpec.java
+com/sun/tools/example/debug/bdi/SCCS/s.MethodNotFoundException.java
+com/sun/tools/example/debug/bdi/SCCS/s.ModificationWatchpointSpec.java
+com/sun/tools/example/debug/bdi/SCCS/s.NoSessionException.java
+com/sun/tools/example/debug/bdi/SCCS/s.NoThreadException.java
+com/sun/tools/example/debug/bdi/SCCS/s.OutputListener.java
+com/sun/tools/example/debug/bdi/SCCS/s.ParseException.java
+com/sun/tools/example/debug/bdi/SCCS/s.PatternReferenceTypeSpec.java
+com/sun/tools/example/debug/bdi/SCCS/s.ReferenceTypeSpec.java
+com/sun/tools/example/debug/bdi/SCCS/s.SessionListener.java
+com/sun/tools/example/debug/bdi/SCCS/s.SpecEvent.java
+com/sun/tools/example/debug/bdi/SCCS/s.ThreadGroupIterator.java
+com/sun/tools/example/debug/bdi/SCCS/s.SpecErrorEvent.java
+com/sun/tools/example/debug/bdi/SCCS/s.SpecListener.java
+com/sun/tools/example/debug/bdi/SCCS/s.VMLaunchFailureException.java
+com/sun/tools/example/debug/bdi/SCCS/s.ThreadInfo.java
+com/sun/tools/example/debug/bdi/SCCS/s.ThreadIterator.java
+com/sun/tools/example/debug/bdi/SCCS/s.Utils.java
+com/sun/tools/example/debug/bdi/SCCS/s.VMNotInterruptedException.java
+com/sun/tools/example/debug/bdi/SCCS/s.WatchpointSpec.java
+com/sun/tools/example/debug/bdi/AmbiguousMethodException.java
+com/sun/tools/example/debug/bdi/AccessWatchpointSpec.java
+com/sun/tools/example/debug/bdi/EvaluationException.java
+com/sun/tools/example/debug/bdi/BreakpointSpec.java
+com/sun/tools/example/debug/bdi/ChildSession.java
+com/sun/tools/example/debug/bdi/FrameIndexOutOfBoundsException.java
+com/sun/tools/example/debug/bdi/EventRequestSpec.java
+com/sun/tools/example/debug/bdi/EventRequestSpecList.java
+com/sun/tools/example/debug/bdi/ExceptionSpec.java
+com/sun/tools/example/debug/bdi/ExecutionManager.java
+com/sun/tools/example/debug/bdi/LineBreakpointSpec.java
+com/sun/tools/example/debug/bdi/InputListener.java
+com/sun/tools/example/debug/bdi/JDIEventSource.java
+com/sun/tools/example/debug/bdi/MalformedMemberNameException.java
+com/sun/tools/example/debug/bdi/LineNotFoundException.java
+com/sun/tools/example/debug/bdi/MethodNotFoundException.java
+com/sun/tools/example/debug/bdi/MethodBreakpointSpec.java
+com/sun/tools/example/debug/bdi/ThreadGroupIterator.java
+com/sun/tools/example/debug/bdi/ModificationWatchpointSpec.java
+com/sun/tools/example/debug/bdi/NoSessionException.java
+com/sun/tools/example/debug/bdi/NoThreadException.java
+com/sun/tools/example/debug/bdi/OutputListener.java
+com/sun/tools/example/debug/bdi/ParseException.java
+com/sun/tools/example/debug/bdi/PatternReferenceTypeSpec.java
+com/sun/tools/example/debug/bdi/ReferenceTypeSpec.java
+com/sun/tools/example/debug/bdi/Session.java
+com/sun/tools/example/debug/bdi/SessionListener.java
+com/sun/tools/example/debug/bdi/SourceNameReferenceTypeSpec.java
+com/sun/tools/example/debug/bdi/SpecErrorEvent.java
+com/sun/tools/example/debug/bdi/SpecEvent.java
+com/sun/tools/example/debug/bdi/SpecListener.java
+com/sun/tools/example/debug/bdi/ThreadIterator.java
+com/sun/tools/example/debug/bdi/ThreadInfo.java
+com/sun/tools/example/debug/bdi/WatchpointSpec.java
+com/sun/tools/example/debug/bdi/Utils.java
+com/sun/tools/example/debug/bdi/VMLaunchFailureException.java
+com/sun/tools/example/debug/bdi/VMNotInterruptedException.java
+com/sun/tools/example/debug/event
+com/sun/tools/example/debug/event/SCCS
+com/sun/tools/example/debug/event/SCCS/s.AccessWatchpointEventSet.java
+com/sun/tools/example/debug/event/SCCS/s.AbstractEventSet.java
+com/sun/tools/example/debug/event/SCCS/s.LocationTriggerEventSet.java
+com/sun/tools/example/debug/event/SCCS/s.ClassPrepareEventSet.java
+com/sun/tools/example/debug/event/SCCS/s.ClassUnloadEventSet.java
+com/sun/tools/example/debug/event/SCCS/s.ExceptionEventSet.java
+com/sun/tools/example/debug/event/SCCS/s.JDIAdapter.java
+com/sun/tools/example/debug/event/SCCS/s.JDIListener.java
+com/sun/tools/example/debug/event/SCCS/s.LocatableEventSet.java
+com/sun/tools/example/debug/event/SCCS/s.ModificationWatchpointEventSet.java
+com/sun/tools/example/debug/event/SCCS/s.ThreadDeathEventSet.java
+com/sun/tools/example/debug/event/SCCS/s.ThreadStartEventSet.java
+com/sun/tools/example/debug/event/SCCS/s.VMDeathEventSet.java
+com/sun/tools/example/debug/event/SCCS/s.VMDisconnectEventSet.java
+com/sun/tools/example/debug/event/SCCS/s.VMStartEventSet.java
+com/sun/tools/example/debug/event/SCCS/s.WatchpointEventSet.java
+com/sun/tools/example/debug/event/AccessWatchpointEventSet.java
+com/sun/tools/example/debug/event/AbstractEventSet.java
+com/sun/tools/example/debug/event/LocationTriggerEventSet.java
+com/sun/tools/example/debug/event/ClassPrepareEventSet.java
+com/sun/tools/example/debug/event/ClassUnloadEventSet.java
+com/sun/tools/example/debug/event/ExceptionEventSet.java
+com/sun/tools/example/debug/event/JDIAdapter.java
+com/sun/tools/example/debug/event/JDIListener.java
+com/sun/tools/example/debug/event/LocatableEventSet.java
+com/sun/tools/example/debug/event/ModificationWatchpointEventSet.java
+com/sun/tools/example/debug/event/ThreadDeathEventSet.java
+com/sun/tools/example/debug/event/ThreadStartEventSet.java
+com/sun/tools/example/debug/event/VMDeathEventSet.java
+com/sun/tools/example/debug/event/VMDisconnectEventSet.java
+com/sun/tools/example/debug/event/VMStartEventSet.java
+com/sun/tools/example/debug/event/WatchpointEventSet.java
+com/sun/tools/example/debug/expr
+com/sun/tools/example/debug/expr/SCCS
+com/sun/tools/example/debug/expr/SCCS/s.Expr.jj
+com/sun/tools/example/debug/expr/SCCS/s.ASCII_UCodeESC_CharStream.java
+com/sun/tools/example/debug/expr/SCCS/s.LValue.java
+com/sun/tools/example/debug/expr/SCCS/s.ExpressionParser.java
+com/sun/tools/example/debug/expr/SCCS/s.ExpressionParserConstants.java
+com/sun/tools/example/debug/expr/SCCS/s.ExpressionParserTokenManager.java
+com/sun/tools/example/debug/expr/SCCS/s.ParseException.java
+com/sun/tools/example/debug/expr/SCCS/s.Token.java
+com/sun/tools/example/debug/expr/SCCS/s.TokenMgrError.java
+com/sun/tools/example/debug/expr/Expr.jj
+com/sun/tools/example/debug/expr/ASCII_UCodeESC_CharStream.java
+com/sun/tools/example/debug/expr/LValue.java
+com/sun/tools/example/debug/expr/TokenMgrError.java
+com/sun/tools/example/debug/expr/Token.java
+com/sun/tools/example/debug/expr/ExpressionParser.java
+com/sun/tools/example/debug/expr/ExpressionParserConstants.java
+com/sun/tools/example/debug/expr/ExpressionParserTokenManager.java
+com/sun/tools/example/debug/expr/ParseException.java
+com/sun/tools/example/debug/gui
+com/sun/tools/example/debug/gui/SCCS
+com/sun/tools/example/debug/gui/SCCS/s.CommandInterpreter.java
+com/sun/tools/example/debug/gui/SCCS/s.ApplicationTool.java
+com/sun/tools/example/debug/gui/SCCS/s.ClassManager.java
+com/sun/tools/example/debug/gui/SCCS/s.ClassTreeTool.java
+com/sun/tools/example/debug/gui/SCCS/s.CurrentFrameChangedEvent.java
+com/sun/tools/example/debug/gui/SCCS/s.CommandTool.java
+com/sun/tools/example/debug/gui/SCCS/s.ContextListener.java
+com/sun/tools/example/debug/gui/SCCS/s.ContextManager.java
+com/sun/tools/example/debug/gui/SCCS/s.JDBFileFilter.java
+com/sun/tools/example/debug/gui/SCCS/s.Environment.java
+com/sun/tools/example/debug/gui/SCCS/s.GUI.java
+com/sun/tools/example/debug/gui/SCCS/s.Icons.java
+com/sun/tools/example/debug/gui/SCCS/s.SourcepathChangedEvent.java
+com/sun/tools/example/debug/gui/SCCS/s.JDBMenuBar.java
+com/sun/tools/example/debug/gui/SCCS/s.JDBToolBar.java
+com/sun/tools/example/debug/gui/SCCS/s.LaunchTool.java
+com/sun/tools/example/debug/gui/SCCS/s.MonitorListModel.java
+com/sun/tools/example/debug/gui/SCCS/s.MonitorTool.java
+com/sun/tools/example/debug/gui/SCCS/s.OutputSink.java
+com/sun/tools/example/debug/gui/SCCS/s.SearchPath.java
+com/sun/tools/example/debug/gui/SCCS/s.SourceListener.java
+com/sun/tools/example/debug/gui/SCCS/s.SingleLeafTreeSelectionModel.java
+com/sun/tools/example/debug/gui/SCCS/s.SourceManager.java
+com/sun/tools/example/debug/gui/SCCS/s.SourceModel.java
+com/sun/tools/example/debug/gui/SCCS/s.SourceTool.java
+com/sun/tools/example/debug/gui/SCCS/s.SourceTreeTool.java
+com/sun/tools/example/debug/gui/SCCS/s.StackTraceTool.java
+com/sun/tools/example/debug/gui/SCCS/s.ThreadTreeTool.java
+com/sun/tools/example/debug/gui/SCCS/s.TypeScript.java
+com/sun/tools/example/debug/gui/SCCS/s.TypeScriptOutputListener.java
+com/sun/tools/example/debug/gui/SCCS/s.TypeScriptWriter.java
+com/sun/tools/example/debug/gui/CurrentFrameChangedEvent.java
+com/sun/tools/example/debug/gui/ApplicationTool.java
+com/sun/tools/example/debug/gui/ClassManager.java
+com/sun/tools/example/debug/gui/ClassTreeTool.java
+com/sun/tools/example/debug/gui/CommandInterpreter.java
+com/sun/tools/example/debug/gui/CommandTool.java
+com/sun/tools/example/debug/gui/ContextListener.java
+com/sun/tools/example/debug/gui/ContextManager.java
+com/sun/tools/example/debug/gui/Environment.java
+com/sun/tools/example/debug/gui/GUI.java
+com/sun/tools/example/debug/gui/Icons.java
+com/sun/tools/example/debug/gui/JDBFileFilter.java
+com/sun/tools/example/debug/gui/JDBMenuBar.java
+com/sun/tools/example/debug/gui/JDBToolBar.java
+com/sun/tools/example/debug/gui/LaunchTool.java
+com/sun/tools/example/debug/gui/SourceListener.java
+com/sun/tools/example/debug/gui/OutputSink.java
+com/sun/tools/example/debug/gui/MonitorListModel.java
+com/sun/tools/example/debug/gui/MonitorTool.java
+com/sun/tools/example/debug/gui/SearchPath.java
+com/sun/tools/example/debug/gui/SingleLeafTreeSelectionModel.java
+com/sun/tools/example/debug/gui/SourceManager.java
+com/sun/tools/example/debug/gui/SourceModel.java
+com/sun/tools/example/debug/gui/SourceTool.java
+com/sun/tools/example/debug/gui/SourceTreeTool.java
+com/sun/tools/example/debug/gui/SourcepathChangedEvent.java
+com/sun/tools/example/debug/gui/StackTraceTool.java
+com/sun/tools/example/debug/gui/ThreadTreeTool.java
+com/sun/tools/example/debug/gui/TypeScript.java
+com/sun/tools/example/debug/gui/TypeScriptOutputListener.java
+com/sun/tools/example/debug/gui/TypeScriptWriter.java
+com/sun/tools/example/debug/tty
+com/sun/tools/example/debug/tty/SCCS
+com/sun/tools/example/debug/tty/SCCS/s.AmbiguousMethodException.java
+com/sun/tools/example/debug/tty/SCCS/s.AccessWatchpointSpec.java
+com/sun/tools/example/debug/tty/SCCS/s.LineNotFoundException.java
+com/sun/tools/example/debug/tty/SCCS/s.BreakpointSpec.java
+com/sun/tools/example/debug/tty/SCCS/s.Commands.java
+com/sun/tools/example/debug/tty/SCCS/s.Env.java
+com/sun/tools/example/debug/tty/SCCS/s.EventHandler.java
+com/sun/tools/example/debug/tty/SCCS/s.EventNotifier.java
+com/sun/tools/example/debug/tty/SCCS/s.EventRequestSpec.java
+com/sun/tools/example/debug/tty/SCCS/s.EventRequestSpecList.java
+com/sun/tools/example/debug/tty/SCCS/s.ExceptionSpec.java
+com/sun/tools/example/debug/tty/SCCS/s.TTY.java
+com/sun/tools/example/debug/tty/SCCS/s.MalformedMemberNameException.java
+com/sun/tools/example/debug/tty/SCCS/s.MessageOutput.java
+com/sun/tools/example/debug/tty/SCCS/s.ThreadGroupIterator.java
+com/sun/tools/example/debug/tty/SCCS/s.ModificationWatchpointSpec.java
+com/sun/tools/example/debug/tty/SCCS/s.PatternReferenceTypeSpec.java
+com/sun/tools/example/debug/tty/SCCS/s.ReferenceTypeSpec.java
+com/sun/tools/example/debug/tty/SCCS/s.SourceMapper.java
+com/sun/tools/example/debug/tty/SCCS/s.TTYResources.java
+com/sun/tools/example/debug/tty/SCCS/s.TTYResources_ja.java
+com/sun/tools/example/debug/tty/SCCS/s.ThreadIterator.java
+com/sun/tools/example/debug/tty/SCCS/s.ThreadInfo.java
+com/sun/tools/example/debug/tty/SCCS/s.VMConnection.java
+com/sun/tools/example/debug/tty/SCCS/s.WatchpointSpec.java
+com/sun/tools/example/debug/tty/SCCS/s.VMNotConnectedException.java
+com/sun/tools/example/debug/tty/AmbiguousMethodException.java
+com/sun/tools/example/debug/tty/AccessWatchpointSpec.java
+com/sun/tools/example/debug/tty/EventRequestSpecList.java
+com/sun/tools/example/debug/tty/BreakpointSpec.java
+com/sun/tools/example/debug/tty/Commands.java
+com/sun/tools/example/debug/tty/Env.java
+com/sun/tools/example/debug/tty/EventHandler.java
+com/sun/tools/example/debug/tty/EventNotifier.java
+com/sun/tools/example/debug/tty/EventRequestSpec.java
+com/sun/tools/example/debug/tty/LineNotFoundException.java
+com/sun/tools/example/debug/tty/ExceptionSpec.java
+com/sun/tools/example/debug/tty/TTY.java
+com/sun/tools/example/debug/tty/MalformedMemberNameException.java
+com/sun/tools/example/debug/tty/MessageOutput.java
+com/sun/tools/example/debug/tty/VMNotConnectedException.java
+com/sun/tools/example/debug/tty/ModificationWatchpointSpec.java
+com/sun/tools/example/debug/tty/PatternReferenceTypeSpec.java
+com/sun/tools/example/debug/tty/ReferenceTypeSpec.java
+com/sun/tools/example/debug/tty/SourceMapper.java
+com/sun/tools/example/debug/tty/TTYResources.java
+com/sun/tools/example/debug/tty/TTYResources_ja.java
+com/sun/tools/example/debug/tty/ThreadGroupIterator.java
+com/sun/tools/example/debug/tty/ThreadInfo.java
+com/sun/tools/example/debug/tty/ThreadIterator.java
+com/sun/tools/example/debug/tty/VMConnection.java
+com/sun/tools/example/debug/tty/WatchpointSpec.java
+com/sun/tools/example/doc
+com/sun/tools/example/doc/SCCS
+com/sun/tools/example/doc/SCCS/s.index.html
+com/sun/tools/example/doc/SCCS/s.javadt.html
+com/sun/tools/example/doc/SCCS/s.jdb.html
+com/sun/tools/example/doc/SCCS/s.trace.html
+com/sun/tools/example/doc/index.html
+com/sun/tools/example/doc/javadt.html
+com/sun/tools/example/doc/jdb.html
+com/sun/tools/example/doc/trace.html
+com/sun/tools/example/trace
+com/sun/tools/example/trace/SCCS
+com/sun/tools/example/trace/SCCS/s.StreamRedirectThread.java
+com/sun/tools/example/trace/SCCS/s.EventThread.java
+com/sun/tools/example/trace/SCCS/s.Trace.java
+com/sun/tools/example/trace/StreamRedirectThread.java
+com/sun/tools/example/trace/EventThread.java
+com/sun/tools/example/trace/Trace.java
+com/sun/tools/example/README
+com/sun/tools/extcheck
+com/sun/tools/extcheck/SCCS
+com/sun/tools/extcheck/SCCS/s.ExtCheck.java
+com/sun/tools/extcheck/SCCS/s.Main.java
+com/sun/tools/extcheck/ExtCheck.java
+com/sun/tools/extcheck/Main.java
+com/sun/tools/javac
+com/sun/tools/javac/SCCS
+com/sun/tools/javac/SCCS/s.Main.java
+com/sun/tools/javac/code
+com/sun/tools/javac/code/SCCS
+com/sun/tools/javac/code/SCCS/s.Attribute.java
+com/sun/tools/javac/code/SCCS/s.BoundKind.java
+com/sun/tools/javac/code/SCCS/s.Flags.java
+com/sun/tools/javac/code/SCCS/s.Kinds.java
+com/sun/tools/javac/code/SCCS/s.Scope.java
+com/sun/tools/javac/code/SCCS/s.Source.java
+com/sun/tools/javac/code/SCCS/s.Symbol.java
+com/sun/tools/javac/code/SCCS/s.Symtab.java
+com/sun/tools/javac/code/SCCS/s.Type.java
+com/sun/tools/javac/code/SCCS/s.TypeTags.java
+com/sun/tools/javac/code/SCCS/s.Types.java
+com/sun/tools/javac/code/Attribute.java
+com/sun/tools/javac/code/BoundKind.java
+com/sun/tools/javac/code/Flags.java
+com/sun/tools/javac/code/Kinds.java
+com/sun/tools/javac/code/Scope.java
+com/sun/tools/javac/code/Source.java
+com/sun/tools/javac/code/Symbol.java
+com/sun/tools/javac/code/Symtab.java
+com/sun/tools/javac/code/Type.java
+com/sun/tools/javac/code/TypeTags.java
+com/sun/tools/javac/code/Types.java
+com/sun/tools/javac/comp
+com/sun/tools/javac/comp/SCCS
+com/sun/tools/javac/comp/SCCS/s.AttrContext.java
+com/sun/tools/javac/comp/SCCS/s.Annotate.java
+com/sun/tools/javac/comp/SCCS/s.Attr.java
+com/sun/tools/javac/comp/SCCS/s.AttrContextEnv.java
+com/sun/tools/javac/comp/SCCS/s.Check.java
+com/sun/tools/javac/comp/SCCS/s.ConstFold.java
+com/sun/tools/javac/comp/SCCS/s.Enter.java
+com/sun/tools/javac/comp/SCCS/s.Env.java
+com/sun/tools/javac/comp/SCCS/s.Flow.java
+com/sun/tools/javac/comp/SCCS/s.Infer.java
+com/sun/tools/javac/comp/SCCS/s.Lower.java
+com/sun/tools/javac/comp/SCCS/s.MemberEnter.java
+com/sun/tools/javac/comp/SCCS/s.Resolve.java
+com/sun/tools/javac/comp/SCCS/s.Todo.java
+com/sun/tools/javac/comp/SCCS/s.TransTypes.java
+com/sun/tools/javac/comp/AttrContext.java
+com/sun/tools/javac/comp/Annotate.java
+com/sun/tools/javac/comp/Attr.java
+com/sun/tools/javac/comp/AttrContextEnv.java
+com/sun/tools/javac/comp/Check.java
+com/sun/tools/javac/comp/ConstFold.java
+com/sun/tools/javac/comp/Enter.java
+com/sun/tools/javac/comp/Env.java
+com/sun/tools/javac/comp/Flow.java
+com/sun/tools/javac/comp/Infer.java
+com/sun/tools/javac/comp/Lower.java
+com/sun/tools/javac/comp/MemberEnter.java
+com/sun/tools/javac/comp/Resolve.java
+com/sun/tools/javac/comp/Todo.java
+com/sun/tools/javac/comp/TransTypes.java
+com/sun/tools/javac/jvm
+com/sun/tools/javac/jvm/SCCS
+com/sun/tools/javac/jvm/SCCS/s.UninitializedType.java
+com/sun/tools/javac/jvm/SCCS/s.ByteCodes.java
+com/sun/tools/javac/jvm/SCCS/s.CRTFlags.java
+com/sun/tools/javac/jvm/SCCS/s.CRTable.java
+com/sun/tools/javac/jvm/SCCS/s.ClassFile.java
+com/sun/tools/javac/jvm/SCCS/s.ClassReader.java
+com/sun/tools/javac/jvm/SCCS/s.ClassWriter.java
+com/sun/tools/javac/jvm/SCCS/s.Code.java
+com/sun/tools/javac/jvm/SCCS/s.Gen.java
+com/sun/tools/javac/jvm/SCCS/s.Items.java
+com/sun/tools/javac/jvm/SCCS/s.Pool.java
+com/sun/tools/javac/jvm/SCCS/s.Target.java
+com/sun/tools/javac/jvm/ClassReader.java
+com/sun/tools/javac/jvm/ByteCodes.java
+com/sun/tools/javac/jvm/CRTFlags.java
+com/sun/tools/javac/jvm/CRTable.java
+com/sun/tools/javac/jvm/ClassFile.java
+com/sun/tools/javac/jvm/ClassWriter.java
+com/sun/tools/javac/jvm/Code.java
+com/sun/tools/javac/jvm/Gen.java
+com/sun/tools/javac/jvm/Items.java
+com/sun/tools/javac/jvm/Pool.java
+com/sun/tools/javac/jvm/Target.java
+com/sun/tools/javac/jvm/UninitializedType.java
+com/sun/tools/javac/main
+com/sun/tools/javac/main/SCCS
+com/sun/tools/javac/main/SCCS/s.CommandLine.java
+com/sun/tools/javac/main/SCCS/s.JavaCompiler.java
+com/sun/tools/javac/main/SCCS/s.Main.java
+com/sun/tools/javac/main/CommandLine.java
+com/sun/tools/javac/main/JavaCompiler.java
+com/sun/tools/javac/main/Main.java
+com/sun/tools/javac/parser
+com/sun/tools/javac/parser/SCCS
+com/sun/tools/javac/parser/SCCS/s.Keywords.java
+com/sun/tools/javac/parser/SCCS/s.Parser.java
+com/sun/tools/javac/parser/SCCS/s.Scanner.java
+com/sun/tools/javac/parser/SCCS/s.Tokens.java
+com/sun/tools/javac/parser/SCCS/s.EndPosParser.java
+com/sun/tools/javac/parser/Keywords.java
+com/sun/tools/javac/parser/Parser.java
+com/sun/tools/javac/parser/Scanner.java
+com/sun/tools/javac/parser/Tokens.java
+com/sun/tools/javac/parser/EndPosParser.java
+com/sun/tools/javac/resources
+com/sun/tools/javac/resources/SCCS
+com/sun/tools/javac/resources/SCCS/s.compiler_ja.properties
+com/sun/tools/javac/resources/SCCS/s.compiler.properties
+com/sun/tools/javac/resources/SCCS/s.javac.properties
+com/sun/tools/javac/resources/SCCS/s.javac_ja.properties
+com/sun/tools/javac/resources/compiler_ja.properties
+com/sun/tools/javac/resources/compiler.properties
+com/sun/tools/javac/resources/javac.properties
+com/sun/tools/javac/resources/javac_ja.properties
+com/sun/tools/javac/tree
+com/sun/tools/javac/tree/SCCS
+com/sun/tools/javac/tree/SCCS/s.TreeMaker.java
+com/sun/tools/javac/tree/SCCS/s.Pretty.java
+com/sun/tools/javac/tree/SCCS/s.Tree.java
+com/sun/tools/javac/tree/SCCS/s.TreeInfo.java
+com/sun/tools/javac/tree/SCCS/s.TreeScanner.java
+com/sun/tools/javac/tree/SCCS/s.TreeTranslator.java
+com/sun/tools/javac/tree/TreeInfo.java
+com/sun/tools/javac/tree/Pretty.java
+com/sun/tools/javac/tree/Tree.java
+com/sun/tools/javac/tree/TreeMaker.java
+com/sun/tools/javac/tree/TreeScanner.java
+com/sun/tools/javac/tree/TreeTranslator.java
+com/sun/tools/javac/util
+com/sun/tools/javac/util/SCCS
+com/sun/tools/javac/util/SCCS/s.ByteBuffer.java
+com/sun/tools/javac/util/SCCS/s.Abort.java
+com/sun/tools/javac/util/SCCS/s.Bits.java
+com/sun/tools/javac/util/SCCS/s.LayoutCharacters.java
+com/sun/tools/javac/util/SCCS/s.Context.java
+com/sun/tools/javac/util/SCCS/s.Convert.java
+com/sun/tools/javac/util/SCCS/s.Diagnostic.java
+com/sun/tools/javac/util/SCCS/s.FatalError.java
+com/sun/tools/javac/util/SCCS/s.FileEntry.java
+com/sun/tools/javac/util/SCCS/s.ListBuffer.java
+com/sun/tools/javac/util/SCCS/s.List.java
+com/sun/tools/javac/util/SCCS/s.Log.java
+com/sun/tools/javac/util/SCCS/s.Name.java
+com/sun/tools/javac/util/SCCS/s.Options.java
+com/sun/tools/javac/util/SCCS/s.Pair.java
+com/sun/tools/javac/util/SCCS/s.Paths.java
+com/sun/tools/javac/util/SCCS/s.Position.java
+com/sun/tools/javac/util/SCCS/s.Warner.java
+com/sun/tools/javac/util/SCCS/s.MandatoryWarningHandler.java
+com/sun/tools/javac/util/ByteBuffer.java
+com/sun/tools/javac/util/Abort.java
+com/sun/tools/javac/util/Bits.java
+com/sun/tools/javac/util/LayoutCharacters.java
+com/sun/tools/javac/util/Context.java
+com/sun/tools/javac/util/Convert.java
+com/sun/tools/javac/util/Diagnostic.java
+com/sun/tools/javac/util/FatalError.java
+com/sun/tools/javac/util/FileEntry.java
+com/sun/tools/javac/util/List.java
+com/sun/tools/javac/util/ListBuffer.java
+com/sun/tools/javac/util/Log.java
+com/sun/tools/javac/util/Name.java
+com/sun/tools/javac/util/Options.java
+com/sun/tools/javac/util/Pair.java
+com/sun/tools/javac/util/Paths.java
+com/sun/tools/javac/util/Position.java
+com/sun/tools/javac/util/Warner.java
+com/sun/tools/javac/util/MandatoryWarningHandler.java
+com/sun/tools/javac/Main.java
+com/sun/tools/javadoc
+com/sun/tools/javadoc/SCCS
+com/sun/tools/javadoc/SCCS/s.AnnotationDescImpl.java
+com/sun/tools/javadoc/SCCS/s.AbstractTypeImpl.java
+com/sun/tools/javadoc/SCCS/s.JavadocClassReader.java
+com/sun/tools/javadoc/SCCS/s.AnnotationTypeDocImpl.java
+com/sun/tools/javadoc/SCCS/s.AnnotationTypeElementDocImpl.java
+com/sun/tools/javadoc/SCCS/s.AnnotationValueImpl.java
+com/sun/tools/javadoc/SCCS/s.ClassDocImpl.java
+com/sun/tools/javadoc/SCCS/s.Comment.java
+com/sun/tools/javadoc/SCCS/s.ConstructorDocImpl.java
+com/sun/tools/javadoc/SCCS/s.DocEnv.java
+com/sun/tools/javadoc/SCCS/s.DocImpl.java
+com/sun/tools/javadoc/SCCS/s.DocLocale.java
+com/sun/tools/javadoc/SCCS/s.DocletInvoker.java
+com/sun/tools/javadoc/SCCS/s.ExecutableMemberDocImpl.java
+com/sun/tools/javadoc/SCCS/s.FieldDocImpl.java
+com/sun/tools/javadoc/SCCS/s.JavadocMemberEnter.java
+com/sun/tools/javadoc/SCCS/s.JavadocEnter.java
+com/sun/tools/javadoc/SCCS/s.MemberDocImpl.java
+com/sun/tools/javadoc/SCCS/s.JavadocTodo.java
+com/sun/tools/javadoc/SCCS/s.JavadocTool.java
+com/sun/tools/javadoc/SCCS/s.Main.java
+com/sun/tools/javadoc/SCCS/s.MethodDocImpl.java
+com/sun/tools/javadoc/SCCS/s.Messager.java
+com/sun/tools/javadoc/SCCS/s.ParameterizedTypeImpl.java
+com/sun/tools/javadoc/SCCS/s.ModifierFilter.java
+com/sun/tools/javadoc/SCCS/s.PackageDocImpl.java
+com/sun/tools/javadoc/SCCS/s.ParamTagImpl.java
+com/sun/tools/javadoc/SCCS/s.ParameterImpl.java
+com/sun/tools/javadoc/SCCS/s.PrimitiveType.java
+com/sun/tools/javadoc/SCCS/s.ProgramElementDocImpl.java
+com/sun/tools/javadoc/SCCS/s.RootDocImpl.java
+com/sun/tools/javadoc/SCCS/s.SeeTagImpl.java
+com/sun/tools/javadoc/SCCS/s.SerialFieldTagImpl.java
+com/sun/tools/javadoc/SCCS/s.SerializedForm.java
+com/sun/tools/javadoc/SCCS/s.SourcePositionImpl.java
+com/sun/tools/javadoc/SCCS/s.Start.java
+com/sun/tools/javadoc/SCCS/s.TagImpl.java
+com/sun/tools/javadoc/SCCS/s.ThrowsTagImpl.java
+com/sun/tools/javadoc/SCCS/s.TypeMaker.java
+com/sun/tools/javadoc/SCCS/s.TypeVariableImpl.java
+com/sun/tools/javadoc/SCCS/s.WildcardTypeImpl.java
+com/sun/tools/javadoc/SCCS/s.DocCommentScanner.java
+com/sun/tools/javadoc/resources
+com/sun/tools/javadoc/resources/SCCS
+com/sun/tools/javadoc/resources/SCCS/s.javadoc.properties
+com/sun/tools/javadoc/resources/SCCS/s.javadoc_ja.properties
+com/sun/tools/javadoc/resources/javadoc_ja.properties
+com/sun/tools/javadoc/resources/javadoc.properties
+com/sun/tools/javadoc/AnnotationTypeDocImpl.java
+com/sun/tools/javadoc/AbstractTypeImpl.java
+com/sun/tools/javadoc/AnnotationDescImpl.java
+com/sun/tools/javadoc/DocEnv.java
+com/sun/tools/javadoc/AnnotationTypeElementDocImpl.java
+com/sun/tools/javadoc/AnnotationValueImpl.java
+com/sun/tools/javadoc/ClassDocImpl.java
+com/sun/tools/javadoc/Comment.java
+com/sun/tools/javadoc/ConstructorDocImpl.java
+com/sun/tools/javadoc/DocImpl.java
+com/sun/tools/javadoc/DocLocale.java
+com/sun/tools/javadoc/DocletInvoker.java
+com/sun/tools/javadoc/MemberDocImpl.java
+com/sun/tools/javadoc/Main.java
+com/sun/tools/javadoc/ExecutableMemberDocImpl.java
+com/sun/tools/javadoc/FieldDocImpl.java
+com/sun/tools/javadoc/JavadocClassReader.java
+com/sun/tools/javadoc/JavadocEnter.java
+com/sun/tools/javadoc/JavadocMemberEnter.java
+com/sun/tools/javadoc/JavadocTodo.java
+com/sun/tools/javadoc/JavadocTool.java
+com/sun/tools/javadoc/MethodDocImpl.java
+com/sun/tools/javadoc/Messager.java
+com/sun/tools/javadoc/ParameterizedTypeImpl.java
+com/sun/tools/javadoc/ModifierFilter.java
+com/sun/tools/javadoc/PackageDocImpl.java
+com/sun/tools/javadoc/ParamTagImpl.java
+com/sun/tools/javadoc/ParameterImpl.java
+com/sun/tools/javadoc/ProgramElementDocImpl.java
+com/sun/tools/javadoc/PrimitiveType.java
+com/sun/tools/javadoc/RootDocImpl.java
+com/sun/tools/javadoc/SeeTagImpl.java
+com/sun/tools/javadoc/Start.java
+com/sun/tools/javadoc/SerialFieldTagImpl.java
+com/sun/tools/javadoc/SerializedForm.java
+com/sun/tools/javadoc/SourcePositionImpl.java
+com/sun/tools/javadoc/TagImpl.java
+com/sun/tools/javadoc/ThrowsTagImpl.java
+com/sun/tools/javadoc/TypeMaker.java
+com/sun/tools/javadoc/TypeVariableImpl.java
+com/sun/tools/javadoc/WildcardTypeImpl.java
+com/sun/tools/javadoc/DocCommentScanner.java
+com/sun/tools/javah
+com/sun/tools/javah/SCCS
+com/sun/tools/javah/SCCS/s.MainDoclet.java
+com/sun/tools/javah/SCCS/s.Gen.java
+com/sun/tools/javah/SCCS/s.JNI.java
+com/sun/tools/javah/SCCS/s.LLNI.java
+com/sun/tools/javah/SCCS/s.Main.java
+com/sun/tools/javah/SCCS/s.TypeSignature.java
+com/sun/tools/javah/SCCS/s.Mangle.java
+com/sun/tools/javah/SCCS/s.Util.java
+com/sun/tools/javah/oldjavah
+com/sun/tools/javah/oldjavah/SCCS
+com/sun/tools/javah/oldjavah/SCCS/s.Mangle.java
+com/sun/tools/javah/oldjavah/SCCS/s.Gen.java
+com/sun/tools/javah/oldjavah/SCCS/s.JNI.java
+com/sun/tools/javah/oldjavah/SCCS/s.LLNI.java
+com/sun/tools/javah/oldjavah/SCCS/s.Main.java
+com/sun/tools/javah/oldjavah/SCCS/s.JavahEnvironment.java
+com/sun/tools/javah/oldjavah/SCCS/s.OldHeaders.java
+com/sun/tools/javah/oldjavah/SCCS/s.OldStubs.java
+com/sun/tools/javah/oldjavah/SCCS/s.Util.java
+com/sun/tools/javah/oldjavah/resources
+com/sun/tools/javah/oldjavah/resources/SCCS
+com/sun/tools/javah/oldjavah/resources/SCCS/s.Linux_sparc.properties
+com/sun/tools/javah/oldjavah/resources/SCCS/s.Linux_ppc.properties
+com/sun/tools/javah/oldjavah/resources/SCCS/s.SunOS_sparc.properties
+com/sun/tools/javah/oldjavah/resources/SCCS/s.SunOS_sparcv9.properties
+com/sun/tools/javah/oldjavah/resources/SCCS/s.l10n.properties
+com/sun/tools/javah/oldjavah/resources/SCCS/s.l10n_ja.properties
+com/sun/tools/javah/oldjavah/resources/SCCS/s.win32_x86.properties
+com/sun/tools/javah/oldjavah/resources/SunOS_sparcv9.properties
+com/sun/tools/javah/oldjavah/resources/Linux_ppc.properties
+com/sun/tools/javah/oldjavah/resources/Linux_sparc.properties
+com/sun/tools/javah/oldjavah/resources/SunOS_sparc.properties
+com/sun/tools/javah/oldjavah/resources/win32_x86.properties
+com/sun/tools/javah/oldjavah/resources/l10n.properties
+com/sun/tools/javah/oldjavah/resources/l10n_ja.properties
+com/sun/tools/javah/oldjavah/OldHeaders.java
+com/sun/tools/javah/oldjavah/Gen.java
+com/sun/tools/javah/oldjavah/JNI.java
+com/sun/tools/javah/oldjavah/LLNI.java
+com/sun/tools/javah/oldjavah/Main.java
+com/sun/tools/javah/oldjavah/JavahEnvironment.java
+com/sun/tools/javah/oldjavah/Mangle.java
+com/sun/tools/javah/oldjavah/OldStubs.java
+com/sun/tools/javah/oldjavah/Util.java
+com/sun/tools/javah/resources
+com/sun/tools/javah/resources/SCCS
+com/sun/tools/javah/resources/SCCS/s.Linux_sparc.properties
+com/sun/tools/javah/resources/SCCS/s.Linux_ppc.properties
+com/sun/tools/javah/resources/SCCS/s.SunOS_sparc.properties
+com/sun/tools/javah/resources/SCCS/s.SunOS_sparcv9.properties
+com/sun/tools/javah/resources/SCCS/s.l10n.properties
+com/sun/tools/javah/resources/SCCS/s.l10n_ja.properties
+com/sun/tools/javah/resources/SCCS/s.win32_x86.properties
+com/sun/tools/javah/resources/SunOS_sparcv9.properties
+com/sun/tools/javah/resources/Linux_ppc.properties
+com/sun/tools/javah/resources/Linux_sparc.properties
+com/sun/tools/javah/resources/SunOS_sparc.properties
+com/sun/tools/javah/resources/win32_x86.properties
+com/sun/tools/javah/resources/l10n.properties
+com/sun/tools/javah/resources/l10n_ja.properties
+com/sun/tools/javah/MainDoclet.java
+com/sun/tools/javah/Gen.java
+com/sun/tools/javah/JNI.java
+com/sun/tools/javah/LLNI.java
+com/sun/tools/javah/Main.java
+com/sun/tools/javah/TypeSignature.java
+com/sun/tools/javah/Mangle.java
+com/sun/tools/javah/Util.java
+com/sun/tools/jdi
+com/sun/tools/jdi/META-INF
+com/sun/tools/jdi/META-INF/services
+com/sun/tools/jdi/META-INF/services/SCCS
+com/sun/tools/jdi/META-INF/services/SCCS/s.com.sun.jdi.connect.Connector
+com/sun/tools/jdi/META-INF/services/SCCS/s.com.sun.jdi.connect.spi.TransportService
+com/sun/tools/jdi/META-INF/services/com.sun.jdi.connect.Connector
+com/sun/tools/jdi/META-INF/services/com.sun.jdi.connect.spi.TransportService
+com/sun/tools/jdi/SCCS
+com/sun/tools/jdi/SCCS/s.ArrayReferenceImpl.java
+com/sun/tools/jdi/SCCS/s.AbstractLauncher.java
+com/sun/tools/jdi/SCCS/s.ClassLoaderReferenceImpl.java
+com/sun/tools/jdi/SCCS/s.ArrayTypeImpl.java
+com/sun/tools/jdi/SCCS/s.BaseLineInfo.java
+com/sun/tools/jdi/SCCS/s.BooleanTypeImpl.java
+com/sun/tools/jdi/SCCS/s.BooleanValueImpl.java
+com/sun/tools/jdi/SCCS/s.ByteTypeImpl.java
+com/sun/tools/jdi/SCCS/s.ByteValueImpl.java
+com/sun/tools/jdi/SCCS/s.CharTypeImpl.java
+com/sun/tools/jdi/SCCS/s.CharValueImpl.java
+com/sun/tools/jdi/SCCS/s.ClassObjectReferenceImpl.java
+com/sun/tools/jdi/SCCS/s.ClassTypeImpl.java
+com/sun/tools/jdi/SCCS/s.Packet.java
+com/sun/tools/jdi/SCCS/s.PrimitiveTypeImpl.java
+com/sun/tools/jdi/SCCS/s.CommandSender.java
+com/sun/tools/jdi/SCCS/s.ConcreteMethodImpl.java
+com/sun/tools/jdi/SCCS/s.ConnectorImpl.java
+com/sun/tools/jdi/SCCS/s.DoubleTypeImpl.java
+com/sun/tools/jdi/SCCS/s.DoubleValueImpl.java
+com/sun/tools/jdi/SCCS/s.EventQueueImpl.java
+com/sun/tools/jdi/SCCS/s.EventRequestManagerImpl.java
+com/sun/tools/jdi/SCCS/s.EventSetImpl.java
+com/sun/tools/jdi/SCCS/s.FieldImpl.java
+com/sun/tools/jdi/SCCS/s.FloatTypeImpl.java
+com/sun/tools/jdi/SCCS/s.FloatValueImpl.java
+com/sun/tools/jdi/SCCS/s.GenericAttachingConnector.java
+com/sun/tools/jdi/SCCS/s.GenericListeningConnector.java
+com/sun/tools/jdi/SCCS/s.IntegerTypeImpl.java
+com/sun/tools/jdi/SCCS/s.IntegerValueImpl.java
+com/sun/tools/jdi/SCCS/s.InterfaceTypeImpl.java
+com/sun/tools/jdi/SCCS/s.InternalEventHandler.java
+com/sun/tools/jdi/SCCS/s.JDWPException.java
+com/sun/tools/jdi/SCCS/s.JNITypeParser.java
+com/sun/tools/jdi/SCCS/s.LineInfo.java
+com/sun/tools/jdi/SCCS/s.LinkedHashMap.java
+com/sun/tools/jdi/SCCS/s.LocalVariableImpl.java
+com/sun/tools/jdi/SCCS/s.LocationImpl.java
+com/sun/tools/jdi/SCCS/s.LockObject.java
+com/sun/tools/jdi/SCCS/s.LongTypeImpl.java
+com/sun/tools/jdi/SCCS/s.LongValueImpl.java
+com/sun/tools/jdi/SCCS/s.MethodImpl.java
+com/sun/tools/jdi/SCCS/s.MirrorImpl.java
+com/sun/tools/jdi/SCCS/s.NonConcreteMethodImpl.java
+com/sun/tools/jdi/SCCS/s.ObjectReferenceImpl.java
+com/sun/tools/jdi/SCCS/s.ObsoleteMethodImpl.java
+com/sun/tools/jdi/SCCS/s.PacketStream.java
+com/sun/tools/jdi/SCCS/s.RawCommandLineLauncher.java
+com/sun/tools/jdi/SCCS/s.PrimitiveValueImpl.java
+com/sun/tools/jdi/SCCS/s.SharedMemoryTransportService.java
+com/sun/tools/jdi/SCCS/s.ReferenceTypeImpl.java
+com/sun/tools/jdi/SCCS/s.SDE.java
+com/sun/tools/jdi/SCCS/s.TargetVM.java
+com/sun/tools/jdi/SCCS/s.SharedMemoryAttachingConnector.java
+com/sun/tools/jdi/SCCS/s.SharedMemoryListeningConnector.java
+com/sun/tools/jdi/SCCS/s.ShortTypeImpl.java
+com/sun/tools/jdi/SCCS/s.ShortValueImpl.java
+com/sun/tools/jdi/SCCS/s.SocketAttachingConnector.java
+com/sun/tools/jdi/SCCS/s.SocketListeningConnector.java
+com/sun/tools/jdi/SCCS/s.VirtualMachineManagerImpl.java
+com/sun/tools/jdi/SCCS/s.SocketTransportService.java
+com/sun/tools/jdi/SCCS/s.StackFrameImpl.java
+com/sun/tools/jdi/SCCS/s.StratumLineInfo.java
+com/sun/tools/jdi/SCCS/s.StringReferenceImpl.java
+com/sun/tools/jdi/SCCS/s.SunCommandLineLauncher.java
+com/sun/tools/jdi/SCCS/s.ThreadAction.java
+com/sun/tools/jdi/SCCS/s.ThreadListener.java
+com/sun/tools/jdi/SCCS/s.ThreadGroupReferenceImpl.java
+com/sun/tools/jdi/SCCS/s.ThreadReferenceImpl.java
+com/sun/tools/jdi/SCCS/s.TypeComponentImpl.java
+com/sun/tools/jdi/SCCS/s.TypeImpl.java
+com/sun/tools/jdi/SCCS/s.VMAction.java
+com/sun/tools/jdi/SCCS/s.VMListener.java
+com/sun/tools/jdi/SCCS/s.VMModifiers.java
+com/sun/tools/jdi/SCCS/s.VMState.java
+com/sun/tools/jdi/SCCS/s.ValueContainer.java
+com/sun/tools/jdi/SCCS/s.ValueImpl.java
+com/sun/tools/jdi/SCCS/s.VirtualMachineImpl.java
+com/sun/tools/jdi/SCCS/s.VirtualMachineManagerService.java
+com/sun/tools/jdi/SCCS/s.VoidTypeImpl.java
+com/sun/tools/jdi/SCCS/s.VoidValueImpl.java
+com/sun/tools/jdi/resources
+com/sun/tools/jdi/resources/SCCS
+com/sun/tools/jdi/resources/SCCS/s.jdi.properties
+com/sun/tools/jdi/resources/SCCS/s.jdi_ja.properties
+com/sun/tools/jdi/resources/jdi_ja.properties
+com/sun/tools/jdi/resources/jdi.properties
+com/sun/tools/jdi/ClassLoaderReferenceImpl.java
+com/sun/tools/jdi/AbstractLauncher.java
+com/sun/tools/jdi/ArrayReferenceImpl.java
+com/sun/tools/jdi/ArrayTypeImpl.java
+com/sun/tools/jdi/BaseLineInfo.java
+com/sun/tools/jdi/BooleanTypeImpl.java
+com/sun/tools/jdi/BooleanValueImpl.java
+com/sun/tools/jdi/ByteTypeImpl.java
+com/sun/tools/jdi/ByteValueImpl.java
+com/sun/tools/jdi/CharTypeImpl.java
+com/sun/tools/jdi/CharValueImpl.java
+com/sun/tools/jdi/Packet.java
+com/sun/tools/jdi/ClassObjectReferenceImpl.java
+com/sun/tools/jdi/PrimitiveTypeImpl.java
+com/sun/tools/jdi/ClassTypeImpl.java
+com/sun/tools/jdi/CommandSender.java
+com/sun/tools/jdi/ConcreteMethodImpl.java
+com/sun/tools/jdi/ConnectorImpl.java
+com/sun/tools/jdi/DoubleTypeImpl.java
+com/sun/tools/jdi/DoubleValueImpl.java
+com/sun/tools/jdi/EventQueueImpl.java
+com/sun/tools/jdi/EventRequestManagerImpl.java
+com/sun/tools/jdi/EventSetImpl.java
+com/sun/tools/jdi/FieldImpl.java
+com/sun/tools/jdi/FloatTypeImpl.java
+com/sun/tools/jdi/FloatValueImpl.java
+com/sun/tools/jdi/GenericAttachingConnector.java
+com/sun/tools/jdi/GenericListeningConnector.java
+com/sun/tools/jdi/IntegerTypeImpl.java
+com/sun/tools/jdi/IntegerValueImpl.java
+com/sun/tools/jdi/InterfaceTypeImpl.java
+com/sun/tools/jdi/InternalEventHandler.java
+com/sun/tools/jdi/JDWPException.java
+com/sun/tools/jdi/JNITypeParser.java
+com/sun/tools/jdi/LineInfo.java
+com/sun/tools/jdi/LinkedHashMap.java
+com/sun/tools/jdi/LocalVariableImpl.java
+com/sun/tools/jdi/LocationImpl.java
+com/sun/tools/jdi/LockObject.java
+com/sun/tools/jdi/LongTypeImpl.java
+com/sun/tools/jdi/LongValueImpl.java
+com/sun/tools/jdi/MethodImpl.java
+com/sun/tools/jdi/MirrorImpl.java
+com/sun/tools/jdi/NonConcreteMethodImpl.java
+com/sun/tools/jdi/ObjectReferenceImpl.java
+com/sun/tools/jdi/ObsoleteMethodImpl.java
+com/sun/tools/jdi/PacketStream.java
+com/sun/tools/jdi/RawCommandLineLauncher.java
+com/sun/tools/jdi/PrimitiveValueImpl.java
+com/sun/tools/jdi/ReferenceTypeImpl.java
+com/sun/tools/jdi/SDE.java
+com/sun/tools/jdi/ShortTypeImpl.java
+com/sun/tools/jdi/StackFrameImpl.java
+com/sun/tools/jdi/SharedMemoryAttachingConnector.java
+com/sun/tools/jdi/SharedMemoryListeningConnector.java
+com/sun/tools/jdi/SharedMemoryTransportService.java
+com/sun/tools/jdi/ShortValueImpl.java
+com/sun/tools/jdi/SocketAttachingConnector.java
+com/sun/tools/jdi/SocketListeningConnector.java
+com/sun/tools/jdi/SocketTransportService.java
+com/sun/tools/jdi/TargetVM.java
+com/sun/tools/jdi/ThreadReferenceImpl.java
+com/sun/tools/jdi/StratumLineInfo.java
+com/sun/tools/jdi/StringReferenceImpl.java
+com/sun/tools/jdi/SunCommandLineLauncher.java
+com/sun/tools/jdi/ThreadAction.java
+com/sun/tools/jdi/ThreadListener.java
+com/sun/tools/jdi/ThreadGroupReferenceImpl.java
+com/sun/tools/jdi/TypeComponentImpl.java
+com/sun/tools/jdi/TypeImpl.java
+com/sun/tools/jdi/VMAction.java
+com/sun/tools/jdi/VMListener.java
+com/sun/tools/jdi/VMModifiers.java
+com/sun/tools/jdi/VMState.java
+com/sun/tools/jdi/ValueContainer.java
+com/sun/tools/jdi/ValueImpl.java
+com/sun/tools/jdi/VirtualMachineImpl.java
+com/sun/tools/jdi/VirtualMachineManagerImpl.java
+com/sun/tools/jdi/VoidTypeImpl.java
+com/sun/tools/jdi/VirtualMachineManagerService.java
+com/sun/tools/jdi/VoidValueImpl.java
+com/sun/tools/jdwpgen
+com/sun/tools/jdwpgen/SCCS
+com/sun/tools/jdwpgen/SCCS/s.AbstractSimpleTypeNode.java
+com/sun/tools/jdwpgen/SCCS/s.AbstractCommandNode.java
+com/sun/tools/jdwpgen/SCCS/s.AbstractGroupNode.java
+com/sun/tools/jdwpgen/SCCS/s.AbstractNamedNode.java
+com/sun/tools/jdwpgen/SCCS/s.AbstractSimpleNode.java
+com/sun/tools/jdwpgen/SCCS/s.ClassLoaderObjectTypeNode.java
+com/sun/tools/jdwpgen/SCCS/s.AbstractTypeListNode.java
+com/sun/tools/jdwpgen/SCCS/s.AbstractTypeNode.java
+com/sun/tools/jdwpgen/SCCS/s.AltNode.java
+com/sun/tools/jdwpgen/SCCS/s.ArrayObjectTypeNode.java
+com/sun/tools/jdwpgen/SCCS/s.ArrayRegionTypeNode.java
+com/sun/tools/jdwpgen/SCCS/s.ArrayTypeNode.java
+com/sun/tools/jdwpgen/SCCS/s.BooleanTypeNode.java
+com/sun/tools/jdwpgen/SCCS/s.ByteTypeNode.java
+com/sun/tools/jdwpgen/SCCS/s.ThreadGroupObjectTypeNode.java
+com/sun/tools/jdwpgen/SCCS/s.ClassObjectTypeNode.java
+com/sun/tools/jdwpgen/SCCS/s.ClassTypeNode.java
+com/sun/tools/jdwpgen/SCCS/s.CommandNode.java
+com/sun/tools/jdwpgen/SCCS/s.CommandSetNode.java
+com/sun/tools/jdwpgen/SCCS/s.CommentNode.java
+com/sun/tools/jdwpgen/SCCS/s.ConstantNode.java
+com/sun/tools/jdwpgen/SCCS/s.ConstantSetNode.java
+com/sun/tools/jdwpgen/SCCS/s.Context.java
+com/sun/tools/jdwpgen/SCCS/s.ErrorNode.java
+com/sun/tools/jdwpgen/SCCS/s.ErrorSetNode.java
+com/sun/tools/jdwpgen/SCCS/s.EventNode.java
+com/sun/tools/jdwpgen/SCCS/s.FieldTypeNode.java
+com/sun/tools/jdwpgen/SCCS/s.FrameTypeNode.java
+com/sun/tools/jdwpgen/SCCS/s.GroupNode.java
+com/sun/tools/jdwpgen/SCCS/s.IntTypeNode.java
+com/sun/tools/jdwpgen/SCCS/s.Main.java
+com/sun/tools/jdwpgen/SCCS/s.InterfaceTypeNode.java
+com/sun/tools/jdwpgen/SCCS/s.LocationTypeNode.java
+com/sun/tools/jdwpgen/SCCS/s.LongTypeNode.java
+com/sun/tools/jdwpgen/SCCS/s.MethodTypeNode.java
+com/sun/tools/jdwpgen/SCCS/s.NameNode.java
+com/sun/tools/jdwpgen/SCCS/s.NameValueNode.java
+com/sun/tools/jdwpgen/SCCS/s.Node.java
+com/sun/tools/jdwpgen/SCCS/s.ObjectTypeNode.java
+com/sun/tools/jdwpgen/SCCS/s.OutNode.java
+com/sun/tools/jdwpgen/SCCS/s.Parse.java
+com/sun/tools/jdwpgen/SCCS/s.ReferenceIDTypeNode.java
+com/sun/tools/jdwpgen/SCCS/s.ReferenceTypeNode.java
+com/sun/tools/jdwpgen/SCCS/s.RepeatNode.java
+com/sun/tools/jdwpgen/SCCS/s.ReplyNode.java
+com/sun/tools/jdwpgen/SCCS/s.RootNode.java
+com/sun/tools/jdwpgen/SCCS/s.jdwp.spec
+com/sun/tools/jdwpgen/SCCS/s.SelectNode.java
+com/sun/tools/jdwpgen/SCCS/s.TypeNode.java
+com/sun/tools/jdwpgen/SCCS/s.StringObjectTypeNode.java
+com/sun/tools/jdwpgen/SCCS/s.StringTypeNode.java
+com/sun/tools/jdwpgen/SCCS/s.TaggedObjectTypeNode.java
+com/sun/tools/jdwpgen/SCCS/s.UntaggedValueTypeNode.java
+com/sun/tools/jdwpgen/SCCS/s.ThreadObjectTypeNode.java
+com/sun/tools/jdwpgen/SCCS/s.ValueTypeNode.java
+com/sun/tools/jdwpgen/AbstractCommandNode.java
+com/sun/tools/jdwpgen/AbstractGroupNode.java
+com/sun/tools/jdwpgen/AbstractNamedNode.java
+com/sun/tools/jdwpgen/AbstractSimpleNode.java
+com/sun/tools/jdwpgen/AbstractSimpleTypeNode.java
+com/sun/tools/jdwpgen/AbstractTypeListNode.java
+com/sun/tools/jdwpgen/AbstractTypeNode.java
+com/sun/tools/jdwpgen/AltNode.java
+com/sun/tools/jdwpgen/ArrayObjectTypeNode.java
+com/sun/tools/jdwpgen/ArrayRegionTypeNode.java
+com/sun/tools/jdwpgen/ArrayTypeNode.java
+com/sun/tools/jdwpgen/BooleanTypeNode.java
+com/sun/tools/jdwpgen/ByteTypeNode.java
+com/sun/tools/jdwpgen/MethodTypeNode.java
+com/sun/tools/jdwpgen/Main.java
+com/sun/tools/jdwpgen/ClassLoaderObjectTypeNode.java
+com/sun/tools/jdwpgen/ClassObjectTypeNode.java
+com/sun/tools/jdwpgen/ClassTypeNode.java
+com/sun/tools/jdwpgen/CommandNode.java
+com/sun/tools/jdwpgen/CommandSetNode.java
+com/sun/tools/jdwpgen/CommentNode.java
+com/sun/tools/jdwpgen/ConstantNode.java
+com/sun/tools/jdwpgen/ConstantSetNode.java
+com/sun/tools/jdwpgen/Context.java
+com/sun/tools/jdwpgen/ErrorNode.java
+com/sun/tools/jdwpgen/ErrorSetNode.java
+com/sun/tools/jdwpgen/EventNode.java
+com/sun/tools/jdwpgen/FieldTypeNode.java
+com/sun/tools/jdwpgen/FrameTypeNode.java
+com/sun/tools/jdwpgen/GroupNode.java
+com/sun/tools/jdwpgen/IntTypeNode.java
+com/sun/tools/jdwpgen/InterfaceTypeNode.java
+com/sun/tools/jdwpgen/NameNode.java
+com/sun/tools/jdwpgen/LocationTypeNode.java
+com/sun/tools/jdwpgen/LongTypeNode.java
+com/sun/tools/jdwpgen/NameValueNode.java
+com/sun/tools/jdwpgen/ObjectTypeNode.java
+com/sun/tools/jdwpgen/Node.java
+com/sun/tools/jdwpgen/ReferenceTypeNode.java
+com/sun/tools/jdwpgen/OutNode.java
+com/sun/tools/jdwpgen/Parse.java
+com/sun/tools/jdwpgen/jdwp.spec
+com/sun/tools/jdwpgen/ReferenceIDTypeNode.java
+com/sun/tools/jdwpgen/RepeatNode.java
+com/sun/tools/jdwpgen/ReplyNode.java
+com/sun/tools/jdwpgen/RootNode.java
+com/sun/tools/jdwpgen/SelectNode.java
+com/sun/tools/jdwpgen/StringObjectTypeNode.java
+com/sun/tools/jdwpgen/StringTypeNode.java
+com/sun/tools/jdwpgen/TaggedObjectTypeNode.java
+com/sun/tools/jdwpgen/ThreadGroupObjectTypeNode.java
+com/sun/tools/jdwpgen/ThreadObjectTypeNode.java
+com/sun/tools/jdwpgen/TypeNode.java
+com/sun/tools/jdwpgen/UntaggedValueTypeNode.java
+com/sun/tools/jdwpgen/ValueTypeNode.java
+com/sun/tools/extractor
+com/sun/tools/extractor/SCCS
+com/sun/tools/extractor/SCCS/s.KeyedInputStream.java
+com/sun/tools/extractor/SCCS/s.Extractor.java
+com/sun/tools/extractor/SCCS/s.Installer.java
+com/sun/tools/extractor/SCCS/s.Maker.java
+com/sun/tools/extractor/SCCS/s.manifest
+com/sun/tools/extractor/KeyedInputStream.java
+com/sun/tools/extractor/Extractor.java
+com/sun/tools/extractor/Installer.java
+com/sun/tools/extractor/Maker.java
+com/sun/tools/extractor/manifest
+com/sun/demo
+com/sun/demo/jvmti
+com/sun/demo/jvmti/hprof
+com/sun/demo/jvmti/hprof/SCCS
+com/sun/demo/jvmti/hprof/SCCS/s.Tracker.java
+com/sun/demo/jvmti/hprof/Tracker.java
+java
+java/applet
+java/applet/SCCS
+java/applet/SCCS/s.AppletContext.java
+java/applet/SCCS/s.Applet.java
+java/applet/SCCS/s.AppletStub.java
+java/applet/SCCS/s.AudioClip.java
+java/applet/SCCS/s.package.html
+java/applet/AppletContext.java
+java/applet/Applet.java
+java/applet/AppletStub.java
+java/applet/AudioClip.java
+java/applet/package.html
+java/awt
+java/awt/SCCS
+java/awt/SCCS/s.AWTException.java
+java/awt/SCCS/s.AWTError.java
+java/awt/SCCS/s.AWTEvent.java
+java/awt/SCCS/s.AWTEventMulticaster.java
+java/awt/SCCS/s.AWTKeyStroke.java
+java/awt/SCCS/s.AWTPermission.java
+java/awt/SCCS/s.ActiveEvent.java
+java/awt/SCCS/s.Adjustable.java
+java/awt/SCCS/s.AlphaComposite.java
+java/awt/SCCS/s.AttributeValue.java
+java/awt/SCCS/s.BasicStroke.java
+java/awt/SCCS/s.BorderLayout.java
+java/awt/SCCS/s.BufferCapabilities.java
+java/awt/SCCS/s.Button.java
+java/awt/SCCS/s.Canvas.java
+java/awt/SCCS/s.Dimension.java
+java/awt/SCCS/s.Dialog.java
+java/awt/SCCS/s.CardLayout.java
+java/awt/SCCS/s.Checkbox.java
+java/awt/SCCS/s.CheckboxGroup.java
+java/awt/SCCS/s.CheckboxMenuItem.java
+java/awt/SCCS/s.Choice.java
+java/awt/SCCS/s.Color.java
+java/awt/SCCS/s.ColorPaintContext.java
+java/awt/SCCS/s.Component.java
+java/awt/SCCS/s.ComponentOrientation.java
+java/awt/SCCS/s.Composite.java
+java/awt/SCCS/s.CompositeContext.java
+java/awt/SCCS/s.Conditional.java
+java/awt/SCCS/s.Container.java
+java/awt/SCCS/s.Cursor.java
+java/awt/SCCS/s.ContainerOrderFocusTraversalPolicy.java
+java/awt/SCCS/s.DefaultFocusTraversalPolicy.java
+java/awt/SCCS/s.DefaultKeyboardFocusManager.java
+java/awt/SCCS/s.EventDispatchThread.java
+java/awt/SCCS/s.DisplayMode.java
+java/awt/SCCS/s.Event.java
+java/awt/SCCS/s.FocusTraversalPolicy.java
+java/awt/SCCS/s.EventQueue.java
+java/awt/SCCS/s.FileDialog.java
+java/awt/SCCS/s.FlowLayout.java
+java/awt/SCCS/s.FontMetrics.java
+java/awt/SCCS/s.Font.java
+java/awt/SCCS/s.FontFormatException.java
+java/awt/SCCS/s.Frame.java
+java/awt/SCCS/s.GradientPaint.java
+java/awt/SCCS/s.GradientPaintContext.java
+java/awt/SCCS/s.Graphics.java
+java/awt/SCCS/s.ItemSelectable.java
+java/awt/SCCS/s.Image.java
+java/awt/SCCS/s.Graphics2D.java
+java/awt/SCCS/s.GraphicsCallback.java
+java/awt/SCCS/s.GraphicsConfigTemplate.java
+java/awt/SCCS/s.GraphicsConfiguration.java
+java/awt/SCCS/s.GraphicsDevice.java
+java/awt/SCCS/s.GraphicsEnvironment.java
+java/awt/SCCS/s.GridBagConstraints.java
+java/awt/SCCS/s.GridBagLayout.java
+java/awt/SCCS/s.GridLayout.java
+java/awt/SCCS/s.HeadlessException.java
+java/awt/SCCS/s.IllegalComponentStateException.java
+java/awt/SCCS/s.Insets.java
+java/awt/SCCS/s.ImageCapabilities.java
+java/awt/SCCS/s.Label.java
+java/awt/SCCS/s.ScrollPaneAdjustable.java
+java/awt/SCCS/s.JobAttributes.java
+java/awt/SCCS/s.KeyEventDispatcher.java
+java/awt/SCCS/s.KeyEventPostProcessor.java
+java/awt/SCCS/s.KeyboardFocusManager.java
+java/awt/SCCS/s.LayoutManager.java
+java/awt/SCCS/s.LayoutManager2.java
+java/awt/SCCS/s.List.java
+java/awt/SCCS/s.MediaTracker.java
+java/awt/SCCS/s.Menu.java
+java/awt/SCCS/s.MenuBar.java
+java/awt/SCCS/s.MenuComponent.java
+java/awt/SCCS/s.MenuContainer.java
+java/awt/SCCS/s.MenuItem.java
+java/awt/SCCS/s.MenuShortcut.java
+java/awt/SCCS/s.MouseInfo.java
+java/awt/SCCS/s.PageAttributes.java
+java/awt/SCCS/s.Paint.java
+java/awt/SCCS/s.PaintContext.java
+java/awt/SCCS/s.Panel.java
+java/awt/SCCS/s.Point.java
+java/awt/SCCS/s.PointerInfo.java
+java/awt/SCCS/s.Polygon.java
+java/awt/SCCS/s.PopupMenu.java
+java/awt/SCCS/s.PrintGraphics.java
+java/awt/SCCS/s.PrintJob.java
+java/awt/SCCS/s.Rectangle.java
+java/awt/SCCS/s.RenderingHints.java
+java/awt/SCCS/s.Robot.java
+java/awt/SCCS/s.ScrollPane.java
+java/awt/SCCS/s.SequencedEvent.java
+java/awt/SCCS/s.Scrollbar.java
+java/awt/SCCS/s.SentEvent.java
+java/awt/SCCS/s.Shape.java
+java/awt/SCCS/s.Stroke.java
+java/awt/SCCS/s.SystemColor.java
+java/awt/SCCS/s.TextArea.java
+java/awt/SCCS/s.TextComponent.java
+java/awt/SCCS/s.TextField.java
+java/awt/SCCS/s.TexturePaint.java
+java/awt/SCCS/s.TexturePaintContext.java
+java/awt/SCCS/s.Toolkit.java
+java/awt/SCCS/s.Transparency.java
+java/awt/SCCS/s.Window.java
+java/awt/SCCS/s.package.html
+java/awt/color
+java/awt/color/SCCS
+java/awt/color/SCCS/s.ICC_ColorSpace.java
+java/awt/color/SCCS/s.CMMException.java
+java/awt/color/SCCS/s.ColorSpace.java
+java/awt/color/SCCS/s.ProfileDataException.java
+java/awt/color/SCCS/s.ICC_Profile.java
+java/awt/color/SCCS/s.ICC_ProfileGray.java
+java/awt/color/SCCS/s.ICC_ProfileRGB.java
+java/awt/color/SCCS/s.package.html
+java/awt/color/ICC_ProfileGray.java
+java/awt/color/CMMException.java
+java/awt/color/ColorSpace.java
+java/awt/color/ICC_ColorSpace.java
+java/awt/color/ICC_Profile.java
+java/awt/color/ProfileDataException.java
+java/awt/color/ICC_ProfileRGB.java
+java/awt/color/package.html
+java/awt/datatransfer
+java/awt/datatransfer/SCCS
+java/awt/datatransfer/SCCS/s.ClipboardOwner.java
+java/awt/datatransfer/SCCS/s.Clipboard.java
+java/awt/datatransfer/SCCS/s.MimeTypeParameterList.java
+java/awt/datatransfer/SCCS/s.DataFlavor.java
+java/awt/datatransfer/SCCS/s.FlavorEvent.java
+java/awt/datatransfer/SCCS/s.FlavorListener.java
+java/awt/datatransfer/SCCS/s.FlavorMap.java
+java/awt/datatransfer/SCCS/s.FlavorTable.java
+java/awt/datatransfer/SCCS/s.MimeType.java
+java/awt/datatransfer/SCCS/s.MimeTypeParseException.java
+java/awt/datatransfer/SCCS/s.StringSelection.java
+java/awt/datatransfer/SCCS/s.SystemFlavorMap.java
+java/awt/datatransfer/SCCS/s.Transferable.java
+java/awt/datatransfer/SCCS/s.package.html
+java/awt/datatransfer/SCCS/s.UnsupportedFlavorException.java
+java/awt/datatransfer/ClipboardOwner.java
+java/awt/datatransfer/Clipboard.java
+java/awt/datatransfer/MimeTypeParameterList.java
+java/awt/datatransfer/DataFlavor.java
+java/awt/datatransfer/FlavorEvent.java
+java/awt/datatransfer/FlavorListener.java
+java/awt/datatransfer/FlavorMap.java
+java/awt/datatransfer/FlavorTable.java
+java/awt/datatransfer/MimeType.java
+java/awt/datatransfer/UnsupportedFlavorException.java
+java/awt/datatransfer/MimeTypeParseException.java
+java/awt/datatransfer/StringSelection.java
+java/awt/datatransfer/SystemFlavorMap.java
+java/awt/datatransfer/Transferable.java
+java/awt/datatransfer/package.html
+java/awt/dnd
+java/awt/dnd/SCCS
+java/awt/dnd/SCCS/s.DnDEventMulticaster.java
+java/awt/dnd/SCCS/s.Autoscroll.java
+java/awt/dnd/SCCS/s.DnDConstants.java
+java/awt/dnd/SCCS/s.DragGestureListener.java
+java/awt/dnd/SCCS/s.DragGestureEvent.java
+java/awt/dnd/SCCS/s.DragGestureRecognizer.java
+java/awt/dnd/SCCS/s.DragSource.java
+java/awt/dnd/SCCS/s.DragSourceAdapter.java
+java/awt/dnd/SCCS/s.DragSourceContext.java
+java/awt/dnd/SCCS/s.DragSourceDragEvent.java
+java/awt/dnd/SCCS/s.DragSourceDropEvent.java
+java/awt/dnd/SCCS/s.DragSourceEvent.java
+java/awt/dnd/SCCS/s.DragSourceListener.java
+java/awt/dnd/SCCS/s.InvalidDnDOperationException.java
+java/awt/dnd/SCCS/s.DragSourceMotionListener.java
+java/awt/dnd/SCCS/s.DropTarget.java
+java/awt/dnd/SCCS/s.DropTargetAdapter.java
+java/awt/dnd/SCCS/s.DropTargetContext.java
+java/awt/dnd/SCCS/s.DropTargetDragEvent.java
+java/awt/dnd/SCCS/s.DropTargetDropEvent.java
+java/awt/dnd/SCCS/s.DropTargetEvent.java
+java/awt/dnd/SCCS/s.DropTargetListener.java
+java/awt/dnd/SCCS/s.MouseDragGestureRecognizer.java
+java/awt/dnd/SCCS/s.SerializationTester.java
+java/awt/dnd/SCCS/s.package.html
+java/awt/dnd/peer
+java/awt/dnd/peer/SCCS
+java/awt/dnd/peer/SCCS/s.DragSourceContextPeer.java
+java/awt/dnd/peer/SCCS/s.DropTargetContextPeer.java
+java/awt/dnd/peer/SCCS/s.DropTargetPeer.java
+java/awt/dnd/peer/SCCS/s.package.html
+java/awt/dnd/peer/DragSourceContextPeer.java
+java/awt/dnd/peer/DropTargetContextPeer.java
+java/awt/dnd/peer/DropTargetPeer.java
+java/awt/dnd/peer/package.html
+java/awt/dnd/DnDConstants.java
+java/awt/dnd/Autoscroll.java
+java/awt/dnd/DragSourceMotionListener.java
+java/awt/dnd/DnDEventMulticaster.java
+java/awt/dnd/DragGestureEvent.java
+java/awt/dnd/DragGestureListener.java
+java/awt/dnd/DragGestureRecognizer.java
+java/awt/dnd/DragSource.java
+java/awt/dnd/DragSourceAdapter.java
+java/awt/dnd/DragSourceContext.java
+java/awt/dnd/DragSourceDragEvent.java
+java/awt/dnd/DragSourceDropEvent.java
+java/awt/dnd/DragSourceEvent.java
+java/awt/dnd/DragSourceListener.java
+java/awt/dnd/DropTargetAdapter.java
+java/awt/dnd/DropTarget.java
+java/awt/dnd/DropTargetDragEvent.java
+java/awt/dnd/DropTargetContext.java
+java/awt/dnd/InvalidDnDOperationException.java
+java/awt/dnd/DropTargetDropEvent.java
+java/awt/dnd/DropTargetEvent.java
+java/awt/dnd/DropTargetListener.java
+java/awt/dnd/MouseDragGestureRecognizer.java
+java/awt/dnd/SerializationTester.java
+java/awt/dnd/package.html
+java/awt/doc-files
+java/awt/doc-files/SCCS
+java/awt/doc-files/SCCS/s.AWTThreadIssues.html
+java/awt/doc-files/SCCS/s.BorderLayout-1.gif
+java/awt/doc-files/SCCS/s.Button-1.gif
+java/awt/doc-files/SCCS/s.Checkbox-1.gif
+java/awt/doc-files/SCCS/s.CheckboxGroup-1.gif
+java/awt/doc-files/SCCS/s.Choice-1.gif
+java/awt/doc-files/SCCS/s.FlowLayout-1.gif
+java/awt/doc-files/SCCS/s.FocusCycle.gif
+java/awt/doc-files/SCCS/s.FocusSpec.html
+java/awt/doc-files/SCCS/s.FontMetrics-1.gif
+java/awt/doc-files/SCCS/s.GridBagLayout-1.gif
+java/awt/doc-files/SCCS/s.GridBagLayout-2.gif
+java/awt/doc-files/SCCS/s.GridLayout-1.gif
+java/awt/doc-files/SCCS/s.GridLayout-2.gif
+java/awt/doc-files/SCCS/s.Label-1.gif
+java/awt/doc-files/SCCS/s.List-1.gif
+java/awt/doc-files/SCCS/s.MenuBar-1.gif
+java/awt/doc-files/SCCS/s.MultiScreen.gif
+java/awt/doc-files/SCCS/s.Scrollbar-1.gif
+java/awt/doc-files/SCCS/s.Scrollbar-2.gif
+java/awt/doc-files/SCCS/s.TextArea-1.gif
+java/awt/doc-files/SCCS/s.TextField-1.gif
+java/awt/doc-files/AWTThreadIssues.html
+java/awt/doc-files/BorderLayout-1.gif
+java/awt/doc-files/Button-1.gif
+java/awt/doc-files/Checkbox-1.gif
+java/awt/doc-files/CheckboxGroup-1.gif
+java/awt/doc-files/Choice-1.gif
+java/awt/doc-files/FlowLayout-1.gif
+java/awt/doc-files/FocusCycle.gif
+java/awt/doc-files/FocusSpec.html
+java/awt/doc-files/FontMetrics-1.gif
+java/awt/doc-files/GridBagLayout-1.gif
+java/awt/doc-files/GridBagLayout-2.gif
+java/awt/doc-files/GridLayout-1.gif
+java/awt/doc-files/GridLayout-2.gif
+java/awt/doc-files/Label-1.gif
+java/awt/doc-files/List-1.gif
+java/awt/doc-files/MenuBar-1.gif
+java/awt/doc-files/MultiScreen.gif
+java/awt/doc-files/Scrollbar-1.gif
+java/awt/doc-files/Scrollbar-2.gif
+java/awt/doc-files/TextArea-1.gif
+java/awt/doc-files/TextField-1.gif
+java/awt/event
+java/awt/event/SCCS
+java/awt/event/SCCS/s.AWTEventListenerProxy.java
+java/awt/event/SCCS/s.AWTEventListener.java
+java/awt/event/SCCS/s.ActionListener.java
+java/awt/event/SCCS/s.ActionEvent.java
+java/awt/event/SCCS/s.AdjustmentEvent.java
+java/awt/event/SCCS/s.AdjustmentListener.java
+java/awt/event/SCCS/s.ComponentAdapter.java
+java/awt/event/SCCS/s.ComponentEvent.java
+java/awt/event/SCCS/s.ComponentListener.java
+java/awt/event/SCCS/s.ContainerAdapter.java
+java/awt/event/SCCS/s.ContainerEvent.java
+java/awt/event/SCCS/s.ContainerListener.java
+java/awt/event/SCCS/s.FocusAdapter.java
+java/awt/event/SCCS/s.KeyEvent.java
+java/awt/event/SCCS/s.MouseListener.java
+java/awt/event/SCCS/s.FocusEvent.java
+java/awt/event/SCCS/s.FocusListener.java
+java/awt/event/SCCS/s.HierarchyBoundsAdapter.java
+java/awt/event/SCCS/s.HierarchyBoundsListener.java
+java/awt/event/SCCS/s.HierarchyEvent.java
+java/awt/event/SCCS/s.HierarchyListener.java
+java/awt/event/SCCS/s.InputEvent.java
+java/awt/event/SCCS/s.InputMethodEvent.java
+java/awt/event/SCCS/s.InputMethodListener.java
+java/awt/event/SCCS/s.InvocationEvent.java
+java/awt/event/SCCS/s.ItemEvent.java
+java/awt/event/SCCS/s.ItemListener.java
+java/awt/event/SCCS/s.KeyAdapter.java
+java/awt/event/SCCS/s.KeyListener.java
+java/awt/event/SCCS/s.MouseAdapter.java
+java/awt/event/SCCS/s.MouseEvent.java
+java/awt/event/SCCS/s.MouseMotionAdapter.java
+java/awt/event/SCCS/s.MouseMotionListener.java
+java/awt/event/SCCS/s.MouseWheelEvent.java
+java/awt/event/SCCS/s.MouseWheelListener.java
+java/awt/event/SCCS/s.NativeLibLoader.java
+java/awt/event/SCCS/s.PaintEvent.java
+java/awt/event/SCCS/s.TextEvent.java
+java/awt/event/SCCS/s.TextListener.java
+java/awt/event/SCCS/s.WindowAdapter.java
+java/awt/event/SCCS/s.WindowEvent.java
+java/awt/event/SCCS/s.WindowFocusListener.java
+java/awt/event/SCCS/s.WindowListener.java
+java/awt/event/SCCS/s.WindowStateListener.java
+java/awt/event/SCCS/s.package.html
+java/awt/event/AWTEventListenerProxy.java
+java/awt/event/AWTEventListener.java
+java/awt/event/ActionEvent.java
+java/awt/event/ActionListener.java
+java/awt/event/AdjustmentEvent.java
+java/awt/event/AdjustmentListener.java
+java/awt/event/ComponentAdapter.java
+java/awt/event/ComponentEvent.java
+java/awt/event/ComponentListener.java
+java/awt/event/ContainerAdapter.java
+java/awt/event/ContainerEvent.java
+java/awt/event/ContainerListener.java
+java/awt/event/FocusAdapter.java
+java/awt/event/FocusEvent.java
+java/awt/event/FocusListener.java
+java/awt/event/HierarchyBoundsAdapter.java
+java/awt/event/HierarchyBoundsListener.java
+java/awt/event/HierarchyEvent.java
+java/awt/event/HierarchyListener.java
+java/awt/event/InputEvent.java
+java/awt/event/InputMethodEvent.java
+java/awt/event/InputMethodListener.java
+java/awt/event/InvocationEvent.java
+java/awt/event/ItemEvent.java
+java/awt/event/ItemListener.java
+java/awt/event/KeyAdapter.java
+java/awt/event/KeyEvent.java
+java/awt/event/KeyListener.java
+java/awt/event/MouseAdapter.java
+java/awt/event/MouseEvent.java
+java/awt/event/MouseListener.java
+java/awt/event/MouseMotionAdapter.java
+java/awt/event/MouseMotionListener.java
+java/awt/event/MouseWheelEvent.java
+java/awt/event/MouseWheelListener.java
+java/awt/event/NativeLibLoader.java
+java/awt/event/PaintEvent.java
+java/awt/event/TextEvent.java
+java/awt/event/TextListener.java
+java/awt/event/WindowAdapter.java
+java/awt/event/WindowEvent.java
+java/awt/event/WindowFocusListener.java
+java/awt/event/WindowListener.java
+java/awt/event/WindowStateListener.java
+java/awt/event/package.html
+java/awt/font
+java/awt/font/SCCS
+java/awt/font/SCCS/s.GlyphJustificationInfo.java
+java/awt/font/SCCS/s.CharArrayIterator.java
+java/awt/font/SCCS/s.FontRenderContext.java
+java/awt/font/SCCS/s.ImageGraphicAttribute.java
+java/awt/font/SCCS/s.GlyphMetrics.java
+java/awt/font/SCCS/s.GlyphVector.java
+java/awt/font/SCCS/s.GraphicAttribute.java
+java/awt/font/SCCS/s.ShapeGraphicAttribute.java
+java/awt/font/SCCS/s.LineBreakMeasurer.java
+java/awt/font/SCCS/s.LineMetrics.java
+java/awt/font/SCCS/s.MultipleMaster.java
+java/awt/font/SCCS/s.NumericShaper.java
+java/awt/font/SCCS/s.OpenType.java
+java/awt/font/SCCS/s.StyledParagraph.java
+java/awt/font/SCCS/s.TextLine.java
+java/awt/font/SCCS/s.TextAttribute.java
+java/awt/font/SCCS/s.TextHitInfo.java
+java/awt/font/SCCS/s.TextJustifier.java
+java/awt/font/SCCS/s.TextLayout.java
+java/awt/font/SCCS/s.TextMeasurer.java
+java/awt/font/SCCS/s.TransformAttribute.java
+java/awt/font/SCCS/s.package.html
+java/awt/font/GlyphJustificationInfo.java
+java/awt/font/CharArrayIterator.java
+java/awt/font/FontRenderContext.java
+java/awt/font/ImageGraphicAttribute.java
+java/awt/font/GlyphMetrics.java
+java/awt/font/GlyphVector.java
+java/awt/font/GraphicAttribute.java
+java/awt/font/LineBreakMeasurer.java
+java/awt/font/LineMetrics.java
+java/awt/font/MultipleMaster.java
+java/awt/font/NumericShaper.java
+java/awt/font/OpenType.java
+java/awt/font/ShapeGraphicAttribute.java
+java/awt/font/StyledParagraph.java
+java/awt/font/TextAttribute.java
+java/awt/font/TextHitInfo.java
+java/awt/font/TextJustifier.java
+java/awt/font/TextLayout.java
+java/awt/font/TextLine.java
+java/awt/font/TextMeasurer.java
+java/awt/font/TransformAttribute.java
+java/awt/font/package.html
+java/awt/geom
+java/awt/geom/SCCS
+java/awt/geom/SCCS/s.FlatteningPathIterator.java
+java/awt/geom/SCCS/s.AffineTransform.java
+java/awt/geom/SCCS/s.Arc2D.java
+java/awt/geom/SCCS/s.ArcIterator.java
+java/awt/geom/SCCS/s.Area.java
+java/awt/geom/SCCS/s.CubicCurve2D.java
+java/awt/geom/SCCS/s.CubicIterator.java
+java/awt/geom/SCCS/s.Dimension2D.java
+java/awt/geom/SCCS/s.Ellipse2D.java
+java/awt/geom/SCCS/s.EllipseIterator.java
+java/awt/geom/SCCS/s.GeneralPathIterator.java
+java/awt/geom/SCCS/s.GeneralPath.java
+java/awt/geom/SCCS/s.RectangularShape.java
+java/awt/geom/SCCS/s.IllegalPathStateException.java
+java/awt/geom/SCCS/s.Line2D.java
+java/awt/geom/SCCS/s.LineIterator.java
+java/awt/geom/SCCS/s.PathIterator.java
+java/awt/geom/SCCS/s.Point2D.java
+java/awt/geom/SCCS/s.NoninvertibleTransformException.java
+java/awt/geom/SCCS/s.QuadCurve2D.java
+java/awt/geom/SCCS/s.QuadIterator.java
+java/awt/geom/SCCS/s.RectIterator.java
+java/awt/geom/SCCS/s.Rectangle2D.java
+java/awt/geom/SCCS/s.RoundRectIterator.java
+java/awt/geom/SCCS/s.RoundRectangle2D.java
+java/awt/geom/SCCS/s.package.html
+java/awt/geom/FlatteningPathIterator.java
+java/awt/geom/AffineTransform.java
+java/awt/geom/Arc2D.java
+java/awt/geom/ArcIterator.java
+java/awt/geom/Area.java
+java/awt/geom/CubicCurve2D.java
+java/awt/geom/CubicIterator.java
+java/awt/geom/Dimension2D.java
+java/awt/geom/Ellipse2D.java
+java/awt/geom/EllipseIterator.java
+java/awt/geom/GeneralPathIterator.java
+java/awt/geom/GeneralPath.java
+java/awt/geom/LineIterator.java
+java/awt/geom/Line2D.java
+java/awt/geom/IllegalPathStateException.java
+java/awt/geom/PathIterator.java
+java/awt/geom/Point2D.java
+java/awt/geom/NoninvertibleTransformException.java
+java/awt/geom/QuadCurve2D.java
+java/awt/geom/QuadIterator.java
+java/awt/geom/RectIterator.java
+java/awt/geom/Rectangle2D.java
+java/awt/geom/RectangularShape.java
+java/awt/geom/RoundRectIterator.java
+java/awt/geom/RoundRectangle2D.java
+java/awt/geom/package.html
+java/awt/im
+java/awt/im/SCCS
+java/awt/im/SCCS/s.InputMethodHighlight.java
+java/awt/im/SCCS/s.InputContext.java
+java/awt/im/SCCS/s.InputMethodRequests.java
+java/awt/im/SCCS/s.InputSubset.java
+java/awt/im/SCCS/s.package.html
+java/awt/im/spi
+java/awt/im/spi/SCCS
+java/awt/im/spi/SCCS/s.InputMethodContext.java
+java/awt/im/spi/SCCS/s.InputMethod.java
+java/awt/im/spi/SCCS/s.InputMethodDescriptor.java
+java/awt/im/spi/SCCS/s.package.html
+java/awt/im/spi/InputMethodContext.java
+java/awt/im/spi/InputMethod.java
+java/awt/im/spi/InputMethodDescriptor.java
+java/awt/im/spi/package.html
+java/awt/im/InputMethodHighlight.java
+java/awt/im/InputContext.java
+java/awt/im/InputMethodRequests.java
+java/awt/im/InputSubset.java
+java/awt/im/package.html
+java/awt/image
+java/awt/image/SCCS
+java/awt/image/SCCS/s.AreaAveragingScaleFilter.java
+java/awt/image/SCCS/s.AffineTransformOp.java
+java/awt/image/SCCS/s.MultiPixelPackedSampleModel.java
+java/awt/image/SCCS/s.BandCombineOp.java
+java/awt/image/SCCS/s.BandedSampleModel.java
+java/awt/image/SCCS/s.BufferStrategy.java
+java/awt/image/SCCS/s.BufferedImage.java
+java/awt/image/SCCS/s.BufferedImageFilter.java
+java/awt/image/SCCS/s.BufferedImageOp.java
+java/awt/image/SCCS/s.ByteLookupTable.java
+java/awt/image/SCCS/s.ColorConvertOp.java
+java/awt/image/SCCS/s.ColorModel.java
+java/awt/image/SCCS/s.ComponentColorModel.java
+java/awt/image/SCCS/s.ComponentSampleModel.java
+java/awt/image/SCCS/s.ConvolveOp.java
+java/awt/image/SCCS/s.CropImageFilter.java
+java/awt/image/SCCS/s.DataBuffer.java
+java/awt/image/SCCS/s.DataBufferByte.java
+java/awt/image/SCCS/s.DataBufferDouble.java
+java/awt/image/SCCS/s.DataBufferFloat.java
+java/awt/image/SCCS/s.DataBufferInt.java
+java/awt/image/SCCS/s.DataBufferShort.java
+java/awt/image/SCCS/s.DataBufferUShort.java
+java/awt/image/SCCS/s.DirectColorModel.java
+java/awt/image/SCCS/s.FilteredImageSource.java
+java/awt/image/SCCS/s.ImageConsumer.java
+java/awt/image/SCCS/s.ImageFilter.java
+java/awt/image/SCCS/s.ImageObserver.java
+java/awt/image/SCCS/s.ImageProducer.java
+java/awt/image/SCCS/s.ImagingOpException.java
+java/awt/image/SCCS/s.IndexColorModel.java
+java/awt/image/SCCS/s.Kernel.java
+java/awt/image/SCCS/s.LookupOp.java
+java/awt/image/SCCS/s.LookupTable.java
+java/awt/image/SCCS/s.MemoryImageSource.java
+java/awt/image/SCCS/s.PackedColorModel.java
+java/awt/image/SCCS/s.PixelGrabber.java
+java/awt/image/SCCS/s.RGBImageFilter.java
+java/awt/image/SCCS/s.RenderedImage.java
+java/awt/image/SCCS/s.RasterOp.java
+java/awt/image/SCCS/s.PixelInterleavedSampleModel.java
+java/awt/image/SCCS/s.Raster.java
+java/awt/image/SCCS/s.RasterFormatException.java
+java/awt/image/SCCS/s.SinglePixelPackedSampleModel.java
+java/awt/image/SCCS/s.ReplicateScaleFilter.java
+java/awt/image/SCCS/s.RescaleOp.java
+java/awt/image/SCCS/s.SampleModel.java
+java/awt/image/SCCS/s.ShortLookupTable.java
+java/awt/image/SCCS/s.VolatileImage.java
+java/awt/image/SCCS/s.TileObserver.java
+java/awt/image/SCCS/s.WritableRenderedImage.java
+java/awt/image/SCCS/s.WritableRaster.java
+java/awt/image/SCCS/s.package.html
+java/awt/image/renderable
+java/awt/image/renderable/SCCS
+java/awt/image/renderable/SCCS/s.package.html
+java/awt/image/renderable/SCCS/s.ContextualRenderedImageFactory.java
+java/awt/image/renderable/SCCS/s.ParameterBlock.java
+java/awt/image/renderable/SCCS/s.RenderContext.java
+java/awt/image/renderable/SCCS/s.RenderableImage.java
+java/awt/image/renderable/SCCS/s.RenderableImageOp.java
+java/awt/image/renderable/SCCS/s.RenderableImageProducer.java
+java/awt/image/renderable/SCCS/s.RenderedImageFactory.java
+java/awt/image/renderable/ContextualRenderedImageFactory.java
+java/awt/image/renderable/ParameterBlock.java
+java/awt/image/renderable/RenderContext.java
+java/awt/image/renderable/RenderableImage.java
+java/awt/image/renderable/RenderableImageOp.java
+java/awt/image/renderable/RenderableImageProducer.java
+java/awt/image/renderable/RenderedImageFactory.java
+java/awt/image/renderable/package.html
+java/awt/image/AreaAveragingScaleFilter.java
+java/awt/image/AffineTransformOp.java
+java/awt/image/BandedSampleModel.java
+java/awt/image/BandCombineOp.java
+java/awt/image/BufferedImageFilter.java
+java/awt/image/BufferStrategy.java
+java/awt/image/BufferedImage.java
+java/awt/image/BufferedImageOp.java
+java/awt/image/ByteLookupTable.java
+java/awt/image/ColorConvertOp.java
+java/awt/image/ColorModel.java
+java/awt/image/ComponentColorModel.java
+java/awt/image/ConvolveOp.java
+java/awt/image/Raster.java
+java/awt/image/RenderedImage.java
+java/awt/image/ComponentSampleModel.java
+java/awt/image/CropImageFilter.java
+java/awt/image/DataBuffer.java
+java/awt/image/DataBufferByte.java
+java/awt/image/DataBufferDouble.java
+java/awt/image/DataBufferFloat.java
+java/awt/image/DataBufferInt.java
+java/awt/image/DataBufferShort.java
+java/awt/image/DataBufferUShort.java
+java/awt/image/DirectColorModel.java
+java/awt/image/FilteredImageSource.java
+java/awt/image/ImageConsumer.java
+java/awt/image/ImageFilter.java
+java/awt/image/ImageObserver.java
+java/awt/image/ImageProducer.java
+java/awt/image/ImagingOpException.java
+java/awt/image/Kernel.java
+java/awt/image/IndexColorModel.java
+java/awt/image/LookupOp.java
+java/awt/image/LookupTable.java
+java/awt/image/MemoryImageSource.java
+java/awt/image/MultiPixelPackedSampleModel.java
+java/awt/image/PackedColorModel.java
+java/awt/image/PixelGrabber.java
+java/awt/image/PixelInterleavedSampleModel.java
+java/awt/image/RGBImageFilter.java
+java/awt/image/RasterOp.java
+java/awt/image/RasterFormatException.java
+java/awt/image/WritableRenderedImage.java
+java/awt/image/ReplicateScaleFilter.java
+java/awt/image/RescaleOp.java
+java/awt/image/SampleModel.java
+java/awt/image/ShortLookupTable.java
+java/awt/image/TileObserver.java
+java/awt/image/package.html
+java/awt/image/SinglePixelPackedSampleModel.java
+java/awt/image/VolatileImage.java
+java/awt/image/WritableRaster.java
+java/awt/peer
+java/awt/peer/SCCS
+java/awt/peer/SCCS/s.CheckboxMenuItemPeer.java
+java/awt/peer/SCCS/s.ButtonPeer.java
+java/awt/peer/SCCS/s.CanvasPeer.java
+java/awt/peer/SCCS/s.ComponentPeer.java
+java/awt/peer/SCCS/s.CheckboxPeer.java
+java/awt/peer/SCCS/s.ChoicePeer.java
+java/awt/peer/SCCS/s.KeyboardFocusManagerPeer.java
+java/awt/peer/SCCS/s.ContainerPeer.java
+java/awt/peer/SCCS/s.DialogPeer.java
+java/awt/peer/SCCS/s.FileDialogPeer.java
+java/awt/peer/SCCS/s.FontPeer.java
+java/awt/peer/SCCS/s.FramePeer.java
+java/awt/peer/SCCS/s.MenuComponentPeer.java
+java/awt/peer/SCCS/s.LabelPeer.java
+java/awt/peer/SCCS/s.LightweightPeer.java
+java/awt/peer/SCCS/s.ListPeer.java
+java/awt/peer/SCCS/s.MenuBarPeer.java
+java/awt/peer/SCCS/s.MouseInfoPeer.java
+java/awt/peer/SCCS/s.MenuItemPeer.java
+java/awt/peer/SCCS/s.MenuPeer.java
+java/awt/peer/SCCS/s.TextComponentPeer.java
+java/awt/peer/SCCS/s.PanelPeer.java
+java/awt/peer/SCCS/s.PopupMenuPeer.java
+java/awt/peer/SCCS/s.RobotPeer.java
+java/awt/peer/SCCS/s.ScrollPanePeer.java
+java/awt/peer/SCCS/s.ScrollbarPeer.java
+java/awt/peer/SCCS/s.TextAreaPeer.java
+java/awt/peer/SCCS/s.TextFieldPeer.java
+java/awt/peer/SCCS/s.WindowPeer.java
+java/awt/peer/SCCS/s.package.html
+java/awt/peer/CheckboxPeer.java
+java/awt/peer/ButtonPeer.java
+java/awt/peer/CanvasPeer.java
+java/awt/peer/CheckboxMenuItemPeer.java
+java/awt/peer/ChoicePeer.java
+java/awt/peer/ComponentPeer.java
+java/awt/peer/ContainerPeer.java
+java/awt/peer/DialogPeer.java
+java/awt/peer/FileDialogPeer.java
+java/awt/peer/FontPeer.java
+java/awt/peer/FramePeer.java
+java/awt/peer/KeyboardFocusManagerPeer.java
+java/awt/peer/LabelPeer.java
+java/awt/peer/LightweightPeer.java
+java/awt/peer/ListPeer.java
+java/awt/peer/MenuBarPeer.java
+java/awt/peer/MenuComponentPeer.java
+java/awt/peer/MenuItemPeer.java
+java/awt/peer/MenuPeer.java
+java/awt/peer/MouseInfoPeer.java
+java/awt/peer/PanelPeer.java
+java/awt/peer/PopupMenuPeer.java
+java/awt/peer/RobotPeer.java
+java/awt/peer/ScrollPanePeer.java
+java/awt/peer/ScrollbarPeer.java
+java/awt/peer/TextAreaPeer.java
+java/awt/peer/TextComponentPeer.java
+java/awt/peer/TextFieldPeer.java
+java/awt/peer/WindowPeer.java
+java/awt/peer/package.html
+java/awt/print
+java/awt/print/SCCS
+java/awt/print/SCCS/s.PageFormat.java
+java/awt/print/SCCS/s.Book.java
+java/awt/print/SCCS/s.Printable.java
+java/awt/print/SCCS/s.Pageable.java
+java/awt/print/SCCS/s.Paper.java
+java/awt/print/SCCS/s.PrinterAbortException.java
+java/awt/print/SCCS/s.PrinterException.java
+java/awt/print/SCCS/s.PrinterGraphics.java
+java/awt/print/SCCS/s.PrinterIOException.java
+java/awt/print/SCCS/s.PrinterJob.java
+java/awt/print/SCCS/s.package.html
+java/awt/print/PageFormat.java
+java/awt/print/Book.java
+java/awt/print/PrinterException.java
+java/awt/print/Pageable.java
+java/awt/print/Paper.java
+java/awt/print/Printable.java
+java/awt/print/PrinterAbortException.java
+java/awt/print/PrinterGraphics.java
+java/awt/print/PrinterIOException.java
+java/awt/print/PrinterJob.java
+java/awt/print/package.html
+java/awt/AWTException.java
+java/awt/AWTError.java
+java/awt/AWTEvent.java
+java/awt/AWTEventMulticaster.java
+java/awt/AWTKeyStroke.java
+java/awt/AWTPermission.java
+java/awt/ActiveEvent.java
+java/awt/Adjustable.java
+java/awt/AlphaComposite.java
+java/awt/DefaultFocusTraversalPolicy.java
+java/awt/AttributeValue.java
+java/awt/BasicStroke.java
+java/awt/BorderLayout.java
+java/awt/BufferCapabilities.java
+java/awt/Button.java
+java/awt/Canvas.java
+java/awt/CardLayout.java
+java/awt/Checkbox.java
+java/awt/CheckboxGroup.java
+java/awt/CheckboxMenuItem.java
+java/awt/Choice.java
+java/awt/Color.java
+java/awt/ColorPaintContext.java
+java/awt/Component.java
+java/awt/ComponentOrientation.java
+java/awt/Composite.java
+java/awt/CompositeContext.java
+java/awt/Conditional.java
+java/awt/Container.java
+java/awt/Cursor.java
+java/awt/ContainerOrderFocusTraversalPolicy.java
+java/awt/Dialog.java
+java/awt/Dimension.java
+java/awt/DefaultKeyboardFocusManager.java
+java/awt/DisplayMode.java
+java/awt/Event.java
+java/awt/EventDispatchThread.java
+java/awt/EventQueue.java
+java/awt/FileDialog.java
+java/awt/FlowLayout.java
+java/awt/FocusTraversalPolicy.java
+java/awt/Font.java
+java/awt/FontFormatException.java
+java/awt/FontMetrics.java
+java/awt/Frame.java
+java/awt/Image.java
+java/awt/KeyEventPostProcessor.java
+java/awt/GradientPaint.java
+java/awt/GradientPaintContext.java
+java/awt/Graphics.java
+java/awt/Graphics2D.java
+java/awt/GraphicsCallback.java
+java/awt/GraphicsConfigTemplate.java
+java/awt/GraphicsConfiguration.java
+java/awt/GraphicsDevice.java
+java/awt/GraphicsEnvironment.java
+java/awt/GridBagConstraints.java
+java/awt/GridBagLayout.java
+java/awt/GridLayout.java
+java/awt/HeadlessException.java
+java/awt/IllegalComponentStateException.java
+java/awt/ImageCapabilities.java
+java/awt/Insets.java
+java/awt/Label.java
+java/awt/ItemSelectable.java
+java/awt/JobAttributes.java
+java/awt/KeyEventDispatcher.java
+java/awt/KeyboardFocusManager.java
+java/awt/LayoutManager.java
+java/awt/LayoutManager2.java
+java/awt/List.java
+java/awt/MediaTracker.java
+java/awt/Menu.java
+java/awt/MenuBar.java
+java/awt/MenuComponent.java
+java/awt/MenuContainer.java
+java/awt/MenuItem.java
+java/awt/MenuShortcut.java
+java/awt/MouseInfo.java
+java/awt/PageAttributes.java
+java/awt/Paint.java
+java/awt/PaintContext.java
+java/awt/Panel.java
+java/awt/Point.java
+java/awt/PointerInfo.java
+java/awt/Polygon.java
+java/awt/PopupMenu.java
+java/awt/PrintGraphics.java
+java/awt/PrintJob.java
+java/awt/Rectangle.java
+java/awt/RenderingHints.java
+java/awt/Robot.java
+java/awt/ScrollPane.java
+java/awt/ScrollPaneAdjustable.java
+java/awt/Scrollbar.java
+java/awt/SentEvent.java
+java/awt/SequencedEvent.java
+java/awt/Shape.java
+java/awt/Stroke.java
+java/awt/SystemColor.java
+java/awt/TextArea.java
+java/awt/TextComponent.java
+java/awt/TextField.java
+java/awt/TexturePaint.java
+java/awt/TexturePaintContext.java
+java/awt/Toolkit.java
+java/awt/Transparency.java
+java/awt/Window.java
+java/awt/package.html
+java/beans
+java/beans/SCCS
+java/beans/SCCS/s.DefaultPersistenceDelegate.java
+java/beans/SCCS/s.AppletInitializer.java
+java/beans/SCCS/s.BeanDescriptor.java
+java/beans/SCCS/s.BeanInfo.java
+java/beans/SCCS/s.Beans.java
+java/beans/SCCS/s.Customizer.java
+java/beans/SCCS/s.EventSetDescriptor.java
+java/beans/SCCS/s.DesignMode.java
+java/beans/SCCS/s.Encoder.java
+java/beans/SCCS/s.EventHandler.java
+java/beans/SCCS/s.ExceptionListener.java
+java/beans/SCCS/s.Expression.java
+java/beans/SCCS/s.FeatureDescriptor.java
+java/beans/SCCS/s.Introspector.java
+java/beans/SCCS/s.package.html
+java/beans/SCCS/s.MetaData.java
+java/beans/SCCS/s.IndexedPropertyChangeEvent.java
+java/beans/SCCS/s.IndexedPropertyDescriptor.java
+java/beans/SCCS/s.IntrospectionException.java
+java/beans/SCCS/s.MethodDescriptor.java
+java/beans/SCCS/s.NameGenerator.java
+java/beans/SCCS/s.ParameterDescriptor.java
+java/beans/SCCS/s.PersistenceDelegate.java
+java/beans/SCCS/s.PropertyChangeEvent.java
+java/beans/SCCS/s.PropertyChangeListener.java
+java/beans/SCCS/s.PropertyChangeListenerProxy.java
+java/beans/SCCS/s.PropertyChangeSupport.java
+java/beans/SCCS/s.PropertyDescriptor.java
+java/beans/SCCS/s.Statement.java
+java/beans/SCCS/s.PropertyEditor.java
+java/beans/SCCS/s.PropertyEditorManager.java
+java/beans/SCCS/s.PropertyEditorSupport.java
+java/beans/SCCS/s.PropertyVetoException.java
+java/beans/SCCS/s.ReflectionUtils.java
+java/beans/SCCS/s.SimpleBeanInfo.java
+java/beans/SCCS/s.VetoableChangeListener.java
+java/beans/SCCS/s.VetoableChangeListenerProxy.java
+java/beans/SCCS/s.VetoableChangeSupport.java
+java/beans/SCCS/s.Visibility.java
+java/beans/SCCS/s.XMLDecoder.java
+java/beans/SCCS/s.XMLEncoder.java
+java/beans/beancontext
+java/beans/beancontext/SCCS
+java/beans/beancontext/SCCS/s.BeanContextChild.java
+java/beans/beancontext/SCCS/s.BeanContext.java
+java/beans/beancontext/SCCS/s.package.html
+java/beans/beancontext/SCCS/s.BeanContextChildComponentProxy.java
+java/beans/beancontext/SCCS/s.BeanContextChildSupport.java
+java/beans/beancontext/SCCS/s.BeanContextContainerProxy.java
+java/beans/beancontext/SCCS/s.BeanContextEvent.java
+java/beans/beancontext/SCCS/s.BeanContextMembershipEvent.java
+java/beans/beancontext/SCCS/s.BeanContextMembershipListener.java
+java/beans/beancontext/SCCS/s.BeanContextProxy.java
+java/beans/beancontext/SCCS/s.BeanContextServiceAvailableEvent.java
+java/beans/beancontext/SCCS/s.BeanContextServiceProvider.java
+java/beans/beancontext/SCCS/s.BeanContextServiceProviderBeanInfo.java
+java/beans/beancontext/SCCS/s.BeanContextServiceRevokedEvent.java
+java/beans/beancontext/SCCS/s.BeanContextServiceRevokedListener.java
+java/beans/beancontext/SCCS/s.BeanContextServices.java
+java/beans/beancontext/SCCS/s.BeanContextServicesListener.java
+java/beans/beancontext/SCCS/s.BeanContextServicesSupport.java
+java/beans/beancontext/SCCS/s.BeanContextSupport.java
+java/beans/beancontext/BeanContextChild.java
+java/beans/beancontext/BeanContext.java
+java/beans/beancontext/BeanContextServiceProviderBeanInfo.java
+java/beans/beancontext/BeanContextChildComponentProxy.java
+java/beans/beancontext/BeanContextChildSupport.java
+java/beans/beancontext/BeanContextContainerProxy.java
+java/beans/beancontext/BeanContextEvent.java
+java/beans/beancontext/BeanContextMembershipEvent.java
+java/beans/beancontext/BeanContextMembershipListener.java
+java/beans/beancontext/BeanContextProxy.java
+java/beans/beancontext/BeanContextServiceAvailableEvent.java
+java/beans/beancontext/BeanContextServiceProvider.java
+java/beans/beancontext/BeanContextServiceRevokedListener.java
+java/beans/beancontext/BeanContextServiceRevokedEvent.java
+java/beans/beancontext/BeanContextServicesListener.java
+java/beans/beancontext/BeanContextServices.java
+java/beans/beancontext/BeanContextServicesSupport.java
+java/beans/beancontext/BeanContextSupport.java
+java/beans/beancontext/package.html
+java/beans/DefaultPersistenceDelegate.java
+java/beans/AppletInitializer.java
+java/beans/BeanDescriptor.java
+java/beans/BeanInfo.java
+java/beans/Beans.java
+java/beans/Customizer.java
+java/beans/EventHandler.java
+java/beans/DesignMode.java
+java/beans/Encoder.java
+java/beans/EventSetDescriptor.java
+java/beans/ExceptionListener.java
+java/beans/Expression.java
+java/beans/FeatureDescriptor.java
+java/beans/PropertyChangeListenerProxy.java
+java/beans/IndexedPropertyChangeEvent.java
+java/beans/IndexedPropertyDescriptor.java
+java/beans/IntrospectionException.java
+java/beans/Introspector.java
+java/beans/MetaData.java
+java/beans/MethodDescriptor.java
+java/beans/NameGenerator.java
+java/beans/ParameterDescriptor.java
+java/beans/PersistenceDelegate.java
+java/beans/PropertyChangeEvent.java
+java/beans/PropertyChangeListener.java
+java/beans/VetoableChangeListenerProxy.java
+java/beans/PropertyChangeSupport.java
+java/beans/PropertyDescriptor.java
+java/beans/PropertyEditor.java
+java/beans/PropertyEditorManager.java
+java/beans/PropertyEditorSupport.java
+java/beans/PropertyVetoException.java
+java/beans/ReflectionUtils.java
+java/beans/SimpleBeanInfo.java
+java/beans/Statement.java
+java/beans/VetoableChangeListener.java
+java/beans/VetoableChangeSupport.java
+java/beans/Visibility.java
+java/beans/XMLDecoder.java
+java/beans/XMLEncoder.java
+java/beans/package.html
+java/io
+java/io/SCCS
+java/io/SCCS/s.Bits.java
+java/io/SCCS/s.CharConversionException.java
+java/io/SCCS/s.CharArrayReader.java
+java/io/SCCS/s.BufferedInputStream.java
+java/io/SCCS/s.BufferedOutputStream.java
+java/io/SCCS/s.BufferedReader.java
+java/io/SCCS/s.BufferedWriter.java
+java/io/SCCS/s.ByteArrayInputStream.java
+java/io/SCCS/s.ByteArrayOutputStream.java
+java/io/SCCS/s.CharArrayWriter.java
+java/io/SCCS/s.DataInputStream.java
+java/io/SCCS/s.Closeable.java
+java/io/SCCS/s.DataInput.java
+java/io/SCCS/s.DataOutputStream.java
+java/io/SCCS/s.DataOutput.java
+java/io/SCCS/s.ExpiringCache.java
+java/io/SCCS/s.EOFException.java
+java/io/SCCS/s.FileNotFoundException.java
+java/io/SCCS/s.Externalizable.java
+java/io/SCCS/s.File.java
+java/io/SCCS/s.FileFilter.java
+java/io/SCCS/s.FileInputStream.java
+java/io/SCCS/s.FileOutputStream.java
+java/io/SCCS/s.FilePermission.java
+java/io/SCCS/s.FileReader.java
+java/io/SCCS/s.FileSystem.java
+java/io/SCCS/s.FileWriter.java
+java/io/SCCS/s.FilenameFilter.java
+java/io/SCCS/s.FilterInputStream.java
+java/io/SCCS/s.FilterOutputStream.java
+java/io/SCCS/s.UnsupportedEncodingException.java
+java/io/SCCS/s.FilterReader.java
+java/io/SCCS/s.FilterWriter.java
+java/io/SCCS/s.Flushable.java
+java/io/SCCS/s.IOException.java
+java/io/SCCS/s.InputStream.java
+java/io/SCCS/s.InputStreamReader.java
+java/io/SCCS/s.InterruptedIOException.java
+java/io/SCCS/s.InvalidClassException.java
+java/io/SCCS/s.InvalidObjectException.java
+java/io/SCCS/s.LineNumberInputStream.java
+java/io/SCCS/s.LineNumberReader.java
+java/io/SCCS/s.NotActiveException.java
+java/io/SCCS/s.NotSerializableException.java
+java/io/SCCS/s.ObjectInput.java
+java/io/SCCS/s.ObjectInputStream.java
+java/io/SCCS/s.ObjectInputValidation.java
+java/io/SCCS/s.ObjectOutput.java
+java/io/SCCS/s.ObjectOutputStream.java
+java/io/SCCS/s.ObjectStreamClass.java
+java/io/SCCS/s.ObjectStreamConstants.java
+java/io/SCCS/s.ObjectStreamException.java
+java/io/SCCS/s.ObjectStreamField.java
+java/io/SCCS/s.OptionalDataException.java
+java/io/SCCS/s.OutputStream.java
+java/io/SCCS/s.OutputStreamWriter.java
+java/io/SCCS/s.PipedInputStream.java
+java/io/SCCS/s.PipedOutputStream.java
+java/io/SCCS/s.PipedReader.java
+java/io/SCCS/s.PipedWriter.java
+java/io/SCCS/s.PrintStream.java
+java/io/SCCS/s.PrintWriter.java
+java/io/SCCS/s.PushbackInputStream.java
+java/io/SCCS/s.PushbackReader.java
+java/io/SCCS/s.RandomAccessFile.java
+java/io/SCCS/s.Reader.java
+java/io/SCCS/s.SequenceInputStream.java
+java/io/SCCS/s.Serializable.java
+java/io/SCCS/s.SerializablePermission.java
+java/io/SCCS/s.StreamCorruptedException.java
+java/io/SCCS/s.StreamTokenizer.java
+java/io/SCCS/s.StringBufferInputStream.java
+java/io/SCCS/s.StringReader.java
+java/io/SCCS/s.StringWriter.java
+java/io/SCCS/s.SyncFailedException.java
+java/io/SCCS/s.UTFDataFormatException.java
+java/io/SCCS/s.WriteAbortedException.java
+java/io/SCCS/s.Writer.java
+java/io/SCCS/s.package.html
+java/io/BufferedReader.java
+java/io/Bits.java
+java/io/CharConversionException.java
+java/io/BufferedInputStream.java
+java/io/BufferedOutputStream.java
+java/io/BufferedWriter.java
+java/io/ByteArrayInputStream.java
+java/io/ByteArrayOutputStream.java
+java/io/CharArrayReader.java
+java/io/CharArrayWriter.java
+java/io/DataInputStream.java
+java/io/Closeable.java
+java/io/DataInput.java
+java/io/DataOutput.java
+java/io/NotSerializableException.java
+java/io/DataOutputStream.java
+java/io/EOFException.java
+java/io/ExpiringCache.java
+java/io/Externalizable.java
+java/io/File.java
+java/io/FileFilter.java
+java/io/FileInputStream.java
+java/io/FileNotFoundException.java
+java/io/FileOutputStream.java
+java/io/FilePermission.java
+java/io/FileReader.java
+java/io/FileSystem.java
+java/io/FileWriter.java
+java/io/FilenameFilter.java
+java/io/FilterInputStream.java
+java/io/FilterOutputStream.java
+java/io/FilterReader.java
+java/io/FilterWriter.java
+java/io/Flushable.java
+java/io/IOException.java
+java/io/InputStream.java
+java/io/InputStreamReader.java
+java/io/InterruptedIOException.java
+java/io/InvalidClassException.java
+java/io/InvalidObjectException.java
+java/io/LineNumberInputStream.java
+java/io/LineNumberReader.java
+java/io/NotActiveException.java
+java/io/ObjectInputStream.java
+java/io/ObjectInput.java
+java/io/UnsupportedEncodingException.java
+java/io/ObjectInputValidation.java
+java/io/ObjectOutput.java
+java/io/Reader.java
+java/io/ObjectOutputStream.java
+java/io/ObjectStreamClass.java
+java/io/ObjectStreamConstants.java
+java/io/ObjectStreamException.java
+java/io/ObjectStreamField.java
+java/io/OptionalDataException.java
+java/io/OutputStream.java
+java/io/OutputStreamWriter.java
+java/io/PipedInputStream.java
+java/io/PipedOutputStream.java
+java/io/PipedReader.java
+java/io/PipedWriter.java
+java/io/PrintStream.java
+java/io/PrintWriter.java
+java/io/PushbackInputStream.java
+java/io/PushbackReader.java
+java/io/RandomAccessFile.java
+java/io/SequenceInputStream.java
+java/io/Serializable.java
+java/io/SerializablePermission.java
+java/io/StreamCorruptedException.java
+java/io/StreamTokenizer.java
+java/io/StringBufferInputStream.java
+java/io/StringReader.java
+java/io/StringWriter.java
+java/io/SyncFailedException.java
+java/io/UTFDataFormatException.java
+java/io/WriteAbortedException.java
+java/io/Writer.java
+java/io/package.html
+java/lang
+java/lang/SCCS
+java/lang/SCCS/s.AbstractStringBuilder.java
+java/lang/SCCS/s.AbstractMethodError.java
+java/lang/SCCS/s.ArithmeticException.java
+java/lang/SCCS/s.Appendable.java
+java/lang/SCCS/s.Boolean.java
+java/lang/SCCS/s.ArrayIndexOutOfBoundsException.java
+java/lang/SCCS/s.ArrayStoreException.java
+java/lang/SCCS/s.AssertionError.java
+java/lang/SCCS/s.AssertionStatusDirectives.java
+java/lang/SCCS/s.Byte.java
+java/lang/SCCS/s.CharSequence.java
+java/lang/SCCS/s.Character.java
+java/lang/SCCS/s.Class.java
+java/lang/SCCS/s.IllegalAccessError.java
+java/lang/SCCS/s.ClassLoader.java
+java/lang/SCCS/s.ClassCastException.java
+java/lang/SCCS/s.ClassCircularityError.java
+java/lang/SCCS/s.ClassFormatError.java
+java/lang/SCCS/s.CloneNotSupportedException.java
+java/lang/SCCS/s.ClassNotFoundException.java
+java/lang/SCCS/s.Cloneable.java
+java/lang/SCCS/s.Comparable.java
+java/lang/SCCS/s.Compiler.java
+java/lang/SCCS/s.Deprecated.java
+java/lang/SCCS/s.Enum.java
+java/lang/SCCS/s.ConditionalSpecialCasing.java
+java/lang/SCCS/s.Double.java
+java/lang/SCCS/s.Error.java
+java/lang/SCCS/s.Exception.java
+java/lang/SCCS/s.EnumConstantNotPresentException.java
+java/lang/SCCS/s.Number.java
+java/lang/SCCS/s.Float.java
+java/lang/SCCS/s.ExceptionInInitializerError.java
+java/lang/SCCS/s.IllegalAccessException.java
+java/lang/SCCS/s.IllegalArgumentException.java
+java/lang/SCCS/s.IllegalMonitorStateException.java
+java/lang/SCCS/s.IllegalStateException.java
+java/lang/SCCS/s.IllegalThreadStateException.java
+java/lang/SCCS/s.IncompatibleClassChangeError.java
+java/lang/SCCS/s.IndexOutOfBoundsException.java
+java/lang/SCCS/s.InheritableThreadLocal.java
+java/lang/SCCS/s.InstantiationError.java
+java/lang/SCCS/s.Integer.java
+java/lang/SCCS/s.Long.java
+java/lang/SCCS/s.Math.java
+java/lang/SCCS/s.InstantiationException.java
+java/lang/SCCS/s.InternalError.java
+java/lang/SCCS/s.InterruptedException.java
+java/lang/SCCS/s.Iterable.java
+java/lang/SCCS/s.LinkageError.java
+java/lang/SCCS/s.StringIndexOutOfBoundsException.java
+java/lang/SCCS/s.NegativeArraySizeException.java
+java/lang/SCCS/s.NoClassDefFoundError.java
+java/lang/SCCS/s.NoSuchFieldError.java
+java/lang/SCCS/s.NoSuchFieldException.java
+java/lang/SCCS/s.NoSuchMethodError.java
+java/lang/SCCS/s.NoSuchMethodException.java
+java/lang/SCCS/s.NullPointerException.java
+java/lang/SCCS/s.NumberFormatException.java
+java/lang/SCCS/s.Object.java
+java/lang/SCCS/s.OutOfMemoryError.java
+java/lang/SCCS/s.Override.java
+java/lang/SCCS/s.Package.java
+java/lang/SCCS/s.Process.java
+java/lang/SCCS/s.ProcessBuilder.java
+java/lang/SCCS/s.Readable.java
+java/lang/SCCS/s.Runnable.java
+java/lang/SCCS/s.Runtime.java
+java/lang/SCCS/s.RuntimeException.java
+java/lang/SCCS/s.RuntimePermission.java
+java/lang/SCCS/s.SecurityException.java
+java/lang/SCCS/s.SecurityManager.java
+java/lang/SCCS/s.Short.java
+java/lang/SCCS/s.Shutdown.java
+java/lang/SCCS/s.StackOverflowError.java
+java/lang/SCCS/s.StackTraceElement.java
+java/lang/SCCS/s.String.java
+java/lang/SCCS/s.StrictMath.java
+java/lang/SCCS/s.StringBuffer.java
+java/lang/SCCS/s.StringBuilder.java
+java/lang/SCCS/s.StringCoding.java
+java/lang/SCCS/s.TypeNotPresentException.java
+java/lang/SCCS/s.SuppressWarnings.java
+java/lang/SCCS/s.System.java
+java/lang/SCCS/s.Thread.java
+java/lang/SCCS/s.ThreadDeath.java
+java/lang/SCCS/s.ThreadGroup.java
+java/lang/SCCS/s.ThreadLocal.java
+java/lang/SCCS/s.Throwable.java
+java/lang/SCCS/s.UnsatisfiedLinkError.java
+java/lang/SCCS/s.UnknownError.java
+java/lang/SCCS/s.UnsupportedClassVersionError.java
+java/lang/SCCS/s.Void.java
+java/lang/SCCS/s.VerifyError.java
+java/lang/SCCS/s.UnsupportedOperationException.java
+java/lang/SCCS/s.VirtualMachineError.java
+java/lang/SCCS/s.package.html
+java/lang/annotation
+java/lang/annotation/SCCS
+java/lang/annotation/SCCS/s.Annotation.java
+java/lang/annotation/SCCS/s.Documented.java
+java/lang/annotation/SCCS/s.Target.java
+java/lang/annotation/SCCS/s.AnnotationFormatError.java
+java/lang/annotation/SCCS/s.AnnotationTypeMismatchException.java
+java/lang/annotation/SCCS/s.ElementType.java
+java/lang/annotation/SCCS/s.IncompleteAnnotationException.java
+java/lang/annotation/SCCS/s.Inherited.java
+java/lang/annotation/SCCS/s.Retention.java
+java/lang/annotation/SCCS/s.RetentionPolicy.java
+java/lang/annotation/SCCS/s.package.html
+java/lang/annotation/Annotation.java
+java/lang/annotation/Documented.java
+java/lang/annotation/Target.java
+java/lang/annotation/AnnotationFormatError.java
+java/lang/annotation/AnnotationTypeMismatchException.java
+java/lang/annotation/ElementType.java
+java/lang/annotation/IncompleteAnnotationException.java
+java/lang/annotation/Inherited.java
+java/lang/annotation/Retention.java
+java/lang/annotation/RetentionPolicy.java
+java/lang/annotation/package.html
+java/lang/doc-files
+java/lang/doc-files/SCCS
+java/lang/doc-files/SCCS/s.capchi.gif
+java/lang/doc-files/SCCS/s.capiota.gif
+java/lang/doc-files/SCCS/s.capsigma.gif
+java/lang/doc-files/SCCS/s.captheta.gif
+java/lang/doc-files/SCCS/s.capupsil.gif
+java/lang/doc-files/SCCS/s.chi.gif
+java/lang/doc-files/SCCS/s.iota.gif
+java/lang/doc-files/SCCS/s.sigma1.gif
+java/lang/doc-files/SCCS/s.theta.gif
+java/lang/doc-files/SCCS/s.javalang.doc.anc21.gif
+java/lang/doc-files/SCCS/s.javalang.doc.anc38.gif
+java/lang/doc-files/SCCS/s.javalang.doc.anc40.gif
+java/lang/doc-files/SCCS/s.javalang.doc.anc41.gif
+java/lang/doc-files/SCCS/s.upsilon.gif
+java/lang/doc-files/capsigma.gif
+java/lang/doc-files/capchi.gif
+java/lang/doc-files/capiota.gif
+java/lang/doc-files/javalang.doc.anc21.gif
+java/lang/doc-files/captheta.gif
+java/lang/doc-files/capupsil.gif
+java/lang/doc-files/chi.gif
+java/lang/doc-files/iota.gif
+java/lang/doc-files/javalang.doc.anc38.gif
+java/lang/doc-files/javalang.doc.anc40.gif
+java/lang/doc-files/javalang.doc.anc41.gif
+java/lang/doc-files/sigma1.gif
+java/lang/doc-files/theta.gif
+java/lang/doc-files/upsilon.gif
+java/lang/instrument
+java/lang/instrument/SCCS
+java/lang/instrument/SCCS/s.ClassFileTransformer.java
+java/lang/instrument/SCCS/s.ClassDefinition.java
+java/lang/instrument/SCCS/s.IllegalClassFormatException.java
+java/lang/instrument/SCCS/s.Instrumentation.java
+java/lang/instrument/SCCS/s.UnmodifiableClassException.java
+java/lang/instrument/SCCS/s.package.html
+java/lang/instrument/ClassFileTransformer.java
+java/lang/instrument/ClassDefinition.java
+java/lang/instrument/IllegalClassFormatException.java
+java/lang/instrument/Instrumentation.java
+java/lang/instrument/UnmodifiableClassException.java
+java/lang/instrument/package.html
+java/lang/management
+java/lang/management/SCCS
+java/lang/management/SCCS/s.GarbageCollectorMXBean.java
+java/lang/management/SCCS/s.ClassLoadingMXBean.java
+java/lang/management/SCCS/s.CompilationMXBean.java
+java/lang/management/SCCS/s.ManagementFactory.java
+java/lang/management/SCCS/s.ManagementPermission.java
+java/lang/management/SCCS/s.MemoryMXBean.java
+java/lang/management/SCCS/s.MemoryManagerMXBean.java
+java/lang/management/SCCS/s.MemoryNotificationInfo.java
+java/lang/management/SCCS/s.MemoryPoolMXBean.java
+java/lang/management/SCCS/s.MemoryType.java
+java/lang/management/SCCS/s.MemoryUsage.java
+java/lang/management/SCCS/s.OperatingSystemMXBean.java
+java/lang/management/SCCS/s.RuntimeMXBean.java
+java/lang/management/SCCS/s.ThreadInfo.java
+java/lang/management/SCCS/s.ThreadMXBean.java
+java/lang/management/SCCS/s.package.html
+java/lang/management/GarbageCollectorMXBean.java
+java/lang/management/ClassLoadingMXBean.java
+java/lang/management/CompilationMXBean.java
+java/lang/management/ThreadMXBean.java
+java/lang/management/ManagementFactory.java
+java/lang/management/ManagementPermission.java
+java/lang/management/MemoryMXBean.java
+java/lang/management/MemoryManagerMXBean.java
+java/lang/management/MemoryNotificationInfo.java
+java/lang/management/MemoryPoolMXBean.java
+java/lang/management/MemoryType.java
+java/lang/management/MemoryUsage.java
+java/lang/management/OperatingSystemMXBean.java
+java/lang/management/RuntimeMXBean.java
+java/lang/management/ThreadInfo.java
+java/lang/management/package.html
+java/lang/ref
+java/lang/ref/SCCS
+java/lang/ref/SCCS/s.FinalReference.java
+java/lang/ref/SCCS/s.Finalizer.java
+java/lang/ref/SCCS/s.PhantomReference.java
+java/lang/ref/SCCS/s.Reference.java
+java/lang/ref/SCCS/s.ReferenceQueue.java
+java/lang/ref/SCCS/s.SoftReference.java
+java/lang/ref/SCCS/s.WeakReference.java
+java/lang/ref/SCCS/s.package.html
+java/lang/ref/PhantomReference.java
+java/lang/ref/FinalReference.java
+java/lang/ref/Finalizer.java
+java/lang/ref/Reference.java
+java/lang/ref/ReferenceQueue.java
+java/lang/ref/SoftReference.java
+java/lang/ref/WeakReference.java
+java/lang/ref/package.html
+java/lang/reflect
+java/lang/reflect/SCCS
+java/lang/reflect/SCCS/s.GenericDeclaration.java
+java/lang/reflect/SCCS/s.AccessibleObject.java
+java/lang/reflect/SCCS/s.AnnotatedElement.java
+java/lang/reflect/SCCS/s.Array.java
+java/lang/reflect/SCCS/s.Constructor.java
+java/lang/reflect/SCCS/s.Field.java
+java/lang/reflect/SCCS/s.GenericArrayType.java
+java/lang/reflect/SCCS/s.MalformedParameterizedTypeException.java
+java/lang/reflect/SCCS/s.GenericSignatureFormatError.java
+java/lang/reflect/SCCS/s.InvocationHandler.java
+java/lang/reflect/SCCS/s.InvocationTargetException.java
+java/lang/reflect/SCCS/s.ReflectAccess.java
+java/lang/reflect/SCCS/s.Member.java
+java/lang/reflect/SCCS/s.Method.java
+java/lang/reflect/SCCS/s.Modifier.java
+java/lang/reflect/SCCS/s.Proxy.java
+java/lang/reflect/SCCS/s.Type.java
+java/lang/reflect/SCCS/s.ParameterizedType.java
+java/lang/reflect/SCCS/s.UndeclaredThrowableException.java
+java/lang/reflect/SCCS/s.ReflectPermission.java
+java/lang/reflect/SCCS/s.TypeVariable.java
+java/lang/reflect/SCCS/s.WildcardType.java
+java/lang/reflect/SCCS/s.package.html
+java/lang/reflect/AccessibleObject.java
+java/lang/reflect/AnnotatedElement.java
+java/lang/reflect/Array.java
+java/lang/reflect/Constructor.java
+java/lang/reflect/Field.java
+java/lang/reflect/GenericArrayType.java
+java/lang/reflect/GenericDeclaration.java
+java/lang/reflect/InvocationHandler.java
+java/lang/reflect/Member.java
+java/lang/reflect/GenericSignatureFormatError.java
+java/lang/reflect/InvocationTargetException.java
+java/lang/reflect/MalformedParameterizedTypeException.java
+java/lang/reflect/Method.java
+java/lang/reflect/Modifier.java
+java/lang/reflect/ParameterizedType.java
+java/lang/reflect/Proxy.java
+java/lang/reflect/ReflectAccess.java
+java/lang/reflect/ReflectPermission.java
+java/lang/reflect/Type.java
+java/lang/reflect/TypeVariable.java
+java/lang/reflect/WildcardType.java
+java/lang/reflect/package.html
+java/lang/reflect/UndeclaredThrowableException.java
+java/lang/ArrayIndexOutOfBoundsException.java
+java/lang/AbstractMethodError.java
+java/lang/AbstractStringBuilder.java
+java/lang/Appendable.java
+java/lang/ArithmeticException.java
+java/lang/AssertionStatusDirectives.java
+java/lang/ArrayStoreException.java
+java/lang/AssertionError.java
+java/lang/Boolean.java
+java/lang/Byte.java
+java/lang/ClassCircularityError.java
+java/lang/CharSequence.java
+java/lang/Character.java
+java/lang/Class.java
+java/lang/ClassCastException.java
+java/lang/ClassNotFoundException.java
+java/lang/ClassFormatError.java
+java/lang/ClassLoader.java
+java/lang/Double.java
+java/lang/CloneNotSupportedException.java
+java/lang/Cloneable.java
+java/lang/Comparable.java
+java/lang/Compiler.java
+java/lang/ConditionalSpecialCasing.java
+java/lang/Deprecated.java
+java/lang/Enum.java
+java/lang/Error.java
+java/lang/Exception.java
+java/lang/Float.java
+java/lang/InstantiationError.java
+java/lang/EnumConstantNotPresentException.java
+java/lang/ExceptionInInitializerError.java
+java/lang/IllegalAccessException.java
+java/lang/IllegalAccessError.java
+java/lang/Long.java
+java/lang/IllegalArgumentException.java
+java/lang/IllegalMonitorStateException.java
+java/lang/IllegalStateException.java
+java/lang/IllegalThreadStateException.java
+java/lang/IncompatibleClassChangeError.java
+java/lang/IndexOutOfBoundsException.java
+java/lang/InheritableThreadLocal.java
+java/lang/Override.java
+java/lang/Number.java
+java/lang/InstantiationException.java
+java/lang/Integer.java
+java/lang/InternalError.java
+java/lang/InterruptedException.java
+java/lang/Iterable.java
+java/lang/LinkageError.java
+java/lang/Math.java
+java/lang/NegativeArraySizeException.java
+java/lang/NoClassDefFoundError.java
+java/lang/NoSuchFieldError.java
+java/lang/NoSuchFieldException.java
+java/lang/NoSuchMethodError.java
+java/lang/NoSuchMethodException.java
+java/lang/NullPointerException.java
+java/lang/Object.java
+java/lang/Shutdown.java
+java/lang/Short.java
+java/lang/NumberFormatException.java
+java/lang/OutOfMemoryError.java
+java/lang/Package.java
+java/lang/Process.java
+java/lang/ProcessBuilder.java
+java/lang/Readable.java
+java/lang/Runnable.java
+java/lang/Runtime.java
+java/lang/RuntimeException.java
+java/lang/RuntimePermission.java
+java/lang/SecurityException.java
+java/lang/SecurityManager.java
+java/lang/StackOverflowError.java
+java/lang/StackTraceElement.java
+java/lang/StrictMath.java
+java/lang/String.java
+java/lang/System.java
+java/lang/TypeNotPresentException.java
+java/lang/StringBuffer.java
+java/lang/StringBuilder.java
+java/lang/StringCoding.java
+java/lang/StringIndexOutOfBoundsException.java
+java/lang/SuppressWarnings.java
+java/lang/Thread.java
+java/lang/ThreadDeath.java
+java/lang/ThreadGroup.java
+java/lang/ThreadLocal.java
+java/lang/Throwable.java
+java/lang/UnsatisfiedLinkError.java
+java/lang/UnknownError.java
+java/lang/VirtualMachineError.java
+java/lang/UnsupportedClassVersionError.java
+java/lang/UnsupportedOperationException.java
+java/lang/VerifyError.java
+java/lang/package.html
+java/lang/Void.java
+java/math
+java/math/SCCS
+java/math/SCCS/s.MutableBigInteger.java
+java/math/SCCS/s.BigDecimal.java
+java/math/SCCS/s.BigInteger.java
+java/math/SCCS/s.BitSieve.java
+java/math/SCCS/s.MathContext.java
+java/math/SCCS/s.RoundingMode.java
+java/math/SCCS/s.package.html
+java/math/SCCS/s.SignedMutableBigInteger.java
+java/math/MathContext.java
+java/math/BigDecimal.java
+java/math/BigInteger.java
+java/math/BitSieve.java
+java/math/SignedMutableBigInteger.java
+java/math/MutableBigInteger.java
+java/math/RoundingMode.java
+java/math/package.html
+java/net
+java/net/SCCS
+java/net/SCCS/s.ContentHandlerFactory.java
+java/net/SCCS/s.Authenticator.java
+java/net/SCCS/s.BindException.java
+java/net/SCCS/s.CacheRequest.java
+java/net/SCCS/s.CacheResponse.java
+java/net/SCCS/s.ConnectException.java
+java/net/SCCS/s.ContentHandler.java
+java/net/SCCS/s.DatagramSocketImpl.java
+java/net/SCCS/s.CookieHandler.java
+java/net/SCCS/s.DatagramPacket.java
+java/net/SCCS/s.DatagramSocket.java
+java/net/SCCS/s.URI.java
+java/net/SCCS/s.URLStreamHandler.java
+java/net/SCCS/s.DatagramSocketImplFactory.java
+java/net/SCCS/s.FileNameMap.java
+java/net/SCCS/s.HttpRetryException.java
+java/net/SCCS/s.HttpURLConnection.java
+java/net/SCCS/s.Inet4Address.java
+java/net/SCCS/s.Inet4AddressImpl.java
+java/net/SCCS/s.Inet6Address.java
+java/net/SCCS/s.Inet6AddressImpl.java
+java/net/SCCS/s.InetAddress.java
+java/net/SCCS/s.InetAddressImpl.java
+java/net/SCCS/s.InetSocketAddress.java
+java/net/SCCS/s.JarURLConnection.java
+java/net/SCCS/s.MalformedURLException.java
+java/net/SCCS/s.MulticastSocket.java
+java/net/SCCS/s.NetPermission.java
+java/net/SCCS/s.NetworkInterface.java
+java/net/SCCS/s.NoRouteToHostException.java
+java/net/SCCS/s.PasswordAuthentication.java
+java/net/SCCS/s.PlainDatagramSocketImpl.java
+java/net/SCCS/s.PlainSocketImpl.java
+java/net/SCCS/s.PortUnreachableException.java
+java/net/SCCS/s.ProtocolException.java
+java/net/SCCS/s.Proxy.java
+java/net/SCCS/s.ProxySelector.java
+java/net/SCCS/s.ResponseCache.java
+java/net/SCCS/s.SecureCacheResponse.java
+java/net/SCCS/s.ServerSocket.java
+java/net/SCCS/s.Socket.java
+java/net/SCCS/s.SocketAddress.java
+java/net/SCCS/s.SocketException.java
+java/net/SCCS/s.SocketImpl.java
+java/net/SCCS/s.SocketImplFactory.java
+java/net/SCCS/s.URL.java
+java/net/SCCS/s.SocketInputStream.java
+java/net/SCCS/s.SocketOptions.java
+java/net/SCCS/s.SocketOutputStream.java
+java/net/SCCS/s.SocketPermission.java
+java/net/SCCS/s.SocketTimeoutException.java
+java/net/SCCS/s.SocksConsts.java
+java/net/SCCS/s.SocksSocketImpl.java
+java/net/SCCS/s.URLDecoder.java
+java/net/SCCS/s.URISyntaxException.java
+java/net/SCCS/s.URLClassLoader.java
+java/net/SCCS/s.URLConnection.java
+java/net/SCCS/s.URLEncoder.java
+java/net/SCCS/s.UnknownServiceException.java
+java/net/SCCS/s.URLStreamHandlerFactory.java
+java/net/SCCS/s.UnknownHostException.java
+java/net/SCCS/s.package.html
+java/net/ConnectException.java
+java/net/Authenticator.java
+java/net/BindException.java
+java/net/CacheRequest.java
+java/net/CacheResponse.java
+java/net/ContentHandlerFactory.java
+java/net/ContentHandler.java
+java/net/DatagramSocketImplFactory.java
+java/net/CookieHandler.java
+java/net/DatagramPacket.java
+java/net/DatagramSocket.java
+java/net/DatagramSocketImpl.java
+java/net/HttpRetryException.java
+java/net/FileNameMap.java
+java/net/ProxySelector.java
+java/net/Proxy.java
+java/net/HttpURLConnection.java
+java/net/Inet4Address.java
+java/net/Inet4AddressImpl.java
+java/net/Inet6Address.java
+java/net/Inet6AddressImpl.java
+java/net/InetAddress.java
+java/net/InetAddressImpl.java
+java/net/InetSocketAddress.java
+java/net/JarURLConnection.java
+java/net/MalformedURLException.java
+java/net/MulticastSocket.java
+java/net/NetPermission.java
+java/net/NetworkInterface.java
+java/net/NoRouteToHostException.java
+java/net/PasswordAuthentication.java
+java/net/PlainSocketImpl.java
+java/net/PlainDatagramSocketImpl.java
+java/net/PortUnreachableException.java
+java/net/ProtocolException.java
+java/net/SecureCacheResponse.java
+java/net/ResponseCache.java
+java/net/SocketException.java
+java/net/ServerSocket.java
+java/net/Socket.java
+java/net/SocketAddress.java
+java/net/SocketImplFactory.java
+java/net/SocketImpl.java
+java/net/SocketInputStream.java
+java/net/SocketOptions.java
+java/net/SocketOutputStream.java
+java/net/SocketPermission.java
+java/net/SocketTimeoutException.java
+java/net/SocksConsts.java
+java/net/SocksSocketImpl.java
+java/net/URI.java
+java/net/URISyntaxException.java
+java/net/URL.java
+java/net/URLClassLoader.java
+java/net/URLConnection.java
+java/net/URLDecoder.java
+java/net/URLEncoder.java
+java/net/URLStreamHandler.java
+java/net/URLStreamHandlerFactory.java
+java/net/UnknownHostException.java
+java/net/UnknownServiceException.java
+java/net/package.html
+java/nio
+java/nio/SCCS
+java/nio/SCCS/s.Buffer.java
+java/nio/SCCS/s.Bits.java
+java/nio/SCCS/s.ByteBufferAs-X-Buffer.java
+java/nio/SCCS/s.ByteOrder.java
+java/nio/SCCS/s.Direct-X-Buffer-bin.java
+java/nio/SCCS/s.Direct-X-Buffer.java
+java/nio/SCCS/s.Heap-X-Buffer.java
+java/nio/SCCS/s.MappedByteBuffer.java
+java/nio/SCCS/s.StringCharBuffer.java
+java/nio/SCCS/s.X-Buffer-bin.java
+java/nio/SCCS/s.X-Buffer.java
+java/nio/SCCS/s.exceptions
+java/nio/SCCS/s.package.html
+java/nio/channels
+java/nio/channels/SCCS
+java/nio/channels/SCCS/s.DatagramChannel.java
+java/nio/channels/SCCS/s.ByteChannel.java
+java/nio/channels/SCCS/s.Channel.java
+java/nio/channels/SCCS/s.Channels.java
+java/nio/channels/SCCS/s.GatheringByteChannel.java
+java/nio/channels/SCCS/s.FileChannel.java
+java/nio/channels/SCCS/s.FileLock.java
+java/nio/channels/SCCS/s.InterruptibleChannel.java
+java/nio/channels/SCCS/s.Pipe.java
+java/nio/channels/SCCS/s.ReadableByteChannel.java
+java/nio/channels/SCCS/s.ScatteringByteChannel.java
+java/nio/channels/SCCS/s.SelectableChannel.java
+java/nio/channels/SCCS/s.SelectionKey.java
+java/nio/channels/SCCS/s.Selector.java
+java/nio/channels/SCCS/s.exceptions
+java/nio/channels/SCCS/s.ServerSocketChannel.java
+java/nio/channels/SCCS/s.SocketChannel.java
+java/nio/channels/SCCS/s.WritableByteChannel.java
+java/nio/channels/SCCS/s.package.html
+java/nio/channels/spi
+java/nio/channels/spi/SCCS
+java/nio/channels/spi/SCCS/s.AbstractInterruptibleChannel.java
+java/nio/channels/spi/SCCS/s.AbstractSelectableChannel.java
+java/nio/channels/spi/SCCS/s.AbstractSelectionKey.java
+java/nio/channels/spi/SCCS/s.AbstractSelector.java
+java/nio/channels/spi/SCCS/s.SelectorProvider.java
+java/nio/channels/spi/SCCS/s.package.html
+java/nio/channels/spi/AbstractInterruptibleChannel.java
+java/nio/channels/spi/AbstractSelectableChannel.java
+java/nio/channels/spi/AbstractSelectionKey.java
+java/nio/channels/spi/AbstractSelector.java
+java/nio/channels/spi/SelectorProvider.java
+java/nio/channels/spi/package.html
+java/nio/channels/DatagramChannel.java
+java/nio/channels/ByteChannel.java
+java/nio/channels/Channel.java
+java/nio/channels/Channels.java
+java/nio/channels/GatheringByteChannel.java
+java/nio/channels/FileChannel.java
+java/nio/channels/FileLock.java
+java/nio/channels/InterruptibleChannel.java
+java/nio/channels/Pipe.java
+java/nio/channels/ReadableByteChannel.java
+java/nio/channels/ScatteringByteChannel.java
+java/nio/channels/SelectableChannel.java
+java/nio/channels/SelectionKey.java
+java/nio/channels/Selector.java
+java/nio/channels/ServerSocketChannel.java
+java/nio/channels/SocketChannel.java
+java/nio/channels/WritableByteChannel.java
+java/nio/channels/exceptions
+java/nio/channels/package.html
+java/nio/charset
+java/nio/charset/SCCS
+java/nio/charset/SCCS/s.CoderMalfunctionError.java
+java/nio/charset/SCCS/s.Charset-X-Coder.java
+java/nio/charset/SCCS/s.Charset.java
+java/nio/charset/SCCS/s.CodingErrorAction.java
+java/nio/charset/SCCS/s.CoderResult.java
+java/nio/charset/SCCS/s.UnmappableCharacterException.java
+java/nio/charset/SCCS/s.MalformedInputException.java
+java/nio/charset/SCCS/s.exceptions
+java/nio/charset/SCCS/s.package.html
+java/nio/charset/spi
+java/nio/charset/spi/SCCS
+java/nio/charset/spi/SCCS/s.CharsetProvider.java
+java/nio/charset/spi/SCCS/s.package.html
+java/nio/charset/spi/CharsetProvider.java
+java/nio/charset/spi/package.html
+java/nio/charset/CoderMalfunctionError.java
+java/nio/charset/Charset-X-Coder.java
+java/nio/charset/Charset.java
+java/nio/charset/MalformedInputException.java
+java/nio/charset/CoderResult.java
+java/nio/charset/CodingErrorAction.java
+java/nio/charset/exceptions
+java/nio/charset/UnmappableCharacterException.java
+java/nio/charset/package.html
+java/nio/ByteOrder.java
+java/nio/Bits.java
+java/nio/Buffer.java
+java/nio/ByteBufferAs-X-Buffer.java
+java/nio/Direct-X-Buffer-bin.java
+java/nio/Direct-X-Buffer.java
+java/nio/Heap-X-Buffer.java
+java/nio/MappedByteBuffer.java
+java/nio/StringCharBuffer.java
+java/nio/X-Buffer-bin.java
+java/nio/X-Buffer.java
+java/nio/exceptions
+java/nio/package.html
+java/rmi
+java/rmi/SCCS
+java/rmi/SCCS/s.AlreadyBoundException.java
+java/rmi/SCCS/s.AccessException.java
+java/rmi/SCCS/s.ConnectIOException.java
+java/rmi/SCCS/s.ConnectException.java
+java/rmi/SCCS/s.NoSuchObjectException.java
+java/rmi/SCCS/s.MarshalException.java
+java/rmi/SCCS/s.MarshalledObject.java
+java/rmi/SCCS/s.Naming.java
+java/rmi/SCCS/s.NotBoundException.java
+java/rmi/SCCS/s.RMISecurityException.java
+java/rmi/SCCS/s.RMISecurityManager.java
+java/rmi/SCCS/s.Remote.java
+java/rmi/SCCS/s.RemoteException.java
+java/rmi/SCCS/s.ServerError.java
+java/rmi/SCCS/s.package.html
+java/rmi/SCCS/s.ServerException.java
+java/rmi/SCCS/s.ServerRuntimeException.java
+java/rmi/SCCS/s.StubNotFoundException.java
+java/rmi/SCCS/s.UnexpectedException.java
+java/rmi/SCCS/s.UnknownHostException.java
+java/rmi/SCCS/s.UnmarshalException.java
+java/rmi/activation
+java/rmi/activation/SCCS
+java/rmi/activation/SCCS/s.ActivationDesc.java
+java/rmi/activation/SCCS/s.Activatable.java
+java/rmi/activation/SCCS/s.ActivateFailedException.java
+java/rmi/activation/SCCS/s.ActivationException.java
+java/rmi/activation/SCCS/s.ActivationGroup.java
+java/rmi/activation/SCCS/s.ActivationGroupDesc.java
+java/rmi/activation/SCCS/s.ActivationGroupID.java
+java/rmi/activation/SCCS/s.ActivationID.java
+java/rmi/activation/SCCS/s.ActivationInstantiator.java
+java/rmi/activation/SCCS/s.ActivationMonitor.java
+java/rmi/activation/SCCS/s.ActivationSystem.java
+java/rmi/activation/SCCS/s.Activator.java
+java/rmi/activation/SCCS/s.package.html
+java/rmi/activation/SCCS/s.UnknownGroupException.java
+java/rmi/activation/SCCS/s.UnknownObjectException.java
+java/rmi/activation/Activatable.java
+java/rmi/activation/ActivationDesc.java
+java/rmi/activation/Activator.java
+java/rmi/activation/ActivateFailedException.java
+java/rmi/activation/ActivationException.java
+java/rmi/activation/ActivationGroup.java
+java/rmi/activation/ActivationGroupDesc.java
+java/rmi/activation/ActivationGroupID.java
+java/rmi/activation/ActivationID.java
+java/rmi/activation/ActivationInstantiator.java
+java/rmi/activation/ActivationMonitor.java
+java/rmi/activation/ActivationSystem.java
+java/rmi/activation/UnknownGroupException.java
+java/rmi/activation/UnknownObjectException.java
+java/rmi/activation/package.html
+java/rmi/dgc
+java/rmi/dgc/SCCS
+java/rmi/dgc/SCCS/s.Lease.java
+java/rmi/dgc/SCCS/s.DGC.java
+java/rmi/dgc/SCCS/s.VMID.java
+java/rmi/dgc/SCCS/s.package.html
+java/rmi/dgc/package.html
+java/rmi/dgc/DGC.java
+java/rmi/dgc/Lease.java
+java/rmi/dgc/VMID.java
+java/rmi/registry
+java/rmi/registry/SCCS
+java/rmi/registry/SCCS/s.LocateRegistry.java
+java/rmi/registry/SCCS/s.Registry.java
+java/rmi/registry/SCCS/s.RegistryHandler.java
+java/rmi/registry/SCCS/s.package.html
+java/rmi/registry/RegistryHandler.java
+java/rmi/registry/LocateRegistry.java
+java/rmi/registry/Registry.java
+java/rmi/registry/package.html
+java/rmi/server
+java/rmi/server/SCCS
+java/rmi/server/SCCS/s.RMIClassLoaderSpi.java
+java/rmi/server/SCCS/s.ExportException.java
+java/rmi/server/SCCS/s.LoaderHandler.java
+java/rmi/server/SCCS/s.LogStream.java
+java/rmi/server/SCCS/s.ObjID.java
+java/rmi/server/SCCS/s.Operation.java
+java/rmi/server/SCCS/s.RMIClassLoader.java
+java/rmi/server/SCCS/s.RMIClientSocketFactory.java
+java/rmi/server/SCCS/s.RMIFailureHandler.java
+java/rmi/server/SCCS/s.RMIServerSocketFactory.java
+java/rmi/server/SCCS/s.RMISocketFactory.java
+java/rmi/server/SCCS/s.RemoteCall.java
+java/rmi/server/SCCS/s.RemoteObject.java
+java/rmi/server/SCCS/s.RemoteRef.java
+java/rmi/server/SCCS/s.ServerNotActiveException.java
+java/rmi/server/SCCS/s.RemoteObjectInvocationHandler.java
+java/rmi/server/SCCS/s.RemoteServer.java
+java/rmi/server/SCCS/s.RemoteStub.java
+java/rmi/server/SCCS/s.ServerCloneException.java
+java/rmi/server/SCCS/s.ServerRef.java
+java/rmi/server/SCCS/s.Skeleton.java
+java/rmi/server/SCCS/s.UID.java
+java/rmi/server/SCCS/s.Unreferenced.java
+java/rmi/server/SCCS/s.SkeletonMismatchException.java
+java/rmi/server/SCCS/s.SkeletonNotFoundException.java
+java/rmi/server/SCCS/s.SocketSecurityException.java
+java/rmi/server/SCCS/s.UnicastRemoteObject.java
+java/rmi/server/SCCS/s.package.html
+java/rmi/server/RMIClientSocketFactory.java
+java/rmi/server/ExportException.java
+java/rmi/server/LoaderHandler.java
+java/rmi/server/LogStream.java
+java/rmi/server/ObjID.java
+java/rmi/server/Operation.java
+java/rmi/server/RMIClassLoader.java
+java/rmi/server/RMIClassLoaderSpi.java
+java/rmi/server/RemoteObjectInvocationHandler.java
+java/rmi/server/RMIFailureHandler.java
+java/rmi/server/RMIServerSocketFactory.java
+java/rmi/server/RMISocketFactory.java
+java/rmi/server/RemoteCall.java
+java/rmi/server/RemoteObject.java
+java/rmi/server/Unreferenced.java
+java/rmi/server/UID.java
+java/rmi/server/RemoteRef.java
+java/rmi/server/RemoteServer.java
+java/rmi/server/RemoteStub.java
+java/rmi/server/ServerCloneException.java
+java/rmi/server/ServerNotActiveException.java
+java/rmi/server/ServerRef.java
+java/rmi/server/Skeleton.java
+java/rmi/server/SkeletonMismatchException.java
+java/rmi/server/SkeletonNotFoundException.java
+java/rmi/server/SocketSecurityException.java
+java/rmi/server/UnicastRemoteObject.java
+java/rmi/server/package.html
+java/rmi/AlreadyBoundException.java
+java/rmi/AccessException.java
+java/rmi/ServerError.java
+java/rmi/ConnectException.java
+java/rmi/ConnectIOException.java
+java/rmi/MarshalException.java
+java/rmi/MarshalledObject.java
+java/rmi/Naming.java
+java/rmi/NoSuchObjectException.java
+java/rmi/NotBoundException.java
+java/rmi/RMISecurityException.java
+java/rmi/RMISecurityManager.java
+java/rmi/Remote.java
+java/rmi/ServerRuntimeException.java
+java/rmi/RemoteException.java
+java/rmi/ServerException.java
+java/rmi/StubNotFoundException.java
+java/rmi/UnexpectedException.java
+java/rmi/UnknownHostException.java
+java/rmi/UnmarshalException.java
+java/rmi/package.html
+java/security
+java/security/SCCS
+java/security/SCCS/s.AccessControlException.java
+java/security/SCCS/s.AccessControlContext.java
+java/security/SCCS/s.AccessController.java
+java/security/SCCS/s.AlgorithmParameters.java
+java/security/SCCS/s.DigestException.java
+java/security/SCCS/s.AlgorithmParameterGenerator.java
+java/security/SCCS/s.AlgorithmParameterGeneratorSpi.java
+java/security/SCCS/s.AlgorithmParametersSpi.java
+java/security/SCCS/s.AllPermission.java
+java/security/SCCS/s.AuthProvider.java
+java/security/SCCS/s.BasicPermission.java
+java/security/SCCS/s.Certificate.java
+java/security/SCCS/s.CodeSigner.java
+java/security/SCCS/s.CodeSource.java
+java/security/SCCS/s.GeneralSecurityException.java
+java/security/SCCS/s.DigestInputStream.java
+java/security/SCCS/s.DigestOutputStream.java
+java/security/SCCS/s.DomainCombiner.java
+java/security/SCCS/s.GuardedObject.java
+java/security/SCCS/s.Guard.java
+java/security/SCCS/s.IdentityScope.java
+java/security/SCCS/s.Identity.java
+java/security/SCCS/s.Key.java
+java/security/SCCS/s.InvalidAlgorithmParameterException.java
+java/security/SCCS/s.InvalidKeyException.java
+java/security/SCCS/s.InvalidParameterException.java
+java/security/SCCS/s.KeyException.java
+java/security/SCCS/s.KeyFactory.java
+java/security/SCCS/s.PrivilegedActionException.java
+java/security/SCCS/s.KeyFactorySpi.java
+java/security/SCCS/s.KeyManagementException.java
+java/security/SCCS/s.KeyPair.java
+java/security/SCCS/s.KeyPairGenerator.java
+java/security/SCCS/s.KeyPairGeneratorSpi.java
+java/security/SCCS/s.KeyRep.java
+java/security/SCCS/s.KeyStore.java
+java/security/SCCS/s.KeyStoreException.java
+java/security/SCCS/s.KeyStoreSpi.java
+java/security/SCCS/s.MessageDigest.java
+java/security/SCCS/s.MessageDigestSpi.java
+java/security/SCCS/s.NoSuchAlgorithmException.java
+java/security/SCCS/s.NoSuchProviderException.java
+java/security/SCCS/s.Permission.java
+java/security/SCCS/s.PermissionCollection.java
+java/security/SCCS/s.Permissions.java
+java/security/SCCS/s.Policy.java
+java/security/SCCS/s.Principal.java
+java/security/SCCS/s.PrivateKey.java
+java/security/SCCS/s.PrivilegedAction.java
+java/security/SCCS/s.UnresolvedPermissionCollection.java
+java/security/SCCS/s.PrivilegedExceptionAction.java
+java/security/SCCS/s.ProtectionDomain.java
+java/security/SCCS/s.Provider.java
+java/security/SCCS/s.ProviderException.java
+java/security/SCCS/s.PublicKey.java
+java/security/SCCS/s.SecureClassLoader.java
+java/security/SCCS/s.SecureRandom.java
+java/security/SCCS/s.SecureRandomSpi.java
+java/security/SCCS/s.Security.java
+java/security/SCCS/s.SecurityPermission.java
+java/security/SCCS/s.Signature.java
+java/security/SCCS/s.SignatureException.java
+java/security/SCCS/s.SignatureSpi.java
+java/security/SCCS/s.SignedObject.java
+java/security/SCCS/s.Signer.java
+java/security/SCCS/s.Timestamp.java
+java/security/SCCS/s.UnrecoverableEntryException.java
+java/security/SCCS/s.UnrecoverableKeyException.java
+java/security/SCCS/s.UnresolvedPermission.java
+java/security/SCCS/s.package.html
+java/security/acl
+java/security/acl/SCCS
+java/security/acl/SCCS/s.AclEntry.java
+java/security/acl/SCCS/s.Acl.java
+java/security/acl/SCCS/s.AclNotFoundException.java
+java/security/acl/SCCS/s.Group.java
+java/security/acl/SCCS/s.LastOwnerException.java
+java/security/acl/SCCS/s.NotOwnerException.java
+java/security/acl/SCCS/s.Owner.java
+java/security/acl/SCCS/s.Permission.java
+java/security/acl/SCCS/s.package.html
+java/security/acl/AclEntry.java
+java/security/acl/Acl.java
+java/security/acl/AclNotFoundException.java
+java/security/acl/Group.java
+java/security/acl/LastOwnerException.java
+java/security/acl/NotOwnerException.java
+java/security/acl/Owner.java
+java/security/acl/Permission.java
+java/security/acl/package.html
+java/security/cert
+java/security/cert/SCCS
+java/security/cert/SCCS/s.CRLException.java
+java/security/cert/SCCS/s.CRL.java
+java/security/cert/SCCS/s.CertPathBuilder.java
+java/security/cert/SCCS/s.CRLSelector.java
+java/security/cert/SCCS/s.CertPath.java
+java/security/cert/SCCS/s.CertificateEncodingException.java
+java/security/cert/SCCS/s.CertPathBuilderException.java
+java/security/cert/SCCS/s.CertPathBuilderResult.java
+java/security/cert/SCCS/s.CertPathBuilderSpi.java
+java/security/cert/SCCS/s.CertPathHelperImpl.java
+java/security/cert/SCCS/s.CertPathParameters.java
+java/security/cert/SCCS/s.CertPathValidator.java
+java/security/cert/SCCS/s.CertPathValidatorException.java
+java/security/cert/SCCS/s.CertPathValidatorResult.java
+java/security/cert/SCCS/s.CertPathValidatorSpi.java
+java/security/cert/SCCS/s.CertSelector.java
+java/security/cert/SCCS/s.CertStore.java
+java/security/cert/SCCS/s.CertStoreException.java
+java/security/cert/SCCS/s.CertStoreParameters.java
+java/security/cert/SCCS/s.CertStoreSpi.java
+java/security/cert/SCCS/s.Certificate.java
+java/security/cert/SCCS/s.CertificateExpiredException.java
+java/security/cert/SCCS/s.CertificateException.java
+java/security/cert/SCCS/s.CertificateFactorySpi.java
+java/security/cert/SCCS/s.CertificateFactory.java
+java/security/cert/SCCS/s.X509CRLSelector.java
+java/security/cert/SCCS/s.X509CRL.java
+java/security/cert/SCCS/s.CertificateNotYetValidException.java
+java/security/cert/SCCS/s.PolicyNode.java
+java/security/cert/SCCS/s.CertificateParsingException.java
+java/security/cert/SCCS/s.CollectionCertStoreParameters.java
+java/security/cert/SCCS/s.LDAPCertStoreParameters.java
+java/security/cert/SCCS/s.PKIXBuilderParameters.java
+java/security/cert/SCCS/s.PKIXCertPathBuilderResult.java
+java/security/cert/SCCS/s.PKIXCertPathChecker.java
+java/security/cert/SCCS/s.PKIXCertPathValidatorResult.java
+java/security/cert/SCCS/s.PKIXParameters.java
+java/security/cert/SCCS/s.PolicyQualifierInfo.java
+java/security/cert/SCCS/s.TrustAnchor.java
+java/security/cert/SCCS/s.X509CRLEntry.java
+java/security/cert/SCCS/s.X509CertSelector.java
+java/security/cert/SCCS/s.X509Certificate.java
+java/security/cert/SCCS/s.package.html
+java/security/cert/SCCS/s.X509Extension.java
+java/security/cert/CRLException.java
+java/security/cert/CRL.java
+java/security/cert/CertPathBuilder.java
+java/security/cert/CRLSelector.java
+java/security/cert/CertPath.java
+java/security/cert/CertPathBuilderException.java
+java/security/cert/CertPathBuilderResult.java
+java/security/cert/CertPathBuilderSpi.java
+java/security/cert/CertPathHelperImpl.java
+java/security/cert/CertPathParameters.java
+java/security/cert/CertPathValidator.java
+java/security/cert/CertPathValidatorException.java
+java/security/cert/CertPathValidatorResult.java
+java/security/cert/TrustAnchor.java
+java/security/cert/PolicyNode.java
+java/security/cert/CertPathValidatorSpi.java
+java/security/cert/CertSelector.java
+java/security/cert/CertStore.java
+java/security/cert/CertStoreException.java
+java/security/cert/CertStoreParameters.java
+java/security/cert/CertStoreSpi.java
+java/security/cert/Certificate.java
+java/security/cert/CertificateEncodingException.java
+java/security/cert/CertificateException.java
+java/security/cert/CertificateExpiredException.java
+java/security/cert/CertificateFactory.java
+java/security/cert/CertificateFactorySpi.java
+java/security/cert/CertificateNotYetValidException.java
+java/security/cert/CertificateParsingException.java
+java/security/cert/CollectionCertStoreParameters.java
+java/security/cert/LDAPCertStoreParameters.java
+java/security/cert/PKIXBuilderParameters.java
+java/security/cert/PKIXCertPathBuilderResult.java
+java/security/cert/PKIXCertPathChecker.java
+java/security/cert/PKIXCertPathValidatorResult.java
+java/security/cert/PKIXParameters.java
+java/security/cert/PolicyQualifierInfo.java
+java/security/cert/X509CRL.java
+java/security/cert/X509CRLEntry.java
+java/security/cert/X509CRLSelector.java
+java/security/cert/X509CertSelector.java
+java/security/cert/X509Certificate.java
+java/security/cert/X509Extension.java
+java/security/cert/package.html
+java/security/interfaces
+java/security/interfaces/SCCS
+java/security/interfaces/SCCS/s.DSAParams.java
+java/security/interfaces/SCCS/s.DSAKey.java
+java/security/interfaces/SCCS/s.RSAMultiPrimePrivateCrtKey.java
+java/security/interfaces/SCCS/s.DSAKeyPairGenerator.java
+java/security/interfaces/SCCS/s.DSAPrivateKey.java
+java/security/interfaces/SCCS/s.DSAPublicKey.java
+java/security/interfaces/SCCS/s.ECKey.java
+java/security/interfaces/SCCS/s.ECPrivateKey.java
+java/security/interfaces/SCCS/s.ECPublicKey.java
+java/security/interfaces/SCCS/s.RSAKey.java
+java/security/interfaces/SCCS/s.RSAPrivateCrtKey.java
+java/security/interfaces/SCCS/s.RSAPrivateKey.java
+java/security/interfaces/SCCS/s.RSAPublicKey.java
+java/security/interfaces/SCCS/s.package.html
+java/security/interfaces/DSAParams.java
+java/security/interfaces/DSAKey.java
+java/security/interfaces/DSAKeyPairGenerator.java
+java/security/interfaces/DSAPrivateKey.java
+java/security/interfaces/DSAPublicKey.java
+java/security/interfaces/ECKey.java
+java/security/interfaces/ECPrivateKey.java
+java/security/interfaces/ECPublicKey.java
+java/security/interfaces/RSAKey.java
+java/security/interfaces/RSAMultiPrimePrivateCrtKey.java
+java/security/interfaces/RSAPrivateCrtKey.java
+java/security/interfaces/RSAPrivateKey.java
+java/security/interfaces/RSAPublicKey.java
+java/security/interfaces/package.html
+java/security/spec
+java/security/spec/SCCS
+java/security/spec/SCCS/s.InvalidParameterSpecException.java
+java/security/spec/SCCS/s.AlgorithmParameterSpec.java
+java/security/spec/SCCS/s.DSAParameterSpec.java
+java/security/spec/SCCS/s.DSAPrivateKeySpec.java
+java/security/spec/SCCS/s.DSAPublicKeySpec.java
+java/security/spec/SCCS/s.ECField.java
+java/security/spec/SCCS/s.ECFieldF2m.java
+java/security/spec/SCCS/s.ECFieldFp.java
+java/security/spec/SCCS/s.ECGenParameterSpec.java
+java/security/spec/SCCS/s.ECParameterSpec.java
+java/security/spec/SCCS/s.ECPoint.java
+java/security/spec/SCCS/s.ECPrivateKeySpec.java
+java/security/spec/SCCS/s.ECPublicKeySpec.java
+java/security/spec/SCCS/s.EllipticCurve.java
+java/security/spec/SCCS/s.EncodedKeySpec.java
+java/security/spec/SCCS/s.InvalidKeySpecException.java
+java/security/spec/SCCS/s.PSSParameterSpec.java
+java/security/spec/SCCS/s.KeySpec.java
+java/security/spec/SCCS/s.RSAKeyGenParameterSpec.java
+java/security/spec/SCCS/s.MGF1ParameterSpec.java
+java/security/spec/SCCS/s.PKCS8EncodedKeySpec.java
+java/security/spec/SCCS/s.package.html
+java/security/spec/SCCS/s.RSAMultiPrimePrivateCrtKeySpec.java
+java/security/spec/SCCS/s.RSAOtherPrimeInfo.java
+java/security/spec/SCCS/s.RSAPrivateCrtKeySpec.java
+java/security/spec/SCCS/s.RSAPrivateKeySpec.java
+java/security/spec/SCCS/s.RSAPublicKeySpec.java
+java/security/spec/SCCS/s.X509EncodedKeySpec.java
+java/security/spec/AlgorithmParameterSpec.java
+java/security/spec/DSAParameterSpec.java
+java/security/spec/DSAPrivateKeySpec.java
+java/security/spec/DSAPublicKeySpec.java
+java/security/spec/ECField.java
+java/security/spec/ECFieldF2m.java
+java/security/spec/ECFieldFp.java
+java/security/spec/ECGenParameterSpec.java
+java/security/spec/ECParameterSpec.java
+java/security/spec/ECPoint.java
+java/security/spec/ECPrivateKeySpec.java
+java/security/spec/ECPublicKeySpec.java
+java/security/spec/EllipticCurve.java
+java/security/spec/EncodedKeySpec.java
+java/security/spec/MGF1ParameterSpec.java
+java/security/spec/KeySpec.java
+java/security/spec/InvalidKeySpecException.java
+java/security/spec/InvalidParameterSpecException.java
+java/security/spec/RSAMultiPrimePrivateCrtKeySpec.java
+java/security/spec/PKCS8EncodedKeySpec.java
+java/security/spec/PSSParameterSpec.java
+java/security/spec/RSAKeyGenParameterSpec.java
+java/security/spec/RSAPrivateCrtKeySpec.java
+java/security/spec/RSAOtherPrimeInfo.java
+java/security/spec/RSAPrivateKeySpec.java
+java/security/spec/RSAPublicKeySpec.java
+java/security/spec/X509EncodedKeySpec.java
+java/security/spec/package.html
+java/security/AlgorithmParameterGenerator.java
+java/security/AccessControlContext.java
+java/security/AccessControlException.java
+java/security/AccessController.java
+java/security/Guard.java
+java/security/AlgorithmParameterGeneratorSpi.java
+java/security/AlgorithmParameters.java
+java/security/AlgorithmParametersSpi.java
+java/security/AllPermission.java
+java/security/AuthProvider.java
+java/security/BasicPermission.java
+java/security/InvalidKeyException.java
+java/security/Certificate.java
+java/security/CodeSigner.java
+java/security/CodeSource.java
+java/security/DigestException.java
+java/security/DigestInputStream.java
+java/security/DigestOutputStream.java
+java/security/DomainCombiner.java
+java/security/GeneralSecurityException.java
+java/security/GuardedObject.java
+java/security/Identity.java
+java/security/IdentityScope.java
+java/security/Key.java
+java/security/KeyFactorySpi.java
+java/security/InvalidAlgorithmParameterException.java
+java/security/InvalidParameterException.java
+java/security/KeyException.java
+java/security/KeyFactory.java
+java/security/NoSuchAlgorithmException.java
+java/security/KeyManagementException.java
+java/security/KeyPair.java
+java/security/KeyPairGenerator.java
+java/security/KeyPairGeneratorSpi.java
+java/security/KeyRep.java
+java/security/KeyStore.java
+java/security/KeyStoreException.java
+java/security/KeyStoreSpi.java
+java/security/MessageDigest.java
+java/security/MessageDigestSpi.java
+java/security/PrivilegedAction.java
+java/security/Policy.java
+java/security/NoSuchProviderException.java
+java/security/Permission.java
+java/security/PermissionCollection.java
+java/security/Permissions.java
+java/security/Principal.java
+java/security/PrivateKey.java
+java/security/UnresolvedPermission.java
+java/security/PrivilegedActionException.java
+java/security/PrivilegedExceptionAction.java
+java/security/ProtectionDomain.java
+java/security/Provider.java
+java/security/ProviderException.java
+java/security/PublicKey.java
+java/security/SecureClassLoader.java
+java/security/SecureRandom.java
+java/security/SecureRandomSpi.java
+java/security/Security.java
+java/security/SecurityPermission.java
+java/security/Signature.java
+java/security/SignatureException.java
+java/security/SignatureSpi.java
+java/security/SignedObject.java
+java/security/Signer.java
+java/security/Timestamp.java
+java/security/UnrecoverableEntryException.java
+java/security/UnrecoverableKeyException.java
+java/security/UnresolvedPermissionCollection.java
+java/security/package.html
+java/sql
+java/sql/SCCS
+java/sql/SCCS/s.Array.java
+java/sql/SCCS/s.Blob.java
+java/sql/SCCS/s.Clob.java
+java/sql/SCCS/s.DataTruncation.java
+java/sql/SCCS/s.BatchUpdateException.java
+java/sql/SCCS/s.CallableStatement.java
+java/sql/SCCS/s.Connection.java
+java/sql/SCCS/s.DatabaseMetaData.java
+java/sql/SCCS/s.Date.java
+java/sql/SCCS/s.Driver.java
+java/sql/SCCS/s.DriverManager.java
+java/sql/SCCS/s.DriverPropertyInfo.java
+java/sql/SCCS/s.ParameterMetaData.java
+java/sql/SCCS/s.PreparedStatement.java
+java/sql/SCCS/s.Ref.java
+java/sql/SCCS/s.ResultSet.java
+java/sql/SCCS/s.SQLData.java
+java/sql/SCCS/s.ResultSetMetaData.java
+java/sql/SCCS/s.SQLException.java
+java/sql/SCCS/s.SQLInput.java
+java/sql/SCCS/s.SQLOutput.java
+java/sql/SCCS/s.SQLPermission.java
+java/sql/SCCS/s.SQLWarning.java
+java/sql/SCCS/s.Savepoint.java
+java/sql/SCCS/s.Statement.java
+java/sql/SCCS/s.Struct.java
+java/sql/SCCS/s.Time.java
+java/sql/SCCS/s.Timestamp.java
+java/sql/SCCS/s.Types.java
+java/sql/SCCS/s.package.html
+java/sql/Array.java
+java/sql/Blob.java
+java/sql/Clob.java
+java/sql/DataTruncation.java
+java/sql/BatchUpdateException.java
+java/sql/CallableStatement.java
+java/sql/Connection.java
+java/sql/DatabaseMetaData.java
+java/sql/Date.java
+java/sql/Driver.java
+java/sql/DriverManager.java
+java/sql/DriverPropertyInfo.java
+java/sql/ParameterMetaData.java
+java/sql/PreparedStatement.java
+java/sql/Ref.java
+java/sql/ResultSet.java
+java/sql/ResultSetMetaData.java
+java/sql/Struct.java
+java/sql/SQLData.java
+java/sql/SQLException.java
+java/sql/SQLInput.java
+java/sql/SQLOutput.java
+java/sql/SQLPermission.java
+java/sql/SQLWarning.java
+java/sql/Savepoint.java
+java/sql/Statement.java
+java/sql/Time.java
+java/sql/Timestamp.java
+java/sql/Types.java
+java/sql/package.html
+java/text
+java/text/SCCS
+java/text/SCCS/s.AttributedString.java
+java/text/SCCS/s.Annotation.java
+java/text/SCCS/s.Bidi.java
+java/text/SCCS/s.AttributedCharacterIterator.java
+java/text/SCCS/s.ChoiceFormat.java
+java/text/SCCS/s.DateFormatSymbols.java
+java/text/SCCS/s.BreakDictionary.java
+java/text/SCCS/s.BreakIterator.java
+java/text/SCCS/s.CharacterIterator.java
+java/text/SCCS/s.CharacterIteratorFieldDelegate.java
+java/text/SCCS/s.CollationElementIterator.java
+java/text/SCCS/s.CollationKey.java
+java/text/SCCS/s.CollationRules.java
+java/text/SCCS/s.Collator.java
+java/text/SCCS/s.DateFormat.java
+java/text/SCCS/s.DecimalFormatSymbols.java
+java/text/SCCS/s.DecimalFormat.java
+java/text/SCCS/s.DictionaryBasedBreakIterator.java
+java/text/SCCS/s.DigitList.java
+java/text/SCCS/s.DontCareFieldPosition.java
+java/text/SCCS/s.EntryPair.java
+java/text/SCCS/s.FieldPosition.java
+java/text/SCCS/s.Format.java
+java/text/SCCS/s.MergeCollation.java
+java/text/SCCS/s.MessageFormat.java
+java/text/SCCS/s.NumberFormat.java
+java/text/SCCS/s.ParseException.java
+java/text/SCCS/s.ParsePosition.java
+java/text/SCCS/s.PatternEntry.java
+java/text/SCCS/s.RBCollationTables.java
+java/text/SCCS/s.package.html
+java/text/SCCS/s.RBTableBuilder.java
+java/text/SCCS/s.RuleBasedBreakIterator.java
+java/text/SCCS/s.RuleBasedCollator.java
+java/text/SCCS/s.SimpleDateFormat.java
+java/text/SCCS/s.StringCharacterIterator.java
+java/text/AttributedString.java
+java/text/Annotation.java
+java/text/BreakIterator.java
+java/text/Bidi.java
+java/text/AttributedCharacterIterator.java
+java/text/BreakDictionary.java
+java/text/CharacterIterator.java
+java/text/ChoiceFormat.java
+java/text/CollationKey.java
+java/text/CharacterIteratorFieldDelegate.java
+java/text/CollationElementIterator.java
+java/text/CollationRules.java
+java/text/Collator.java
+java/text/DateFormat.java
+java/text/DictionaryBasedBreakIterator.java
+java/text/DateFormatSymbols.java
+java/text/DecimalFormat.java
+java/text/DecimalFormatSymbols.java
+java/text/DigitList.java
+java/text/EntryPair.java
+java/text/MergeCollation.java
+java/text/Format.java
+java/text/DontCareFieldPosition.java
+java/text/FieldPosition.java
+java/text/MessageFormat.java
+java/text/NumberFormat.java
+java/text/ParseException.java
+java/text/ParsePosition.java
+java/text/PatternEntry.java
+java/text/RBCollationTables.java
+java/text/RBTableBuilder.java
+java/text/package.html
+java/text/RuleBasedCollator.java
+java/text/RuleBasedBreakIterator.java
+java/text/SimpleDateFormat.java
+java/text/StringCharacterIterator.java
+java/util
+java/util/SCCS
+java/util/SCCS/s.AbstractSequentialList.java
+java/util/SCCS/s.AbstractCollection.java
+java/util/SCCS/s.AbstractList.java
+java/util/SCCS/s.AbstractMap.java
+java/util/SCCS/s.AbstractQueue.java
+java/util/SCCS/s.AbstractSet.java
+java/util/SCCS/s.ArrayList.java
+java/util/SCCS/s.Arrays.java
+java/util/SCCS/s.BitSet.java
+java/util/SCCS/s.Calendar.java
+java/util/SCCS/s.Collection.java
+java/util/SCCS/s.Collections.java
+java/util/SCCS/s.Comparator.java
+java/util/SCCS/s.Currency.java
+java/util/SCCS/s.ConcurrentModificationException.java
+java/util/SCCS/s.EmptyStackException.java
+java/util/SCCS/s.Date.java
+java/util/SCCS/s.EnumMap.java
+java/util/SCCS/s.CurrencyData.properties
+java/util/SCCS/s.Dictionary.java
+java/util/SCCS/s.Enumeration.java
+java/util/SCCS/s.EnumSet.java
+java/util/SCCS/s.DuplicateFormatFlagsException.java
+java/util/SCCS/s.EventListener.java
+java/util/SCCS/s.EventListenerProxy.java
+java/util/SCCS/s.EventObject.java
+java/util/SCCS/s.Formattable.java
+java/util/SCCS/s.FormattableFlags.java
+java/util/SCCS/s.FormatFlagsConversionMismatchException.java
+java/util/SCCS/s.Formatter.java
+java/util/SCCS/s.Iterator.java
+java/util/SCCS/s.ListResourceBundle.java
+java/util/SCCS/s.FormatterClosedException.java
+java/util/SCCS/s.GregorianCalendar.java
+java/util/SCCS/s.HashMap.java
+java/util/SCCS/s.HashSet.java
+java/util/SCCS/s.Hashtable.java
+java/util/SCCS/s.IdentityHashMap.java
+java/util/SCCS/s.IllegalFormatCodePointException.java
+java/util/SCCS/s.IllegalFormatConversionException.java
+java/util/SCCS/s.IllegalFormatException.java
+java/util/SCCS/s.IllegalFormatFlagsException.java
+java/util/SCCS/s.IllegalFormatPrecisionException.java
+java/util/SCCS/s.IllegalFormatWidthException.java
+java/util/SCCS/s.InputMismatchException.java
+java/util/SCCS/s.InvalidPropertiesFormatException.java
+java/util/SCCS/s.JumboEnumSet.java
+java/util/SCCS/s.LinkedHashMap.java
+java/util/SCCS/s.LinkedHashSet.java
+java/util/SCCS/s.LinkedList.java
+java/util/SCCS/s.List.java
+java/util/SCCS/s.ListIterator.java
+java/util/SCCS/s.Locale.java
+java/util/SCCS/s.Map.java
+java/util/SCCS/s.NoSuchElementException.java
+java/util/SCCS/s.MissingFormatArgumentException.java
+java/util/SCCS/s.MissingFormatWidthException.java
+java/util/SCCS/s.MissingResourceException.java
+java/util/SCCS/s.Observable.java
+java/util/SCCS/s.SortedMap.java
+java/util/SCCS/s.Set.java
+java/util/SCCS/s.Observer.java
+java/util/SCCS/s.PriorityQueue.java
+java/util/SCCS/s.Properties.java
+java/util/SCCS/s.PropertyPermission.java
+java/util/SCCS/s.PropertyResourceBundle.java
+java/util/SCCS/s.Queue.java
+java/util/SCCS/s.Random.java
+java/util/SCCS/s.RandomAccess.java
+java/util/SCCS/s.RegularEnumSet.java
+java/util/SCCS/s.ResourceBundle.java
+java/util/SCCS/s.ResourceBundleEnumeration.java
+java/util/SCCS/s.Scanner.java
+java/util/SCCS/s.SimpleTimeZone.java
+java/util/SCCS/s.SortedSet.java
+java/util/SCCS/s.Stack.java
+java/util/SCCS/s.TreeMap.java
+java/util/SCCS/s.StringTokenizer.java
+java/util/SCCS/s.TimeZone.java
+java/util/SCCS/s.Timer.java
+java/util/SCCS/s.TimerTask.java
+java/util/SCCS/s.TooManyListenersException.java
+java/util/SCCS/s.TreeSet.java
+java/util/SCCS/s.UUID.java
+java/util/SCCS/s.Vector.java
+java/util/SCCS/s.WeakHashMap.java
+java/util/SCCS/s.UnknownFormatConversionException.java
+java/util/SCCS/s.UnknownFormatFlagsException.java
+java/util/SCCS/s.XMLUtils.java
+java/util/SCCS/s.package.html
+java/util/concurrent
+java/util/concurrent/SCCS
+java/util/concurrent/SCCS/s.AbstractExecutorService.java
+java/util/concurrent/SCCS/p.ConcurrentHashMap.java
+java/util/concurrent/SCCS/s.ArrayBlockingQueue.java
+java/util/concurrent/SCCS/s.BlockingQueue.java
+java/util/concurrent/SCCS/s.BrokenBarrierException.java
+java/util/concurrent/SCCS/s.Callable.java
+java/util/concurrent/SCCS/s.CancellationException.java
+java/util/concurrent/SCCS/s.CompletionService.java
+java/util/concurrent/SCCS/s.ConcurrentHashMap.java
+java/util/concurrent/SCCS/s.ConcurrentLinkedQueue.java
+java/util/concurrent/SCCS/s.ConcurrentMap.java
+java/util/concurrent/SCCS/s.CopyOnWriteArrayList.java
+java/util/concurrent/SCCS/s.Future.java
+java/util/concurrent/SCCS/s.LinkedBlockingQueue.java
+java/util/concurrent/SCCS/s.CopyOnWriteArraySet.java
+java/util/concurrent/SCCS/s.CountDownLatch.java
+java/util/concurrent/SCCS/s.CyclicBarrier.java
+java/util/concurrent/SCCS/s.DelayQueue.java
+java/util/concurrent/SCCS/s.Delayed.java
+java/util/concurrent/SCCS/s.Exchanger.java
+java/util/concurrent/SCCS/s.ExecutionException.java
+java/util/concurrent/SCCS/s.Executor.java
+java/util/concurrent/SCCS/s.ExecutorCompletionService.java
+java/util/concurrent/SCCS/s.ExecutorService.java
+java/util/concurrent/SCCS/s.Executors.java
+java/util/concurrent/SCCS/s.FutureTask.java
+java/util/concurrent/SCCS/s.RejectedExecutionException.java
+java/util/concurrent/SCCS/s.PriorityBlockingQueue.java
+java/util/concurrent/SCCS/s.RejectedExecutionHandler.java
+java/util/concurrent/SCCS/s.ScheduledExecutorService.java
+java/util/concurrent/SCCS/s.ScheduledFuture.java
+java/util/concurrent/SCCS/s.ScheduledThreadPoolExecutor.java
+java/util/concurrent/SCCS/s.Semaphore.java
+java/util/concurrent/SCCS/s.SynchronousQueue.java
+java/util/concurrent/SCCS/s.ThreadFactory.java
+java/util/concurrent/SCCS/s.ThreadPoolExecutor.java
+java/util/concurrent/SCCS/s.TimeUnit.java
+java/util/concurrent/SCCS/s.TimeoutException.java
+java/util/concurrent/SCCS/s.package.html
+java/util/concurrent/SCCS/p.ConcurrentLinkedQueue.java
+java/util/concurrent/SCCS/p.ThreadPoolExecutor.java
+java/util/concurrent/atomic
+java/util/concurrent/atomic/SCCS
+java/util/concurrent/atomic/SCCS/s.AtomicIntegerArray.java
+java/util/concurrent/atomic/SCCS/s.AtomicBoolean.java
+java/util/concurrent/atomic/SCCS/s.AtomicInteger.java
+java/util/concurrent/atomic/SCCS/s.AtomicIntegerFieldUpdater.java
+java/util/concurrent/atomic/SCCS/s.AtomicLong.java
+java/util/concurrent/atomic/SCCS/s.AtomicLongArray.java
+java/util/concurrent/atomic/SCCS/s.AtomicLongFieldUpdater.java
+java/util/concurrent/atomic/SCCS/s.AtomicMarkableReference.java
+java/util/concurrent/atomic/SCCS/s.AtomicReference.java
+java/util/concurrent/atomic/SCCS/s.AtomicReferenceArray.java
+java/util/concurrent/atomic/SCCS/s.AtomicReferenceFieldUpdater.java
+java/util/concurrent/atomic/SCCS/s.AtomicStampedReference.java
+java/util/concurrent/atomic/SCCS/s.package.html
+java/util/concurrent/atomic/AtomicIntegerArray.java
+java/util/concurrent/atomic/AtomicBoolean.java
+java/util/concurrent/atomic/AtomicInteger.java
+java/util/concurrent/atomic/AtomicIntegerFieldUpdater.java
+java/util/concurrent/atomic/AtomicLong.java
+java/util/concurrent/atomic/AtomicLongArray.java
+java/util/concurrent/atomic/AtomicLongFieldUpdater.java
+java/util/concurrent/atomic/AtomicMarkableReference.java
+java/util/concurrent/atomic/AtomicReference.java
+java/util/concurrent/atomic/AtomicReferenceArray.java
+java/util/concurrent/atomic/AtomicReferenceFieldUpdater.java
+java/util/concurrent/atomic/AtomicStampedReference.java
+java/util/concurrent/atomic/package.html
+java/util/concurrent/locks
+java/util/concurrent/locks/SCCS
+java/util/concurrent/locks/SCCS/s.LockSupport.java
+java/util/concurrent/locks/SCCS/s.Lock.java
+java/util/concurrent/locks/SCCS/s.AbstractQueuedSynchronizer.java
+java/util/concurrent/locks/SCCS/s.Condition.java
+java/util/concurrent/locks/SCCS/s.ReentrantReadWriteLock.java
+java/util/concurrent/locks/SCCS/s.ReadWriteLock.java
+java/util/concurrent/locks/SCCS/s.ReentrantLock.java
+java/util/concurrent/locks/SCCS/s.package.html
+java/util/concurrent/locks/LockSupport.java
+java/util/concurrent/locks/Lock.java
+java/util/concurrent/locks/AbstractQueuedSynchronizer.java
+java/util/concurrent/locks/Condition.java
+java/util/concurrent/locks/ReentrantReadWriteLock.java
+java/util/concurrent/locks/ReadWriteLock.java
+java/util/concurrent/locks/ReentrantLock.java
+java/util/concurrent/locks/package.html
+java/util/concurrent/AbstractExecutorService.java
+java/util/concurrent/AbstractExecutorService.java~
+java/util/concurrent/ArrayBlockingQueue.java
+java/util/concurrent/BlockingQueue.java
+java/util/concurrent/BrokenBarrierException.java
+java/util/concurrent/Callable.java
+java/util/concurrent/CancellationException.java
+java/util/concurrent/CompletionService.java
+java/util/concurrent/CompletionService.java~
+java/util/concurrent/ConcurrentHashMap.java
+java/util/concurrent/ConcurrentLinkedQueue.java
+java/util/concurrent/ConcurrentMap.java
+java/util/concurrent/ExecutorCompletionService.java
+java/util/concurrent/CopyOnWriteArrayList.java
+java/util/concurrent/CopyOnWriteArraySet.java
+java/util/concurrent/CountDownLatch.java
+java/util/concurrent/CyclicBarrier.java
+java/util/concurrent/DelayQueue.java
+java/util/concurrent/Delayed.java
+java/util/concurrent/Exchanger.java
+java/util/concurrent/ExecutionException.java
+java/util/concurrent/Executor.java
+java/util/concurrent/FutureTask.java
+java/util/concurrent/Future.java
+java/util/concurrent/ExecutorCompletionService.java~
+java/util/concurrent/ExecutorService.java
+java/util/concurrent/Executors.java
+java/util/concurrent/RejectedExecutionException.java
+java/util/concurrent/LinkedBlockingQueue.java
+java/util/concurrent/PriorityBlockingQueue.java
+java/util/concurrent/ScheduledThreadPoolExecutor.java
+java/util/concurrent/RejectedExecutionHandler.java
+java/util/concurrent/ScheduledExecutorService.java
+java/util/concurrent/ScheduledFuture.java
+java/util/concurrent/SynchronousQueue.java
+java/util/concurrent/Semaphore.java
+java/util/concurrent/ThreadFactory.java
+java/util/concurrent/ThreadPoolExecutor.java
+java/util/concurrent/TimeUnit.java
+java/util/concurrent/TimeoutException.java
+java/util/concurrent/package.html
+java/util/jar
+java/util/jar/SCCS
+java/util/jar/SCCS/s.JarInputStream.java
+java/util/jar/SCCS/s.Attributes.java
+java/util/jar/SCCS/s.JarEntry.java
+java/util/jar/SCCS/s.JarException.java
+java/util/jar/SCCS/s.JarFile.java
+java/util/jar/SCCS/s.JavaUtilJarAccessImpl.java
+java/util/jar/SCCS/s.JarOutputStream.java
+java/util/jar/SCCS/s.JarVerifier.java
+java/util/jar/SCCS/s.Manifest.java
+java/util/jar/SCCS/s.Pack200.java
+java/util/jar/SCCS/s.package.html
+java/util/jar/JarException.java
+java/util/jar/Attributes.java
+java/util/jar/JarEntry.java
+java/util/jar/JarOutputStream.java
+java/util/jar/JarFile.java
+java/util/jar/JarInputStream.java
+java/util/jar/JavaUtilJarAccessImpl.java
+java/util/jar/JarVerifier.java
+java/util/jar/Manifest.java
+java/util/jar/Pack200.java
+java/util/jar/package.html
+java/util/logging
+java/util/logging/SCCS
+java/util/logging/SCCS/s.LoggingPermission.java
+java/util/logging/SCCS/s.ConsoleHandler.java
+java/util/logging/SCCS/s.ErrorManager.java
+java/util/logging/SCCS/s.FileHandler.java
+java/util/logging/SCCS/s.Filter.java
+java/util/logging/SCCS/s.Formatter.java
+java/util/logging/SCCS/s.Handler.java
+java/util/logging/SCCS/s.Level.java
+java/util/logging/SCCS/s.LogManager.java
+java/util/logging/SCCS/s.LogRecord.java
+java/util/logging/SCCS/s.Logger.java
+java/util/logging/SCCS/s.Logging.java
+java/util/logging/SCCS/s.LoggingMXBean.java
+java/util/logging/SCCS/s.MemoryHandler.java
+java/util/logging/SCCS/s.SimpleFormatter.java
+java/util/logging/SCCS/s.SocketHandler.java
+java/util/logging/SCCS/s.StreamHandler.java
+java/util/logging/SCCS/s.XMLFormatter.java
+java/util/logging/SCCS/s.package.html
+java/util/logging/LoggingPermission.java
+java/util/logging/ConsoleHandler.java
+java/util/logging/ErrorManager.java
+java/util/logging/FileHandler.java
+java/util/logging/Filter.java
+java/util/logging/Formatter.java
+java/util/logging/Handler.java
+java/util/logging/Level.java
+java/util/logging/LogManager.java
+java/util/logging/LogRecord.java
+java/util/logging/Logger.java
+java/util/logging/Logging.java
+java/util/logging/LoggingMXBean.java
+java/util/logging/MemoryHandler.java
+java/util/logging/SimpleFormatter.java
+java/util/logging/SocketHandler.java
+java/util/logging/StreamHandler.java
+java/util/logging/XMLFormatter.java
+java/util/logging/package.html
+java/util/prefs
+java/util/prefs/SCCS
+java/util/prefs/SCCS/s.BackingStoreException.java
+java/util/prefs/SCCS/s.AbstractPreferences.java
+java/util/prefs/SCCS/s.NodeChangeEvent.java
+java/util/prefs/SCCS/s.Base64.java
+java/util/prefs/SCCS/s.package.html
+java/util/prefs/SCCS/s.InvalidPreferencesFormatException.java
+java/util/prefs/SCCS/s.NodeChangeListener.java
+java/util/prefs/SCCS/s.PreferenceChangeEvent.java
+java/util/prefs/SCCS/s.PreferenceChangeListener.java
+java/util/prefs/SCCS/s.Preferences.java
+java/util/prefs/SCCS/s.PreferencesFactory.java
+java/util/prefs/SCCS/s.XmlSupport.java
+java/util/prefs/AbstractPreferences.java
+java/util/prefs/BackingStoreException.java
+java/util/prefs/Base64.java
+java/util/prefs/NodeChangeEvent.java
+java/util/prefs/Preferences.java
+java/util/prefs/InvalidPreferencesFormatException.java
+java/util/prefs/NodeChangeListener.java
+java/util/prefs/PreferenceChangeEvent.java
+java/util/prefs/PreferenceChangeListener.java
+java/util/prefs/PreferencesFactory.java
+java/util/prefs/XmlSupport.java
+java/util/prefs/package.html
+java/util/regex
+java/util/regex/SCCS
+java/util/regex/SCCS/s.MatchResult.java
+java/util/regex/SCCS/s.ASCII.java
+java/util/regex/SCCS/s.Matcher.java
+java/util/regex/SCCS/s.Pattern.java
+java/util/regex/SCCS/s.package.html
+java/util/regex/SCCS/s.PatternSyntaxException.java
+java/util/regex/MatchResult.java
+java/util/regex/ASCII.java
+java/util/regex/Matcher.java
+java/util/regex/Pattern.java
+java/util/regex/package.html
+java/util/regex/PatternSyntaxException.java
+java/util/zip
+java/util/zip/SCCS
+java/util/zip/SCCS/s.Adler32.java
+java/util/zip/SCCS/s.CRC32.java
+java/util/zip/SCCS/s.Checksum.java
+java/util/zip/SCCS/s.CheckedInputStream.java
+java/util/zip/SCCS/s.CheckedOutputStream.java
+java/util/zip/SCCS/s.DataFormatException.java
+java/util/zip/SCCS/s.Deflater.java
+java/util/zip/SCCS/s.DeflaterOutputStream.java
+java/util/zip/SCCS/s.GZIPInputStream.java
+java/util/zip/SCCS/s.GZIPOutputStream.java
+java/util/zip/SCCS/s.Inflater.java
+java/util/zip/SCCS/s.InflaterInputStream.java
+java/util/zip/SCCS/s.ZipConstants.java
+java/util/zip/SCCS/s.ZipEntry.java
+java/util/zip/SCCS/s.ZipException.java
+java/util/zip/SCCS/s.ZipFile.java
+java/util/zip/SCCS/s.ZipInputStream.java
+java/util/zip/SCCS/s.ZipOutputStream.java
+java/util/zip/SCCS/s.package.html
+java/util/zip/CheckedInputStream.java
+java/util/zip/Adler32.java
+java/util/zip/CRC32.java
+java/util/zip/ZipOutputStream.java
+java/util/zip/CheckedOutputStream.java
+java/util/zip/Checksum.java
+java/util/zip/DataFormatException.java
+java/util/zip/Deflater.java
+java/util/zip/DeflaterOutputStream.java
+java/util/zip/GZIPInputStream.java
+java/util/zip/GZIPOutputStream.java
+java/util/zip/Inflater.java
+java/util/zip/InflaterInputStream.java
+java/util/zip/ZipConstants.java
+java/util/zip/ZipEntry.java
+java/util/zip/ZipException.java
+java/util/zip/ZipFile.java
+java/util/zip/ZipInputStream.java
+java/util/zip/package.html
+java/util/AbstractSequentialList.java
+java/util/AbstractCollection.java
+java/util/AbstractList.java
+java/util/AbstractMap.java
+java/util/AbstractQueue.java
+java/util/CurrencyData.properties
+java/util/AbstractSet.java
+java/util/ArrayList.java
+java/util/Arrays.java
+java/util/BitSet.java
+java/util/Calendar.java
+java/util/Collection.java
+java/util/Collections.java
+java/util/Comparator.java
+java/util/Currency.java
+java/util/ConcurrentModificationException.java
+java/util/Date.java
+java/util/Dictionary.java
+java/util/EnumMap.java
+java/util/EnumSet.java
+java/util/EventListenerProxy.java
+java/util/DuplicateFormatFlagsException.java
+java/util/EmptyStackException.java
+java/util/Enumeration.java
+java/util/EventListener.java
+java/util/FormatterClosedException.java
+java/util/EventObject.java
+java/util/Formattable.java
+java/util/FormattableFlags.java
+java/util/FormatFlagsConversionMismatchException.java
+java/util/Formatter.java
+java/util/IllegalFormatException.java
+java/util/GregorianCalendar.java
+java/util/HashMap.java
+java/util/HashSet.java
+java/util/Hashtable.java
+java/util/IdentityHashMap.java
+java/util/MissingFormatArgumentException.java
+java/util/IllegalFormatCodePointException.java
+java/util/IllegalFormatConversionException.java
+java/util/IllegalFormatFlagsException.java
+java/util/IllegalFormatPrecisionException.java
+java/util/IllegalFormatWidthException.java
+java/util/InputMismatchException.java
+java/util/Iterator.java
+java/util/JumboEnumSet.java
+java/util/InvalidPropertiesFormatException.java
+java/util/LinkedHashMap.java
+java/util/LinkedHashSet.java
+java/util/LinkedList.java
+java/util/List.java
+java/util/ListIterator.java
+java/util/ListResourceBundle.java
+java/util/Locale.java
+java/util/Map.java
+java/util/Observer.java
+java/util/MissingFormatWidthException.java
+java/util/MissingResourceException.java
+java/util/NoSuchElementException.java
+java/util/Observable.java
+java/util/ResourceBundleEnumeration.java
+java/util/PriorityQueue.java
+java/util/Properties.java
+java/util/PropertyPermission.java
+java/util/PropertyResourceBundle.java
+java/util/Queue.java
+java/util/Random.java
+java/util/RandomAccess.java
+java/util/RegularEnumSet.java
+java/util/ResourceBundle.java
+java/util/SimpleTimeZone.java
+java/util/Scanner.java
+java/util/Set.java
+java/util/StringTokenizer.java
+java/util/SortedMap.java
+java/util/SortedSet.java
+java/util/Stack.java
+java/util/TimeZone.java
+java/util/Timer.java
+java/util/WeakHashMap.java
+java/util/UUID.java
+java/util/TimerTask.java
+java/util/TooManyListenersException.java
+java/util/TreeMap.java
+java/util/TreeSet.java
+java/util/Vector.java
+java/util/UnknownFormatConversionException.java
+java/util/UnknownFormatFlagsException.java
+java/util/XMLUtils.java
+java/util/package.html
+javax
+javax/accessibility
+javax/accessibility/SCCS
+javax/accessibility/SCCS/s.AccessibleAction.java
+javax/accessibility/SCCS/s.Accessible.java
+javax/accessibility/SCCS/s.AccessibleRelationSet.java
+javax/accessibility/SCCS/s.AccessibleAttributeSequence.java
+javax/accessibility/SCCS/s.AccessibleBundle.java
+javax/accessibility/SCCS/s.AccessibleComponent.java
+javax/accessibility/SCCS/s.AccessibleContext.java
+javax/accessibility/SCCS/s.AccessibleEditableText.java
+javax/accessibility/SCCS/s.AccessibleExtendedComponent.java
+javax/accessibility/SCCS/s.AccessibleExtendedTable.java
+javax/accessibility/SCCS/s.AccessibleExtendedText.java
+javax/accessibility/SCCS/s.AccessibleHyperlink.java
+javax/accessibility/SCCS/s.AccessibleHypertext.java
+javax/accessibility/SCCS/s.AccessibleIcon.java
+javax/accessibility/SCCS/s.AccessibleKeyBinding.java
+javax/accessibility/SCCS/s.AccessibleRelation.java
+javax/accessibility/SCCS/s.AccessibleTableModelChange.java
+javax/accessibility/SCCS/s.AccessibleResourceBundle.java
+javax/accessibility/SCCS/s.AccessibleRole.java
+javax/accessibility/SCCS/s.AccessibleSelection.java
+javax/accessibility/SCCS/s.AccessibleState.java
+javax/accessibility/SCCS/s.AccessibleStateSet.java
+javax/accessibility/SCCS/s.AccessibleStreamable.java
+javax/accessibility/SCCS/s.AccessibleTable.java
+javax/accessibility/SCCS/s.AccessibleText.java
+javax/accessibility/SCCS/s.AccessibleTextSequence.java
+javax/accessibility/SCCS/s.AccessibleValue.java
+javax/accessibility/SCCS/s.package.html
+javax/accessibility/AccessibleAction.java
+javax/accessibility/Accessible.java
+javax/accessibility/AccessibleResourceBundle.java
+javax/accessibility/AccessibleAttributeSequence.java
+javax/accessibility/AccessibleBundle.java
+javax/accessibility/AccessibleComponent.java
+javax/accessibility/AccessibleContext.java
+javax/accessibility/AccessibleEditableText.java
+javax/accessibility/AccessibleExtendedComponent.java
+javax/accessibility/AccessibleExtendedTable.java
+javax/accessibility/AccessibleExtendedText.java
+javax/accessibility/AccessibleHyperlink.java
+javax/accessibility/AccessibleHypertext.java
+javax/accessibility/AccessibleIcon.java
+javax/accessibility/AccessibleKeyBinding.java
+javax/accessibility/AccessibleRelation.java
+javax/accessibility/AccessibleRelationSet.java
+javax/accessibility/AccessibleSelection.java
+javax/accessibility/AccessibleRole.java
+javax/accessibility/AccessibleStreamable.java
+javax/accessibility/AccessibleState.java
+javax/accessibility/AccessibleStateSet.java
+javax/accessibility/AccessibleTableModelChange.java
+javax/accessibility/AccessibleTable.java
+javax/accessibility/AccessibleTextSequence.java
+javax/accessibility/AccessibleText.java
+javax/accessibility/AccessibleValue.java
+javax/accessibility/package.html
+javax/activity
+javax/activity/SCCS
+javax/activity/SCCS/s.ActivityCompletedException.java
+javax/activity/SCCS/s.ActivityRequiredException.java
+javax/activity/SCCS/s.InvalidActivityException.java
+javax/activity/SCCS/s.package.html
+javax/activity/ActivityCompletedException.java
+javax/activity/ActivityRequiredException.java
+javax/activity/InvalidActivityException.java
+javax/activity/package.html
+javax/imageio
+javax/imageio/SCCS
+javax/imageio/SCCS/s.IIOParamController.java
+javax/imageio/SCCS/s.IIOException.java
+javax/imageio/SCCS/s.IIOImage.java
+javax/imageio/SCCS/s.IIOParam.java
+javax/imageio/SCCS/s.ImageReadParam.java
+javax/imageio/SCCS/s.ImageIO.java
+javax/imageio/SCCS/s.ImageTranscoder.java
+javax/imageio/SCCS/s.ImageReader.java
+javax/imageio/SCCS/s.ImageTypeSpecifier.java
+javax/imageio/SCCS/s.ImageWriteParam.java
+javax/imageio/SCCS/s.ImageWriter.java
+javax/imageio/SCCS/s.package.html
+javax/imageio/event
+javax/imageio/event/SCCS
+javax/imageio/event/SCCS/s.IIOReadProgressListener.java
+javax/imageio/event/SCCS/s.IIOReadUpdateListener.java
+javax/imageio/event/SCCS/s.IIOReadWarningListener.java
+javax/imageio/event/SCCS/s.IIOWriteProgressListener.java
+javax/imageio/event/SCCS/s.IIOWriteWarningListener.java
+javax/imageio/event/SCCS/s.package.html
+javax/imageio/event/IIOReadProgressListener.java
+javax/imageio/event/IIOReadUpdateListener.java
+javax/imageio/event/IIOReadWarningListener.java
+javax/imageio/event/IIOWriteProgressListener.java
+javax/imageio/event/IIOWriteWarningListener.java
+javax/imageio/event/package.html
+javax/imageio/metadata
+javax/imageio/metadata/SCCS
+javax/imageio/metadata/SCCS/s.IIOInvalidTreeException.java
+javax/imageio/metadata/SCCS/s.IIOMetadata.java
+javax/imageio/metadata/SCCS/s.IIOMetadataController.java
+javax/imageio/metadata/SCCS/s.IIOMetadataFormat.java
+javax/imageio/metadata/SCCS/s.IIOMetadataFormatImpl.java
+javax/imageio/metadata/SCCS/s.IIOMetadataNode.java
+javax/imageio/metadata/SCCS/s.package.html
+javax/imageio/metadata/doc-files
+javax/imageio/metadata/doc-files/SCCS
+javax/imageio/metadata/doc-files/SCCS/s.jpeg_metadata.html
+javax/imageio/metadata/doc-files/SCCS/s.bmp_metadata.html
+javax/imageio/metadata/doc-files/SCCS/s.gif_metadata.html
+javax/imageio/metadata/doc-files/SCCS/s.standard_metadata.html
+javax/imageio/metadata/doc-files/SCCS/s.png_metadata.html
+javax/imageio/metadata/doc-files/SCCS/s.wbmp_metadata.html
+javax/imageio/metadata/doc-files/standard_metadata.html
+javax/imageio/metadata/doc-files/bmp_metadata.html
+javax/imageio/metadata/doc-files/gif_metadata.html
+javax/imageio/metadata/doc-files/jpeg_metadata.html
+javax/imageio/metadata/doc-files/png_metadata.html
+javax/imageio/metadata/doc-files/wbmp_metadata.html
+javax/imageio/metadata/IIOInvalidTreeException.java
+javax/imageio/metadata/IIOMetadata.java
+javax/imageio/metadata/IIOMetadataController.java
+javax/imageio/metadata/IIOMetadataFormat.java
+javax/imageio/metadata/IIOMetadataFormatImpl.java
+javax/imageio/metadata/IIOMetadataNode.java
+javax/imageio/metadata/package.html
+javax/imageio/plugins
+javax/imageio/plugins/bmp
+javax/imageio/plugins/bmp/SCCS
+javax/imageio/plugins/bmp/SCCS/s.BMPImageWriteParam.java
+javax/imageio/plugins/bmp/SCCS/s.package.html
+javax/imageio/plugins/bmp/BMPImageWriteParam.java
+javax/imageio/plugins/bmp/package.html
+javax/imageio/plugins/jpeg
+javax/imageio/plugins/jpeg/SCCS
+javax/imageio/plugins/jpeg/SCCS/s.JPEGImageReadParam.java
+javax/imageio/plugins/jpeg/SCCS/s.JPEGHuffmanTable.java
+javax/imageio/plugins/jpeg/SCCS/s.JPEGImageWriteParam.java
+javax/imageio/plugins/jpeg/SCCS/s.JPEGQTable.java
+javax/imageio/plugins/jpeg/SCCS/s.package.html
+javax/imageio/plugins/jpeg/JPEGImageWriteParam.java
+javax/imageio/plugins/jpeg/JPEGHuffmanTable.java
+javax/imageio/plugins/jpeg/JPEGImageReadParam.java
+javax/imageio/plugins/jpeg/JPEGQTable.java
+javax/imageio/plugins/jpeg/package.html
+javax/imageio/spi
+javax/imageio/spi/SCCS
+javax/imageio/spi/SCCS/s.IIOServiceProvider.java
+javax/imageio/spi/SCCS/s.DigraphNode.java
+javax/imageio/spi/SCCS/s.IIORegistry.java
+javax/imageio/spi/SCCS/s.ImageInputStreamSpi.java
+javax/imageio/spi/SCCS/s.ImageOutputStreamSpi.java
+javax/imageio/spi/SCCS/s.ImageReaderSpi.java
+javax/imageio/spi/SCCS/s.ImageReaderWriterSpi.java
+javax/imageio/spi/SCCS/s.ImageTranscoderSpi.java
+javax/imageio/spi/SCCS/s.ImageWriterSpi.java
+javax/imageio/spi/SCCS/s.PartiallyOrderedSet.java
+javax/imageio/spi/SCCS/s.RegisterableService.java
+javax/imageio/spi/SCCS/s.ServiceRegistry.java
+javax/imageio/spi/SCCS/s.package.html
+javax/imageio/spi/IIOServiceProvider.java
+javax/imageio/spi/DigraphNode.java
+javax/imageio/spi/IIORegistry.java
+javax/imageio/spi/ImageInputStreamSpi.java
+javax/imageio/spi/ImageOutputStreamSpi.java
+javax/imageio/spi/ImageReaderSpi.java
+javax/imageio/spi/ImageReaderWriterSpi.java
+javax/imageio/spi/ImageTranscoderSpi.java
+javax/imageio/spi/ImageWriterSpi.java
+javax/imageio/spi/PartiallyOrderedSet.java
+javax/imageio/spi/RegisterableService.java
+javax/imageio/spi/ServiceRegistry.java
+javax/imageio/spi/package.html
+javax/imageio/stream
+javax/imageio/stream/SCCS
+javax/imageio/stream/SCCS/s.FileCacheImageInputStream.java
+javax/imageio/stream/SCCS/s.FileCacheImageOutputStream.java
+javax/imageio/stream/SCCS/s.FileImageInputStream.java
+javax/imageio/stream/SCCS/s.FileImageOutputStream.java
+javax/imageio/stream/SCCS/s.IIOByteBuffer.java
+javax/imageio/stream/SCCS/s.ImageInputStream.java
+javax/imageio/stream/SCCS/s.ImageInputStreamImpl.java
+javax/imageio/stream/SCCS/s.ImageOutputStream.java
+javax/imageio/stream/SCCS/s.ImageOutputStreamImpl.java
+javax/imageio/stream/SCCS/s.MemoryCache.java
+javax/imageio/stream/SCCS/s.MemoryCacheImageInputStream.java
+javax/imageio/stream/SCCS/s.package.html
+javax/imageio/stream/SCCS/s.MemoryCacheImageOutputStream.java
+javax/imageio/stream/MemoryCacheImageInputStream.java
+javax/imageio/stream/FileCacheImageInputStream.java
+javax/imageio/stream/FileCacheImageOutputStream.java
+javax/imageio/stream/FileImageInputStream.java
+javax/imageio/stream/FileImageOutputStream.java
+javax/imageio/stream/IIOByteBuffer.java
+javax/imageio/stream/ImageInputStream.java
+javax/imageio/stream/ImageInputStreamImpl.java
+javax/imageio/stream/ImageOutputStream.java
+javax/imageio/stream/ImageOutputStreamImpl.java
+javax/imageio/stream/MemoryCache.java
+javax/imageio/stream/package.html
+javax/imageio/stream/MemoryCacheImageOutputStream.java
+javax/imageio/IIOParamController.java
+javax/imageio/IIOException.java
+javax/imageio/IIOImage.java
+javax/imageio/IIOParam.java
+javax/imageio/ImageTranscoder.java
+javax/imageio/ImageIO.java
+javax/imageio/ImageReadParam.java
+javax/imageio/ImageReader.java
+javax/imageio/ImageTypeSpecifier.java
+javax/imageio/ImageWriteParam.java
+javax/imageio/ImageWriter.java
+javax/imageio/package.html
+javax/management
+javax/management/SCCS
+javax/management/SCCS/s.AndQueryExp.java
+javax/management/SCCS/s.Attribute.java
+javax/management/SCCS/s.AttributeList.java
+javax/management/SCCS/s.QueryEval.java
+javax/management/SCCS/s.Query.java
+javax/management/SCCS/s.AttributeChangeNotification.java
+javax/management/SCCS/s.AttributeChangeNotificationFilter.java
+javax/management/SCCS/s.AttributeNotFoundException.java
+javax/management/SCCS/s.AttributeValueExp.java
+javax/management/SCCS/s.BadAttributeValueExpException.java
+javax/management/SCCS/s.BadBinaryOpValueExpException.java
+javax/management/SCCS/s.BadStringOperationException.java
+javax/management/SCCS/s.BetweenQueryExp.java
+javax/management/SCCS/s.BinaryOpValueExp.java
+javax/management/SCCS/s.BinaryRelQueryExp.java
+javax/management/SCCS/s.BooleanValueExp.java
+javax/management/SCCS/s.ClassAttributeValueExp.java
+javax/management/SCCS/s.DefaultLoaderRepository.java
+javax/management/SCCS/s.Descriptor.java
+javax/management/SCCS/s.DescriptorAccess.java
+javax/management/SCCS/s.DynamicMBean.java
+javax/management/SCCS/s.InQueryExp.java
+javax/management/SCCS/s.InstanceAlreadyExistsException.java
+javax/management/SCCS/s.InstanceNotFoundException.java
+javax/management/SCCS/s.IntrospectionException.java
+javax/management/SCCS/s.InvalidApplicationException.java
+javax/management/SCCS/s.JMException.java
+javax/management/SCCS/s.InvalidAttributeValueException.java
+javax/management/SCCS/s.JMRuntimeException.java
+javax/management/SCCS/s.ListenerNotFoundException.java
+javax/management/SCCS/s.MBeanAttributeInfo.java
+javax/management/SCCS/s.MBeanConstructorInfo.java
+javax/management/SCCS/s.MBeanException.java
+javax/management/SCCS/s.MBeanFeatureInfo.java
+javax/management/SCCS/s.MBeanInfo.java
+javax/management/SCCS/s.MBeanNotificationInfo.java
+javax/management/SCCS/s.MBeanOperationInfo.java
+javax/management/SCCS/s.MBeanParameterInfo.java
+javax/management/SCCS/s.MBeanPermission.java
+javax/management/SCCS/s.MBeanRegistration.java
+javax/management/SCCS/s.MBeanServer.java
+javax/management/SCCS/s.MBeanRegistrationException.java
+javax/management/SCCS/s.MBeanServerBuilder.java
+javax/management/SCCS/s.MBeanServerConnection.java
+javax/management/SCCS/s.MBeanServerDelegate.java
+javax/management/SCCS/s.MBeanServerDelegateMBean.java
+javax/management/SCCS/s.MBeanServerFactory.java
+javax/management/SCCS/s.MBeanServerInvocationHandler.java
+javax/management/SCCS/s.MBeanServerNotification.java
+javax/management/SCCS/s.MBeanServerPermission.java
+javax/management/SCCS/s.MBeanTrustPermission.java
+javax/management/SCCS/s.MalformedObjectNameException.java
+javax/management/SCCS/s.MatchQueryExp.java
+javax/management/SCCS/s.NotCompliantMBeanException.java
+javax/management/SCCS/s.NotQueryExp.java
+javax/management/SCCS/s.Notification.java
+javax/management/SCCS/s.NotificationBroadcaster.java
+javax/management/SCCS/s.NotificationBroadcasterSupport.java
+javax/management/SCCS/s.NotificationEmitter.java
+javax/management/SCCS/s.NotificationFilter.java
+javax/management/SCCS/s.NotificationFilterSupport.java
+javax/management/SCCS/s.NotificationListener.java
+javax/management/SCCS/s.NumericValueExp.java
+javax/management/SCCS/s.ObjectInstance.java
+javax/management/SCCS/s.ObjectName.java
+javax/management/SCCS/s.OperationsException.java
+javax/management/SCCS/s.OrQueryExp.java
+javax/management/SCCS/s.PersistentMBean.java
+javax/management/SCCS/s.QueryExp.java
+javax/management/SCCS/s.QualifiedAttributeValueExp.java
+javax/management/SCCS/s.RuntimeErrorException.java
+javax/management/SCCS/s.ReflectionException.java
+javax/management/SCCS/s.RuntimeMBeanException.java
+javax/management/SCCS/s.RuntimeOperationsException.java
+javax/management/SCCS/s.ServiceNotFoundException.java
+javax/management/SCCS/s.StandardMBean.java
+javax/management/SCCS/s.StringValueExp.java
+javax/management/SCCS/s.ValueExp.java
+javax/management/SCCS/s.package.html
+javax/management/loading
+javax/management/loading/SCCS
+javax/management/loading/SCCS/s.MLetContent.java
+javax/management/loading/SCCS/s.MLet.java
+javax/management/loading/SCCS/s.ClassLoaderRepository.java
+javax/management/loading/SCCS/s.DefaultLoaderRepository.java
+javax/management/loading/SCCS/s.MLetMBean.java
+javax/management/loading/SCCS/s.MLetParser.java
+javax/management/loading/SCCS/s.package.html
+javax/management/loading/SCCS/s.MLetObjectInputStream.java
+javax/management/loading/SCCS/s.PrivateClassLoader.java
+javax/management/loading/SCCS/s.PrivateMLet.java
+javax/management/loading/DefaultLoaderRepository.java
+javax/management/loading/ClassLoaderRepository.java
+javax/management/loading/MLetContent.java
+javax/management/loading/MLet.java
+javax/management/loading/MLetMBean.java
+javax/management/loading/MLetParser.java
+javax/management/loading/package.html
+javax/management/loading/MLetObjectInputStream.java
+javax/management/loading/PrivateClassLoader.java
+javax/management/loading/PrivateMLet.java
+javax/management/modelmbean
+javax/management/modelmbean/SCCS
+javax/management/modelmbean/SCCS/s.DescriptorSupport.java
+javax/management/modelmbean/SCCS/s.ModelMBean.java
+javax/management/modelmbean/SCCS/s.ModelMBeanInfoSupport.java
+javax/management/modelmbean/SCCS/s.ModelMBeanInfo.java
+javax/management/modelmbean/SCCS/s.InvalidTargetObjectTypeException.java
+javax/management/modelmbean/SCCS/s.ModelMBeanAttributeInfo.java
+javax/management/modelmbean/SCCS/s.ModelMBeanConstructorInfo.java
+javax/management/modelmbean/SCCS/s.ModelMBeanNotificationBroadcaster.java
+javax/management/modelmbean/SCCS/s.ModelMBeanNotificationInfo.java
+javax/management/modelmbean/SCCS/s.ModelMBeanOperationInfo.java
+javax/management/modelmbean/SCCS/s.RequiredModelMBean.java
+javax/management/modelmbean/SCCS/s.XMLParseException.java
+javax/management/modelmbean/SCCS/s.package.html
+javax/management/modelmbean/DescriptorSupport.java
+javax/management/modelmbean/ModelMBean.java
+javax/management/modelmbean/ModelMBeanInfo.java
+javax/management/modelmbean/ModelMBeanNotificationInfo.java
+javax/management/modelmbean/InvalidTargetObjectTypeException.java
+javax/management/modelmbean/ModelMBeanAttributeInfo.java
+javax/management/modelmbean/ModelMBeanConstructorInfo.java
+javax/management/modelmbean/ModelMBeanInfoSupport.java
+javax/management/modelmbean/package.html
+javax/management/modelmbean/ModelMBeanNotificationBroadcaster.java
+javax/management/modelmbean/ModelMBeanOperationInfo.java
+javax/management/modelmbean/RequiredModelMBean.java
+javax/management/modelmbean/XMLParseException.java
+javax/management/monitor
+javax/management/monitor/SCCS
+javax/management/monitor/SCCS/s.CounterMonitorMBean.java
+javax/management/monitor/SCCS/s.CounterMonitor.java
+javax/management/monitor/SCCS/s.GaugeMonitorMBean.java
+javax/management/monitor/SCCS/s.GaugeMonitor.java
+javax/management/monitor/SCCS/s.MonitorNotification.java
+javax/management/monitor/SCCS/s.Monitor.java
+javax/management/monitor/SCCS/s.MonitorMBean.java
+javax/management/monitor/SCCS/s.MonitorSettingException.java
+javax/management/monitor/SCCS/s.StringMonitor.java
+javax/management/monitor/SCCS/s.StringMonitorMBean.java
+javax/management/monitor/SCCS/s.package.html
+javax/management/monitor/CounterMonitorMBean.java
+javax/management/monitor/CounterMonitor.java
+javax/management/monitor/GaugeMonitorMBean.java
+javax/management/monitor/GaugeMonitor.java
+javax/management/monitor/MonitorNotification.java
+javax/management/monitor/Monitor.java
+javax/management/monitor/MonitorMBean.java
+javax/management/monitor/MonitorSettingException.java
+javax/management/monitor/StringMonitor.java
+javax/management/monitor/StringMonitorMBean.java
+javax/management/monitor/package.html
+javax/management/openmbean
+javax/management/openmbean/SCCS
+javax/management/openmbean/SCCS/s.CompositeData.java
+javax/management/openmbean/SCCS/s.ArrayType.java
+javax/management/openmbean/SCCS/s.KeyAlreadyExistsException.java
+javax/management/openmbean/SCCS/s.CompositeDataSupport.java
+javax/management/openmbean/SCCS/s.CompositeType.java
+javax/management/openmbean/SCCS/s.InvalidKeyException.java
+javax/management/openmbean/SCCS/s.InvalidOpenTypeException.java
+javax/management/openmbean/SCCS/s.OpenMBeanAttributeInfoSupport.java
+javax/management/openmbean/SCCS/s.OpenDataException.java
+javax/management/openmbean/SCCS/s.OpenMBeanAttributeInfo.java
+javax/management/openmbean/SCCS/s.OpenMBeanConstructorInfo.java
+javax/management/openmbean/SCCS/s.OpenMBeanInfo.java
+javax/management/openmbean/SCCS/s.OpenMBeanOperationInfo.java
+javax/management/openmbean/SCCS/s.OpenMBeanConstructorInfoSupport.java
+javax/management/openmbean/SCCS/s.OpenMBeanInfoSupport.java
+javax/management/openmbean/SCCS/s.SimpleType.java
+javax/management/openmbean/SCCS/s.OpenType.java
+javax/management/openmbean/SCCS/s.OpenMBeanOperationInfoSupport.java
+javax/management/openmbean/SCCS/s.OpenMBeanParameterInfo.java
+javax/management/openmbean/SCCS/s.OpenMBeanParameterInfoSupport.java
+javax/management/openmbean/SCCS/s.TabularDataSupport.java
+javax/management/openmbean/SCCS/s.TabularData.java
+javax/management/openmbean/SCCS/s.TabularType.java
+javax/management/openmbean/SCCS/s.package.html
+javax/management/openmbean/CompositeData.java
+javax/management/openmbean/ArrayType.java
+javax/management/openmbean/OpenMBeanAttributeInfoSupport.java
+javax/management/openmbean/CompositeDataSupport.java
+javax/management/openmbean/CompositeType.java
+javax/management/openmbean/InvalidKeyException.java
+javax/management/openmbean/InvalidOpenTypeException.java
+javax/management/openmbean/KeyAlreadyExistsException.java
+javax/management/openmbean/OpenDataException.java
+javax/management/openmbean/OpenMBeanAttributeInfo.java
+javax/management/openmbean/OpenMBeanConstructorInfo.java
+javax/management/openmbean/OpenMBeanInfo.java
+javax/management/openmbean/OpenType.java
+javax/management/openmbean/TabularDataSupport.java
+javax/management/openmbean/OpenMBeanConstructorInfoSupport.java
+javax/management/openmbean/OpenMBeanInfoSupport.java
+javax/management/openmbean/OpenMBeanOperationInfo.java
+javax/management/openmbean/OpenMBeanOperationInfoSupport.java
+javax/management/openmbean/OpenMBeanParameterInfo.java
+javax/management/openmbean/OpenMBeanParameterInfoSupport.java
+javax/management/openmbean/SimpleType.java
+javax/management/openmbean/TabularData.java
+javax/management/openmbean/TabularType.java
+javax/management/openmbean/package.html
+javax/management/relation
+javax/management/relation/SCCS
+javax/management/relation/SCCS/s.InvalidRelationServiceException.java
+javax/management/relation/SCCS/s.InvalidRelationIdException.java
+javax/management/relation/SCCS/s.Relation.java
+javax/management/relation/SCCS/s.InvalidRelationTypeException.java
+javax/management/relation/SCCS/s.InvalidRoleInfoException.java
+javax/management/relation/SCCS/s.InvalidRoleValueException.java
+javax/management/relation/SCCS/s.MBeanServerNotificationFilter.java
+javax/management/relation/SCCS/s.RelationService.java
+javax/management/relation/SCCS/s.RoleInfoNotFoundException.java
+javax/management/relation/SCCS/s.RelationException.java
+javax/management/relation/SCCS/s.RelationNotFoundException.java
+javax/management/relation/SCCS/s.RelationNotification.java
+javax/management/relation/SCCS/s.RelationServiceMBean.java
+javax/management/relation/SCCS/s.RelationSupport.java
+javax/management/relation/SCCS/s.RelationType.java
+javax/management/relation/SCCS/s.RelationServiceNotRegisteredException.java
+javax/management/relation/SCCS/s.RelationSupportMBean.java
+javax/management/relation/SCCS/s.RelationTypeSupport.java
+javax/management/relation/SCCS/s.Role.java
+javax/management/relation/SCCS/s.RelationTypeNotFoundException.java
+javax/management/relation/SCCS/s.RoleInfo.java
+javax/management/relation/SCCS/s.RoleList.java
+javax/management/relation/SCCS/s.RoleResult.java
+javax/management/relation/SCCS/s.RoleNotFoundException.java
+javax/management/relation/SCCS/s.RoleStatus.java
+javax/management/relation/SCCS/s.RoleUnresolved.java
+javax/management/relation/SCCS/s.RoleUnresolvedList.java
+javax/management/relation/SCCS/s.package.html
+javax/management/relation/InvalidRelationServiceException.java
+javax/management/relation/InvalidRelationIdException.java
+javax/management/relation/RelationServiceNotRegisteredException.java
+javax/management/relation/InvalidRelationTypeException.java
+javax/management/relation/InvalidRoleInfoException.java
+javax/management/relation/InvalidRoleValueException.java
+javax/management/relation/MBeanServerNotificationFilter.java
+javax/management/relation/Relation.java
+javax/management/relation/RelationException.java
+javax/management/relation/RelationNotFoundException.java
+javax/management/relation/RelationNotification.java
+javax/management/relation/RelationService.java
+javax/management/relation/RelationServiceMBean.java
+javax/management/relation/RelationSupportMBean.java
+javax/management/relation/RelationSupport.java
+javax/management/relation/RelationTypeSupport.java
+javax/management/relation/RelationType.java
+javax/management/relation/Role.java
+javax/management/relation/RelationTypeNotFoundException.java
+javax/management/relation/RoleInfo.java
+javax/management/relation/RoleList.java
+javax/management/relation/RoleResult.java
+javax/management/relation/RoleUnresolvedList.java
+javax/management/relation/RoleInfoNotFoundException.java
+javax/management/relation/RoleNotFoundException.java
+javax/management/relation/RoleStatus.java
+javax/management/relation/RoleUnresolved.java
+javax/management/relation/package.html
+javax/management/remote
+javax/management/remote/SCCS
+javax/management/remote/SCCS/s.JMXAuthenticator.java
+javax/management/remote/SCCS/s.JMXConnector.java
+javax/management/remote/SCCS/s.JMXProviderException.java
+javax/management/remote/SCCS/s.JMXPrincipal.java
+javax/management/remote/SCCS/s.JMXConnectionNotification.java
+javax/management/remote/SCCS/s.JMXConnectorFactory.java
+javax/management/remote/SCCS/s.JMXConnectorProvider.java
+javax/management/remote/SCCS/s.JMXConnectorServer.java
+javax/management/remote/SCCS/s.JMXConnectorServerFactory.java
+javax/management/remote/SCCS/s.JMXConnectorServerMBean.java
+javax/management/remote/SCCS/s.JMXConnectorServerProvider.java
+javax/management/remote/SCCS/s.JMXServiceURL.java
+javax/management/remote/SCCS/s.JMXServerErrorException.java
+javax/management/remote/SCCS/s.MBeanServerForwarder.java
+javax/management/remote/SCCS/s.NotificationResult.java
+javax/management/remote/SCCS/s.SubjectDelegationPermission.java
+javax/management/remote/SCCS/s.TargetedNotification.java
+javax/management/remote/SCCS/s.package.html
+javax/management/remote/rmi
+javax/management/remote/rmi/SCCS
+javax/management/remote/rmi/SCCS/s.NoCallStackClassLoader.java
+javax/management/remote/rmi/SCCS/s.RMIConnection.java
+javax/management/remote/rmi/SCCS/s.RMIConnectionImpl.java
+javax/management/remote/rmi/SCCS/s.RMIConnector.java
+javax/management/remote/rmi/SCCS/s.RMIConnectorServer.java
+javax/management/remote/rmi/SCCS/s.RMIIIOPServerImpl.java
+javax/management/remote/rmi/SCCS/s.RMIJRMPServerImpl.java
+javax/management/remote/rmi/SCCS/s.RMIServer.java
+javax/management/remote/rmi/SCCS/s.RMIServerImpl.java
+javax/management/remote/rmi/SCCS/s.package.html
+javax/management/remote/rmi/NoCallStackClassLoader.java
+javax/management/remote/rmi/RMIConnection.java
+javax/management/remote/rmi/RMIConnectionImpl.java
+javax/management/remote/rmi/RMIConnector.java
+javax/management/remote/rmi/RMIConnectorServer.java
+javax/management/remote/rmi/RMIIIOPServerImpl.java
+javax/management/remote/rmi/RMIJRMPServerImpl.java
+javax/management/remote/rmi/RMIServer.java
+javax/management/remote/rmi/RMIServerImpl.java
+javax/management/remote/rmi/package.html
+javax/management/remote/JMXConnectionNotification.java
+javax/management/remote/JMXAuthenticator.java
+javax/management/remote/JMXConnectorFactory.java
+javax/management/remote/JMXConnector.java
+javax/management/remote/JMXConnectorServerFactory.java
+javax/management/remote/JMXConnectorProvider.java
+javax/management/remote/JMXConnectorServer.java
+javax/management/remote/JMXConnectorServerMBean.java
+javax/management/remote/JMXConnectorServerProvider.java
+javax/management/remote/JMXPrincipal.java
+javax/management/remote/JMXProviderException.java
+javax/management/remote/JMXServerErrorException.java
+javax/management/remote/JMXServiceURL.java
+javax/management/remote/MBeanServerForwarder.java
+javax/management/remote/NotificationResult.java
+javax/management/remote/SubjectDelegationPermission.java
+javax/management/remote/TargetedNotification.java
+javax/management/remote/package.html
+javax/management/timer
+javax/management/timer/SCCS
+javax/management/timer/SCCS/s.TimerMBean.java
+javax/management/timer/SCCS/s.Timer.java
+javax/management/timer/SCCS/s.TimerAlarmClockNotification.java
+javax/management/timer/SCCS/s.TimerNotification.java
+javax/management/timer/SCCS/s.package.html
+javax/management/timer/TimerMBean.java
+javax/management/timer/Timer.java
+javax/management/timer/TimerAlarmClockNotification.java
+javax/management/timer/TimerNotification.java
+javax/management/timer/package.html
+javax/management/AndQueryExp.java
+javax/management/Attribute.java
+javax/management/AttributeList.java
+javax/management/DescriptorAccess.java
+javax/management/Descriptor.java
+javax/management/AttributeChangeNotification.java
+javax/management/AttributeChangeNotificationFilter.java
+javax/management/AttributeNotFoundException.java
+javax/management/AttributeValueExp.java
+javax/management/BadAttributeValueExpException.java
+javax/management/BadBinaryOpValueExpException.java
+javax/management/BadStringOperationException.java
+javax/management/BetweenQueryExp.java
+javax/management/BinaryOpValueExp.java
+javax/management/BinaryRelQueryExp.java
+javax/management/BooleanValueExp.java
+javax/management/ClassAttributeValueExp.java
+javax/management/DefaultLoaderRepository.java
+javax/management/DynamicMBean.java
+javax/management/InQueryExp.java
+javax/management/InvalidApplicationException.java
+javax/management/InstanceNotFoundException.java
+javax/management/InstanceAlreadyExistsException.java
+javax/management/IntrospectionException.java
+javax/management/Query.java
+javax/management/StandardMBean.java
+javax/management/InvalidAttributeValueException.java
+javax/management/JMException.java
+javax/management/JMRuntimeException.java
+javax/management/ListenerNotFoundException.java
+javax/management/MBeanAttributeInfo.java
+javax/management/MBeanConstructorInfo.java
+javax/management/MBeanException.java
+javax/management/MBeanFeatureInfo.java
+javax/management/MBeanInfo.java
+javax/management/MBeanNotificationInfo.java
+javax/management/MBeanOperationInfo.java
+javax/management/MBeanParameterInfo.java
+javax/management/MBeanPermission.java
+javax/management/MBeanRegistration.java
+javax/management/MBeanRegistrationException.java
+javax/management/MBeanServer.java
+javax/management/MBeanServerBuilder.java
+javax/management/MBeanServerConnection.java
+javax/management/MBeanServerDelegate.java
+javax/management/MBeanServerDelegateMBean.java
+javax/management/MBeanServerFactory.java
+javax/management/MBeanServerInvocationHandler.java
+javax/management/MBeanServerNotification.java
+javax/management/MBeanServerPermission.java
+javax/management/MBeanTrustPermission.java
+javax/management/MalformedObjectNameException.java
+javax/management/MatchQueryExp.java
+javax/management/NotCompliantMBeanException.java
+javax/management/NotQueryExp.java
+javax/management/Notification.java
+javax/management/NotificationBroadcaster.java
+javax/management/NotificationBroadcasterSupport.java
+javax/management/NotificationEmitter.java
+javax/management/NotificationFilter.java
+javax/management/NotificationFilterSupport.java
+javax/management/NotificationListener.java
+javax/management/NumericValueExp.java
+javax/management/ObjectInstance.java
+javax/management/ObjectName.java
+javax/management/OperationsException.java
+javax/management/OrQueryExp.java
+javax/management/PersistentMBean.java
+javax/management/QualifiedAttributeValueExp.java
+javax/management/QueryEval.java
+javax/management/QueryExp.java
+javax/management/RuntimeOperationsException.java
+javax/management/ReflectionException.java
+javax/management/RuntimeErrorException.java
+javax/management/RuntimeMBeanException.java
+javax/management/ServiceNotFoundException.java
+javax/management/StringValueExp.java
+javax/management/ValueExp.java
+javax/management/package.html
+javax/naming
+javax/naming/SCCS
+javax/naming/SCCS/s.AuthenticationException.java
+javax/naming/SCCS/s.BinaryRefAddr.java
+javax/naming/SCCS/s.Binding.java
+javax/naming/SCCS/s.AuthenticationNotSupportedException.java
+javax/naming/SCCS/s.CannotProceedException.java
+javax/naming/SCCS/s.CommunicationException.java
+javax/naming/SCCS/s.CompositeName.java
+javax/naming/SCCS/s.CompoundName.java
+javax/naming/SCCS/s.ConfigurationException.java
+javax/naming/SCCS/s.Context.java
+javax/naming/SCCS/s.ContextNotEmptyException.java
+javax/naming/SCCS/s.InitialContext.java
+javax/naming/SCCS/s.LinkRef.java
+javax/naming/SCCS/s.NameNotFoundException.java
+javax/naming/SCCS/s.InsufficientResourcesException.java
+javax/naming/SCCS/s.InterruptedNamingException.java
+javax/naming/SCCS/s.InvalidNameException.java
+javax/naming/SCCS/s.LimitExceededException.java
+javax/naming/SCCS/s.LinkException.java
+javax/naming/SCCS/s.LinkLoopException.java
+javax/naming/SCCS/s.Name.java
+javax/naming/SCCS/s.NameImpl.java
+javax/naming/SCCS/s.MalformedLinkException.java
+javax/naming/SCCS/s.NameClassPair.java
+javax/naming/SCCS/s.NameAlreadyBoundException.java
+javax/naming/SCCS/s.NameParser.java
+javax/naming/SCCS/s.NamingEnumeration.java
+javax/naming/SCCS/s.OperationNotSupportedException.java
+javax/naming/SCCS/s.NamingException.java
+javax/naming/SCCS/s.NamingSecurityException.java
+javax/naming/SCCS/s.NoInitialContextException.java
+javax/naming/SCCS/s.NoPermissionException.java
+javax/naming/SCCS/s.NotContextException.java
+javax/naming/SCCS/s.ServiceUnavailableException.java
+javax/naming/SCCS/s.PartialResultException.java
+javax/naming/SCCS/s.RefAddr.java
+javax/naming/SCCS/s.Reference.java
+javax/naming/SCCS/s.Referenceable.java
+javax/naming/SCCS/s.ReferralException.java
+javax/naming/SCCS/s.SizeLimitExceededException.java
+javax/naming/SCCS/s.StringRefAddr.java
+javax/naming/SCCS/s.package.html
+javax/naming/SCCS/s.TimeLimitExceededException.java
+javax/naming/directory
+javax/naming/directory/SCCS
+javax/naming/directory/SCCS/s.Attribute.java
+javax/naming/directory/SCCS/s.Attributes.java
+javax/naming/directory/SCCS/s.InvalidAttributeIdentifierException.java
+javax/naming/directory/SCCS/s.AttributeInUseException.java
+javax/naming/directory/SCCS/s.AttributeModificationException.java
+javax/naming/directory/SCCS/s.BasicAttribute.java
+javax/naming/directory/SCCS/s.BasicAttributes.java
+javax/naming/directory/SCCS/s.DirContext.java
+javax/naming/directory/SCCS/s.InitialDirContext.java
+javax/naming/directory/SCCS/s.package.html
+javax/naming/directory/SCCS/s.InvalidAttributeValueException.java
+javax/naming/directory/SCCS/s.InvalidAttributesException.java
+javax/naming/directory/SCCS/s.InvalidSearchControlsException.java
+javax/naming/directory/SCCS/s.InvalidSearchFilterException.java
+javax/naming/directory/SCCS/s.ModificationItem.java
+javax/naming/directory/SCCS/s.NoSuchAttributeException.java
+javax/naming/directory/SCCS/s.SchemaViolationException.java
+javax/naming/directory/SCCS/s.SearchControls.java
+javax/naming/directory/SCCS/s.SearchResult.java
+javax/naming/directory/Attribute.java
+javax/naming/directory/Attributes.java
+javax/naming/directory/InitialDirContext.java
+javax/naming/directory/DirContext.java
+javax/naming/directory/AttributeInUseException.java
+javax/naming/directory/AttributeModificationException.java
+javax/naming/directory/BasicAttribute.java
+javax/naming/directory/BasicAttributes.java
+javax/naming/directory/package.html
+javax/naming/directory/InvalidAttributeIdentifierException.java
+javax/naming/directory/InvalidAttributeValueException.java
+javax/naming/directory/InvalidAttributesException.java
+javax/naming/directory/SearchControls.java
+javax/naming/directory/ModificationItem.java
+javax/naming/directory/InvalidSearchControlsException.java
+javax/naming/directory/InvalidSearchFilterException.java
+javax/naming/directory/NoSuchAttributeException.java
+javax/naming/directory/SchemaViolationException.java
+javax/naming/directory/SearchResult.java
+javax/naming/event
+javax/naming/event/SCCS
+javax/naming/event/SCCS/s.EventDirContext.java
+javax/naming/event/SCCS/s.EventContext.java
+javax/naming/event/SCCS/s.NamespaceChangeListener.java
+javax/naming/event/SCCS/s.NamingEvent.java
+javax/naming/event/SCCS/s.NamingExceptionEvent.java
+javax/naming/event/SCCS/s.NamingListener.java
+javax/naming/event/SCCS/s.ObjectChangeListener.java
+javax/naming/event/SCCS/s.package.html
+javax/naming/event/EventDirContext.java
+javax/naming/event/EventContext.java
+javax/naming/event/NamespaceChangeListener.java
+javax/naming/event/NamingEvent.java
+javax/naming/event/NamingExceptionEvent.java
+javax/naming/event/NamingListener.java
+javax/naming/event/ObjectChangeListener.java
+javax/naming/event/package.html
+javax/naming/ldap
+javax/naming/ldap/SCCS
+javax/naming/ldap/SCCS/s.ControlFactory.java
+javax/naming/ldap/SCCS/s.BasicControl.java
+javax/naming/ldap/SCCS/s.Control.java
+javax/naming/ldap/SCCS/s.LdapReferralException.java
+javax/naming/ldap/SCCS/s.ExtendedRequest.java
+javax/naming/ldap/SCCS/s.ExtendedResponse.java
+javax/naming/ldap/SCCS/s.HasControls.java
+javax/naming/ldap/SCCS/s.InitialLdapContext.java
+javax/naming/ldap/SCCS/s.LdapContext.java
+javax/naming/ldap/SCCS/s.LdapName.java
+javax/naming/ldap/SCCS/s.Rdn.java
+javax/naming/ldap/SCCS/s.ManageReferralControl.java
+javax/naming/ldap/SCCS/s.PagedResultsControl.java
+javax/naming/ldap/SCCS/s.PagedResultsResponseControl.java
+javax/naming/ldap/SCCS/s.UnsolicitedNotification.java
+javax/naming/ldap/SCCS/s.Rfc2253Parser.java
+javax/naming/ldap/SCCS/s.SortControl.java
+javax/naming/ldap/SCCS/s.SortKey.java
+javax/naming/ldap/SCCS/s.SortResponseControl.java
+javax/naming/ldap/SCCS/s.StartTlsRequest.java
+javax/naming/ldap/SCCS/s.StartTlsResponse.java
+javax/naming/ldap/SCCS/s.UnsolicitedNotificationListener.java
+javax/naming/ldap/SCCS/s.UnsolicitedNotificationEvent.java
+javax/naming/ldap/SCCS/s.package.html
+javax/naming/ldap/ExtendedRequest.java
+javax/naming/ldap/BasicControl.java
+javax/naming/ldap/Control.java
+javax/naming/ldap/ControlFactory.java
+javax/naming/ldap/PagedResultsResponseControl.java
+javax/naming/ldap/ExtendedResponse.java
+javax/naming/ldap/HasControls.java
+javax/naming/ldap/InitialLdapContext.java
+javax/naming/ldap/LdapContext.java
+javax/naming/ldap/LdapName.java
+javax/naming/ldap/LdapReferralException.java
+javax/naming/ldap/ManageReferralControl.java
+javax/naming/ldap/PagedResultsControl.java
+javax/naming/ldap/Rdn.java
+javax/naming/ldap/UnsolicitedNotification.java
+javax/naming/ldap/Rfc2253Parser.java
+javax/naming/ldap/SortControl.java
+javax/naming/ldap/SortKey.java
+javax/naming/ldap/SortResponseControl.java
+javax/naming/ldap/StartTlsRequest.java
+javax/naming/ldap/StartTlsResponse.java
+javax/naming/ldap/UnsolicitedNotificationListener.java
+javax/naming/ldap/UnsolicitedNotificationEvent.java
+javax/naming/ldap/package.html
+javax/naming/spi
+javax/naming/spi/SCCS
+javax/naming/spi/SCCS/s.ContinuationDirContext.java
+javax/naming/spi/SCCS/s.ContinuationContext.java
+javax/naming/spi/SCCS/s.InitialContextFactory.java
+javax/naming/spi/SCCS/s.DirObjectFactory.java
+javax/naming/spi/SCCS/s.DirStateFactory.java
+javax/naming/spi/SCCS/s.DirectoryManager.java
+javax/naming/spi/SCCS/s.InitialContextFactoryBuilder.java
+javax/naming/spi/SCCS/s.NamingManager.java
+javax/naming/spi/SCCS/s.ObjectFactory.java
+javax/naming/spi/SCCS/s.ObjectFactoryBuilder.java
+javax/naming/spi/SCCS/s.ResolveResult.java
+javax/naming/spi/SCCS/s.Resolver.java
+javax/naming/spi/SCCS/s.StateFactory.java
+javax/naming/spi/SCCS/s.package.html
+javax/naming/spi/InitialContextFactoryBuilder.java
+javax/naming/spi/ContinuationContext.java
+javax/naming/spi/ContinuationDirContext.java
+javax/naming/spi/DirObjectFactory.java
+javax/naming/spi/DirStateFactory.java
+javax/naming/spi/DirectoryManager.java
+javax/naming/spi/InitialContextFactory.java
+javax/naming/spi/ObjectFactoryBuilder.java
+javax/naming/spi/NamingManager.java
+javax/naming/spi/ObjectFactory.java
+javax/naming/spi/ResolveResult.java
+javax/naming/spi/Resolver.java
+javax/naming/spi/StateFactory.java
+javax/naming/spi/package.html
+javax/naming/AuthenticationException.java
+javax/naming/BinaryRefAddr.java
+javax/naming/Binding.java
+javax/naming/LinkRef.java
+javax/naming/AuthenticationNotSupportedException.java
+javax/naming/CannotProceedException.java
+javax/naming/CommunicationException.java
+javax/naming/CompositeName.java
+javax/naming/CompoundName.java
+javax/naming/ConfigurationException.java
+javax/naming/Context.java
+javax/naming/NameClassPair.java
+javax/naming/Name.java
+javax/naming/ContextNotEmptyException.java
+javax/naming/InitialContext.java
+javax/naming/InsufficientResourcesException.java
+javax/naming/InterruptedNamingException.java
+javax/naming/InvalidNameException.java
+javax/naming/LimitExceededException.java
+javax/naming/LinkException.java
+javax/naming/LinkLoopException.java
+javax/naming/MalformedLinkException.java
+javax/naming/NameAlreadyBoundException.java
+javax/naming/NameImpl.java
+javax/naming/NameNotFoundException.java
+javax/naming/NameParser.java
+javax/naming/RefAddr.java
+javax/naming/ServiceUnavailableException.java
+javax/naming/NamingEnumeration.java
+javax/naming/NamingException.java
+javax/naming/NamingSecurityException.java
+javax/naming/NoInitialContextException.java
+javax/naming/NoPermissionException.java
+javax/naming/NotContextException.java
+javax/naming/OperationNotSupportedException.java
+javax/naming/PartialResultException.java
+javax/naming/Reference.java
+javax/naming/Referenceable.java
+javax/naming/ReferralException.java
+javax/naming/SizeLimitExceededException.java
+javax/naming/StringRefAddr.java
+javax/naming/TimeLimitExceededException.java
+javax/naming/package.html
+javax/pack
+javax/pack/SCCS
+javax/print
+javax/print/SCCS
+javax/print/SCCS/s.AttributeException.java
+javax/print/SCCS/s.CancelablePrintJob.java
+javax/print/SCCS/s.Doc.java
+javax/print/SCCS/s.DocFlavor.java
+javax/print/SCCS/s.DocPrintJob.java
+javax/print/SCCS/s.FlavorException.java
+javax/print/SCCS/s.MimeType.java
+javax/print/SCCS/s.MultiDoc.java
+javax/print/SCCS/s.MultiDocPrintJob.java
+javax/print/SCCS/s.MultiDocPrintService.java
+javax/print/SCCS/s.PrintException.java
+javax/print/SCCS/s.PrintService.java
+javax/print/SCCS/s.PrintServiceLookup.java
+javax/print/SCCS/s.ServiceUI.java
+javax/print/SCCS/s.URIException.java
+javax/print/SCCS/s.ServiceUIFactory.java
+javax/print/SCCS/s.SimpleDoc.java
+javax/print/SCCS/s.StreamPrintService.java
+javax/print/SCCS/s.StreamPrintServiceFactory.java
+javax/print/SCCS/s.package.html
+javax/print/attribute
+javax/print/attribute/SCCS
+javax/print/attribute/SCCS/s.DateTimeSyntax.java
+javax/print/attribute/SCCS/s.Attribute.java
+javax/print/attribute/SCCS/s.AttributeSet.java
+javax/print/attribute/SCCS/s.AttributeSetUtilities.java
+javax/print/attribute/SCCS/s.DocAttribute.java
+javax/print/attribute/SCCS/s.DocAttributeSet.java
+javax/print/attribute/SCCS/s.EnumSyntax.java
+javax/print/attribute/SCCS/s.HashAttributeSet.java
+javax/print/attribute/SCCS/s.HashDocAttributeSet.java
+javax/print/attribute/SCCS/s.HashPrintJobAttributeSet.java
+javax/print/attribute/SCCS/s.HashPrintRequestAttributeSet.java
+javax/print/attribute/SCCS/s.HashPrintServiceAttributeSet.java
+javax/print/attribute/SCCS/s.IntegerSyntax.java
+javax/print/attribute/SCCS/s.PrintRequestAttribute.java
+javax/print/attribute/SCCS/s.PrintJobAttribute.java
+javax/print/attribute/SCCS/s.PrintJobAttributeSet.java
+javax/print/attribute/SCCS/s.PrintRequestAttributeSet.java
+javax/print/attribute/SCCS/s.PrintServiceAttribute.java
+javax/print/attribute/SCCS/s.PrintServiceAttributeSet.java
+javax/print/attribute/SCCS/s.ResolutionSyntax.java
+javax/print/attribute/SCCS/s.SetOfIntegerSyntax.java
+javax/print/attribute/SCCS/s.Size2DSyntax.java
+javax/print/attribute/SCCS/s.SupportedValuesAttribute.java
+javax/print/attribute/SCCS/s.TextSyntax.java
+javax/print/attribute/SCCS/s.URISyntax.java
+javax/print/attribute/SCCS/s.UnmodifiableSetException.java
+javax/print/attribute/SCCS/s.package.html
+javax/print/attribute/standard
+javax/print/attribute/standard/SCCS
+javax/print/attribute/standard/SCCS/s.ColorSupported.java
+javax/print/attribute/standard/SCCS/s.Chromaticity.java
+javax/print/attribute/standard/SCCS/s.DateTimeAtCompleted.java
+javax/print/attribute/standard/SCCS/s.Compression.java
+javax/print/attribute/standard/SCCS/s.Copies.java
+javax/print/attribute/standard/SCCS/s.CopiesSupported.java
+javax/print/attribute/standard/SCCS/s.DateTimeAtCreation.java
+javax/print/attribute/standard/SCCS/s.DateTimeAtProcessing.java
+javax/print/attribute/standard/SCCS/s.Destination.java
+javax/print/attribute/standard/SCCS/s.DocumentName.java
+javax/print/attribute/standard/SCCS/s.Fidelity.java
+javax/print/attribute/standard/SCCS/s.Finishings.java
+javax/print/attribute/standard/SCCS/s.JobHoldUntil.java
+javax/print/attribute/standard/SCCS/s.JobImpressions.java
+javax/print/attribute/standard/SCCS/s.PrinterResolution.java
+javax/print/attribute/standard/SCCS/s.PrinterName.java
+javax/print/attribute/standard/SCCS/s.JobImpressionsCompleted.java
+javax/print/attribute/standard/SCCS/s.JobImpressionsSupported.java
+javax/print/attribute/standard/SCCS/s.JobKOctets.java
+javax/print/attribute/standard/SCCS/s.JobKOctetsProcessed.java
+javax/print/attribute/standard/SCCS/s.JobKOctetsSupported.java
+javax/print/attribute/standard/SCCS/s.JobMediaSheets.java
+javax/print/attribute/standard/SCCS/s.JobMediaSheetsCompleted.java
+javax/print/attribute/standard/SCCS/s.JobMediaSheetsSupported.java
+javax/print/attribute/standard/SCCS/s.JobMessageFromOperator.java
+javax/print/attribute/standard/SCCS/s.JobName.java
+javax/print/attribute/standard/SCCS/s.JobOriginatingUserName.java
+javax/print/attribute/standard/SCCS/s.JobPriority.java
+javax/print/attribute/standard/SCCS/s.JobPrioritySupported.java
+javax/print/attribute/standard/SCCS/s.JobSheets.java
+javax/print/attribute/standard/SCCS/s.JobState.java
+javax/print/attribute/standard/SCCS/s.JobStateReason.java
+javax/print/attribute/standard/SCCS/s.JobStateReasons.java
+javax/print/attribute/standard/SCCS/s.Media.java
+javax/print/attribute/standard/SCCS/s.MediaName.java
+javax/print/attribute/standard/SCCS/s.MediaPrintableArea.java
+javax/print/attribute/standard/SCCS/s.MediaSize.java
+javax/print/attribute/standard/SCCS/s.MediaSizeName.java
+javax/print/attribute/standard/SCCS/s.MediaTray.java
+javax/print/attribute/standard/SCCS/s.MultipleDocumentHandling.java
+javax/print/attribute/standard/SCCS/s.NumberOfDocuments.java
+javax/print/attribute/standard/SCCS/s.NumberOfInterveningJobs.java
+javax/print/attribute/standard/SCCS/s.NumberUp.java
+javax/print/attribute/standard/SCCS/s.NumberUpSupported.java
+javax/print/attribute/standard/SCCS/s.OrientationRequested.java
+javax/print/attribute/standard/SCCS/s.OutputDeviceAssigned.java
+javax/print/attribute/standard/SCCS/s.Severity.java
+javax/print/attribute/standard/SCCS/s.PDLOverrideSupported.java
+javax/print/attribute/standard/SCCS/s.PageRanges.java
+javax/print/attribute/standard/SCCS/s.PagesPerMinute.java
+javax/print/attribute/standard/SCCS/s.PagesPerMinuteColor.java
+javax/print/attribute/standard/SCCS/s.PresentationDirection.java
+javax/print/attribute/standard/SCCS/s.PrintQuality.java
+javax/print/attribute/standard/SCCS/s.PrinterInfo.java
+javax/print/attribute/standard/SCCS/s.PrinterIsAcceptingJobs.java
+javax/print/attribute/standard/SCCS/s.PrinterLocation.java
+javax/print/attribute/standard/SCCS/s.PrinterMakeAndModel.java
+javax/print/attribute/standard/SCCS/s.PrinterMessageFromOperator.java
+javax/print/attribute/standard/SCCS/s.PrinterMoreInfo.java
+javax/print/attribute/standard/SCCS/s.PrinterMoreInfoManufacturer.java
+javax/print/attribute/standard/SCCS/s.Sides.java
+javax/print/attribute/standard/SCCS/s.PrinterState.java
+javax/print/attribute/standard/SCCS/s.PrinterStateReason.java
+javax/print/attribute/standard/SCCS/s.PrinterStateReasons.java
+javax/print/attribute/standard/SCCS/s.PrinterURI.java
+javax/print/attribute/standard/SCCS/s.QueuedJobCount.java
+javax/print/attribute/standard/SCCS/s.ReferenceUriSchemesSupported.java
+javax/print/attribute/standard/SCCS/s.RequestingUserName.java
+javax/print/attribute/standard/SCCS/s.SheetCollate.java
+javax/print/attribute/standard/SCCS/s.package.html
+javax/print/attribute/standard/CopiesSupported.java
+javax/print/attribute/standard/Chromaticity.java
+javax/print/attribute/standard/ColorSupported.java
+javax/print/attribute/standard/Compression.java
+javax/print/attribute/standard/Copies.java
+javax/print/attribute/standard/MediaName.java
+javax/print/attribute/standard/Media.java
+javax/print/attribute/standard/DateTimeAtCompleted.java
+javax/print/attribute/standard/DateTimeAtCreation.java
+javax/print/attribute/standard/DateTimeAtProcessing.java
+javax/print/attribute/standard/Destination.java
+javax/print/attribute/standard/DocumentName.java
+javax/print/attribute/standard/Fidelity.java
+javax/print/attribute/standard/Finishings.java
+javax/print/attribute/standard/JobHoldUntil.java
+javax/print/attribute/standard/JobImpressions.java
+javax/print/attribute/standard/JobKOctets.java
+javax/print/attribute/standard/JobImpressionsCompleted.java
+javax/print/attribute/standard/JobImpressionsSupported.java
+javax/print/attribute/standard/JobKOctetsProcessed.java
+javax/print/attribute/standard/JobKOctetsSupported.java
+javax/print/attribute/standard/JobMediaSheets.java
+javax/print/attribute/standard/JobMediaSheetsCompleted.java
+javax/print/attribute/standard/JobMediaSheetsSupported.java
+javax/print/attribute/standard/JobMessageFromOperator.java
+javax/print/attribute/standard/JobName.java
+javax/print/attribute/standard/JobOriginatingUserName.java
+javax/print/attribute/standard/JobPriority.java
+javax/print/attribute/standard/JobPrioritySupported.java
+javax/print/attribute/standard/JobSheets.java
+javax/print/attribute/standard/JobState.java
+javax/print/attribute/standard/JobStateReason.java
+javax/print/attribute/standard/JobStateReasons.java
+javax/print/attribute/standard/MultipleDocumentHandling.java
+javax/print/attribute/standard/MediaPrintableArea.java
+javax/print/attribute/standard/MediaSize.java
+javax/print/attribute/standard/MediaSizeName.java
+javax/print/attribute/standard/MediaTray.java
+javax/print/attribute/standard/NumberOfInterveningJobs.java
+javax/print/attribute/standard/NumberOfDocuments.java
+javax/print/attribute/standard/NumberUpSupported.java
+javax/print/attribute/standard/NumberUp.java
+javax/print/attribute/standard/PrinterMessageFromOperator.java
+javax/print/attribute/standard/OrientationRequested.java
+javax/print/attribute/standard/OutputDeviceAssigned.java
+javax/print/attribute/standard/PDLOverrideSupported.java
+javax/print/attribute/standard/PageRanges.java
+javax/print/attribute/standard/PagesPerMinute.java
+javax/print/attribute/standard/PagesPerMinuteColor.java
+javax/print/attribute/standard/PresentationDirection.java
+javax/print/attribute/standard/PrintQuality.java
+javax/print/attribute/standard/PrinterInfo.java
+javax/print/attribute/standard/PrinterIsAcceptingJobs.java
+javax/print/attribute/standard/PrinterLocation.java
+javax/print/attribute/standard/PrinterMakeAndModel.java
+javax/print/attribute/standard/PrinterMoreInfo.java
+javax/print/attribute/standard/PrinterName.java
+javax/print/attribute/standard/ReferenceUriSchemesSupported.java
+javax/print/attribute/standard/PrinterMoreInfoManufacturer.java
+javax/print/attribute/standard/PrinterResolution.java
+javax/print/attribute/standard/PrinterState.java
+javax/print/attribute/standard/PrinterStateReason.java
+javax/print/attribute/standard/PrinterStateReasons.java
+javax/print/attribute/standard/PrinterURI.java
+javax/print/attribute/standard/QueuedJobCount.java
+javax/print/attribute/standard/RequestingUserName.java
+javax/print/attribute/standard/Severity.java
+javax/print/attribute/standard/SheetCollate.java
+javax/print/attribute/standard/Sides.java
+javax/print/attribute/standard/package.html
+javax/print/attribute/AttributeSet.java
+javax/print/attribute/Attribute.java
+javax/print/attribute/HashPrintRequestAttributeSet.java
+javax/print/attribute/AttributeSetUtilities.java
+javax/print/attribute/DateTimeSyntax.java
+javax/print/attribute/DocAttribute.java
+javax/print/attribute/DocAttributeSet.java
+javax/print/attribute/EnumSyntax.java
+javax/print/attribute/HashAttributeSet.java
+javax/print/attribute/HashDocAttributeSet.java
+javax/print/attribute/HashPrintJobAttributeSet.java
+javax/print/attribute/HashPrintServiceAttributeSet.java
+javax/print/attribute/IntegerSyntax.java
+javax/print/attribute/Size2DSyntax.java
+javax/print/attribute/PrintJobAttribute.java
+javax/print/attribute/PrintJobAttributeSet.java
+javax/print/attribute/PrintRequestAttribute.java
+javax/print/attribute/PrintRequestAttributeSet.java
+javax/print/attribute/PrintServiceAttribute.java
+javax/print/attribute/PrintServiceAttributeSet.java
+javax/print/attribute/ResolutionSyntax.java
+javax/print/attribute/SetOfIntegerSyntax.java
+javax/print/attribute/SupportedValuesAttribute.java
+javax/print/attribute/TextSyntax.java
+javax/print/attribute/URISyntax.java
+javax/print/attribute/UnmodifiableSetException.java
+javax/print/attribute/package.html
+javax/print/event
+javax/print/event/SCCS
+javax/print/event/SCCS/s.PrintJobAdapter.java
+javax/print/event/SCCS/s.PrintEvent.java
+javax/print/event/SCCS/s.PrintServiceAttributeListener.java
+javax/print/event/SCCS/s.PrintJobAttributeEvent.java
+javax/print/event/SCCS/s.PrintJobAttributeListener.java
+javax/print/event/SCCS/s.PrintJobEvent.java
+javax/print/event/SCCS/s.PrintJobListener.java
+javax/print/event/SCCS/s.PrintServiceAttributeEvent.java
+javax/print/event/SCCS/s.package.html
+javax/print/event/PrintJobAdapter.java
+javax/print/event/PrintEvent.java
+javax/print/event/PrintJobAttributeListener.java
+javax/print/event/PrintJobAttributeEvent.java
+javax/print/event/PrintServiceAttributeEvent.java
+javax/print/event/PrintJobEvent.java
+javax/print/event/PrintJobListener.java
+javax/print/event/PrintServiceAttributeListener.java
+javax/print/event/package.html
+javax/print/MultiDocPrintService.java
+javax/print/AttributeException.java
+javax/print/CancelablePrintJob.java
+javax/print/Doc.java
+javax/print/DocFlavor.java
+javax/print/DocPrintJob.java
+javax/print/FlavorException.java
+javax/print/MimeType.java
+javax/print/MultiDoc.java
+javax/print/MultiDocPrintJob.java
+javax/print/StreamPrintServiceFactory.java
+javax/print/PrintException.java
+javax/print/PrintService.java
+javax/print/PrintServiceLookup.java
+javax/print/ServiceUI.java
+javax/print/ServiceUIFactory.java
+javax/print/SimpleDoc.java
+javax/print/StreamPrintService.java
+javax/print/URIException.java
+javax/print/package.html
+javax/rmi
+javax/rmi/CORBA
+javax/rmi/CORBA/SCCS
+javax/rmi/CORBA/SCCS/s.ClassDesc.java
+javax/rmi/CORBA/SCCS/s.Stub.java
+javax/rmi/CORBA/SCCS/s.StubDelegate.java
+javax/rmi/CORBA/SCCS/s.GetORBPropertiesFileAction.java
+javax/rmi/CORBA/SCCS/s.PortableRemoteObjectDelegate.java
+javax/rmi/CORBA/SCCS/s.Tie.java
+javax/rmi/CORBA/SCCS/s.Util.java
+javax/rmi/CORBA/SCCS/s.UtilDelegate.java
+javax/rmi/CORBA/SCCS/s.ValueHandler.java
+javax/rmi/CORBA/SCCS/s.package.html
+javax/rmi/CORBA/SCCS/s.ValueHandlerMultiFormat.java
+javax/rmi/CORBA/ClassDesc.java
+javax/rmi/CORBA/Stub.java
+javax/rmi/CORBA/Tie.java
+javax/rmi/CORBA/ValueHandlerMultiFormat.java
+javax/rmi/CORBA/GetORBPropertiesFileAction.java
+javax/rmi/CORBA/PortableRemoteObjectDelegate.java
+javax/rmi/CORBA/StubDelegate.java
+javax/rmi/CORBA/Util.java
+javax/rmi/CORBA/UtilDelegate.java
+javax/rmi/CORBA/ValueHandler.java
+javax/rmi/CORBA/package.html
+javax/rmi/SCCS
+javax/rmi/SCCS/s.PortableRemoteObject.java
+javax/rmi/SCCS/s.package.html
+javax/rmi/ssl
+javax/rmi/ssl/SCCS
+javax/rmi/ssl/SCCS/s.SslRMIClientSocketFactory.java
+javax/rmi/ssl/SCCS/s.SslRMIServerSocketFactory.java
+javax/rmi/ssl/SCCS/s.package.html
+javax/rmi/ssl/SslRMIClientSocketFactory.java
+javax/rmi/ssl/SslRMIServerSocketFactory.java
+javax/rmi/ssl/package.html
+javax/rmi/PortableRemoteObject.java
+javax/rmi/package.html
+javax/security
+javax/security/auth
+javax/security/auth/SCCS
+javax/security/auth/SCCS/s.DestroyFailedException.java
+javax/security/auth/SCCS/s.AuthPermission.java
+javax/security/auth/SCCS/s.Destroyable.java
+javax/security/auth/SCCS/s.Policy.java
+javax/security/auth/SCCS/s.Refreshable.java
+javax/security/auth/SCCS/s.Subject.java
+javax/security/auth/SCCS/s.PrivateCredentialPermission.java
+javax/security/auth/SCCS/s.RefreshFailedException.java
+javax/security/auth/SCCS/s.package.html
+javax/security/auth/SCCS/s.SubjectDomainCombiner.java
+javax/security/auth/callback
+javax/security/auth/callback/SCCS
+javax/security/auth/callback/SCCS/s.CallbackHandler.java
+javax/security/auth/callback/SCCS/s.Callback.java
+javax/security/auth/callback/SCCS/s.ConfirmationCallback.java
+javax/security/auth/callback/SCCS/s.ChoiceCallback.java
+javax/security/auth/callback/SCCS/s.UnsupportedCallbackException.java
+javax/security/auth/callback/SCCS/s.LanguageCallback.java
+javax/security/auth/callback/SCCS/s.NameCallback.java
+javax/security/auth/callback/SCCS/s.PasswordCallback.java
+javax/security/auth/callback/SCCS/s.TextInputCallback.java
+javax/security/auth/callback/SCCS/s.TextOutputCallback.java
+javax/security/auth/callback/SCCS/s.package.html
+javax/security/auth/callback/CallbackHandler.java
+javax/security/auth/callback/Callback.java
+javax/security/auth/callback/ConfirmationCallback.java
+javax/security/auth/callback/ChoiceCallback.java
+javax/security/auth/callback/LanguageCallback.java
+javax/security/auth/callback/NameCallback.java
+javax/security/auth/callback/PasswordCallback.java
+javax/security/auth/callback/TextInputCallback.java
+javax/security/auth/callback/TextOutputCallback.java
+javax/security/auth/callback/package.html
+javax/security/auth/callback/UnsupportedCallbackException.java
+javax/security/auth/kerberos
+javax/security/auth/kerberos/SCCS
+javax/security/auth/kerberos/SCCS/s.DelegationPermission.java
+javax/security/auth/kerberos/SCCS/s.KerberosKey.java
+javax/security/auth/kerberos/SCCS/s.KerberosPrincipal.java
+javax/security/auth/kerberos/SCCS/s.KerberosTicket.java
+javax/security/auth/kerberos/SCCS/s.KeyImpl.java
+javax/security/auth/kerberos/SCCS/s.ServicePermission.java
+javax/security/auth/kerberos/SCCS/s.package.html
+javax/security/auth/kerberos/DelegationPermission.java
+javax/security/auth/kerberos/KerberosKey.java
+javax/security/auth/kerberos/KerberosPrincipal.java
+javax/security/auth/kerberos/KerberosTicket.java
+javax/security/auth/kerberos/KeyImpl.java
+javax/security/auth/kerberos/ServicePermission.java
+javax/security/auth/kerberos/package.html
+javax/security/auth/login
+javax/security/auth/login/SCCS
+javax/security/auth/login/SCCS/s.AccountExpiredException.java
+javax/security/auth/login/SCCS/s.AccountException.java
+javax/security/auth/login/SCCS/s.CredentialExpiredException.java
+javax/security/auth/login/SCCS/s.AccountLockedException.java
+javax/security/auth/login/SCCS/s.AccountNotFoundException.java
+javax/security/auth/login/SCCS/s.AppConfigurationEntry.java
+javax/security/auth/login/SCCS/s.Configuration.java
+javax/security/auth/login/SCCS/s.CredentialException.java
+javax/security/auth/login/SCCS/s.CredentialNotFoundException.java
+javax/security/auth/login/SCCS/s.FailedLoginException.java
+javax/security/auth/login/SCCS/s.LoginContext.java
+javax/security/auth/login/SCCS/s.LoginException.java
+javax/security/auth/login/SCCS/s.package.html
+javax/security/auth/login/AccountExpiredException.java
+javax/security/auth/login/AccountException.java
+javax/security/auth/login/AccountNotFoundException.java
+javax/security/auth/login/AccountLockedException.java
+javax/security/auth/login/CredentialNotFoundException.java
+javax/security/auth/login/AppConfigurationEntry.java
+javax/security/auth/login/Configuration.java
+javax/security/auth/login/CredentialException.java
+javax/security/auth/login/CredentialExpiredException.java
+javax/security/auth/login/FailedLoginException.java
+javax/security/auth/login/LoginContext.java
+javax/security/auth/login/LoginException.java
+javax/security/auth/login/package.html
+javax/security/auth/spi
+javax/security/auth/spi/SCCS
+javax/security/auth/spi/SCCS/s.LoginModule.java
+javax/security/auth/spi/SCCS/s.package.html
+javax/security/auth/spi/LoginModule.java
+javax/security/auth/spi/package.html
+javax/security/auth/x500
+javax/security/auth/x500/SCCS
+javax/security/auth/x500/SCCS/s.X500PrivateCredential.java
+javax/security/auth/x500/SCCS/s.X500Principal.java
+javax/security/auth/x500/SCCS/s.package.html
+javax/security/auth/x500/X500PrivateCredential.java
+javax/security/auth/x500/X500Principal.java
+javax/security/auth/x500/package.html
+javax/security/auth/DestroyFailedException.java
+javax/security/auth/AuthPermission.java
+javax/security/auth/RefreshFailedException.java
+javax/security/auth/Destroyable.java
+javax/security/auth/Policy.java
+javax/security/auth/PrivateCredentialPermission.java
+javax/security/auth/Refreshable.java
+javax/security/auth/Subject.java
+javax/security/auth/SubjectDomainCombiner.java
+javax/security/auth/package.html
+javax/security/sasl
+javax/security/sasl/SCCS
+javax/security/sasl/SCCS/s.SaslClient.java
+javax/security/sasl/SCCS/s.Sasl.java
+javax/security/sasl/SCCS/s.AuthenticationException.java
+javax/security/sasl/SCCS/s.AuthorizeCallback.java
+javax/security/sasl/SCCS/s.RealmCallback.java
+javax/security/sasl/SCCS/s.RealmChoiceCallback.java
+javax/security/sasl/SCCS/s.SaslClientFactory.java
+javax/security/sasl/SCCS/s.SaslException.java
+javax/security/sasl/SCCS/s.SaslServer.java
+javax/security/sasl/SCCS/s.SaslServerFactory.java
+javax/security/sasl/SCCS/s.package.html
+javax/security/sasl/SaslClient.java
+javax/security/sasl/Sasl.java
+javax/security/sasl/AuthenticationException.java
+javax/security/sasl/AuthorizeCallback.java
+javax/security/sasl/RealmCallback.java
+javax/security/sasl/RealmChoiceCallback.java
+javax/security/sasl/SaslClientFactory.java
+javax/security/sasl/SaslException.java
+javax/security/sasl/SaslServer.java
+javax/security/sasl/SaslServerFactory.java
+javax/security/sasl/package.html
+javax/sound
+javax/sound/midi
+javax/sound/midi/SCCS
+javax/sound/midi/SCCS/s.Sequencer.java
+javax/sound/midi/SCCS/s.ControllerEventListener.java
+javax/sound/midi/SCCS/s.Instrument.java
+javax/sound/midi/SCCS/s.InvalidMidiDataException.java
+javax/sound/midi/SCCS/s.MetaEventListener.java
+javax/sound/midi/SCCS/s.MetaMessage.java
+javax/sound/midi/SCCS/s.MidiChannel.java
+javax/sound/midi/SCCS/s.MidiDevice.java
+javax/sound/midi/SCCS/s.MidiEvent.java
+javax/sound/midi/SCCS/s.MidiFileFormat.java
+javax/sound/midi/SCCS/s.MidiMessage.java
+javax/sound/midi/SCCS/s.MidiSystem.java
+javax/sound/midi/SCCS/s.MidiUnavailableException.java
+javax/sound/midi/SCCS/s.Patch.java
+javax/sound/midi/SCCS/s.Receiver.java
+javax/sound/midi/SCCS/s.Sequence.java
+javax/sound/midi/SCCS/s.SoundbankResource.java
+javax/sound/midi/SCCS/s.ShortMessage.java
+javax/sound/midi/SCCS/s.Soundbank.java
+javax/sound/midi/SCCS/s.Synthesizer.java
+javax/sound/midi/SCCS/s.SysexMessage.java
+javax/sound/midi/SCCS/s.Track.java
+javax/sound/midi/SCCS/s.Transmitter.java
+javax/sound/midi/SCCS/s.VoiceStatus.java
+javax/sound/midi/SCCS/s.package.html
+javax/sound/midi/spi
+javax/sound/midi/spi/SCCS
+javax/sound/midi/spi/SCCS/s.MidiDeviceProvider.java
+javax/sound/midi/spi/SCCS/s.MidiFileReader.java
+javax/sound/midi/spi/SCCS/s.MidiFileWriter.java
+javax/sound/midi/spi/SCCS/s.SoundbankReader.java
+javax/sound/midi/spi/SCCS/s.package.html
+javax/sound/midi/spi/MidiDeviceProvider.java
+javax/sound/midi/spi/MidiFileReader.java
+javax/sound/midi/spi/MidiFileWriter.java
+javax/sound/midi/spi/SoundbankReader.java
+javax/sound/midi/spi/package.html
+javax/sound/midi/Receiver.java
+javax/sound/midi/Patch.java
+javax/sound/midi/ControllerEventListener.java
+javax/sound/midi/Instrument.java
+javax/sound/midi/InvalidMidiDataException.java
+javax/sound/midi/MetaEventListener.java
+javax/sound/midi/MetaMessage.java
+javax/sound/midi/MidiChannel.java
+javax/sound/midi/MidiDevice.java
+javax/sound/midi/MidiEvent.java
+javax/sound/midi/MidiFileFormat.java
+javax/sound/midi/MidiMessage.java
+javax/sound/midi/MidiSystem.java
+javax/sound/midi/MidiUnavailableException.java
+javax/sound/midi/ShortMessage.java
+javax/sound/midi/Sequence.java
+javax/sound/midi/Sequencer.java
+javax/sound/midi/SoundbankResource.java
+javax/sound/midi/Soundbank.java
+javax/sound/midi/Synthesizer.java
+javax/sound/midi/SysexMessage.java
+javax/sound/midi/Track.java
+javax/sound/midi/Transmitter.java
+javax/sound/midi/VoiceStatus.java
+javax/sound/midi/package.html
+javax/sound/sampled
+javax/sound/sampled/SCCS
+javax/sound/sampled/SCCS/s.AudioFileFormat.java
+javax/sound/sampled/SCCS/s.AudioFormat.java
+javax/sound/sampled/SCCS/s.AudioInputStream.java
+javax/sound/sampled/SCCS/s.AudioPermission.java
+javax/sound/sampled/SCCS/s.AudioSystem.java
+javax/sound/sampled/SCCS/s.BooleanControl.java
+javax/sound/sampled/SCCS/s.Clip.java
+javax/sound/sampled/SCCS/s.CompoundControl.java
+javax/sound/sampled/SCCS/s.Control.java
+javax/sound/sampled/SCCS/s.DataLine.java
+javax/sound/sampled/SCCS/s.EnumControl.java
+javax/sound/sampled/SCCS/s.FloatControl.java
+javax/sound/sampled/SCCS/s.Line.java
+javax/sound/sampled/SCCS/s.LineEvent.java
+javax/sound/sampled/SCCS/s.LineListener.java
+javax/sound/sampled/SCCS/s.Mixer.java
+javax/sound/sampled/SCCS/s.UnsupportedAudioFileException.java
+javax/sound/sampled/SCCS/s.LineUnavailableException.java
+javax/sound/sampled/SCCS/s.Port.java
+javax/sound/sampled/SCCS/s.ReverbType.java
+javax/sound/sampled/SCCS/s.SourceDataLine.java
+javax/sound/sampled/SCCS/s.TargetDataLine.java
+javax/sound/sampled/SCCS/s.package.html
+javax/sound/sampled/spi
+javax/sound/sampled/spi/SCCS
+javax/sound/sampled/spi/SCCS/s.FormatConversionProvider.java
+javax/sound/sampled/spi/SCCS/s.AudioFileReader.java
+javax/sound/sampled/spi/SCCS/s.AudioFileWriter.java
+javax/sound/sampled/spi/SCCS/s.MixerProvider.java
+javax/sound/sampled/spi/SCCS/s.package.html
+javax/sound/sampled/spi/FormatConversionProvider.java
+javax/sound/sampled/spi/AudioFileReader.java
+javax/sound/sampled/spi/AudioFileWriter.java
+javax/sound/sampled/spi/MixerProvider.java
+javax/sound/sampled/spi/package.html
+javax/sound/sampled/AudioFileFormat.java
+javax/sound/sampled/AudioFormat.java
+javax/sound/sampled/AudioInputStream.java
+javax/sound/sampled/AudioPermission.java
+javax/sound/sampled/AudioSystem.java
+javax/sound/sampled/BooleanControl.java
+javax/sound/sampled/Clip.java
+javax/sound/sampled/CompoundControl.java
+javax/sound/sampled/Control.java
+javax/sound/sampled/DataLine.java
+javax/sound/sampled/EnumControl.java
+javax/sound/sampled/FloatControl.java
+javax/sound/sampled/Line.java
+javax/sound/sampled/LineEvent.java
+javax/sound/sampled/LineListener.java
+javax/sound/sampled/Mixer.java
+javax/sound/sampled/SourceDataLine.java
+javax/sound/sampled/LineUnavailableException.java
+javax/sound/sampled/Port.java
+javax/sound/sampled/ReverbType.java
+javax/sound/sampled/TargetDataLine.java
+javax/sound/sampled/package.html
+javax/sound/sampled/UnsupportedAudioFileException.java
+javax/sql
+javax/sql/SCCS
+javax/sql/SCCS/s.ConnectionEventListener.java
+javax/sql/SCCS/s.ConnectionEvent.java
+javax/sql/SCCS/s.ConnectionPoolDataSource.java
+javax/sql/SCCS/s.DataSource.java
+javax/sql/SCCS/s.PooledConnection.java
+javax/sql/SCCS/s.RowSet.java
+javax/sql/SCCS/s.RowSetEvent.java
+javax/sql/SCCS/s.RowSetInternal.java
+javax/sql/SCCS/s.RowSetListener.java
+javax/sql/SCCS/s.RowSetMetaData.java
+javax/sql/SCCS/s.RowSetReader.java
+javax/sql/SCCS/s.RowSetWriter.java
+javax/sql/SCCS/s.XAConnection.java
+javax/sql/SCCS/s.XADataSource.java
+javax/sql/SCCS/s.package.html
+javax/sql/rowset
+javax/sql/rowset/SCCS
+javax/sql/rowset/SCCS/s.FilteredRowSet.java
+javax/sql/rowset/SCCS/s.BaseRowSet.java
+javax/sql/rowset/SCCS/s.CachedRowSet.java
+javax/sql/rowset/SCCS/s.RowSetMetaDataImpl.java
+javax/sql/rowset/SCCS/s.JdbcRowSet.java
+javax/sql/rowset/SCCS/s.JoinRowSet.java
+javax/sql/rowset/SCCS/s.Joinable.java
+javax/sql/rowset/SCCS/s.Predicate.java
+javax/sql/rowset/SCCS/s.RowSetWarning.java
+javax/sql/rowset/SCCS/s.WebRowSet.java
+javax/sql/rowset/SCCS/s.package.html
+javax/sql/rowset/SCCS/s.rowset.properties
+javax/sql/rowset/SCCS/s.sqlxml.xsd
+javax/sql/rowset/SCCS/s.webrowset.xsd
+javax/sql/rowset/serial
+javax/sql/rowset/serial/SCCS
+javax/sql/rowset/serial/SCCS/s.SQLOutputImpl.java
+javax/sql/rowset/serial/SCCS/s.SQLInputImpl.java
+javax/sql/rowset/serial/SCCS/s.SerialArray.java
+javax/sql/rowset/serial/SCCS/s.SerialBlob.java
+javax/sql/rowset/serial/SCCS/s.SerialClob.java
+javax/sql/rowset/serial/SCCS/s.SerialDatalink.java
+javax/sql/rowset/serial/SCCS/s.SerialException.java
+javax/sql/rowset/serial/SCCS/s.SerialJavaObject.java
+javax/sql/rowset/serial/SCCS/s.SerialRef.java
+javax/sql/rowset/serial/SCCS/s.SerialStruct.java
+javax/sql/rowset/serial/SCCS/s.package.html
+javax/sql/rowset/serial/SerialException.java
+javax/sql/rowset/serial/SQLInputImpl.java
+javax/sql/rowset/serial/SQLOutputImpl.java
+javax/sql/rowset/serial/SerialArray.java
+javax/sql/rowset/serial/SerialBlob.java
+javax/sql/rowset/serial/SerialClob.java
+javax/sql/rowset/serial/SerialDatalink.java
+javax/sql/rowset/serial/SerialJavaObject.java
+javax/sql/rowset/serial/SerialRef.java
+javax/sql/rowset/serial/SerialStruct.java
+javax/sql/rowset/serial/package.html
+javax/sql/rowset/spi
+javax/sql/rowset/spi/SCCS
+javax/sql/rowset/spi/SCCS/s.SyncFactoryException.java
+javax/sql/rowset/spi/SCCS/s.SyncFactory.java
+javax/sql/rowset/spi/SCCS/s.SyncProvider.java
+javax/sql/rowset/spi/SCCS/s.SyncResolver.java
+javax/sql/rowset/spi/SCCS/s.package.html
+javax/sql/rowset/spi/SCCS/s.SyncProviderException.java
+javax/sql/rowset/spi/SCCS/s.TransactionalWriter.java
+javax/sql/rowset/spi/SCCS/s.XmlReader.java
+javax/sql/rowset/spi/SCCS/s.XmlWriter.java
+javax/sql/rowset/spi/SyncFactoryException.java
+javax/sql/rowset/spi/SyncFactory.java
+javax/sql/rowset/spi/SyncProviderException.java
+javax/sql/rowset/spi/SyncProvider.java
+javax/sql/rowset/spi/TransactionalWriter.java
+javax/sql/rowset/spi/SyncResolver.java
+javax/sql/rowset/spi/XmlReader.java
+javax/sql/rowset/spi/XmlWriter.java
+javax/sql/rowset/spi/package.html
+javax/sql/rowset/CachedRowSet.java
+javax/sql/rowset/BaseRowSet.java
+javax/sql/rowset/FilteredRowSet.java
+javax/sql/rowset/JdbcRowSet.java
+javax/sql/rowset/JoinRowSet.java
+javax/sql/rowset/Joinable.java
+javax/sql/rowset/Predicate.java
+javax/sql/rowset/RowSetMetaDataImpl.java
+javax/sql/rowset/RowSetWarning.java
+javax/sql/rowset/WebRowSet.java
+javax/sql/rowset/package.html
+javax/sql/rowset/rowset.properties
+javax/sql/rowset/sqlxml.xsd
+javax/sql/rowset/webrowset.xsd
+javax/sql/ConnectionEventListener.java
+javax/sql/ConnectionEvent.java
+javax/sql/RowSetEvent.java
+javax/sql/RowSet.java
+javax/sql/ConnectionPoolDataSource.java
+javax/sql/DataSource.java
+javax/sql/PooledConnection.java
+javax/sql/RowSetInternal.java
+javax/sql/RowSetListener.java
+javax/sql/RowSetMetaData.java
+javax/sql/RowSetReader.java
+javax/sql/RowSetWriter.java
+javax/sql/XAConnection.java
+javax/sql/XADataSource.java
+javax/sql/package.html
+javax/swing
+javax/swing/SCCS
+javax/swing/SCCS/s.AbstractAction.java
+javax/swing/SCCS/s.AbstractButton.java
+javax/swing/SCCS/s.Action.java
+javax/swing/SCCS/s.AbstractActionPropertyChangeListener.java
+javax/swing/SCCS/s.AbstractCellEditor.java
+javax/swing/SCCS/s.AbstractListModel.java
+javax/swing/SCCS/s.AbstractSpinnerModel.java
+javax/swing/SCCS/s.ActionMap.java
+javax/swing/SCCS/s.AncestorNotifier.java
+javax/swing/SCCS/s.ArrayTable.java
+javax/swing/SCCS/s.Autoscroller.java
+javax/swing/SCCS/s.BorderFactory.java
+javax/swing/SCCS/s.BoundedRangeModel.java
+javax/swing/SCCS/s.Box.java
+javax/swing/SCCS/s.CellRendererPane.java
+javax/swing/SCCS/s.BoxLayout.java
+javax/swing/SCCS/s.ButtonGroup.java
+javax/swing/SCCS/s.ButtonModel.java
+javax/swing/SCCS/s.CellEditor.java
+javax/swing/SCCS/s.ComponentInputMap.java
+javax/swing/SCCS/s.ComboBoxEditor.java
+javax/swing/SCCS/s.ComboBoxModel.java
+javax/swing/SCCS/s.DebugGraphicsObserver.java
+javax/swing/SCCS/s.DebugGraphics.java
+javax/swing/SCCS/s.DebugGraphicsFilter.java
+javax/swing/SCCS/s.DebugGraphicsInfo.java
+javax/swing/SCCS/s.DefaultDesktopManager.java
+javax/swing/SCCS/s.DefaultBoundedRangeModel.java
+javax/swing/SCCS/s.DefaultButtonModel.java
+javax/swing/SCCS/s.DefaultCellEditor.java
+javax/swing/SCCS/s.DefaultComboBoxModel.java
+javax/swing/SCCS/s.DefaultListCellRenderer.java
+javax/swing/SCCS/s.DefaultFocusManager.java
+javax/swing/SCCS/s.DefaultListModel.java
+javax/swing/SCCS/s.DesktopManager.java
+javax/swing/SCCS/s.Icon.java
+javax/swing/SCCS/s.DefaultListSelectionModel.java
+javax/swing/SCCS/s.DefaultSingleSelectionModel.java
+javax/swing/SCCS/s.DelegatingDefaultFocusManager.java
+javax/swing/SCCS/s.FocusManager.java
+javax/swing/SCCS/s.GraphicsWrapper.java
+javax/swing/SCCS/s.GrayFilter.java
+javax/swing/SCCS/s.ImageIcon.java
+javax/swing/SCCS/s.InputMap.java
+javax/swing/SCCS/s.JCheckBoxMenuItem.java
+javax/swing/SCCS/s.InputVerifier.java
+javax/swing/SCCS/s.JApplet.java
+javax/swing/SCCS/s.JButton.java
+javax/swing/SCCS/s.InternalFrameFocusTraversalPolicy.java
+javax/swing/SCCS/s.JCheckBox.java
+javax/swing/SCCS/s.JColorChooser.java
+javax/swing/SCCS/s.JComboBox.java
+javax/swing/SCCS/s.JComponent.java
+javax/swing/SCCS/s.JDesktopPane.java
+javax/swing/SCCS/s.JDialog.java
+javax/swing/SCCS/s.JEditorPane.java
+javax/swing/SCCS/s.JFileChooser.java
+javax/swing/SCCS/s.JFormattedTextField.java
+javax/swing/SCCS/s.JFrame.java
+javax/swing/SCCS/s.JInternalFrame.java
+javax/swing/SCCS/s.JLabel.java
+javax/swing/SCCS/s.JRadioButtonMenuItem.java
+javax/swing/SCCS/s.JLayeredPane.java
+javax/swing/SCCS/s.JList.java
+javax/swing/SCCS/s.JMenu.java
+javax/swing/SCCS/s.JMenuBar.java
+javax/swing/SCCS/s.JMenuItem.java
+javax/swing/SCCS/s.JOptionPane.java
+javax/swing/SCCS/s.JPanel.java
+javax/swing/SCCS/s.JPasswordField.java
+javax/swing/SCCS/s.JPopupMenu.java
+javax/swing/SCCS/s.JProgressBar.java
+javax/swing/SCCS/s.JRadioButton.java
+javax/swing/SCCS/s.JRootPane.java
+javax/swing/SCCS/s.JScrollBar.java
+javax/swing/SCCS/s.JScrollPane.java
+javax/swing/SCCS/s.JSeparator.java
+javax/swing/SCCS/s.JSlider.java
+javax/swing/SCCS/s.JSpinner.java
+javax/swing/SCCS/s.JViewport.java
+javax/swing/SCCS/s.JToolBar.java
+javax/swing/SCCS/s.JSplitPane.java
+javax/swing/SCCS/s.JTabbedPane.java
+javax/swing/SCCS/s.JTable.java
+javax/swing/SCCS/s.JTextArea.java
+javax/swing/SCCS/s.JTextField.java
+javax/swing/SCCS/s.JTextPane.java
+javax/swing/SCCS/s.JToggleButton.java
+javax/swing/SCCS/s.JToolTip.java
+javax/swing/SCCS/s.JTree.java
+javax/swing/SCCS/s.KeyStroke.java
+javax/swing/SCCS/s.JWindow.java
+javax/swing/SCCS/s.KeyboardManager.java
+javax/swing/SCCS/s.LayoutComparator.java
+javax/swing/SCCS/s.Popup.java
+javax/swing/SCCS/s.LayoutFocusTraversalPolicy.java
+javax/swing/SCCS/s.LegacyGlueFocusTraversalPolicy.java
+javax/swing/SCCS/s.ProgressMonitor.java
+javax/swing/SCCS/s.ListCellRenderer.java
+javax/swing/SCCS/s.ListModel.java
+javax/swing/SCCS/s.ListSelectionModel.java
+javax/swing/SCCS/s.LookAndFeel.java
+javax/swing/SCCS/s.MenuElement.java
+javax/swing/SCCS/s.MenuSelectionManager.java
+javax/swing/SCCS/s.MultiUIDefaults.java
+javax/swing/SCCS/s.MutableComboBoxModel.java
+javax/swing/SCCS/s.OverlayLayout.java
+javax/swing/SCCS/s.PopupFactory.java
+javax/swing/SCCS/s.ProgressMonitorInputStream.java
+javax/swing/SCCS/s.Renderer.java
+javax/swing/SCCS/s.RepaintManager.java
+javax/swing/SCCS/s.RootPaneContainer.java
+javax/swing/SCCS/s.package.html
+javax/swing/SCCS/s.ScrollPaneConstants.java
+javax/swing/SCCS/s.ScrollPaneLayout.java
+javax/swing/SCCS/s.Scrollable.java
+javax/swing/SCCS/s.SingleSelectionModel.java
+javax/swing/SCCS/s.SizeRequirements.java
+javax/swing/SCCS/s.SizeSequence.java
+javax/swing/SCCS/s.SortingFocusTraversalPolicy.java
+javax/swing/SCCS/s.SpinnerDateModel.java
+javax/swing/SCCS/s.SpinnerListModel.java
+javax/swing/SCCS/s.SpinnerModel.java
+javax/swing/SCCS/s.SpinnerNumberModel.java
+javax/swing/SCCS/s.Spring.java
+javax/swing/SCCS/s.SpringLayout.java
+javax/swing/SCCS/s.SwingConstants.java
+javax/swing/SCCS/s.SwingUtilities.java
+javax/swing/SCCS/s.TablePrintable.java
+javax/swing/SCCS/s.Timer.java
+javax/swing/SCCS/s.SystemEventQueueUtilities.java
+javax/swing/SCCS/s.TimerQueue.java
+javax/swing/SCCS/s.ToolTipManager.java
+javax/swing/SCCS/s.TransferHandler.java
+javax/swing/SCCS/s.UIDefaults.java
+javax/swing/SCCS/s.UIManager.java
+javax/swing/SCCS/s.UnsupportedLookAndFeelException.java
+javax/swing/SCCS/s.ViewportLayout.java
+javax/swing/SCCS/s.WindowConstants.java
+javax/swing/border
+javax/swing/border/SCCS
+javax/swing/border/SCCS/s.AbstractBorder.java
+javax/swing/border/SCCS/s.BevelBorder.java
+javax/swing/border/SCCS/s.Border.java
+javax/swing/border/SCCS/s.CompoundBorder.java
+javax/swing/border/SCCS/s.EmptyBorder.java
+javax/swing/border/SCCS/s.EtchedBorder.java
+javax/swing/border/SCCS/s.LineBorder.java
+javax/swing/border/SCCS/s.MatteBorder.java
+javax/swing/border/SCCS/s.SoftBevelBorder.java
+javax/swing/border/SCCS/s.TitledBorder.java
+javax/swing/border/SCCS/s.package.html
+javax/swing/border/SoftBevelBorder.java
+javax/swing/border/AbstractBorder.java
+javax/swing/border/BevelBorder.java
+javax/swing/border/Border.java
+javax/swing/border/CompoundBorder.java
+javax/swing/border/EmptyBorder.java
+javax/swing/border/EtchedBorder.java
+javax/swing/border/LineBorder.java
+javax/swing/border/MatteBorder.java
+javax/swing/border/TitledBorder.java
+javax/swing/border/package.html
+javax/swing/colorchooser
+javax/swing/colorchooser/SCCS
+javax/swing/colorchooser/SCCS/s.AbstractColorChooserPanel.java
+javax/swing/colorchooser/SCCS/s.CenterLayout.java
+javax/swing/colorchooser/SCCS/s.ColorChooserComponentFactory.java
+javax/swing/colorchooser/SCCS/s.ColorSelectionModel.java
+javax/swing/colorchooser/SCCS/s.DefaultColorSelectionModel.java
+javax/swing/colorchooser/SCCS/s.DefaultHSBChooserPanel.java
+javax/swing/colorchooser/SCCS/s.DefaultPreviewPanel.java
+javax/swing/colorchooser/SCCS/s.DefaultRGBChooserPanel.java
+javax/swing/colorchooser/SCCS/s.DefaultSwatchChooserPanel.java
+javax/swing/colorchooser/SCCS/s.SmartGridLayout.java
+javax/swing/colorchooser/SCCS/s.SyntheticImage.java
+javax/swing/colorchooser/SCCS/s.package.html
+javax/swing/colorchooser/ColorChooserComponentFactory.java
+javax/swing/colorchooser/AbstractColorChooserPanel.java
+javax/swing/colorchooser/CenterLayout.java
+javax/swing/colorchooser/ColorSelectionModel.java
+javax/swing/colorchooser/DefaultColorSelectionModel.java
+javax/swing/colorchooser/DefaultHSBChooserPanel.java
+javax/swing/colorchooser/DefaultPreviewPanel.java
+javax/swing/colorchooser/DefaultRGBChooserPanel.java
+javax/swing/colorchooser/DefaultSwatchChooserPanel.java
+javax/swing/colorchooser/SmartGridLayout.java
+javax/swing/colorchooser/SyntheticImage.java
+javax/swing/colorchooser/package.html
+javax/swing/doc-files
+javax/swing/doc-files/SCCS
+javax/swing/doc-files/SCCS/s.JLayeredPane-1.gif
+javax/swing/doc-files/SCCS/s.BoxLayout-1.gif
+javax/swing/doc-files/SCCS/s.JRootPane-1.gif
+javax/swing/doc-files/SCCS/s.JRootPane-2.gif
+javax/swing/doc-files/SCCS/s.JScrollPane-1.gif
+javax/swing/doc-files/SCCS/s.SizeSequence-1.gif
+javax/swing/doc-files/JLayeredPane-1.gif
+javax/swing/doc-files/BoxLayout-1.gif
+javax/swing/doc-files/JRootPane-1.gif
+javax/swing/doc-files/JRootPane-2.gif
+javax/swing/doc-files/JScrollPane-1.gif
+javax/swing/doc-files/SizeSequence-1.gif
+javax/swing/event
+javax/swing/event/SCCS
+javax/swing/event/SCCS/s.CellEditorListener.java
+javax/swing/event/SCCS/s.AncestorEvent.java
+javax/swing/event/SCCS/s.AncestorListener.java
+javax/swing/event/SCCS/s.CaretEvent.java
+javax/swing/event/SCCS/s.CaretListener.java
+javax/swing/event/SCCS/s.EventListenerList.java
+javax/swing/event/SCCS/s.ChangeEvent.java
+javax/swing/event/SCCS/s.ChangeListener.java
+javax/swing/event/SCCS/s.DocumentEvent.java
+javax/swing/event/SCCS/s.DocumentListener.java
+javax/swing/event/SCCS/s.HyperlinkEvent.java
+javax/swing/event/SCCS/s.HyperlinkListener.java
+javax/swing/event/SCCS/s.InternalFrameAdapter.java
+javax/swing/event/SCCS/s.MenuKeyListener.java
+javax/swing/event/SCCS/s.MenuEvent.java
+javax/swing/event/SCCS/s.InternalFrameEvent.java
+javax/swing/event/SCCS/s.InternalFrameListener.java
+javax/swing/event/SCCS/s.ListDataEvent.java
+javax/swing/event/SCCS/s.ListDataListener.java
+javax/swing/event/SCCS/s.ListSelectionEvent.java
+javax/swing/event/SCCS/s.ListSelectionListener.java
+javax/swing/event/SCCS/s.MenuDragMouseEvent.java
+javax/swing/event/SCCS/s.MenuDragMouseListener.java
+javax/swing/event/SCCS/s.MenuKeyEvent.java
+javax/swing/event/SCCS/s.MouseInputAdapter.java
+javax/swing/event/SCCS/s.MenuListener.java
+javax/swing/event/SCCS/s.MouseInputListener.java
+javax/swing/event/SCCS/s.PopupMenuEvent.java
+javax/swing/event/SCCS/s.package.html
+javax/swing/event/SCCS/s.PopupMenuListener.java
+javax/swing/event/SCCS/s.SwingPropertyChangeSupport.java
+javax/swing/event/SCCS/s.TableColumnModelEvent.java
+javax/swing/event/SCCS/s.TableColumnModelListener.java
+javax/swing/event/SCCS/s.TableModelEvent.java
+javax/swing/event/SCCS/s.TableModelListener.java
+javax/swing/event/SCCS/s.TreeExpansionEvent.java
+javax/swing/event/SCCS/s.TreeExpansionListener.java
+javax/swing/event/SCCS/s.TreeModelEvent.java
+javax/swing/event/SCCS/s.TreeModelListener.java
+javax/swing/event/SCCS/s.TreeSelectionEvent.java
+javax/swing/event/SCCS/s.TreeSelectionListener.java
+javax/swing/event/SCCS/s.TreeWillExpandListener.java
+javax/swing/event/SCCS/s.UndoableEditEvent.java
+javax/swing/event/SCCS/s.UndoableEditListener.java
+javax/swing/event/AncestorListener.java
+javax/swing/event/AncestorEvent.java
+javax/swing/event/CellEditorListener.java
+javax/swing/event/CaretEvent.java
+javax/swing/event/CaretListener.java
+javax/swing/event/InternalFrameAdapter.java
+javax/swing/event/ChangeEvent.java
+javax/swing/event/ChangeListener.java
+javax/swing/event/DocumentEvent.java
+javax/swing/event/DocumentListener.java
+javax/swing/event/EventListenerList.java
+javax/swing/event/HyperlinkEvent.java
+javax/swing/event/HyperlinkListener.java
+javax/swing/event/InternalFrameEvent.java
+javax/swing/event/InternalFrameListener.java
+javax/swing/event/ListDataEvent.java
+javax/swing/event/ListDataListener.java
+javax/swing/event/ListSelectionEvent.java
+javax/swing/event/ListSelectionListener.java
+javax/swing/event/MenuDragMouseEvent.java
+javax/swing/event/MenuDragMouseListener.java
+javax/swing/event/MenuEvent.java
+javax/swing/event/MenuKeyEvent.java
+javax/swing/event/MenuKeyListener.java
+javax/swing/event/MenuListener.java
+javax/swing/event/MouseInputAdapter.java
+javax/swing/event/MouseInputListener.java
+javax/swing/event/PopupMenuEvent.java
+javax/swing/event/PopupMenuListener.java
+javax/swing/event/SwingPropertyChangeSupport.java
+javax/swing/event/TableColumnModelEvent.java
+javax/swing/event/TableColumnModelListener.java
+javax/swing/event/TableModelEvent.java
+javax/swing/event/TableModelListener.java
+javax/swing/event/TreeExpansionEvent.java
+javax/swing/event/TreeExpansionListener.java
+javax/swing/event/TreeModelEvent.java
+javax/swing/event/TreeModelListener.java
+javax/swing/event/TreeSelectionEvent.java
+javax/swing/event/TreeSelectionListener.java
+javax/swing/event/TreeWillExpandListener.java
+javax/swing/event/UndoableEditEvent.java
+javax/swing/event/UndoableEditListener.java
+javax/swing/event/package.html
+javax/swing/filechooser
+javax/swing/filechooser/SCCS
+javax/swing/filechooser/SCCS/s.FileSystemView.java
+javax/swing/filechooser/SCCS/s.FileFilter.java
+javax/swing/filechooser/SCCS/s.FileView.java
+javax/swing/filechooser/SCCS/s.package.html
+javax/swing/filechooser/FileSystemView.java
+javax/swing/filechooser/FileFilter.java
+javax/swing/filechooser/FileView.java
+javax/swing/filechooser/package.html
+javax/swing/plaf
+javax/swing/plaf/SCCS
+javax/swing/plaf/SCCS/s.ComponentInputMapUIResource.java
+javax/swing/plaf/SCCS/s.ActionMapUIResource.java
+javax/swing/plaf/SCCS/s.BorderUIResource.java
+javax/swing/plaf/SCCS/s.ButtonUI.java
+javax/swing/plaf/SCCS/s.ColorChooserUI.java
+javax/swing/plaf/SCCS/s.ColorUIResource.java
+javax/swing/plaf/SCCS/s.ComboBoxUI.java
+javax/swing/plaf/SCCS/s.DesktopIconUI.java
+javax/swing/plaf/SCCS/s.ComponentUI.java
+javax/swing/plaf/SCCS/s.DesktopPaneUI.java
+javax/swing/plaf/SCCS/s.DimensionUIResource.java
+javax/swing/plaf/SCCS/s.FileChooserUI.java
+javax/swing/plaf/SCCS/s.FontUIResource.java
+javax/swing/plaf/SCCS/s.LabelUI.java
+javax/swing/plaf/SCCS/s.IconUIResource.java
+javax/swing/plaf/SCCS/s.InputMapUIResource.java
+javax/swing/plaf/SCCS/s.InsetsUIResource.java
+javax/swing/plaf/SCCS/s.InternalFrameUI.java
+javax/swing/plaf/SCCS/s.ListUI.java
+javax/swing/plaf/SCCS/s.MenuBarUI.java
+javax/swing/plaf/SCCS/s.MenuItemUI.java
+javax/swing/plaf/SCCS/s.OptionPaneUI.java
+javax/swing/plaf/SCCS/s.PanelUI.java
+javax/swing/plaf/SCCS/s.PopupMenuUI.java
+javax/swing/plaf/SCCS/s.ProgressBarUI.java
+javax/swing/plaf/SCCS/s.RootPaneUI.java
+javax/swing/plaf/SCCS/s.ScrollBarUI.java
+javax/swing/plaf/SCCS/s.ScrollPaneUI.java
+javax/swing/plaf/SCCS/s.SeparatorUI.java
+javax/swing/plaf/SCCS/s.SliderUI.java
+javax/swing/plaf/SCCS/s.SpinnerUI.java
+javax/swing/plaf/SCCS/s.TableUI.java
+javax/swing/plaf/SCCS/s.SplitPaneUI.java
+javax/swing/plaf/SCCS/s.TabbedPaneUI.java
+javax/swing/plaf/SCCS/s.TableHeaderUI.java
+javax/swing/plaf/SCCS/s.TextUI.java
+javax/swing/plaf/SCCS/s.ToolBarUI.java
+javax/swing/plaf/SCCS/s.ToolTipUI.java
+javax/swing/plaf/SCCS/s.TreeUI.java
+javax/swing/plaf/SCCS/s.UIResource.java
+javax/swing/plaf/SCCS/s.ViewportUI.java
+javax/swing/plaf/SCCS/s.package.html
+javax/swing/plaf/basic
+javax/swing/plaf/basic/SCCS
+javax/swing/plaf/basic/SCCS/s.BasicButtonListener.java
+javax/swing/plaf/basic/SCCS/s.BasicArrowButton.java
+javax/swing/plaf/basic/SCCS/s.BasicBorders.java
+javax/swing/plaf/basic/SCCS/s.BasicCheckBoxMenuItemUI.java
+javax/swing/plaf/basic/SCCS/s.BasicButtonUI.java
+javax/swing/plaf/basic/SCCS/s.BasicComboBoxRenderer.java
+javax/swing/plaf/basic/SCCS/s.BasicCheckBoxUI.java
+javax/swing/plaf/basic/SCCS/s.BasicColorChooserUI.java
+javax/swing/plaf/basic/SCCS/s.BasicComboBoxEditor.java
+javax/swing/plaf/basic/SCCS/s.BasicComboBoxUI.java
+javax/swing/plaf/basic/SCCS/s.BasicComboPopup.java
+javax/swing/plaf/basic/SCCS/s.BasicDesktopIconUI.java
+javax/swing/plaf/basic/SCCS/s.BasicHTML.java
+javax/swing/plaf/basic/SCCS/s.BasicInternalFrameTitlePane.java
+javax/swing/plaf/basic/SCCS/s.BasicDesktopPaneUI.java
+javax/swing/plaf/basic/SCCS/s.BasicDirectoryModel.java
+javax/swing/plaf/basic/SCCS/s.BasicDragGestureRecognizer.java
+javax/swing/plaf/basic/SCCS/s.BasicDropTargetListener.java
+javax/swing/plaf/basic/SCCS/s.BasicEditorPaneUI.java
+javax/swing/plaf/basic/SCCS/s.BasicFileChooserUI.java
+javax/swing/plaf/basic/SCCS/s.BasicFormattedTextFieldUI.java
+javax/swing/plaf/basic/SCCS/s.BasicGraphicsUtils.java
+javax/swing/plaf/basic/SCCS/s.BasicIconFactory.java
+javax/swing/plaf/basic/SCCS/s.BasicPopupMenuSeparatorUI.java
+javax/swing/plaf/basic/SCCS/s.BasicInternalFrameUI.java
+javax/swing/plaf/basic/SCCS/s.BasicLabelUI.java
+javax/swing/plaf/basic/SCCS/s.BasicListUI.java
+javax/swing/plaf/basic/SCCS/s.BasicLookAndFeel.java
+javax/swing/plaf/basic/SCCS/s.BasicMenuBarUI.java
+javax/swing/plaf/basic/SCCS/s.BasicMenuItemUI.java
+javax/swing/plaf/basic/SCCS/s.BasicMenuUI.java
+javax/swing/plaf/basic/SCCS/s.BasicOptionPaneUI.java
+javax/swing/plaf/basic/SCCS/s.BasicPanelUI.java
+javax/swing/plaf/basic/SCCS/s.BasicPasswordFieldUI.java
+javax/swing/plaf/basic/SCCS/s.BasicProgressBarUI.java
+javax/swing/plaf/basic/SCCS/s.BasicPopupMenuUI.java
+javax/swing/plaf/basic/SCCS/s.BasicSplitPaneDivider.java
+javax/swing/plaf/basic/SCCS/s.BasicRadioButtonMenuItemUI.java
+javax/swing/plaf/basic/SCCS/s.BasicRadioButtonUI.java
+javax/swing/plaf/basic/SCCS/s.BasicRootPaneUI.java
+javax/swing/plaf/basic/SCCS/s.BasicScrollBarUI.java
+javax/swing/plaf/basic/SCCS/s.BasicScrollPaneUI.java
+javax/swing/plaf/basic/SCCS/s.BasicSeparatorUI.java
+javax/swing/plaf/basic/SCCS/s.BasicSliderUI.java
+javax/swing/plaf/basic/SCCS/s.BasicSpinnerUI.java
+javax/swing/plaf/basic/SCCS/s.BasicTabbedPaneUI.java
+javax/swing/plaf/basic/SCCS/s.BasicSplitPaneUI.java
+javax/swing/plaf/basic/SCCS/s.BasicTableHeaderUI.java
+javax/swing/plaf/basic/SCCS/s.BasicTableUI.java
+javax/swing/plaf/basic/SCCS/s.BasicTextAreaUI.java
+javax/swing/plaf/basic/SCCS/s.BasicTextFieldUI.java
+javax/swing/plaf/basic/SCCS/s.BasicTextPaneUI.java
+javax/swing/plaf/basic/SCCS/s.BasicTextUI.java
+javax/swing/plaf/basic/SCCS/s.BasicToggleButtonUI.java
+javax/swing/plaf/basic/SCCS/s.BasicToolBarSeparatorUI.java
+javax/swing/plaf/basic/SCCS/s.BasicToolBarUI.java
+javax/swing/plaf/basic/SCCS/s.BasicToolTipUI.java
+javax/swing/plaf/basic/SCCS/s.BasicTransferable.java
+javax/swing/plaf/basic/SCCS/s.BasicTreeUI.java
+javax/swing/plaf/basic/SCCS/s.BasicViewportUI.java
+javax/swing/plaf/basic/SCCS/s.CenterLayout.java
+javax/swing/plaf/basic/SCCS/s.ComboPopup.java
+javax/swing/plaf/basic/SCCS/s.DefaultMenuLayout.java
+javax/swing/plaf/basic/SCCS/s.LazyActionMap.java
+javax/swing/plaf/basic/SCCS/s.package.html
+javax/swing/plaf/basic/icons
+javax/swing/plaf/basic/icons/SCCS
+javax/swing/plaf/basic/icons/SCCS/s.JavaCup16.png
+javax/swing/plaf/basic/icons/JavaCup16.png
+javax/swing/plaf/basic/BasicButtonListener.java
+javax/swing/plaf/basic/BasicArrowButton.java
+javax/swing/plaf/basic/BasicBorders.java
+javax/swing/plaf/basic/BasicButtonUI.java
+javax/swing/plaf/basic/BasicCheckBoxUI.java
+javax/swing/plaf/basic/BasicIconFactory.java
+javax/swing/plaf/basic/BasicHTML.java
+javax/swing/plaf/basic/BasicCheckBoxMenuItemUI.java
+javax/swing/plaf/basic/BasicColorChooserUI.java
+javax/swing/plaf/basic/BasicComboBoxEditor.java
+javax/swing/plaf/basic/BasicComboBoxRenderer.java
+javax/swing/plaf/basic/BasicComboBoxUI.java
+javax/swing/plaf/basic/BasicComboPopup.java
+javax/swing/plaf/basic/BasicDesktopIconUI.java
+javax/swing/plaf/basic/BasicDesktopPaneUI.java
+javax/swing/plaf/basic/BasicDirectoryModel.java
+javax/swing/plaf/basic/BasicDragGestureRecognizer.java
+javax/swing/plaf/basic/BasicDropTargetListener.java
+javax/swing/plaf/basic/BasicEditorPaneUI.java
+javax/swing/plaf/basic/BasicFileChooserUI.java
+javax/swing/plaf/basic/BasicFormattedTextFieldUI.java
+javax/swing/plaf/basic/BasicGraphicsUtils.java
+javax/swing/plaf/basic/BasicInternalFrameTitlePane.java
+javax/swing/plaf/basic/BasicInternalFrameUI.java
+javax/swing/plaf/basic/BasicLabelUI.java
+javax/swing/plaf/basic/BasicListUI.java
+javax/swing/plaf/basic/BasicLookAndFeel.java
+javax/swing/plaf/basic/BasicMenuBarUI.java
+javax/swing/plaf/basic/BasicMenuItemUI.java
+javax/swing/plaf/basic/BasicMenuUI.java
+javax/swing/plaf/basic/BasicOptionPaneUI.java
+javax/swing/plaf/basic/BasicPanelUI.java
+javax/swing/plaf/basic/BasicPasswordFieldUI.java
+javax/swing/plaf/basic/BasicPopupMenuSeparatorUI.java
+javax/swing/plaf/basic/BasicPopupMenuUI.java
+javax/swing/plaf/basic/BasicProgressBarUI.java
+javax/swing/plaf/basic/BasicRadioButtonMenuItemUI.java
+javax/swing/plaf/basic/BasicRadioButtonUI.java
+javax/swing/plaf/basic/BasicRootPaneUI.java
+javax/swing/plaf/basic/BasicScrollBarUI.java
+javax/swing/plaf/basic/BasicScrollPaneUI.java
+javax/swing/plaf/basic/BasicSeparatorUI.java
+javax/swing/plaf/basic/ComboPopup.java
+javax/swing/plaf/basic/BasicSliderUI.java
+javax/swing/plaf/basic/BasicSpinnerUI.java
+javax/swing/plaf/basic/BasicSplitPaneDivider.java
+javax/swing/plaf/basic/BasicSplitPaneUI.java
+javax/swing/plaf/basic/BasicTabbedPaneUI.java
+javax/swing/plaf/basic/BasicTableHeaderUI.java
+javax/swing/plaf/basic/BasicTableUI.java
+javax/swing/plaf/basic/BasicTextAreaUI.java
+javax/swing/plaf/basic/BasicTextFieldUI.java
+javax/swing/plaf/basic/BasicTextPaneUI.java
+javax/swing/plaf/basic/BasicTextUI.java
+javax/swing/plaf/basic/BasicToggleButtonUI.java
+javax/swing/plaf/basic/BasicToolBarSeparatorUI.java
+javax/swing/plaf/basic/BasicToolBarUI.java
+javax/swing/plaf/basic/BasicToolTipUI.java
+javax/swing/plaf/basic/BasicTransferable.java
+javax/swing/plaf/basic/BasicTreeUI.java
+javax/swing/plaf/basic/BasicViewportUI.java
+javax/swing/plaf/basic/CenterLayout.java
+javax/swing/plaf/basic/DefaultMenuLayout.java
+javax/swing/plaf/basic/LazyActionMap.java
+javax/swing/plaf/basic/package.html
+javax/swing/plaf/metal
+javax/swing/plaf/metal/SCCS
+javax/swing/plaf/metal/SCCS/s.DefaultMetalTheme.java
+javax/swing/plaf/metal/SCCS/s.MetalCheckBoxIcon.java
+javax/swing/plaf/metal/SCCS/s.MetalBorders.java
+javax/swing/plaf/metal/SCCS/s.MetalBumps.java
+javax/swing/plaf/metal/SCCS/s.MetalButtonUI.java
+javax/swing/plaf/metal/SCCS/s.MetalCheckBoxUI.java
+javax/swing/plaf/metal/SCCS/s.MetalComboBoxButton.java
+javax/swing/plaf/metal/SCCS/s.MetalComboBoxEditor.java
+javax/swing/plaf/metal/SCCS/s.MetalComboBoxIcon.java
+javax/swing/plaf/metal/SCCS/s.MetalComboBoxUI.java
+javax/swing/plaf/metal/SCCS/s.MetalDesktopIconUI.java
+javax/swing/plaf/metal/SCCS/s.MetalFileChooserUI.java
+javax/swing/plaf/metal/SCCS/s.MetalFontDesktopProperty.java
+javax/swing/plaf/metal/SCCS/s.MetalHighContrastTheme.java
+javax/swing/plaf/metal/SCCS/s.MetalIconFactory.java
+javax/swing/plaf/metal/SCCS/s.MetalInternalFrameTitlePane.java
+javax/swing/plaf/metal/SCCS/s.MetalInternalFrameUI.java
+javax/swing/plaf/metal/SCCS/s.MetalLabelUI.java
+javax/swing/plaf/metal/SCCS/s.MetalLookAndFeel.java
+javax/swing/plaf/metal/SCCS/s.MetalMenuBarUI.java
+javax/swing/plaf/metal/SCCS/s.MetalPopupMenuSeparatorUI.java
+javax/swing/plaf/metal/SCCS/s.MetalProgressBarUI.java
+javax/swing/plaf/metal/SCCS/s.MetalRadioButtonUI.java
+javax/swing/plaf/metal/SCCS/s.MetalRootPaneUI.java
+javax/swing/plaf/metal/SCCS/s.MetalScrollBarUI.java
+javax/swing/plaf/metal/SCCS/s.MetalScrollButton.java
+javax/swing/plaf/metal/SCCS/s.MetalScrollPaneUI.java
+javax/swing/plaf/metal/SCCS/s.MetalSeparatorUI.java
+javax/swing/plaf/metal/SCCS/s.package.html
+javax/swing/plaf/metal/SCCS/s.MetalSliderUI.java
+javax/swing/plaf/metal/SCCS/s.MetalSplitPaneDivider.java
+javax/swing/plaf/metal/SCCS/s.MetalSplitPaneUI.java
+javax/swing/plaf/metal/SCCS/s.MetalTabbedPaneUI.java
+javax/swing/plaf/metal/SCCS/s.MetalTextFieldUI.java
+javax/swing/plaf/metal/SCCS/s.MetalTheme.java
+javax/swing/plaf/metal/SCCS/s.MetalTitlePane.java
+javax/swing/plaf/metal/SCCS/s.MetalToggleButtonUI.java
+javax/swing/plaf/metal/SCCS/s.MetalToolBarUI.java
+javax/swing/plaf/metal/SCCS/s.MetalToolTipUI.java
+javax/swing/plaf/metal/SCCS/s.MetalTreeUI.java
+javax/swing/plaf/metal/SCCS/s.MetalUtils.java
+javax/swing/plaf/metal/SCCS/s.OceanTheme.java
+javax/swing/plaf/metal/icons
+javax/swing/plaf/metal/icons/SCCS
+javax/swing/plaf/metal/icons/SCCS/s.Inform.gif
+javax/swing/plaf/metal/icons/SCCS/s.Error.gif
+javax/swing/plaf/metal/icons/SCCS/s.Question.gif
+javax/swing/plaf/metal/icons/SCCS/s.Warn.gif
+javax/swing/plaf/metal/icons/ocean
+javax/swing/plaf/metal/icons/ocean/SCCS
+javax/swing/plaf/metal/icons/ocean/SCCS/s.iconify-pressed.gif
+javax/swing/plaf/metal/icons/ocean/SCCS/s.close-pressed.gif
+javax/swing/plaf/metal/icons/ocean/SCCS/s.close.gif
+javax/swing/plaf/metal/icons/ocean/SCCS/s.collapsed-rtl.gif
+javax/swing/plaf/metal/icons/ocean/SCCS/s.collapsed.gif
+javax/swing/plaf/metal/icons/ocean/SCCS/s.computer.gif
+javax/swing/plaf/metal/icons/ocean/SCCS/s.directory.gif
+javax/swing/plaf/metal/icons/ocean/SCCS/s.error.png
+javax/swing/plaf/metal/icons/ocean/SCCS/s.expanded.gif
+javax/swing/plaf/metal/icons/ocean/SCCS/s.file.gif
+javax/swing/plaf/metal/icons/ocean/SCCS/s.floppy.gif
+javax/swing/plaf/metal/icons/ocean/SCCS/s.hardDrive.gif
+javax/swing/plaf/metal/icons/ocean/SCCS/s.homeFolder.gif
+javax/swing/plaf/metal/icons/ocean/SCCS/s.maximize-pressed.gif
+javax/swing/plaf/metal/icons/ocean/SCCS/s.iconify.gif
+javax/swing/plaf/metal/icons/ocean/SCCS/s.info.png
+javax/swing/plaf/metal/icons/ocean/SCCS/s.maximize.gif
+javax/swing/plaf/metal/icons/ocean/SCCS/s.menu.gif
+javax/swing/plaf/metal/icons/ocean/SCCS/s.minimize-pressed.gif
+javax/swing/plaf/metal/icons/ocean/SCCS/s.minimize.gif
+javax/swing/plaf/metal/icons/ocean/SCCS/s.newFolder.gif
+javax/swing/plaf/metal/icons/ocean/SCCS/s.paletteClose-pressed.gif
+javax/swing/plaf/metal/icons/ocean/SCCS/s.paletteClose.gif
+javax/swing/plaf/metal/icons/ocean/SCCS/s.question.png
+javax/swing/plaf/metal/icons/ocean/SCCS/s.upFolder.gif
+javax/swing/plaf/metal/icons/ocean/SCCS/s.warning.png
+javax/swing/plaf/metal/icons/ocean/maximize-pressed.gif
+javax/swing/plaf/metal/icons/ocean/close-pressed.gif
+javax/swing/plaf/metal/icons/ocean/close.gif
+javax/swing/plaf/metal/icons/ocean/collapsed-rtl.gif
+javax/swing/plaf/metal/icons/ocean/collapsed.gif
+javax/swing/plaf/metal/icons/ocean/computer.gif
+javax/swing/plaf/metal/icons/ocean/directory.gif
+javax/swing/plaf/metal/icons/ocean/error.png
+javax/swing/plaf/metal/icons/ocean/expanded.gif
+javax/swing/plaf/metal/icons/ocean/file.gif
+javax/swing/plaf/metal/icons/ocean/floppy.gif
+javax/swing/plaf/metal/icons/ocean/hardDrive.gif
+javax/swing/plaf/metal/icons/ocean/homeFolder.gif
+javax/swing/plaf/metal/icons/ocean/iconify-pressed.gif
+javax/swing/plaf/metal/icons/ocean/iconify.gif
+javax/swing/plaf/metal/icons/ocean/info.png
+javax/swing/plaf/metal/icons/ocean/maximize.gif
+javax/swing/plaf/metal/icons/ocean/menu.gif
+javax/swing/plaf/metal/icons/ocean/warning.png
+javax/swing/plaf/metal/icons/ocean/minimize.gif
+javax/swing/plaf/metal/icons/ocean/minimize-pressed.gif
+javax/swing/plaf/metal/icons/ocean/newFolder.gif
+javax/swing/plaf/metal/icons/ocean/paletteClose-pressed.gif
+javax/swing/plaf/metal/icons/ocean/paletteClose.gif
+javax/swing/plaf/metal/icons/ocean/question.png
+javax/swing/plaf/metal/icons/ocean/upFolder.gif
+javax/swing/plaf/metal/icons/Question.gif
+javax/swing/plaf/metal/icons/Error.gif
+javax/swing/plaf/metal/icons/Inform.gif
+javax/swing/plaf/metal/icons/Warn.gif
+javax/swing/plaf/metal/sounds
+javax/swing/plaf/metal/sounds/SCCS
+javax/swing/plaf/metal/sounds/SCCS/s.FrameRestoreDown.wav
+javax/swing/plaf/metal/sounds/SCCS/s.FrameClose.wav
+javax/swing/plaf/metal/sounds/SCCS/s.FrameMaximize.wav
+javax/swing/plaf/metal/sounds/SCCS/s.FrameMinimize.wav
+javax/swing/plaf/metal/sounds/SCCS/s.FrameRestoreUp.wav
+javax/swing/plaf/metal/sounds/SCCS/s.MenuItemCommand.wav
+javax/swing/plaf/metal/sounds/SCCS/s.OptionPaneError.wav
+javax/swing/plaf/metal/sounds/SCCS/s.OptionPaneInformation.wav
+javax/swing/plaf/metal/sounds/SCCS/s.OptionPaneQuestion.wav
+javax/swing/plaf/metal/sounds/SCCS/s.OptionPaneWarning.wav
+javax/swing/plaf/metal/sounds/SCCS/s.PopupMenuPopup.wav
+javax/swing/plaf/metal/sounds/FrameMaximize.wav
+javax/swing/plaf/metal/sounds/FrameClose.wav
+javax/swing/plaf/metal/sounds/OptionPaneInformation.wav
+javax/swing/plaf/metal/sounds/FrameMinimize.wav
+javax/swing/plaf/metal/sounds/FrameRestoreDown.wav
+javax/swing/plaf/metal/sounds/FrameRestoreUp.wav
+javax/swing/plaf/metal/sounds/MenuItemCommand.wav
+javax/swing/plaf/metal/sounds/OptionPaneError.wav
+javax/swing/plaf/metal/sounds/OptionPaneQuestion.wav
+javax/swing/plaf/metal/sounds/OptionPaneWarning.wav
+javax/swing/plaf/metal/sounds/PopupMenuPopup.wav
+javax/swing/plaf/metal/DefaultMetalTheme.java
+javax/swing/plaf/metal/MetalComboBoxButton.java
+javax/swing/plaf/metal/MetalBorders.java
+javax/swing/plaf/metal/MetalBumps.java
+javax/swing/plaf/metal/MetalButtonUI.java
+javax/swing/plaf/metal/MetalCheckBoxIcon.java
+javax/swing/plaf/metal/MetalCheckBoxUI.java
+javax/swing/plaf/metal/MetalComboBoxEditor.java
+javax/swing/plaf/metal/MetalComboBoxIcon.java
+javax/swing/plaf/metal/MetalComboBoxUI.java
+javax/swing/plaf/metal/MetalDesktopIconUI.java
+javax/swing/plaf/metal/MetalLabelUI.java
+javax/swing/plaf/metal/MetalPopupMenuSeparatorUI.java
+javax/swing/plaf/metal/MetalMenuBarUI.java
+javax/swing/plaf/metal/MetalFileChooserUI.java
+javax/swing/plaf/metal/MetalFontDesktopProperty.java
+javax/swing/plaf/metal/MetalHighContrastTheme.java
+javax/swing/plaf/metal/MetalIconFactory.java
+javax/swing/plaf/metal/MetalInternalFrameTitlePane.java
+javax/swing/plaf/metal/MetalInternalFrameUI.java
+javax/swing/plaf/metal/MetalLookAndFeel.java
+javax/swing/plaf/metal/MetalSplitPaneDivider.java
+javax/swing/plaf/metal/MetalProgressBarUI.java
+javax/swing/plaf/metal/MetalRadioButtonUI.java
+javax/swing/plaf/metal/MetalRootPaneUI.java
+javax/swing/plaf/metal/MetalScrollBarUI.java
+javax/swing/plaf/metal/MetalScrollButton.java
+javax/swing/plaf/metal/MetalScrollPaneUI.java
+javax/swing/plaf/metal/MetalSeparatorUI.java
+javax/swing/plaf/metal/MetalSliderUI.java
+javax/swing/plaf/metal/MetalToggleButtonUI.java
+javax/swing/plaf/metal/MetalSplitPaneUI.java
+javax/swing/plaf/metal/MetalTabbedPaneUI.java
+javax/swing/plaf/metal/MetalTextFieldUI.java
+javax/swing/plaf/metal/MetalTheme.java
+javax/swing/plaf/metal/MetalTitlePane.java
+javax/swing/plaf/metal/MetalToolBarUI.java
+javax/swing/plaf/metal/MetalToolTipUI.java
+javax/swing/plaf/metal/MetalTreeUI.java
+javax/swing/plaf/metal/MetalUtils.java
+javax/swing/plaf/metal/OceanTheme.java
+javax/swing/plaf/metal/package.html
+javax/swing/plaf/multi
+javax/swing/plaf/multi/SCCS
+javax/swing/plaf/multi/SCCS/s.MultiColorChooserUI.java
+javax/swing/plaf/multi/SCCS/s.MultiButtonUI.java
+javax/swing/plaf/multi/SCCS/s.MultiComboBoxUI.java
+javax/swing/plaf/multi/SCCS/s.MultiDesktopIconUI.java
+javax/swing/plaf/multi/SCCS/s.MultiDesktopPaneUI.java
+javax/swing/plaf/multi/SCCS/s.MultiFileChooserUI.java
+javax/swing/plaf/multi/SCCS/s.MultiInternalFrameUI.java
+javax/swing/plaf/multi/SCCS/s.MultiLabelUI.java
+javax/swing/plaf/multi/SCCS/s.MultiListUI.java
+javax/swing/plaf/multi/SCCS/s.MultiLookAndFeel.java
+javax/swing/plaf/multi/SCCS/s.MultiMenuBarUI.java
+javax/swing/plaf/multi/SCCS/s.MultiMenuItemUI.java
+javax/swing/plaf/multi/SCCS/s.MultiOptionPaneUI.java
+javax/swing/plaf/multi/SCCS/s.MultiPanelUI.java
+javax/swing/plaf/multi/SCCS/s.MultiTableUI.java
+javax/swing/plaf/multi/SCCS/s.MultiPopupMenuUI.java
+javax/swing/plaf/multi/SCCS/s.MultiProgressBarUI.java
+javax/swing/plaf/multi/SCCS/s.MultiRootPaneUI.java
+javax/swing/plaf/multi/SCCS/s.MultiScrollBarUI.java
+javax/swing/plaf/multi/SCCS/s.MultiScrollPaneUI.java
+javax/swing/plaf/multi/SCCS/s.MultiSeparatorUI.java
+javax/swing/plaf/multi/SCCS/s.MultiSliderUI.java
+javax/swing/plaf/multi/SCCS/s.MultiSpinnerUI.java
+javax/swing/plaf/multi/SCCS/s.MultiSplitPaneUI.java
+javax/swing/plaf/multi/SCCS/s.MultiTabbedPaneUI.java
+javax/swing/plaf/multi/SCCS/s.MultiTableHeaderUI.java
+javax/swing/plaf/multi/SCCS/s.MultiTextUI.java
+javax/swing/plaf/multi/SCCS/s.MultiToolBarUI.java
+javax/swing/plaf/multi/SCCS/s.MultiTreeUI.java
+javax/swing/plaf/multi/SCCS/s.MultiToolTipUI.java
+javax/swing/plaf/multi/SCCS/s.package.html
+javax/swing/plaf/multi/SCCS/s.MultiViewportUI.java
+javax/swing/plaf/multi/doc-files
+javax/swing/plaf/multi/doc-files/SCCS
+javax/swing/plaf/multi/doc-files/SCCS/s.multi_tsc.html
+javax/swing/plaf/multi/doc-files/multi_tsc.html
+javax/swing/plaf/multi/MultiColorChooserUI.java
+javax/swing/plaf/multi/MultiButtonUI.java
+javax/swing/plaf/multi/MultiInternalFrameUI.java
+javax/swing/plaf/multi/MultiComboBoxUI.java
+javax/swing/plaf/multi/MultiDesktopIconUI.java
+javax/swing/plaf/multi/MultiDesktopPaneUI.java
+javax/swing/plaf/multi/MultiFileChooserUI.java
+javax/swing/plaf/multi/MultiLabelUI.java
+javax/swing/plaf/multi/MultiListUI.java
+javax/swing/plaf/multi/MultiLookAndFeel.java
+javax/swing/plaf/multi/MultiMenuBarUI.java
+javax/swing/plaf/multi/MultiMenuItemUI.java
+javax/swing/plaf/multi/MultiOptionPaneUI.java
+javax/swing/plaf/multi/MultiPanelUI.java
+javax/swing/plaf/multi/MultiPopupMenuUI.java
+javax/swing/plaf/multi/MultiProgressBarUI.java
+javax/swing/plaf/multi/MultiRootPaneUI.java
+javax/swing/plaf/multi/MultiScrollBarUI.java
+javax/swing/plaf/multi/MultiScrollPaneUI.java
+javax/swing/plaf/multi/MultiSeparatorUI.java
+javax/swing/plaf/multi/MultiSliderUI.java
+javax/swing/plaf/multi/MultiSpinnerUI.java
+javax/swing/plaf/multi/MultiSplitPaneUI.java
+javax/swing/plaf/multi/MultiTabbedPaneUI.java
+javax/swing/plaf/multi/MultiTableHeaderUI.java
+javax/swing/plaf/multi/MultiTableUI.java
+javax/swing/plaf/multi/MultiTextUI.java
+javax/swing/plaf/multi/MultiToolBarUI.java
+javax/swing/plaf/multi/MultiToolTipUI.java
+javax/swing/plaf/multi/MultiTreeUI.java
+javax/swing/plaf/multi/package.html
+javax/swing/plaf/multi/MultiViewportUI.java
+javax/swing/plaf/synth
+javax/swing/plaf/synth/SCCS
+javax/swing/plaf/synth/SCCS/s.DefaultMenuLayout.java
+javax/swing/plaf/synth/SCCS/s.ColorType.java
+javax/swing/plaf/synth/SCCS/s.DefaultSynthStyleFactory.java
+javax/swing/plaf/synth/SCCS/s.ImagePainter.java
+javax/swing/plaf/synth/SCCS/s.ParsedSynthStyle.java
+javax/swing/plaf/synth/SCCS/s.Region.java
+javax/swing/plaf/synth/SCCS/s.SynthArrowButton.java
+javax/swing/plaf/synth/SCCS/s.SynthBorder.java
+javax/swing/plaf/synth/SCCS/s.SynthButtonUI.java
+javax/swing/plaf/synth/SCCS/s.SynthCheckBoxMenuItemUI.java
+javax/swing/plaf/synth/SCCS/s.SynthCheckBoxUI.java
+javax/swing/plaf/synth/SCCS/s.SynthColorChooserUI.java
+javax/swing/plaf/synth/SCCS/s.SynthComboBoxUI.java
+javax/swing/plaf/synth/SCCS/s.SynthLabelUI.java
+javax/swing/plaf/synth/SCCS/s.SynthOptionPaneUI.java
+javax/swing/plaf/synth/SCCS/s.SynthComboPopup.java
+javax/swing/plaf/synth/SCCS/s.SynthConstants.java
+javax/swing/plaf/synth/SCCS/s.SynthContext.java
+javax/swing/plaf/synth/SCCS/s.SynthDefaultLookup.java
+javax/swing/plaf/synth/SCCS/s.SynthDesktopIconUI.java
+javax/swing/plaf/synth/SCCS/s.SynthDesktopPaneUI.java
+javax/swing/plaf/synth/SCCS/s.SynthEditorPaneUI.java
+javax/swing/plaf/synth/SCCS/s.SynthFormattedTextFieldUI.java
+javax/swing/plaf/synth/SCCS/s.SynthGraphicsUtils.java
+javax/swing/plaf/synth/SCCS/s.SynthInternalFrameTitlePane.java
+javax/swing/plaf/synth/SCCS/s.SynthInternalFrameUI.java
+javax/swing/plaf/synth/SCCS/s.SynthListUI.java
+javax/swing/plaf/synth/SCCS/s.SynthLookAndFeel.java
+javax/swing/plaf/synth/SCCS/s.SynthMenuBarUI.java
+javax/swing/plaf/synth/SCCS/s.package.html
+javax/swing/plaf/synth/SCCS/s.SynthMenuItemUI.java
+javax/swing/plaf/synth/SCCS/s.SynthMenuUI.java
+javax/swing/plaf/synth/SCCS/s.SynthPasswordFieldUI.java
+javax/swing/plaf/synth/SCCS/s.SynthPainter.java
+javax/swing/plaf/synth/SCCS/s.SynthPanelUI.java
+javax/swing/plaf/synth/SCCS/s.SynthParser.java
+javax/swing/plaf/synth/SCCS/s.SynthProgressBarUI.java
+javax/swing/plaf/synth/SCCS/s.SynthPopupMenuUI.java
+javax/swing/plaf/synth/SCCS/s.SynthRadioButtonMenuItemUI.java
+javax/swing/plaf/synth/SCCS/s.SynthRadioButtonUI.java
+javax/swing/plaf/synth/SCCS/s.SynthRootPaneUI.java
+javax/swing/plaf/synth/SCCS/s.SynthScrollBarUI.java
+javax/swing/plaf/synth/SCCS/s.SynthScrollPaneUI.java
+javax/swing/plaf/synth/SCCS/s.SynthSeparatorUI.java
+javax/swing/plaf/synth/SCCS/s.SynthSliderUI.java
+javax/swing/plaf/synth/SCCS/s.SynthSpinnerUI.java
+javax/swing/plaf/synth/SCCS/s.SynthSplitPaneDivider.java
+javax/swing/plaf/synth/SCCS/s.SynthSplitPaneUI.java
+javax/swing/plaf/synth/SCCS/s.SynthStyle.java
+javax/swing/plaf/synth/SCCS/s.SynthStyleFactory.java
+javax/swing/plaf/synth/SCCS/s.SynthTabbedPaneUI.java
+javax/swing/plaf/synth/SCCS/s.SynthTableHeaderUI.java
+javax/swing/plaf/synth/SCCS/s.SynthTableUI.java
+javax/swing/plaf/synth/SCCS/s.SynthTextAreaUI.java
+javax/swing/plaf/synth/SCCS/s.SynthTextFieldUI.java
+javax/swing/plaf/synth/SCCS/s.SynthTextPaneUI.java
+javax/swing/plaf/synth/SCCS/s.SynthToggleButtonUI.java
+javax/swing/plaf/synth/SCCS/s.SynthToolBarUI.java
+javax/swing/plaf/synth/SCCS/s.SynthToolTipUI.java
+javax/swing/plaf/synth/SCCS/s.SynthTreeUI.java
+javax/swing/plaf/synth/SCCS/s.SynthViewportUI.java
+javax/swing/plaf/synth/doc-files
+javax/swing/plaf/synth/doc-files/SCCS
+javax/swing/plaf/synth/doc-files/SCCS/s.componentProperties.html
+javax/swing/plaf/synth/doc-files/SCCS/s.synth.dtd
+javax/swing/plaf/synth/doc-files/SCCS/s.synthFileFormat.html
+javax/swing/plaf/synth/doc-files/componentProperties.html
+javax/swing/plaf/synth/doc-files/synth.dtd
+javax/swing/plaf/synth/doc-files/synthFileFormat.html
+javax/swing/plaf/synth/DefaultMenuLayout.java
+javax/swing/plaf/synth/ColorType.java
+javax/swing/plaf/synth/SynthBorder.java
+javax/swing/plaf/synth/Region.java
+javax/swing/plaf/synth/DefaultSynthStyleFactory.java
+javax/swing/plaf/synth/ImagePainter.java
+javax/swing/plaf/synth/ParsedSynthStyle.java
+javax/swing/plaf/synth/SynthCheckBoxMenuItemUI.java
+javax/swing/plaf/synth/SynthArrowButton.java
+javax/swing/plaf/synth/SynthButtonUI.java
+javax/swing/plaf/synth/SynthColorChooserUI.java
+javax/swing/plaf/synth/SynthCheckBoxUI.java
+javax/swing/plaf/synth/SynthComboBoxUI.java
+javax/swing/plaf/synth/SynthInternalFrameTitlePane.java
+javax/swing/plaf/synth/SynthComboPopup.java
+javax/swing/plaf/synth/SynthConstants.java
+javax/swing/plaf/synth/SynthContext.java
+javax/swing/plaf/synth/SynthDefaultLookup.java
+javax/swing/plaf/synth/SynthDesktopIconUI.java
+javax/swing/plaf/synth/SynthDesktopPaneUI.java
+javax/swing/plaf/synth/SynthEditorPaneUI.java
+javax/swing/plaf/synth/SynthFormattedTextFieldUI.java
+javax/swing/plaf/synth/SynthGraphicsUtils.java
+javax/swing/plaf/synth/SynthPasswordFieldUI.java
+javax/swing/plaf/synth/SynthInternalFrameUI.java
+javax/swing/plaf/synth/SynthLabelUI.java
+javax/swing/plaf/synth/SynthListUI.java
+javax/swing/plaf/synth/SynthLookAndFeel.java
+javax/swing/plaf/synth/SynthMenuBarUI.java
+javax/swing/plaf/synth/SynthMenuItemUI.java
+javax/swing/plaf/synth/SynthMenuUI.java
+javax/swing/plaf/synth/SynthOptionPaneUI.java
+javax/swing/plaf/synth/SynthPainter.java
+javax/swing/plaf/synth/SynthPanelUI.java
+javax/swing/plaf/synth/SynthParser.java
+javax/swing/plaf/synth/SynthRadioButtonMenuItemUI.java
+javax/swing/plaf/synth/SynthPopupMenuUI.java
+javax/swing/plaf/synth/SynthProgressBarUI.java
+javax/swing/plaf/synth/SynthRadioButtonUI.java
+javax/swing/plaf/synth/SynthRootPaneUI.java
+javax/swing/plaf/synth/SynthScrollBarUI.java
+javax/swing/plaf/synth/SynthScrollPaneUI.java
+javax/swing/plaf/synth/SynthSeparatorUI.java
+javax/swing/plaf/synth/SynthSliderUI.java
+javax/swing/plaf/synth/SynthSpinnerUI.java
+javax/swing/plaf/synth/SynthSplitPaneDivider.java
+javax/swing/plaf/synth/SynthSplitPaneUI.java
+javax/swing/plaf/synth/SynthStyle.java
+javax/swing/plaf/synth/SynthStyleFactory.java
+javax/swing/plaf/synth/SynthTabbedPaneUI.java
+javax/swing/plaf/synth/SynthTableHeaderUI.java
+javax/swing/plaf/synth/SynthTableUI.java
+javax/swing/plaf/synth/SynthTextAreaUI.java
+javax/swing/plaf/synth/SynthTextFieldUI.java
+javax/swing/plaf/synth/SynthTextPaneUI.java
+javax/swing/plaf/synth/SynthToggleButtonUI.java
+javax/swing/plaf/synth/SynthToolBarUI.java
+javax/swing/plaf/synth/SynthToolTipUI.java
+javax/swing/plaf/synth/SynthTreeUI.java
+javax/swing/plaf/synth/SynthViewportUI.java
+javax/swing/plaf/synth/package.html
+javax/swing/plaf/ComponentInputMapUIResource.java
+javax/swing/plaf/ActionMapUIResource.java
+javax/swing/plaf/BorderUIResource.java
+javax/swing/plaf/ButtonUI.java
+javax/swing/plaf/ColorChooserUI.java
+javax/swing/plaf/ColorUIResource.java
+javax/swing/plaf/ComboBoxUI.java
+javax/swing/plaf/DimensionUIResource.java
+javax/swing/plaf/ComponentUI.java
+javax/swing/plaf/DesktopIconUI.java
+javax/swing/plaf/DesktopPaneUI.java
+javax/swing/plaf/FileChooserUI.java
+javax/swing/plaf/FontUIResource.java
+javax/swing/plaf/IconUIResource.java
+javax/swing/plaf/InputMapUIResource.java
+javax/swing/plaf/InsetsUIResource.java
+javax/swing/plaf/InternalFrameUI.java
+javax/swing/plaf/LabelUI.java
+javax/swing/plaf/ListUI.java
+javax/swing/plaf/MenuBarUI.java
+javax/swing/plaf/MenuItemUI.java
+javax/swing/plaf/OptionPaneUI.java
+javax/swing/plaf/PanelUI.java
+javax/swing/plaf/PopupMenuUI.java
+javax/swing/plaf/ProgressBarUI.java
+javax/swing/plaf/RootPaneUI.java
+javax/swing/plaf/ScrollBarUI.java
+javax/swing/plaf/ScrollPaneUI.java
+javax/swing/plaf/SeparatorUI.java
+javax/swing/plaf/SliderUI.java
+javax/swing/plaf/SpinnerUI.java
+javax/swing/plaf/SplitPaneUI.java
+javax/swing/plaf/TabbedPaneUI.java
+javax/swing/plaf/TableHeaderUI.java
+javax/swing/plaf/TableUI.java
+javax/swing/plaf/TextUI.java
+javax/swing/plaf/ToolBarUI.java
+javax/swing/plaf/ToolTipUI.java
+javax/swing/plaf/TreeUI.java
+javax/swing/plaf/UIResource.java
+javax/swing/plaf/ViewportUI.java
+javax/swing/plaf/package.html
+javax/swing/table
+javax/swing/table/SCCS
+javax/swing/table/SCCS/s.DefaultTableCellRenderer.java
+javax/swing/table/SCCS/s.AbstractTableModel.java
+javax/swing/table/SCCS/s.DefaultTableColumnModel.java
+javax/swing/table/SCCS/s.DefaultTableModel.java
+javax/swing/table/SCCS/s.JTableHeader.java
+javax/swing/table/SCCS/s.TableCellEditor.java
+javax/swing/table/SCCS/s.TableCellRenderer.java
+javax/swing/table/SCCS/s.TableColumn.java
+javax/swing/table/SCCS/s.TableColumnModel.java
+javax/swing/table/SCCS/s.TableModel.java
+javax/swing/table/SCCS/s.package.html
+javax/swing/table/DefaultTableCellRenderer.java
+javax/swing/table/AbstractTableModel.java
+javax/swing/table/DefaultTableColumnModel.java
+javax/swing/table/DefaultTableModel.java
+javax/swing/table/JTableHeader.java
+javax/swing/table/TableCellEditor.java
+javax/swing/table/TableCellRenderer.java
+javax/swing/table/TableColumn.java
+javax/swing/table/TableColumnModel.java
+javax/swing/table/TableModel.java
+javax/swing/table/package.html
+javax/swing/text
+javax/swing/text/SCCS
+javax/swing/text/SCCS/s.BadLocationException.java
+javax/swing/text/SCCS/s.AbstractDocument.java
+javax/swing/text/SCCS/s.AbstractWriter.java
+javax/swing/text/SCCS/s.AsyncBoxView.java
+javax/swing/text/SCCS/s.AttributeSet.java
+javax/swing/text/SCCS/s.ComponentView.java
+javax/swing/text/SCCS/s.BoxView.java
+javax/swing/text/SCCS/s.Caret.java
+javax/swing/text/SCCS/s.SegmentCache.java
+javax/swing/text/SCCS/s.ChangedCharSetException.java
+javax/swing/text/SCCS/s.CompositeView.java
+javax/swing/text/SCCS/s.DateFormatter.java
+javax/swing/text/SCCS/s.DefaultCaret.java
+javax/swing/text/SCCS/s.DefaultEditorKit.java
+javax/swing/text/SCCS/s.DefaultFormatter.java
+javax/swing/text/SCCS/s.Segment.java
+javax/swing/text/SCCS/s.DefaultFormatterFactory.java
+javax/swing/text/SCCS/s.DefaultHighlighter.java
+javax/swing/text/SCCS/s.DefaultStyledDocument.java
+javax/swing/text/SCCS/s.DefaultTextUI.java
+javax/swing/text/SCCS/s.Document.java
+javax/swing/text/SCCS/s.DocumentFilter.java
+javax/swing/text/SCCS/s.EditorKit.java
+javax/swing/text/SCCS/s.Element.java
+javax/swing/text/SCCS/s.ElementIterator.java
+javax/swing/text/SCCS/s.FieldView.java
+javax/swing/text/SCCS/s.FlowView.java
+javax/swing/text/SCCS/s.GapContent.java
+javax/swing/text/SCCS/s.GapVector.java
+javax/swing/text/SCCS/s.GlyphPainter1.java
+javax/swing/text/SCCS/s.GlyphPainter2.java
+javax/swing/text/SCCS/s.GlyphView.java
+javax/swing/text/SCCS/s.IconView.java
+javax/swing/text/SCCS/s.Highlighter.java
+javax/swing/text/SCCS/s.InternationalFormatter.java
+javax/swing/text/SCCS/s.JTextComponent.java
+javax/swing/text/SCCS/s.Keymap.java
+javax/swing/text/SCCS/s.LabelView.java
+javax/swing/text/SCCS/s.LayeredHighlighter.java
+javax/swing/text/SCCS/s.LayoutQueue.java
+javax/swing/text/SCCS/s.MaskFormatter.java
+javax/swing/text/SCCS/s.MutableAttributeSet.java
+javax/swing/text/SCCS/s.NavigationFilter.java
+javax/swing/text/SCCS/s.NumberFormatter.java
+javax/swing/text/SCCS/s.ParagraphView.java
+javax/swing/text/SCCS/s.PasswordView.java
+javax/swing/text/SCCS/s.PlainDocument.java
+javax/swing/text/SCCS/s.PlainView.java
+javax/swing/text/SCCS/s.Position.java
+javax/swing/text/SCCS/s.View.java
+javax/swing/text/SCCS/s.WrappedPlainView.java
+javax/swing/text/SCCS/s.SimpleAttributeSet.java
+javax/swing/text/SCCS/s.StateInvariantError.java
+javax/swing/text/SCCS/s.StringContent.java
+javax/swing/text/SCCS/s.Style.java
+javax/swing/text/SCCS/s.StyleConstants.java
+javax/swing/text/SCCS/s.StyleContext.java
+javax/swing/text/SCCS/s.StyledDocument.java
+javax/swing/text/SCCS/s.StyledEditorKit.java
+javax/swing/text/SCCS/s.TabExpander.java
+javax/swing/text/SCCS/s.TabSet.java
+javax/swing/text/SCCS/s.TabStop.java
+javax/swing/text/SCCS/s.TabableView.java
+javax/swing/text/SCCS/s.TableView.java
+javax/swing/text/SCCS/s.TextAction.java
+javax/swing/text/SCCS/s.TextLayoutStrategy.java
+javax/swing/text/SCCS/s.Utilities.java
+javax/swing/text/SCCS/s.ViewFactory.java
+javax/swing/text/SCCS/s.ZoneView.java
+javax/swing/text/SCCS/s.package.html
+javax/swing/text/doc-files
+javax/swing/text/doc-files/SCCS
+javax/swing/text/doc-files/SCCS/s.Document-notification.gif
+javax/swing/text/doc-files/SCCS/s.Document-coord.gif
+javax/swing/text/doc-files/SCCS/s.Document-insert.gif
+javax/swing/text/doc-files/SCCS/s.Document-remove.gif
+javax/swing/text/doc-files/SCCS/s.Document-structure.gif
+javax/swing/text/doc-files/SCCS/s.OpenBookIcon.gif
+javax/swing/text/doc-files/SCCS/s.View-flexibility.jpg
+javax/swing/text/doc-files/SCCS/s.View-layout.jpg
+javax/swing/text/doc-files/SCCS/s.editor.gif
+javax/swing/text/doc-files/SCCS/s.paragraph.gif
+javax/swing/text/doc-files/Document-notification.gif
+javax/swing/text/doc-files/Document-coord.gif
+javax/swing/text/doc-files/Document-insert.gif
+javax/swing/text/doc-files/Document-structure.gif
+javax/swing/text/doc-files/Document-remove.gif
+javax/swing/text/doc-files/OpenBookIcon.gif
+javax/swing/text/doc-files/View-flexibility.jpg
+javax/swing/text/doc-files/View-layout.jpg
+javax/swing/text/doc-files/editor.gif
+javax/swing/text/doc-files/paragraph.gif
+javax/swing/text/html
+javax/swing/text/html/SCCS
+javax/swing/text/html/SCCS/s.AccessibleHTML.java
+javax/swing/text/html/SCCS/s.BRView.java
+javax/swing/text/html/SCCS/s.BlockView.java
+javax/swing/text/html/SCCS/s.CSS.java
+javax/swing/text/html/SCCS/s.CSSParser.java
+javax/swing/text/html/SCCS/s.CommentView.java
+javax/swing/text/html/SCCS/s.EditableView.java
+javax/swing/text/html/SCCS/s.FormSubmitEvent.java
+javax/swing/text/html/SCCS/s.FormView.java
+javax/swing/text/html/SCCS/s.FrameSetView.java
+javax/swing/text/html/SCCS/s.FrameView.java
+javax/swing/text/html/SCCS/s.HRuleView.java
+javax/swing/text/html/SCCS/s.HTML.java
+javax/swing/text/html/SCCS/s.HTMLDocument.java
+javax/swing/text/html/SCCS/s.HTMLEditorKit.java
+javax/swing/text/html/SCCS/s.HTMLWriter.java
+javax/swing/text/html/SCCS/s.NoFramesView.java
+javax/swing/text/html/SCCS/s.Map.java
+javax/swing/text/html/SCCS/s.HTMLFrameHyperlinkEvent.java
+javax/swing/text/html/SCCS/s.HiddenTagView.java
+javax/swing/text/html/SCCS/s.ImageView.java
+javax/swing/text/html/SCCS/s.InlineView.java
+javax/swing/text/html/SCCS/s.IsindexView.java
+javax/swing/text/html/SCCS/s.LineView.java
+javax/swing/text/html/SCCS/s.ListView.java
+javax/swing/text/html/SCCS/s.MinimalHTMLWriter.java
+javax/swing/text/html/SCCS/s.MuxingAttributeSet.java
+javax/swing/text/html/SCCS/s.ObjectView.java
+javax/swing/text/html/SCCS/s.Option.java
+javax/swing/text/html/SCCS/s.OptionComboBoxModel.java
+javax/swing/text/html/SCCS/s.OptionListModel.java
+javax/swing/text/html/SCCS/s.ParagraphView.java
+javax/swing/text/html/SCCS/s.ResourceLoader.java
+javax/swing/text/html/SCCS/s.StyleSheet.java
+javax/swing/text/html/SCCS/s.default.css
+javax/swing/text/html/SCCS/s.TableView.java
+javax/swing/text/html/SCCS/s.TextAreaDocument.java
+javax/swing/text/html/SCCS/s.package.html
+javax/swing/text/html/icons
+javax/swing/text/html/icons/SCCS
+javax/swing/text/html/icons/SCCS/s.image-delayed.gif
+javax/swing/text/html/icons/SCCS/s.image-failed.gif
+javax/swing/text/html/icons/image-delayed.gif
+javax/swing/text/html/icons/image-failed.gif
+javax/swing/text/html/parser
+javax/swing/text/html/parser/SCCS
+javax/swing/text/html/parser/SCCS/s.ContentModelState.java
+javax/swing/text/html/parser/SCCS/s.AttributeList.java
+javax/swing/text/html/parser/SCCS/s.ContentModel.java
+javax/swing/text/html/parser/SCCS/s.DTDConstants.java
+javax/swing/text/html/parser/SCCS/s.DTD.java
+javax/swing/text/html/parser/SCCS/s.DocumentParser.java
+javax/swing/text/html/parser/SCCS/s.Element.java
+javax/swing/text/html/parser/SCCS/s.Entity.java
+javax/swing/text/html/parser/SCCS/s.Parser.java
+javax/swing/text/html/parser/SCCS/s.ParserDelegator.java
+javax/swing/text/html/parser/SCCS/s.ResourceLoader.java
+javax/swing/text/html/parser/SCCS/s.TagElement.java
+javax/swing/text/html/parser/SCCS/s.TagStack.java
+javax/swing/text/html/parser/SCCS/s.html32.bdtd
+javax/swing/text/html/parser/SCCS/s.package.html
+javax/swing/text/html/parser/ContentModelState.java
+javax/swing/text/html/parser/AttributeList.java
+javax/swing/text/html/parser/ContentModel.java
+javax/swing/text/html/parser/DTDConstants.java
+javax/swing/text/html/parser/DTD.java
+javax/swing/text/html/parser/DocumentParser.java
+javax/swing/text/html/parser/Element.java
+javax/swing/text/html/parser/Entity.java
+javax/swing/text/html/parser/Parser.java
+javax/swing/text/html/parser/ParserDelegator.java
+javax/swing/text/html/parser/ResourceLoader.java
+javax/swing/text/html/parser/TagElement.java
+javax/swing/text/html/parser/TagStack.java
+javax/swing/text/html/parser/html32.bdtd
+javax/swing/text/html/parser/package.html
+javax/swing/text/html/FormSubmitEvent.java
+javax/swing/text/html/AccessibleHTML.java
+javax/swing/text/html/BRView.java
+javax/swing/text/html/BlockView.java
+javax/swing/text/html/CSS.java
+javax/swing/text/html/CSSParser.java
+javax/swing/text/html/CommentView.java
+javax/swing/text/html/EditableView.java
+javax/swing/text/html/FormView.java
+javax/swing/text/html/FrameSetView.java
+javax/swing/text/html/FrameView.java
+javax/swing/text/html/HRuleView.java
+javax/swing/text/html/HTML.java
+javax/swing/text/html/HTMLDocument.java
+javax/swing/text/html/HTMLEditorKit.java
+javax/swing/text/html/HTMLWriter.java
+javax/swing/text/html/MinimalHTMLWriter.java
+javax/swing/text/html/HTMLFrameHyperlinkEvent.java
+javax/swing/text/html/HiddenTagView.java
+javax/swing/text/html/ImageView.java
+javax/swing/text/html/InlineView.java
+javax/swing/text/html/IsindexView.java
+javax/swing/text/html/LineView.java
+javax/swing/text/html/ListView.java
+javax/swing/text/html/Map.java
+javax/swing/text/html/OptionComboBoxModel.java
+javax/swing/text/html/MuxingAttributeSet.java
+javax/swing/text/html/NoFramesView.java
+javax/swing/text/html/ObjectView.java
+javax/swing/text/html/Option.java
+javax/swing/text/html/OptionListModel.java
+javax/swing/text/html/ParagraphView.java
+javax/swing/text/html/ResourceLoader.java
+javax/swing/text/html/StyleSheet.java
+javax/swing/text/html/TableView.java
+javax/swing/text/html/default.css
+javax/swing/text/html/TextAreaDocument.java
+javax/swing/text/html/package.html
+javax/swing/text/rtf
+javax/swing/text/rtf/SCCS
+javax/swing/text/rtf/SCCS/s.AbstractFilter.java
+javax/swing/text/rtf/SCCS/s.Constants.java
+javax/swing/text/rtf/SCCS/s.MockAttributeSet.java
+javax/swing/text/rtf/SCCS/s.RTFAttribute.java
+javax/swing/text/rtf/SCCS/s.RTFAttributes.java
+javax/swing/text/rtf/SCCS/s.RTFEditorKit.java
+javax/swing/text/rtf/SCCS/s.RTFGenerator.java
+javax/swing/text/rtf/SCCS/s.RTFParser.java
+javax/swing/text/rtf/SCCS/s.RTFReader.java
+javax/swing/text/rtf/SCCS/s.package.html
+javax/swing/text/rtf/charsets
+javax/swing/text/rtf/charsets/SCCS
+javax/swing/text/rtf/charsets/SCCS/s.cpg437.txt
+javax/swing/text/rtf/charsets/SCCS/s.NeXT.txt
+javax/swing/text/rtf/charsets/SCCS/s.ansi.txt
+javax/swing/text/rtf/charsets/SCCS/s.cpg850.txt
+javax/swing/text/rtf/charsets/SCCS/s.mac.txt
+javax/swing/text/rtf/charsets/NeXT.txt
+javax/swing/text/rtf/charsets/ansi.txt
+javax/swing/text/rtf/charsets/cpg437.txt
+javax/swing/text/rtf/charsets/cpg850.txt
+javax/swing/text/rtf/charsets/mac.txt
+javax/swing/text/rtf/MockAttributeSet.java
+javax/swing/text/rtf/AbstractFilter.java
+javax/swing/text/rtf/Constants.java
+javax/swing/text/rtf/RTFAttribute.java
+javax/swing/text/rtf/RTFAttributes.java
+javax/swing/text/rtf/RTFEditorKit.java
+javax/swing/text/rtf/RTFGenerator.java
+javax/swing/text/rtf/RTFParser.java
+javax/swing/text/rtf/RTFReader.java
+javax/swing/text/rtf/package.html
+javax/swing/text/BadLocationException.java
+javax/swing/text/AbstractDocument.java
+javax/swing/text/AbstractWriter.java
+javax/swing/text/AsyncBoxView.java
+javax/swing/text/AttributeSet.java
+javax/swing/text/BoxView.java
+javax/swing/text/Caret.java
+javax/swing/text/ComponentView.java
+javax/swing/text/DefaultFormatterFactory.java
+javax/swing/text/ChangedCharSetException.java
+javax/swing/text/CompositeView.java
+javax/swing/text/DateFormatter.java
+javax/swing/text/DefaultCaret.java
+javax/swing/text/DefaultEditorKit.java
+javax/swing/text/DefaultFormatter.java
+javax/swing/text/DefaultStyledDocument.java
+javax/swing/text/DefaultHighlighter.java
+javax/swing/text/DefaultTextUI.java
+javax/swing/text/Document.java
+javax/swing/text/DocumentFilter.java
+javax/swing/text/EditorKit.java
+javax/swing/text/Element.java
+javax/swing/text/ElementIterator.java
+javax/swing/text/FieldView.java
+javax/swing/text/FlowView.java
+javax/swing/text/GapContent.java
+javax/swing/text/GapVector.java
+javax/swing/text/GlyphPainter1.java
+javax/swing/text/GlyphPainter2.java
+javax/swing/text/GlyphView.java
+javax/swing/text/Highlighter.java
+javax/swing/text/LabelView.java
+javax/swing/text/Keymap.java
+javax/swing/text/IconView.java
+javax/swing/text/InternationalFormatter.java
+javax/swing/text/JTextComponent.java
+javax/swing/text/MutableAttributeSet.java
+javax/swing/text/LayeredHighlighter.java
+javax/swing/text/LayoutQueue.java
+javax/swing/text/MaskFormatter.java
+javax/swing/text/NavigationFilter.java
+javax/swing/text/NumberFormatter.java
+javax/swing/text/ParagraphView.java
+javax/swing/text/PasswordView.java
+javax/swing/text/PlainDocument.java
+javax/swing/text/PlainView.java
+javax/swing/text/Position.java
+javax/swing/text/Segment.java
+javax/swing/text/SegmentCache.java
+javax/swing/text/SimpleAttributeSet.java
+javax/swing/text/Style.java
+javax/swing/text/StateInvariantError.java
+javax/swing/text/StringContent.java
+javax/swing/text/StyleConstants.java
+javax/swing/text/StyleContext.java
+javax/swing/text/StyledDocument.java
+javax/swing/text/StyledEditorKit.java
+javax/swing/text/TabExpander.java
+javax/swing/text/TabSet.java
+javax/swing/text/TabStop.java
+javax/swing/text/TabableView.java
+javax/swing/text/TableView.java
+javax/swing/text/TextAction.java
+javax/swing/text/TextLayoutStrategy.java
+javax/swing/text/Utilities.java
+javax/swing/text/View.java
+javax/swing/text/ViewFactory.java
+javax/swing/text/ZoneView.java
+javax/swing/text/WrappedPlainView.java
+javax/swing/text/package.html
+javax/swing/tree
+javax/swing/tree/SCCS
+javax/swing/tree/SCCS/s.DefaultMutableTreeNode.java
+javax/swing/tree/SCCS/s.AbstractLayoutCache.java
+javax/swing/tree/SCCS/s.DefaultTreeCellEditor.java
+javax/swing/tree/SCCS/s.DefaultTreeCellRenderer.java
+javax/swing/tree/SCCS/s.DefaultTreeModel.java
+javax/swing/tree/SCCS/s.DefaultTreeSelectionModel.java
+javax/swing/tree/SCCS/s.ExpandVetoException.java
+javax/swing/tree/SCCS/s.FixedHeightLayoutCache.java
+javax/swing/tree/SCCS/s.MutableTreeNode.java
+javax/swing/tree/SCCS/s.RowMapper.java
+javax/swing/tree/SCCS/s.TreeCellEditor.java
+javax/swing/tree/SCCS/s.TreeCellRenderer.java
+javax/swing/tree/SCCS/s.TreeModel.java
+javax/swing/tree/SCCS/s.TreeNode.java
+javax/swing/tree/SCCS/s.TreePath.java
+javax/swing/tree/SCCS/s.TreeSelectionModel.java
+javax/swing/tree/SCCS/s.VariableHeightLayoutCache.java
+javax/swing/tree/SCCS/s.package.html
+javax/swing/tree/DefaultTreeCellRenderer.java
+javax/swing/tree/AbstractLayoutCache.java
+javax/swing/tree/DefaultMutableTreeNode.java
+javax/swing/tree/DefaultTreeCellEditor.java
+javax/swing/tree/DefaultTreeSelectionModel.java
+javax/swing/tree/DefaultTreeModel.java
+javax/swing/tree/ExpandVetoException.java
+javax/swing/tree/FixedHeightLayoutCache.java
+javax/swing/tree/MutableTreeNode.java
+javax/swing/tree/RowMapper.java
+javax/swing/tree/TreeCellEditor.java
+javax/swing/tree/TreeCellRenderer.java
+javax/swing/tree/TreeModel.java
+javax/swing/tree/VariableHeightLayoutCache.java
+javax/swing/tree/TreeNode.java
+javax/swing/tree/TreePath.java
+javax/swing/tree/TreeSelectionModel.java
+javax/swing/tree/package.html
+javax/swing/undo
+javax/swing/undo/SCCS
+javax/swing/undo/SCCS/s.AbstractUndoableEdit.java
+javax/swing/undo/SCCS/s.CannotRedoException.java
+javax/swing/undo/SCCS/s.CannotUndoException.java
+javax/swing/undo/SCCS/s.CompoundEdit.java
+javax/swing/undo/SCCS/s.StateEdit.java
+javax/swing/undo/SCCS/s.StateEditable.java
+javax/swing/undo/SCCS/s.UndoManager.java
+javax/swing/undo/SCCS/s.UndoableEdit.java
+javax/swing/undo/SCCS/s.UndoableEditSupport.java
+javax/swing/undo/SCCS/s.package.html
+javax/swing/undo/AbstractUndoableEdit.java
+javax/swing/undo/CannotRedoException.java
+javax/swing/undo/CannotUndoException.java
+javax/swing/undo/CompoundEdit.java
+javax/swing/undo/StateEdit.java
+javax/swing/undo/StateEditable.java
+javax/swing/undo/UndoManager.java
+javax/swing/undo/UndoableEdit.java
+javax/swing/undo/UndoableEditSupport.java
+javax/swing/undo/package.html
+javax/swing/AbstractAction.java
+javax/swing/AbstractButton.java
+javax/swing/Action.java
+javax/swing/AbstractActionPropertyChangeListener.java
+javax/swing/AbstractCellEditor.java
+javax/swing/AbstractListModel.java
+javax/swing/AbstractSpinnerModel.java
+javax/swing/ActionMap.java
+javax/swing/DefaultBoundedRangeModel.java
+javax/swing/AncestorNotifier.java
+javax/swing/ArrayTable.java
+javax/swing/Autoscroller.java
+javax/swing/BorderFactory.java
+javax/swing/BoundedRangeModel.java
+javax/swing/Box.java
+javax/swing/BoxLayout.java
+javax/swing/ButtonGroup.java
+javax/swing/ButtonModel.java
+javax/swing/CellEditor.java
+javax/swing/CellRendererPane.java
+javax/swing/ComboBoxEditor.java
+javax/swing/ComboBoxModel.java
+javax/swing/ComponentInputMap.java
+javax/swing/DebugGraphics.java
+javax/swing/DebugGraphicsFilter.java
+javax/swing/DebugGraphicsInfo.java
+javax/swing/DesktopManager.java
+javax/swing/DebugGraphicsObserver.java
+javax/swing/DefaultComboBoxModel.java
+javax/swing/DefaultButtonModel.java
+javax/swing/DefaultCellEditor.java
+javax/swing/DefaultSingleSelectionModel.java
+javax/swing/DefaultDesktopManager.java
+javax/swing/DefaultFocusManager.java
+javax/swing/DefaultListCellRenderer.java
+javax/swing/DefaultListModel.java
+javax/swing/DefaultListSelectionModel.java
+javax/swing/DelegatingDefaultFocusManager.java
+javax/swing/FocusManager.java
+javax/swing/GraphicsWrapper.java
+javax/swing/LayoutFocusTraversalPolicy.java
+javax/swing/GrayFilter.java
+javax/swing/Icon.java
+javax/swing/ImageIcon.java
+javax/swing/InputMap.java
+javax/swing/InputVerifier.java
+javax/swing/JApplet.java
+javax/swing/JButton.java
+javax/swing/InternalFrameFocusTraversalPolicy.java
+javax/swing/JCheckBox.java
+javax/swing/JCheckBoxMenuItem.java
+javax/swing/JColorChooser.java
+javax/swing/JComboBox.java
+javax/swing/JComponent.java
+javax/swing/JDesktopPane.java
+javax/swing/JDialog.java
+javax/swing/JEditorPane.java
+javax/swing/JFileChooser.java
+javax/swing/JFormattedTextField.java
+javax/swing/JFrame.java
+javax/swing/JInternalFrame.java
+javax/swing/JLabel.java
+javax/swing/JLayeredPane.java
+javax/swing/JList.java
+javax/swing/JMenu.java
+javax/swing/JMenuBar.java
+javax/swing/JMenuItem.java
+javax/swing/JOptionPane.java
+javax/swing/JPanel.java
+javax/swing/JPasswordField.java
+javax/swing/JPopupMenu.java
+javax/swing/JProgressBar.java
+javax/swing/JRadioButton.java
+javax/swing/JRadioButtonMenuItem.java
+javax/swing/JRootPane.java
+javax/swing/JScrollBar.java
+javax/swing/JScrollPane.java
+javax/swing/JSeparator.java
+javax/swing/JSlider.java
+javax/swing/JSpinner.java
+javax/swing/JSplitPane.java
+javax/swing/JTabbedPane.java
+javax/swing/JTable.java
+javax/swing/JTextArea.java
+javax/swing/JTextField.java
+javax/swing/JTextPane.java
+javax/swing/JToggleButton.java
+javax/swing/JToolBar.java
+javax/swing/JToolTip.java
+javax/swing/JTree.java
+javax/swing/JViewport.java
+javax/swing/JWindow.java
+javax/swing/KeyStroke.java
+javax/swing/KeyboardManager.java
+javax/swing/LayoutComparator.java
+javax/swing/ListSelectionModel.java
+javax/swing/LegacyGlueFocusTraversalPolicy.java
+javax/swing/ListCellRenderer.java
+javax/swing/ListModel.java
+javax/swing/MenuSelectionManager.java
+javax/swing/LookAndFeel.java
+javax/swing/MenuElement.java
+javax/swing/MutableComboBoxModel.java
+javax/swing/MultiUIDefaults.java
+javax/swing/ProgressMonitorInputStream.java
+javax/swing/OverlayLayout.java
+javax/swing/Popup.java
+javax/swing/PopupFactory.java
+javax/swing/ProgressMonitor.java
+javax/swing/RepaintManager.java
+javax/swing/Renderer.java
+javax/swing/RootPaneContainer.java
+javax/swing/ScrollPaneConstants.java
+javax/swing/ScrollPaneLayout.java
+javax/swing/SpringLayout.java
+javax/swing/Spring.java
+javax/swing/Scrollable.java
+javax/swing/SingleSelectionModel.java
+javax/swing/SizeRequirements.java
+javax/swing/SizeSequence.java
+javax/swing/SortingFocusTraversalPolicy.java
+javax/swing/SpinnerDateModel.java
+javax/swing/SpinnerListModel.java
+javax/swing/SpinnerModel.java
+javax/swing/SpinnerNumberModel.java
+javax/swing/SwingConstants.java
+javax/swing/SwingUtilities.java
+javax/swing/TablePrintable.java
+javax/swing/Timer.java
+javax/swing/SystemEventQueueUtilities.java
+javax/swing/TimerQueue.java
+javax/swing/ViewportLayout.java
+javax/swing/UIDefaults.java
+javax/swing/ToolTipManager.java
+javax/swing/TransferHandler.java
+javax/swing/UIManager.java
+javax/swing/package.html
+javax/swing/UnsupportedLookAndFeelException.java
+javax/swing/WindowConstants.java
+javax/transaction
+javax/transaction/SCCS
+javax/transaction/SCCS/s.TransactionRolledbackException.java
+javax/transaction/SCCS/s.InvalidTransactionException.java
+javax/transaction/SCCS/s.TransactionRequiredException.java
+javax/transaction/SCCS/s.package.html
+javax/transaction/xa
+javax/transaction/xa/SCCS
+javax/transaction/xa/SCCS/s.XAException.java
+javax/transaction/xa/SCCS/s.XAResource.java
+javax/transaction/xa/SCCS/s.Xid.java
+javax/transaction/xa/SCCS/s.package.html
+javax/transaction/xa/XAException.java
+javax/transaction/xa/XAResource.java
+javax/transaction/xa/Xid.java
+javax/transaction/xa/package.html
+javax/transaction/InvalidTransactionException.java
+javax/transaction/TransactionRequiredException.java
+javax/transaction/TransactionRolledbackException.java
+javax/transaction/package.html
+javax/xml
+javax/xml/SCCS
+javax/xml/SCCS/s.XMLConstants.java
+javax/xml/SCCS/s.package.html
+javax/xml/datatype
+javax/xml/datatype/SCCS
+javax/xml/datatype/SCCS/s.FactoryFinder.java
+javax/xml/datatype/SCCS/s.Duration.java
+javax/xml/datatype/SCCS/s.DatatypeConfigurationException.java
+javax/xml/datatype/SCCS/s.DatatypeConstants.java
+javax/xml/datatype/SCCS/s.DatatypeFactory.java
+javax/xml/datatype/SCCS/s.XMLGregorianCalendar.java
+javax/xml/datatype/SCCS/s.package.html
+javax/xml/datatype/DatatypeConfigurationException.java
+javax/xml/datatype/DatatypeConstants.java
+javax/xml/datatype/DatatypeFactory.java
+javax/xml/datatype/Duration.java
+javax/xml/datatype/FactoryFinder.java
+javax/xml/datatype/XMLGregorianCalendar.java
+javax/xml/datatype/package.html
+javax/xml/namespace
+javax/xml/namespace/SCCS
+javax/xml/namespace/SCCS/s.NamespaceContext.java
+javax/xml/namespace/SCCS/s.QName.java
+javax/xml/namespace/SCCS/s.package.html
+javax/xml/namespace/NamespaceContext.java
+javax/xml/namespace/QName.java
+javax/xml/namespace/package.html
+javax/xml/parsers
+javax/xml/parsers/SCCS
+javax/xml/parsers/SCCS/s.DocumentBuilderFactory.java
+javax/xml/parsers/SCCS/s.DocumentBuilder.java
+javax/xml/parsers/SCCS/s.FactoryConfigurationError.java
+javax/xml/parsers/SCCS/s.FactoryFinder.java
+javax/xml/parsers/SCCS/s.ParserConfigurationException.java
+javax/xml/parsers/SCCS/s.SAXParser.java
+javax/xml/parsers/SCCS/s.SAXParserFactory.java
+javax/xml/parsers/SCCS/s.SecuritySupport.java
+javax/xml/parsers/SCCS/s.package.html
+javax/xml/parsers/DocumentBuilderFactory.java
+javax/xml/parsers/DocumentBuilder.java
+javax/xml/parsers/FactoryConfigurationError.java
+javax/xml/parsers/FactoryFinder.java
+javax/xml/parsers/ParserConfigurationException.java
+javax/xml/parsers/SAXParser.java
+javax/xml/parsers/SAXParserFactory.java
+javax/xml/parsers/SecuritySupport.java
+javax/xml/parsers/package.html
+javax/xml/transform
+javax/xml/transform/SCCS
+javax/xml/transform/SCCS/s.TransformerException.java
+javax/xml/transform/SCCS/s.ErrorListener.java
+javax/xml/transform/SCCS/s.FactoryFinder.java
+javax/xml/transform/SCCS/s.OutputKeys.java
+javax/xml/transform/SCCS/s.Result.java
+javax/xml/transform/SCCS/s.SecuritySupport.java
+javax/xml/transform/SCCS/s.Source.java
+javax/xml/transform/SCCS/s.SourceLocator.java
+javax/xml/transform/SCCS/s.Templates.java
+javax/xml/transform/SCCS/s.Transformer.java
+javax/xml/transform/SCCS/s.overview.html
+javax/xml/transform/SCCS/s.TransformerConfigurationException.java
+javax/xml/transform/SCCS/s.TransformerFactory.java
+javax/xml/transform/SCCS/s.URIResolver.java
+javax/xml/transform/SCCS/s.TransformerFactoryConfigurationError.java
+javax/xml/transform/SCCS/s.package.html
+javax/xml/transform/dom
+javax/xml/transform/dom/SCCS
+javax/xml/transform/dom/SCCS/s.DOMLocator.java
+javax/xml/transform/dom/SCCS/s.DOMResult.java
+javax/xml/transform/dom/SCCS/s.DOMSource.java
+javax/xml/transform/dom/SCCS/s.package.html
+javax/xml/transform/dom/DOMLocator.java
+javax/xml/transform/dom/DOMResult.java
+javax/xml/transform/dom/DOMSource.java
+javax/xml/transform/dom/package.html
+javax/xml/transform/sax
+javax/xml/transform/sax/SCCS
+javax/xml/transform/sax/SCCS/s.TemplatesHandler.java
+javax/xml/transform/sax/SCCS/s.SAXResult.java
+javax/xml/transform/sax/SCCS/s.SAXSource.java
+javax/xml/transform/sax/SCCS/s.SAXTransformerFactory.java
+javax/xml/transform/sax/SCCS/s.TransformerHandler.java
+javax/xml/transform/sax/SCCS/s.package.html
+javax/xml/transform/sax/TemplatesHandler.java
+javax/xml/transform/sax/SAXResult.java
+javax/xml/transform/sax/SAXSource.java
+javax/xml/transform/sax/SAXTransformerFactory.java
+javax/xml/transform/sax/TransformerHandler.java
+javax/xml/transform/sax/package.html
+javax/xml/transform/stream
+javax/xml/transform/stream/SCCS
+javax/xml/transform/stream/SCCS/s.StreamResult.java
+javax/xml/transform/stream/SCCS/s.StreamSource.java
+javax/xml/transform/stream/SCCS/s.package.html
+javax/xml/transform/stream/StreamResult.java
+javax/xml/transform/stream/StreamSource.java
+javax/xml/transform/stream/package.html
+javax/xml/transform/SecuritySupport.java
+javax/xml/transform/ErrorListener.java
+javax/xml/transform/FactoryFinder.java
+javax/xml/transform/OutputKeys.java
+javax/xml/transform/Result.java
+javax/xml/transform/SourceLocator.java
+javax/xml/transform/Source.java
+javax/xml/transform/TransformerException.java
+javax/xml/transform/Templates.java
+javax/xml/transform/Transformer.java
+javax/xml/transform/TransformerConfigurationException.java
+javax/xml/transform/TransformerFactory.java
+javax/xml/transform/URIResolver.java
+javax/xml/transform/TransformerFactoryConfigurationError.java
+javax/xml/transform/overview.html
+javax/xml/transform/package.html
+javax/xml/validation
+javax/xml/validation/SCCS
+javax/xml/validation/SCCS/s.SchemaFactory.java
+javax/xml/validation/SCCS/s.Schema.java
+javax/xml/validation/SCCS/s.SchemaFactoryFinder.java
+javax/xml/validation/SCCS/s.SchemaFactoryLoader.java
+javax/xml/validation/SCCS/s.TypeInfoProvider.java
+javax/xml/validation/SCCS/s.Validator.java
+javax/xml/validation/SCCS/s.ValidatorHandler.java
+javax/xml/validation/SCCS/s.package.html
+javax/xml/validation/SchemaFactory.java
+javax/xml/validation/Schema.java
+javax/xml/validation/SchemaFactoryFinder.java
+javax/xml/validation/SchemaFactoryLoader.java
+javax/xml/validation/TypeInfoProvider.java
+javax/xml/validation/Validator.java
+javax/xml/validation/ValidatorHandler.java
+javax/xml/validation/package.html
+javax/xml/xpath
+javax/xml/xpath/SCCS
+javax/xml/xpath/SCCS/s.XPathConstants.java
+javax/xml/xpath/SCCS/s.XPath.java
+javax/xml/xpath/SCCS/s.XPathExpressionException.java
+javax/xml/xpath/SCCS/s.XPathException.java
+javax/xml/xpath/SCCS/s.XPathExpression.java
+javax/xml/xpath/SCCS/s.XPathFactoryFinder.java
+javax/xml/xpath/SCCS/s.XPathFactory.java
+javax/xml/xpath/SCCS/s.package.html
+javax/xml/xpath/SCCS/s.XPathFactoryConfigurationException.java
+javax/xml/xpath/SCCS/s.XPathFunction.java
+javax/xml/xpath/SCCS/s.XPathFunctionException.java
+javax/xml/xpath/SCCS/s.XPathFunctionResolver.java
+javax/xml/xpath/SCCS/s.XPathVariableResolver.java
+javax/xml/xpath/XPathConstants.java
+javax/xml/xpath/XPath.java
+javax/xml/xpath/XPathExpression.java
+javax/xml/xpath/XPathException.java
+javax/xml/xpath/XPathFactoryConfigurationException.java
+javax/xml/xpath/XPathExpressionException.java
+javax/xml/xpath/XPathFactory.java
+javax/xml/xpath/XPathFactoryFinder.java
+javax/xml/xpath/XPathFunction.java
+javax/xml/xpath/XPathFunctionException.java
+javax/xml/xpath/XPathFunctionResolver.java
+javax/xml/xpath/XPathVariableResolver.java
+javax/xml/xpath/package.html
+javax/xml/XMLConstants.java
+javax/xml/package.html
+org
+org/ietf
+org/ietf/jgss
+org/ietf/jgss/SCCS
+org/ietf/jgss/SCCS/s.ChannelBinding.java
+org/ietf/jgss/SCCS/s.GSSContext.java
+org/ietf/jgss/SCCS/s.GSSCredential.java
+org/ietf/jgss/SCCS/s.GSSException.java
+org/ietf/jgss/SCCS/s.GSSManager.java
+org/ietf/jgss/SCCS/s.GSSName.java
+org/ietf/jgss/SCCS/s.MessageProp.java
+org/ietf/jgss/SCCS/s.Oid.java
+org/ietf/jgss/SCCS/s.package.html
+org/ietf/jgss/ChannelBinding.java
+org/ietf/jgss/GSSContext.java
+org/ietf/jgss/GSSCredential.java
+org/ietf/jgss/GSSException.java
+org/ietf/jgss/GSSManager.java
+org/ietf/jgss/GSSName.java
+org/ietf/jgss/MessageProp.java
+org/ietf/jgss/Oid.java
+org/ietf/jgss/package.html
+org/omg
+org/omg/CORBA
+org/omg/CORBA/DynAnyPackage
+org/omg/CORBA/DynAnyPackage/SCCS
+org/omg/CORBA/DynAnyPackage/SCCS/s.InvalidSeq.java
+org/omg/CORBA/DynAnyPackage/SCCS/s.Invalid.java
+org/omg/CORBA/DynAnyPackage/SCCS/s.InvalidValue.java
+org/omg/CORBA/DynAnyPackage/SCCS/s.TypeMismatch.java
+org/omg/CORBA/DynAnyPackage/SCCS/s.package.html
+org/omg/CORBA/DynAnyPackage/InvalidValue.java
+org/omg/CORBA/DynAnyPackage/Invalid.java
+org/omg/CORBA/DynAnyPackage/InvalidSeq.java
+org/omg/CORBA/DynAnyPackage/TypeMismatch.java
+org/omg/CORBA/DynAnyPackage/package.html
+org/omg/CORBA/ORBPackage
+org/omg/CORBA/ORBPackage/SCCS
+org/omg/CORBA/ORBPackage/SCCS/s.InconsistentTypeCode.java
+org/omg/CORBA/ORBPackage/SCCS/s.InvalidName.java
+org/omg/CORBA/ORBPackage/SCCS/s.package.html
+org/omg/CORBA/ORBPackage/InconsistentTypeCode.java
+org/omg/CORBA/ORBPackage/InvalidName.java
+org/omg/CORBA/ORBPackage/package.html
+org/omg/CORBA/SCCS
+org/omg/CORBA/SCCS/s.ACTIVITY_COMPLETED.java
+org/omg/CORBA/SCCS/s.ACTIVITY_REQUIRED.java
+org/omg/CORBA/SCCS/s.ARG_IN.java
+org/omg/CORBA/SCCS/s.ARG_INOUT.java
+org/omg/CORBA/SCCS/s.ARG_OUT.java
+org/omg/CORBA/SCCS/s.Any.java
+org/omg/CORBA/SCCS/s.AnyHolder.java
+org/omg/CORBA/SCCS/s.AnySeqHelper.java
+org/omg/CORBA/SCCS/s.AnySeqHolder.java
+org/omg/CORBA/SCCS/s.BAD_CONTEXT.java
+org/omg/CORBA/SCCS/s.BAD_INV_ORDER.java
+org/omg/CORBA/SCCS/s.BAD_OPERATION.java
+org/omg/CORBA/SCCS/s.BAD_PARAM.java
+org/omg/CORBA/SCCS/s.BAD_POLICY.java
+org/omg/CORBA/SCCS/s.BAD_POLICY_TYPE.java
+org/omg/CORBA/SCCS/s.ContextList.java
+org/omg/CORBA/SCCS/s.Context.java
+org/omg/CORBA/SCCS/s.BAD_POLICY_VALUE.java
+org/omg/CORBA/SCCS/s.BAD_QOS.java
+org/omg/CORBA/SCCS/s.BAD_TYPECODE.java
+org/omg/CORBA/SCCS/s.BooleanHolder.java
+org/omg/CORBA/SCCS/s.BooleanSeqHelper.java
+org/omg/CORBA/SCCS/s.BooleanSeqHolder.java
+org/omg/CORBA/SCCS/s.Bounds.java
+org/omg/CORBA/SCCS/s.ByteHolder.java
+org/omg/CORBA/SCCS/s.CODESET_INCOMPATIBLE.java
+org/omg/CORBA/SCCS/s.COMM_FAILURE.java
+org/omg/CORBA/SCCS/s.CTX_RESTRICT_SCOPE.java
+org/omg/CORBA/SCCS/s.CharHolder.java
+org/omg/CORBA/SCCS/s.CharSeqHelper.java
+org/omg/CORBA/SCCS/s.CharSeqHolder.java
+org/omg/CORBA/SCCS/s.CompletionStatus.java
+org/omg/CORBA/SCCS/s.CompletionStatusHelper.java
+org/omg/CORBA/SCCS/s.CurrentHelper.java
+org/omg/CORBA/SCCS/s.Current.java
+org/omg/CORBA/SCCS/s.CurrentOperations.java
+org/omg/CORBA/SCCS/s.CurrentHolder.java
+org/omg/CORBA/SCCS/s.DomainManagerOperations.java
+org/omg/CORBA/SCCS/s.CustomMarshal.java
+org/omg/CORBA/SCCS/s.DATA_CONVERSION.java
+org/omg/CORBA/SCCS/s.DataInputStream.java
+org/omg/CORBA/SCCS/s.DataOutputStream.java
+org/omg/CORBA/SCCS/s.DefinitionKind.java
+org/omg/CORBA/SCCS/s.DefinitionKindHelper.java
+org/omg/CORBA/SCCS/s.DomainManager.java
+org/omg/CORBA/SCCS/s.DoubleHolder.java
+org/omg/CORBA/SCCS/s.DoubleSeqHelper.java
+org/omg/CORBA/SCCS/s.FieldNameHelper.java
+org/omg/CORBA/SCCS/s.FREE_MEM.java
+org/omg/CORBA/SCCS/s.DoubleSeqHolder.java
+org/omg/CORBA/SCCS/s.DynAny.java
+org/omg/CORBA/SCCS/s.DynArray.java
+org/omg/CORBA/SCCS/s.DynEnum.java
+org/omg/CORBA/SCCS/s.DynFixed.java
+org/omg/CORBA/SCCS/s.DynSequence.java
+org/omg/CORBA/SCCS/s.DynStruct.java
+org/omg/CORBA/SCCS/s.DynUnion.java
+org/omg/CORBA/SCCS/s.DynValue.java
+org/omg/CORBA/SCCS/s.DynamicImplementation.java
+org/omg/CORBA/SCCS/s.Environment.java
+org/omg/CORBA/SCCS/s.ExceptionList.java
+org/omg/CORBA/SCCS/s.FloatSeqHelper.java
+org/omg/CORBA/SCCS/s.FixedHolder.java
+org/omg/CORBA/SCCS/s.FloatHolder.java
+org/omg/CORBA/SCCS/s.IDLTypeHelper.java
+org/omg/CORBA/SCCS/s.FloatSeqHolder.java
+org/omg/CORBA/SCCS/s.IDLType.java
+org/omg/CORBA/SCCS/s.ServiceInformationHelper.java
+org/omg/CORBA/SCCS/s.IDLTypeOperations.java
+org/omg/CORBA/SCCS/s.IMP_LIMIT.java
+org/omg/CORBA/SCCS/s.INITIALIZE.java
+org/omg/CORBA/SCCS/s.INTERNAL.java
+org/omg/CORBA/SCCS/s.INTF_REPOS.java
+org/omg/CORBA/SCCS/s.INVALID_ACTIVITY.java
+org/omg/CORBA/SCCS/s.INVALID_TRANSACTION.java
+org/omg/CORBA/SCCS/s.INV_FLAG.java
+org/omg/CORBA/SCCS/s.INV_IDENT.java
+org/omg/CORBA/SCCS/s.INV_OBJREF.java
+org/omg/CORBA/SCCS/s.INV_POLICY.java
+org/omg/CORBA/SCCS/s.IRObject.java
+org/omg/CORBA/SCCS/s.IRObjectOperations.java
+org/omg/CORBA/SCCS/s.IdentifierHelper.java
+org/omg/CORBA/SCCS/s.IntHolder.java
+org/omg/CORBA/SCCS/s.LocalObject.java
+org/omg/CORBA/SCCS/s.LongHolder.java
+org/omg/CORBA/SCCS/s.LongLongSeqHelper.java
+org/omg/CORBA/SCCS/s.LongLongSeqHolder.java
+org/omg/CORBA/SCCS/s.LongSeqHelper.java
+org/omg/CORBA/SCCS/s.LongSeqHolder.java
+org/omg/CORBA/SCCS/s.MARSHAL.java
+org/omg/CORBA/SCCS/s.NO_IMPLEMENT.java
+org/omg/CORBA/SCCS/s.NO_MEMORY.java
+org/omg/CORBA/SCCS/s.NO_PERMISSION.java
+org/omg/CORBA/SCCS/s.NO_RESOURCES.java
+org/omg/CORBA/SCCS/s.NO_RESPONSE.java
+org/omg/CORBA/SCCS/s.NVList.java
+org/omg/CORBA/SCCS/s.NameValuePair.java
+org/omg/CORBA/SCCS/s.NameValuePairHelper.java
+org/omg/CORBA/SCCS/s.NamedValue.java
+org/omg/CORBA/SCCS/s.OBJECT_NOT_EXIST.java
+org/omg/CORBA/SCCS/s.OBJ_ADAPTER.java
+org/omg/CORBA/SCCS/s.OMGVMCID.java
+org/omg/CORBA/SCCS/s.ORB.java
+org/omg/CORBA/SCCS/s.Object.java
+org/omg/CORBA/SCCS/s.ObjectHelper.java
+org/omg/CORBA/SCCS/s.ObjectHolder.java
+org/omg/CORBA/SCCS/s.OctetSeqHelper.java
+org/omg/CORBA/SCCS/s.OctetSeqHolder.java
+org/omg/CORBA/SCCS/s.PERSIST_STORE.java
+org/omg/CORBA/SCCS/s.PRIVATE_MEMBER.java
+org/omg/CORBA/SCCS/s.PUBLIC_MEMBER.java
+org/omg/CORBA/SCCS/s.Policy.java
+org/omg/CORBA/SCCS/s.PolicyError.java
+org/omg/CORBA/SCCS/s.PolicyHelper.java
+org/omg/CORBA/SCCS/s.PolicyHolder.java
+org/omg/CORBA/SCCS/s.PolicyListHelper.java
+org/omg/CORBA/SCCS/s.PolicyListHolder.java
+org/omg/CORBA/SCCS/s.PolicyOperations.java
+org/omg/CORBA/SCCS/s.REBIND.java
+org/omg/CORBA/SCCS/s.PolicyTypeHelper.java
+org/omg/CORBA/SCCS/s.Principal.java
+org/omg/CORBA/SCCS/s.PrincipalHolder.java
+org/omg/CORBA/SCCS/s.RepositoryIdHelper.java
+org/omg/CORBA/SCCS/s.Request.java
+org/omg/CORBA/SCCS/s.ServerRequest.java
+org/omg/CORBA/SCCS/s.ServiceDetail.java
+org/omg/CORBA/SCCS/s.ServiceDetailHelper.java
+org/omg/CORBA/SCCS/s.ServiceInformation.java
+org/omg/CORBA/SCCS/s.ServiceInformationHolder.java
+org/omg/CORBA/SCCS/s.SetOverrideType.java
+org/omg/CORBA/SCCS/s.SetOverrideTypeHelper.java
+org/omg/CORBA/SCCS/s.ShortHolder.java
+org/omg/CORBA/SCCS/s.ShortSeqHelper.java
+org/omg/CORBA/SCCS/s.ir.idl
+org/omg/CORBA/SCCS/s.ShortSeqHolder.java
+org/omg/CORBA/SCCS/s.StringHolder.java
+org/omg/CORBA/SCCS/s.StringValueHelper.java
+org/omg/CORBA/SCCS/s.StructMember.java
+org/omg/CORBA/SCCS/s.StructMemberHelper.java
+org/omg/CORBA/SCCS/s.SystemException.java
+org/omg/CORBA/SCCS/s.TCKind.java
+org/omg/CORBA/SCCS/s.TIMEOUT.java
+org/omg/CORBA/SCCS/s.TRANSACTION_MODE.java
+org/omg/CORBA/SCCS/s.TRANSACTION_REQUIRED.java
+org/omg/CORBA/SCCS/s.TRANSACTION_ROLLEDBACK.java
+org/omg/CORBA/SCCS/s.TRANSACTION_UNAVAILABLE.java
+org/omg/CORBA/SCCS/s.TRANSIENT.java
+org/omg/CORBA/SCCS/s.TypeCode.java
+org/omg/CORBA/SCCS/s.TypeCodeHolder.java
+org/omg/CORBA/SCCS/s.ULongLongSeqHelper.java
+org/omg/CORBA/SCCS/s.ULongLongSeqHolder.java
+org/omg/CORBA/SCCS/s.ULongSeqHelper.java
+org/omg/CORBA/SCCS/s.ULongSeqHolder.java
+org/omg/CORBA/SCCS/s.UNKNOWN.java
+org/omg/CORBA/SCCS/s.UNSUPPORTED_POLICY.java
+org/omg/CORBA/SCCS/s.UNSUPPORTED_POLICY_VALUE.java
+org/omg/CORBA/SCCS/s.UShortSeqHelper.java
+org/omg/CORBA/SCCS/s.UShortSeqHolder.java
+org/omg/CORBA/SCCS/s.UnionMember.java
+org/omg/CORBA/SCCS/s.UnionMemberHelper.java
+org/omg/CORBA/SCCS/s.UnknownUserException.java
+org/omg/CORBA/SCCS/s.UnknownUserExceptionHelper.java
+org/omg/CORBA/SCCS/s.UnknownUserExceptionHolder.java
+org/omg/CORBA/SCCS/s.UserException.java
+org/omg/CORBA/SCCS/s.VM_ABSTRACT.java
+org/omg/CORBA/SCCS/s.VM_CUSTOM.java
+org/omg/CORBA/SCCS/s.VM_NONE.java
+org/omg/CORBA/SCCS/s.VM_TRUNCATABLE.java
+org/omg/CORBA/SCCS/s.ValueBaseHelper.java
+org/omg/CORBA/SCCS/s.ValueBaseHolder.java
+org/omg/CORBA/SCCS/s.ValueMember.java
+org/omg/CORBA/SCCS/s.ValueMemberHelper.java
+org/omg/CORBA/SCCS/s.VersionSpecHelper.java
+org/omg/CORBA/SCCS/s.VisibilityHelper.java
+org/omg/CORBA/SCCS/s.WCharSeqHelper.java
+org/omg/CORBA/SCCS/s.WCharSeqHolder.java
+org/omg/CORBA/SCCS/s.WStringValueHelper.java
+org/omg/CORBA/SCCS/s.WrongTransaction.java
+org/omg/CORBA/SCCS/s.WrongTransactionHelper.java
+org/omg/CORBA/SCCS/s.WrongTransactionHolder.java
+org/omg/CORBA/SCCS/s.orb.idl
+org/omg/CORBA/SCCS/s._IDLTypeStub.java
+org/omg/CORBA/SCCS/s._PolicyStub.java
+org/omg/CORBA/SCCS/s.package.html
+org/omg/CORBA/TypeCodePackage
+org/omg/CORBA/TypeCodePackage/SCCS
+org/omg/CORBA/TypeCodePackage/SCCS/s.BadKind.java
+org/omg/CORBA/TypeCodePackage/SCCS/s.Bounds.java
+org/omg/CORBA/TypeCodePackage/SCCS/s.package.html
+org/omg/CORBA/TypeCodePackage/BadKind.java
+org/omg/CORBA/TypeCodePackage/Bounds.java
+org/omg/CORBA/TypeCodePackage/package.html
+org/omg/CORBA/doc-files
+org/omg/CORBA/doc-files/SCCS
+org/omg/CORBA/doc-files/SCCS/s.generatedfiles.html
+org/omg/CORBA/doc-files/SCCS/s.compliance.html
+org/omg/CORBA/doc-files/generatedfiles.html
+org/omg/CORBA/doc-files/compliance.html
+org/omg/CORBA/portable
+org/omg/CORBA/portable/SCCS
+org/omg/CORBA/portable/SCCS/s.ApplicationException.java
+org/omg/CORBA/portable/SCCS/s.BoxedValueHelper.java
+org/omg/CORBA/portable/SCCS/s.CustomValue.java
+org/omg/CORBA/portable/SCCS/s.Delegate.java
+org/omg/CORBA/portable/SCCS/s.IDLEntity.java
+org/omg/CORBA/portable/SCCS/s.IndirectionException.java
+org/omg/CORBA/portable/SCCS/s.InputStream.java
+org/omg/CORBA/portable/SCCS/s.InvokeHandler.java
+org/omg/CORBA/portable/SCCS/s.ObjectImpl.java
+org/omg/CORBA/portable/SCCS/s.OutputStream.java
+org/omg/CORBA/portable/SCCS/s.RemarshalException.java
+org/omg/CORBA/portable/SCCS/s.ResponseHandler.java
+org/omg/CORBA/portable/SCCS/s.ServantObject.java
+org/omg/CORBA/portable/SCCS/s.Streamable.java
+org/omg/CORBA/portable/SCCS/s.StreamableValue.java
+org/omg/CORBA/portable/SCCS/s.ValueBase.java
+org/omg/CORBA/portable/SCCS/s.UnknownException.java
+org/omg/CORBA/portable/SCCS/s.ValueFactory.java
+org/omg/CORBA/portable/SCCS/s.ValueInputStream.java
+org/omg/CORBA/portable/SCCS/s.ValueOutputStream.java
+org/omg/CORBA/portable/SCCS/s.package.html
+org/omg/CORBA/portable/ApplicationException.java
+org/omg/CORBA/portable/BoxedValueHelper.java
+org/omg/CORBA/portable/CustomValue.java
+org/omg/CORBA/portable/Delegate.java
+org/omg/CORBA/portable/IDLEntity.java
+org/omg/CORBA/portable/IndirectionException.java
+org/omg/CORBA/portable/InputStream.java
+org/omg/CORBA/portable/InvokeHandler.java
+org/omg/CORBA/portable/ObjectImpl.java
+org/omg/CORBA/portable/OutputStream.java
+org/omg/CORBA/portable/RemarshalException.java
+org/omg/CORBA/portable/ResponseHandler.java
+org/omg/CORBA/portable/ServantObject.java
+org/omg/CORBA/portable/Streamable.java
+org/omg/CORBA/portable/ValueBase.java
+org/omg/CORBA/portable/StreamableValue.java
+org/omg/CORBA/portable/UnknownException.java
+org/omg/CORBA/portable/ValueFactory.java
+org/omg/CORBA/portable/ValueInputStream.java
+org/omg/CORBA/portable/ValueOutputStream.java
+org/omg/CORBA/portable/package.html
+org/omg/CORBA/ACTIVITY_COMPLETED.java
+org/omg/CORBA/ACTIVITY_REQUIRED.java
+org/omg/CORBA/ARG_IN.java
+org/omg/CORBA/ARG_INOUT.java
+org/omg/CORBA/ARG_OUT.java
+org/omg/CORBA/Any.java
+org/omg/CORBA/AnyHolder.java
+org/omg/CORBA/AnySeqHelper.java
+org/omg/CORBA/AnySeqHolder.java
+org/omg/CORBA/BAD_CONTEXT.java
+org/omg/CORBA/BAD_INV_ORDER.java
+org/omg/CORBA/BAD_OPERATION.java
+org/omg/CORBA/DynArray.java
+org/omg/CORBA/DynAny.java
+org/omg/CORBA/BAD_PARAM.java
+org/omg/CORBA/BAD_POLICY.java
+org/omg/CORBA/BAD_POLICY_TYPE.java
+org/omg/CORBA/BAD_POLICY_VALUE.java
+org/omg/CORBA/BAD_QOS.java
+org/omg/CORBA/BAD_TYPECODE.java
+org/omg/CORBA/BooleanHolder.java
+org/omg/CORBA/BooleanSeqHelper.java
+org/omg/CORBA/BooleanSeqHolder.java
+org/omg/CORBA/Bounds.java
+org/omg/CORBA/ByteHolder.java
+org/omg/CORBA/CODESET_INCOMPATIBLE.java
+org/omg/CORBA/COMM_FAILURE.java
+org/omg/CORBA/CTX_RESTRICT_SCOPE.java
+org/omg/CORBA/CharHolder.java
+org/omg/CORBA/CharSeqHelper.java
+org/omg/CORBA/CharSeqHolder.java
+org/omg/CORBA/CompletionStatus.java
+org/omg/CORBA/CompletionStatusHelper.java
+org/omg/CORBA/Context.java
+org/omg/CORBA/ContextList.java
+org/omg/CORBA/Current.java
+org/omg/CORBA/CurrentHelper.java
+org/omg/CORBA/CurrentHolder.java
+org/omg/CORBA/CurrentOperations.java
+org/omg/CORBA/CustomMarshal.java
+org/omg/CORBA/DATA_CONVERSION.java
+org/omg/CORBA/DataInputStream.java
+org/omg/CORBA/DataOutputStream.java
+org/omg/CORBA/DefinitionKind.java
+org/omg/CORBA/DefinitionKindHelper.java
+org/omg/CORBA/DomainManager.java
+org/omg/CORBA/DomainManagerOperations.java
+org/omg/CORBA/DoubleHolder.java
+org/omg/CORBA/DynEnum.java
+org/omg/CORBA/DoubleSeqHelper.java
+org/omg/CORBA/DoubleSeqHolder.java
+org/omg/CORBA/DynSequence.java
+org/omg/CORBA/DynFixed.java
+org/omg/CORBA/DynStruct.java
+org/omg/CORBA/DynUnion.java
+org/omg/CORBA/DynValue.java
+org/omg/CORBA/Environment.java
+org/omg/CORBA/DynamicImplementation.java
+org/omg/CORBA/ExceptionList.java
+org/omg/CORBA/FREE_MEM.java
+org/omg/CORBA/FieldNameHelper.java
+org/omg/CORBA/FixedHolder.java
+org/omg/CORBA/FloatHolder.java
+org/omg/CORBA/FloatSeqHelper.java
+org/omg/CORBA/FloatSeqHolder.java
+org/omg/CORBA/IDLType.java
+org/omg/CORBA/INVALID_TRANSACTION.java
+org/omg/CORBA/IDLTypeHelper.java
+org/omg/CORBA/IDLTypeOperations.java
+org/omg/CORBA/IMP_LIMIT.java
+org/omg/CORBA/INITIALIZE.java
+org/omg/CORBA/INTERNAL.java
+org/omg/CORBA/INTF_REPOS.java
+org/omg/CORBA/INVALID_ACTIVITY.java
+org/omg/CORBA/IRObjectOperations.java
+org/omg/CORBA/INV_FLAG.java
+org/omg/CORBA/INV_IDENT.java
+org/omg/CORBA/INV_OBJREF.java
+org/omg/CORBA/INV_POLICY.java
+org/omg/CORBA/IRObject.java
+org/omg/CORBA/NameValuePairHelper.java
+org/omg/CORBA/IdentifierHelper.java
+org/omg/CORBA/IntHolder.java
+org/omg/CORBA/LocalObject.java
+org/omg/CORBA/LongHolder.java
+org/omg/CORBA/MARSHAL.java
+org/omg/CORBA/LongLongSeqHelper.java
+org/omg/CORBA/LongLongSeqHolder.java
+org/omg/CORBA/LongSeqHelper.java
+org/omg/CORBA/LongSeqHolder.java
+org/omg/CORBA/NO_IMPLEMENT.java
+org/omg/CORBA/NO_MEMORY.java
+org/omg/CORBA/NO_PERMISSION.java
+org/omg/CORBA/NO_RESOURCES.java
+org/omg/CORBA/NO_RESPONSE.java
+org/omg/CORBA/NVList.java
+org/omg/CORBA/NameValuePair.java
+org/omg/CORBA/OBJECT_NOT_EXIST.java
+org/omg/CORBA/NamedValue.java
+org/omg/CORBA/OBJ_ADAPTER.java
+org/omg/CORBA/OMGVMCID.java
+org/omg/CORBA/ORB.java
+org/omg/CORBA/Object.java
+org/omg/CORBA/Policy.java
+org/omg/CORBA/ServiceDetailHelper.java
+org/omg/CORBA/ObjectHelper.java
+org/omg/CORBA/ObjectHolder.java
+org/omg/CORBA/OctetSeqHelper.java
+org/omg/CORBA/OctetSeqHolder.java
+org/omg/CORBA/PERSIST_STORE.java
+org/omg/CORBA/PRIVATE_MEMBER.java
+org/omg/CORBA/PUBLIC_MEMBER.java
+org/omg/CORBA/PolicyError.java
+org/omg/CORBA/PolicyHelper.java
+org/omg/CORBA/PolicyHolder.java
+org/omg/CORBA/PolicyListHelper.java
+org/omg/CORBA/PolicyListHolder.java
+org/omg/CORBA/PolicyOperations.java
+org/omg/CORBA/PolicyTypeHelper.java
+org/omg/CORBA/Principal.java
+org/omg/CORBA/PrincipalHolder.java
+org/omg/CORBA/REBIND.java
+org/omg/CORBA/Request.java
+org/omg/CORBA/RepositoryIdHelper.java
+org/omg/CORBA/ServerRequest.java
+org/omg/CORBA/ServiceDetail.java
+org/omg/CORBA/ServiceInformationHelper.java
+org/omg/CORBA/ServiceInformation.java
+org/omg/CORBA/TRANSACTION_REQUIRED.java
+org/omg/CORBA/ServiceInformationHolder.java
+org/omg/CORBA/SetOverrideType.java
+org/omg/CORBA/SetOverrideTypeHelper.java
+org/omg/CORBA/ShortHolder.java
+org/omg/CORBA/ShortSeqHelper.java
+org/omg/CORBA/ShortSeqHolder.java
+org/omg/CORBA/StringHolder.java
+org/omg/CORBA/StringValueHelper.java
+org/omg/CORBA/StructMember.java
+org/omg/CORBA/StructMemberHelper.java
+org/omg/CORBA/SystemException.java
+org/omg/CORBA/TCKind.java
+org/omg/CORBA/TIMEOUT.java
+org/omg/CORBA/TRANSACTION_MODE.java
+org/omg/CORBA/TRANSACTION_UNAVAILABLE.java
+org/omg/CORBA/TRANSACTION_ROLLEDBACK.java
+org/omg/CORBA/ULongLongSeqHelper.java
+org/omg/CORBA/TRANSIENT.java
+org/omg/CORBA/TypeCode.java
+org/omg/CORBA/TypeCodeHolder.java
+org/omg/CORBA/ULongLongSeqHolder.java
+org/omg/CORBA/ULongSeqHelper.java
+org/omg/CORBA/ULongSeqHolder.java
+org/omg/CORBA/UNKNOWN.java
+org/omg/CORBA/UNSUPPORTED_POLICY.java
+org/omg/CORBA/UShortSeqHelper.java
+org/omg/CORBA/UnknownUserExceptionHelper.java
+org/omg/CORBA/UNSUPPORTED_POLICY_VALUE.java
+org/omg/CORBA/UShortSeqHolder.java
+org/omg/CORBA/UnionMember.java
+org/omg/CORBA/UnionMemberHelper.java
+org/omg/CORBA/UnknownUserException.java
+org/omg/CORBA/ir.idl
+org/omg/CORBA/UnknownUserExceptionHolder.java
+org/omg/CORBA/UserException.java
+org/omg/CORBA/VM_ABSTRACT.java
+org/omg/CORBA/VM_CUSTOM.java
+org/omg/CORBA/VM_NONE.java
+org/omg/CORBA/VM_TRUNCATABLE.java
+org/omg/CORBA/ValueBaseHelper.java
+org/omg/CORBA/ValueBaseHolder.java
+org/omg/CORBA/ValueMember.java
+org/omg/CORBA/ValueMemberHelper.java
+org/omg/CORBA/VersionSpecHelper.java
+org/omg/CORBA/VisibilityHelper.java
+org/omg/CORBA/WCharSeqHelper.java
+org/omg/CORBA/WCharSeqHolder.java
+org/omg/CORBA/WStringValueHelper.java
+org/omg/CORBA/WrongTransaction.java
+org/omg/CORBA/WrongTransactionHelper.java
+org/omg/CORBA/WrongTransactionHolder.java
+org/omg/CORBA/_IDLTypeStub.java
+org/omg/CORBA/_PolicyStub.java
+org/omg/CORBA/orb.idl
+org/omg/CORBA/package.html
+org/omg/CORBA_2_3
+org/omg/CORBA_2_3/SCCS
+org/omg/CORBA_2_3/SCCS/s.package.html
+org/omg/CORBA_2_3/SCCS/s.ORB.java
+org/omg/CORBA_2_3/portable
+org/omg/CORBA_2_3/portable/SCCS
+org/omg/CORBA_2_3/portable/SCCS/s.InputStream.java
+org/omg/CORBA_2_3/portable/SCCS/s.Delegate.java
+org/omg/CORBA_2_3/portable/SCCS/s.ObjectImpl.java
+org/omg/CORBA_2_3/portable/SCCS/s.OutputStream.java
+org/omg/CORBA_2_3/portable/SCCS/s.package.html
+org/omg/CORBA_2_3/portable/InputStream.java
+org/omg/CORBA_2_3/portable/Delegate.java
+org/omg/CORBA_2_3/portable/ObjectImpl.java
+org/omg/CORBA_2_3/portable/OutputStream.java
+org/omg/CORBA_2_3/portable/package.html
+org/omg/CORBA_2_3/package.html
+org/omg/CORBA_2_3/ORB.java
+org/omg/CosNaming
+org/omg/CosNaming/NamingContextExtPackage
+org/omg/CosNaming/NamingContextExtPackage/SCCS
+org/omg/CosNaming/NamingContextExtPackage/SCCS/s.package.html
+org/omg/CosNaming/NamingContextExtPackage/package.html
+org/omg/CosNaming/NamingContextPackage
+org/omg/CosNaming/NamingContextPackage/SCCS
+org/omg/CosNaming/NamingContextPackage/SCCS/s.package.html
+org/omg/CosNaming/NamingContextPackage/package.html
+org/omg/CosNaming/SCCS
+org/omg/CosNaming/SCCS/s._BindingIteratorImplBase.java
+org/omg/CosNaming/SCCS/s._NamingContextImplBase.java
+org/omg/CosNaming/SCCS/s.nameservice.idl
+org/omg/CosNaming/SCCS/s.package.html
+org/omg/CosNaming/_BindingIteratorImplBase.java
+org/omg/CosNaming/_NamingContextImplBase.java
+org/omg/CosNaming/nameservice.idl
+org/omg/CosNaming/package.html
+org/omg/Dynamic
+org/omg/Dynamic/SCCS
+org/omg/Dynamic/SCCS/s.package.html
+org/omg/Dynamic/package.html
+org/omg/DynamicAny
+org/omg/DynamicAny/DynAnyFactoryPackage
+org/omg/DynamicAny/DynAnyFactoryPackage/SCCS
+org/omg/DynamicAny/DynAnyFactoryPackage/SCCS/s.package.html
+org/omg/DynamicAny/DynAnyFactoryPackage/package.html
+org/omg/DynamicAny/DynAnyPackage
+org/omg/DynamicAny/DynAnyPackage/SCCS
+org/omg/DynamicAny/DynAnyPackage/SCCS/s.package.html
+org/omg/DynamicAny/DynAnyPackage/package.html
+org/omg/DynamicAny/SCCS
+org/omg/DynamicAny/SCCS/s.DynamicAny.idl
+org/omg/DynamicAny/SCCS/s.package.html
+org/omg/DynamicAny/DynamicAny.idl
+org/omg/DynamicAny/package.html
+org/omg/IOP
+org/omg/IOP/CodecFactoryPackage
+org/omg/IOP/CodecFactoryPackage/SCCS
+org/omg/IOP/CodecFactoryPackage/SCCS/s.package.html
+org/omg/IOP/CodecFactoryPackage/package.html
+org/omg/IOP/CodecPackage
+org/omg/IOP/CodecPackage/SCCS
+org/omg/IOP/CodecPackage/SCCS/s.package.html
+org/omg/IOP/CodecPackage/package.html
+org/omg/IOP/SCCS
+org/omg/IOP/SCCS/s.package.html
+org/omg/IOP/package.html
+org/omg/Messaging
+org/omg/Messaging/SCCS
+org/omg/Messaging/SCCS/s.package.html
+org/omg/Messaging/package.html
+org/omg/PortableInterceptor
+org/omg/PortableInterceptor/ORBInitInfoPackage
+org/omg/PortableInterceptor/ORBInitInfoPackage/SCCS
+org/omg/PortableInterceptor/ORBInitInfoPackage/SCCS/s.package.html
+org/omg/PortableInterceptor/ORBInitInfoPackage/package.html
+org/omg/PortableInterceptor/SCCS
+org/omg/PortableInterceptor/SCCS/s.Interceptors.idl
+org/omg/PortableInterceptor/SCCS/s.CORBAX.idl
+org/omg/PortableInterceptor/SCCS/s.IOP.idl
+org/omg/PortableInterceptor/SCCS/s.Messaging.idl
+org/omg/PortableInterceptor/SCCS/s.package.html
+org/omg/PortableInterceptor/Interceptors.idl
+org/omg/PortableInterceptor/CORBAX.idl
+org/omg/PortableInterceptor/IOP.idl
+org/omg/PortableInterceptor/Messaging.idl
+org/omg/PortableInterceptor/package.html
+org/omg/PortableServer
+org/omg/PortableServer/CurrentPackage
+org/omg/PortableServer/CurrentPackage/SCCS
+org/omg/PortableServer/CurrentPackage/SCCS/s.package.html
+org/omg/PortableServer/CurrentPackage/package.html
+org/omg/PortableServer/POAManagerPackage
+org/omg/PortableServer/POAManagerPackage/SCCS
+org/omg/PortableServer/POAManagerPackage/SCCS/s.package.html
+org/omg/PortableServer/POAManagerPackage/package.html
+org/omg/PortableServer/POAPackage
+org/omg/PortableServer/POAPackage/SCCS
+org/omg/PortableServer/POAPackage/SCCS/s.package.html
+org/omg/PortableServer/POAPackage/package.html
+org/omg/PortableServer/SCCS
+org/omg/PortableServer/SCCS/s.DynamicImplementation.java
+org/omg/PortableServer/SCCS/s.CurrentHelper.java
+org/omg/PortableServer/SCCS/s.POAHelper.java
+org/omg/PortableServer/SCCS/s.Servant.java
+org/omg/PortableServer/SCCS/s.corba.idl
+org/omg/PortableServer/SCCS/s.package.html
+org/omg/PortableServer/SCCS/s.poa.idl
+org/omg/PortableServer/ServantLocatorPackage
+org/omg/PortableServer/ServantLocatorPackage/SCCS
+org/omg/PortableServer/ServantLocatorPackage/SCCS/s.CookieHolder.java
+org/omg/PortableServer/ServantLocatorPackage/SCCS/s.package.html
+org/omg/PortableServer/ServantLocatorPackage/CookieHolder.java
+org/omg/PortableServer/ServantLocatorPackage/package.html
+org/omg/PortableServer/portable
+org/omg/PortableServer/portable/SCCS
+org/omg/PortableServer/portable/SCCS/s.Delegate.java
+org/omg/PortableServer/portable/SCCS/s.package.html
+org/omg/PortableServer/portable/Delegate.java
+org/omg/PortableServer/portable/package.html
+org/omg/PortableServer/DynamicImplementation.java
+org/omg/PortableServer/CurrentHelper.java
+org/omg/PortableServer/POAHelper.java
+org/omg/PortableServer/Servant.java
+org/omg/PortableServer/corba.idl
+org/omg/PortableServer/package.html
+org/omg/PortableServer/poa.idl
+org/omg/SendingContext
+org/omg/SendingContext/SCCS
+org/omg/SendingContext/SCCS/s.RunTime.java
+org/omg/SendingContext/SCCS/s.package.html
+org/omg/SendingContext/SCCS/s.RunTimeOperations.java
+org/omg/SendingContext/RunTimeOperations.java
+org/omg/SendingContext/RunTime.java
+org/omg/SendingContext/package.html
+org/omg/stub
+org/omg/stub/java
+org/omg/stub/java/rmi
+org/omg/stub/java/rmi/SCCS
+org/omg/stub/java/rmi/SCCS/s._Remote_Stub.java
+org/omg/stub/java/rmi/SCCS/s.package.html
+org/omg/stub/java/rmi/_Remote_Stub.java
+org/omg/stub/java/rmi/package.html
+org/w3c
+org/w3c/dom
+org/w3c/dom/SCCS
+org/w3c/dom/SCCS/s.CDATASection.java
+org/w3c/dom/SCCS/s.Attr.java
+org/w3c/dom/SCCS/s.DOMImplementation.java
+org/w3c/dom/SCCS/s.CharacterData.java
+org/w3c/dom/SCCS/s.Comment.java
+org/w3c/dom/SCCS/s.DOMConfiguration.java
+org/w3c/dom/SCCS/s.DOMError.java
+org/w3c/dom/SCCS/s.DOMErrorHandler.java
+org/w3c/dom/SCCS/s.DOMException.java
+org/w3c/dom/SCCS/s.Node.java
+org/w3c/dom/SCCS/s.DOMImplementationList.java
+org/w3c/dom/SCCS/s.DOMImplementationSource.java
+org/w3c/dom/SCCS/s.DOMLocator.java
+org/w3c/dom/SCCS/s.DOMStringList.java
+org/w3c/dom/SCCS/s.Document.java
+org/w3c/dom/SCCS/s.TypeInfo.java
+org/w3c/dom/SCCS/s.Text.java
+org/w3c/dom/SCCS/s.DocumentFragment.java
+org/w3c/dom/SCCS/s.DocumentType.java
+org/w3c/dom/SCCS/s.Element.java
+org/w3c/dom/SCCS/s.Entity.java
+org/w3c/dom/SCCS/s.EntityReference.java
+org/w3c/dom/SCCS/s.NameList.java
+org/w3c/dom/SCCS/s.NamedNodeMap.java
+org/w3c/dom/SCCS/s.NodeList.java
+org/w3c/dom/SCCS/s.Notation.java
+org/w3c/dom/SCCS/s.ProcessingInstruction.java
+org/w3c/dom/SCCS/s.UserDataHandler.java
+org/w3c/dom/SCCS/s.package.html
+org/w3c/dom/bootstrap
+org/w3c/dom/bootstrap/SCCS
+org/w3c/dom/bootstrap/SCCS/s.DOMImplementationRegistry.java
+org/w3c/dom/bootstrap/DOMImplementationRegistry.java
+org/w3c/dom/css
+org/w3c/dom/css/SCCS
+org/w3c/dom/css/SCCS/s.CSSPrimitiveValue.java
+org/w3c/dom/css/SCCS/s.CSS2Properties.java
+org/w3c/dom/css/SCCS/s.CSSCharsetRule.java
+org/w3c/dom/css/SCCS/s.CSSFontFaceRule.java
+org/w3c/dom/css/SCCS/s.CSSImportRule.java
+org/w3c/dom/css/SCCS/s.CSSMediaRule.java
+org/w3c/dom/css/SCCS/s.CSSPageRule.java
+org/w3c/dom/css/SCCS/s.CSSStyleDeclaration.java
+org/w3c/dom/css/SCCS/s.CSSRule.java
+org/w3c/dom/css/SCCS/s.CSSRuleList.java
+org/w3c/dom/css/SCCS/s.CSSStyleSheet.java
+org/w3c/dom/css/SCCS/s.CSSStyleRule.java
+org/w3c/dom/css/SCCS/s.DOMImplementationCSS.java
+org/w3c/dom/css/SCCS/s.CSSUnknownRule.java
+org/w3c/dom/css/SCCS/s.CSSValue.java
+org/w3c/dom/css/SCCS/s.CSSValueList.java
+org/w3c/dom/css/SCCS/s.Counter.java
+org/w3c/dom/css/SCCS/s.DocumentCSS.java
+org/w3c/dom/css/SCCS/s.RGBColor.java
+org/w3c/dom/css/SCCS/s.Rect.java
+org/w3c/dom/css/SCCS/s.ElementCSSInlineStyle.java
+org/w3c/dom/css/SCCS/s.ViewCSS.java
+org/w3c/dom/css/CSSFontFaceRule.java
+org/w3c/dom/css/CSS2Properties.java
+org/w3c/dom/css/CSSCharsetRule.java
+org/w3c/dom/css/CSSStyleDeclaration.java
+org/w3c/dom/css/CSSImportRule.java
+org/w3c/dom/css/CSSMediaRule.java
+org/w3c/dom/css/CSSPageRule.java
+org/w3c/dom/css/CSSPrimitiveValue.java
+org/w3c/dom/css/CSSRule.java
+org/w3c/dom/css/CSSRuleList.java
+org/w3c/dom/css/CSSStyleRule.java
+org/w3c/dom/css/CSSStyleSheet.java
+org/w3c/dom/css/CSSUnknownRule.java
+org/w3c/dom/css/CSSValue.java
+org/w3c/dom/css/CSSValueList.java
+org/w3c/dom/css/Counter.java
+org/w3c/dom/css/Rect.java
+org/w3c/dom/css/DOMImplementationCSS.java
+org/w3c/dom/css/DocumentCSS.java
+org/w3c/dom/css/ElementCSSInlineStyle.java
+org/w3c/dom/css/RGBColor.java
+org/w3c/dom/css/ViewCSS.java
+org/w3c/dom/events
+org/w3c/dom/events/SCCS
+org/w3c/dom/events/SCCS/s.DocumentEvent.java
+org/w3c/dom/events/SCCS/s.Event.java
+org/w3c/dom/events/SCCS/s.EventException.java
+org/w3c/dom/events/SCCS/s.EventListener.java
+org/w3c/dom/events/SCCS/s.EventTarget.java
+org/w3c/dom/events/SCCS/s.MouseEvent.java
+org/w3c/dom/events/SCCS/s.MutationEvent.java
+org/w3c/dom/events/SCCS/s.UIEvent.java
+org/w3c/dom/events/DocumentEvent.java
+org/w3c/dom/events/Event.java
+org/w3c/dom/events/EventException.java
+org/w3c/dom/events/EventListener.java
+org/w3c/dom/events/EventTarget.java
+org/w3c/dom/events/MouseEvent.java
+org/w3c/dom/events/MutationEvent.java
+org/w3c/dom/events/UIEvent.java
+org/w3c/dom/html
+org/w3c/dom/html/SCCS
+org/w3c/dom/html/SCCS/s.HTMLDOMImplementation.java
+org/w3c/dom/html/SCCS/s.HTMLAnchorElement.java
+org/w3c/dom/html/SCCS/s.HTMLAppletElement.java
+org/w3c/dom/html/SCCS/s.HTMLAreaElement.java
+org/w3c/dom/html/SCCS/s.HTMLBRElement.java
+org/w3c/dom/html/SCCS/s.HTMLBaseElement.java
+org/w3c/dom/html/SCCS/s.HTMLBaseFontElement.java
+org/w3c/dom/html/SCCS/s.HTMLBodyElement.java
+org/w3c/dom/html/SCCS/s.HTMLButtonElement.java
+org/w3c/dom/html/SCCS/s.HTMLCollection.java
+org/w3c/dom/html/SCCS/s.HTMLDListElement.java
+org/w3c/dom/html/SCCS/s.HTMLDirectoryElement.java
+org/w3c/dom/html/SCCS/s.HTMLDivElement.java
+org/w3c/dom/html/SCCS/s.HTMLTableCaptionElement.java
+org/w3c/dom/html/SCCS/s.HTMLDocument.java
+org/w3c/dom/html/SCCS/s.HTMLElement.java
+org/w3c/dom/html/SCCS/s.HTMLFieldSetElement.java
+org/w3c/dom/html/SCCS/s.HTMLFontElement.java
+org/w3c/dom/html/SCCS/s.HTMLFormElement.java
+org/w3c/dom/html/SCCS/s.HTMLFrameElement.java
+org/w3c/dom/html/SCCS/s.HTMLFrameSetElement.java
+org/w3c/dom/html/SCCS/s.HTMLHRElement.java
+org/w3c/dom/html/SCCS/s.HTMLHeadElement.java
+org/w3c/dom/html/SCCS/s.HTMLHeadingElement.java
+org/w3c/dom/html/SCCS/s.HTMLHtmlElement.java
+org/w3c/dom/html/SCCS/s.HTMLIFrameElement.java
+org/w3c/dom/html/SCCS/s.HTMLImageElement.java
+org/w3c/dom/html/SCCS/s.HTMLInputElement.java
+org/w3c/dom/html/SCCS/s.HTMLIsIndexElement.java
+org/w3c/dom/html/SCCS/s.HTMLLIElement.java
+org/w3c/dom/html/SCCS/s.HTMLLabelElement.java
+org/w3c/dom/html/SCCS/s.HTMLLegendElement.java
+org/w3c/dom/html/SCCS/s.HTMLLinkElement.java
+org/w3c/dom/html/SCCS/s.HTMLMapElement.java
+org/w3c/dom/html/SCCS/s.HTMLMenuElement.java
+org/w3c/dom/html/SCCS/s.HTMLMetaElement.java
+org/w3c/dom/html/SCCS/s.HTMLModElement.java
+org/w3c/dom/html/SCCS/s.HTMLOListElement.java
+org/w3c/dom/html/SCCS/s.HTMLObjectElement.java
+org/w3c/dom/html/SCCS/s.HTMLOptGroupElement.java
+org/w3c/dom/html/SCCS/s.HTMLOptionElement.java
+org/w3c/dom/html/SCCS/s.HTMLParagraphElement.java
+org/w3c/dom/html/SCCS/s.HTMLParamElement.java
+org/w3c/dom/html/SCCS/s.HTMLPreElement.java
+org/w3c/dom/html/SCCS/s.HTMLQuoteElement.java
+org/w3c/dom/html/SCCS/s.HTMLScriptElement.java
+org/w3c/dom/html/SCCS/s.HTMLSelectElement.java
+org/w3c/dom/html/SCCS/s.HTMLStyleElement.java
+org/w3c/dom/html/SCCS/s.HTMLTableSectionElement.java
+org/w3c/dom/html/SCCS/s.HTMLTableCellElement.java
+org/w3c/dom/html/SCCS/s.HTMLTableColElement.java
+org/w3c/dom/html/SCCS/s.HTMLTableElement.java
+org/w3c/dom/html/SCCS/s.HTMLTableRowElement.java
+org/w3c/dom/html/SCCS/s.HTMLTextAreaElement.java
+org/w3c/dom/html/SCCS/s.HTMLTitleElement.java
+org/w3c/dom/html/SCCS/s.HTMLUListElement.java
+org/w3c/dom/html/HTMLBaseFontElement.java
+org/w3c/dom/html/HTMLAnchorElement.java
+org/w3c/dom/html/HTMLAppletElement.java
+org/w3c/dom/html/HTMLAreaElement.java
+org/w3c/dom/html/HTMLBRElement.java
+org/w3c/dom/html/HTMLBaseElement.java
+org/w3c/dom/html/HTMLBodyElement.java
+org/w3c/dom/html/HTMLButtonElement.java
+org/w3c/dom/html/HTMLCollection.java
+org/w3c/dom/html/HTMLDListElement.java
+org/w3c/dom/html/HTMLDOMImplementation.java
+org/w3c/dom/html/HTMLDirectoryElement.java
+org/w3c/dom/html/HTMLDivElement.java
+org/w3c/dom/html/HTMLDocument.java
+org/w3c/dom/html/HTMLElement.java
+org/w3c/dom/html/HTMLFieldSetElement.java
+org/w3c/dom/html/HTMLFontElement.java
+org/w3c/dom/html/HTMLFormElement.java
+org/w3c/dom/html/HTMLFrameElement.java
+org/w3c/dom/html/HTMLFrameSetElement.java
+org/w3c/dom/html/HTMLHRElement.java
+org/w3c/dom/html/HTMLHeadElement.java
+org/w3c/dom/html/HTMLHeadingElement.java
+org/w3c/dom/html/HTMLHtmlElement.java
+org/w3c/dom/html/HTMLIFrameElement.java
+org/w3c/dom/html/HTMLImageElement.java
+org/w3c/dom/html/HTMLInputElement.java
+org/w3c/dom/html/HTMLIsIndexElement.java
+org/w3c/dom/html/HTMLLIElement.java
+org/w3c/dom/html/HTMLLabelElement.java
+org/w3c/dom/html/HTMLLegendElement.java
+org/w3c/dom/html/HTMLLinkElement.java
+org/w3c/dom/html/HTMLMapElement.java
+org/w3c/dom/html/HTMLMenuElement.java
+org/w3c/dom/html/HTMLMetaElement.java
+org/w3c/dom/html/HTMLModElement.java
+org/w3c/dom/html/HTMLOListElement.java
+org/w3c/dom/html/HTMLObjectElement.java
+org/w3c/dom/html/HTMLOptGroupElement.java
+org/w3c/dom/html/HTMLOptionElement.java
+org/w3c/dom/html/HTMLParagraphElement.java
+org/w3c/dom/html/HTMLParamElement.java
+org/w3c/dom/html/HTMLPreElement.java
+org/w3c/dom/html/HTMLQuoteElement.java
+org/w3c/dom/html/HTMLScriptElement.java
+org/w3c/dom/html/HTMLSelectElement.java
+org/w3c/dom/html/HTMLStyleElement.java
+org/w3c/dom/html/HTMLTableCaptionElement.java
+org/w3c/dom/html/HTMLTableCellElement.java
+org/w3c/dom/html/HTMLTableColElement.java
+org/w3c/dom/html/HTMLTableElement.java
+org/w3c/dom/html/HTMLTableRowElement.java
+org/w3c/dom/html/HTMLTableSectionElement.java
+org/w3c/dom/html/HTMLTextAreaElement.java
+org/w3c/dom/html/HTMLTitleElement.java
+org/w3c/dom/html/HTMLUListElement.java
+org/w3c/dom/ls
+org/w3c/dom/ls/SCCS
+org/w3c/dom/ls/SCCS/s.DOMImplementationLS.java
+org/w3c/dom/ls/SCCS/s.LSException.java
+org/w3c/dom/ls/SCCS/s.LSInput.java
+org/w3c/dom/ls/SCCS/s.LSLoadEvent.java
+org/w3c/dom/ls/SCCS/s.LSOutput.java
+org/w3c/dom/ls/SCCS/s.LSParser.java
+org/w3c/dom/ls/SCCS/s.LSParserFilter.java
+org/w3c/dom/ls/SCCS/s.LSProgressEvent.java
+org/w3c/dom/ls/SCCS/s.LSResourceResolver.java
+org/w3c/dom/ls/SCCS/s.LSSerializer.java
+org/w3c/dom/ls/SCCS/s.LSSerializerFilter.java
+org/w3c/dom/ls/DOMImplementationLS.java
+org/w3c/dom/ls/LSException.java
+org/w3c/dom/ls/LSInput.java
+org/w3c/dom/ls/LSLoadEvent.java
+org/w3c/dom/ls/LSOutput.java
+org/w3c/dom/ls/LSParser.java
+org/w3c/dom/ls/LSParserFilter.java
+org/w3c/dom/ls/LSProgressEvent.java
+org/w3c/dom/ls/LSResourceResolver.java
+org/w3c/dom/ls/LSSerializer.java
+org/w3c/dom/ls/LSSerializerFilter.java
+org/w3c/dom/ranges
+org/w3c/dom/ranges/SCCS
+org/w3c/dom/ranges/SCCS/s.DocumentRange.java
+org/w3c/dom/ranges/SCCS/s.Range.java
+org/w3c/dom/ranges/SCCS/s.RangeException.java
+org/w3c/dom/ranges/SCCS/s.package.html
+org/w3c/dom/ranges/DocumentRange.java
+org/w3c/dom/ranges/Range.java
+org/w3c/dom/ranges/RangeException.java
+org/w3c/dom/ranges/package.html
+org/w3c/dom/stylesheets
+org/w3c/dom/stylesheets/SCCS
+org/w3c/dom/stylesheets/SCCS/s.DocumentStyle.java
+org/w3c/dom/stylesheets/SCCS/s.LinkStyle.java
+org/w3c/dom/stylesheets/SCCS/s.MediaList.java
+org/w3c/dom/stylesheets/SCCS/s.StyleSheet.java
+org/w3c/dom/stylesheets/SCCS/s.StyleSheetList.java
+org/w3c/dom/stylesheets/DocumentStyle.java
+org/w3c/dom/stylesheets/LinkStyle.java
+org/w3c/dom/stylesheets/MediaList.java
+org/w3c/dom/stylesheets/StyleSheet.java
+org/w3c/dom/stylesheets/StyleSheetList.java
+org/w3c/dom/traversal
+org/w3c/dom/traversal/SCCS
+org/w3c/dom/traversal/SCCS/s.DocumentTraversal.java
+org/w3c/dom/traversal/SCCS/s.NodeFilter.java
+org/w3c/dom/traversal/SCCS/s.NodeIterator.java
+org/w3c/dom/traversal/SCCS/s.TreeWalker.java
+org/w3c/dom/traversal/DocumentTraversal.java
+org/w3c/dom/traversal/NodeFilter.java
+org/w3c/dom/traversal/NodeIterator.java
+org/w3c/dom/traversal/TreeWalker.java
+org/w3c/dom/views
+org/w3c/dom/views/SCCS
+org/w3c/dom/views/SCCS/s.AbstractView.java
+org/w3c/dom/views/SCCS/s.DocumentView.java
+org/w3c/dom/views/AbstractView.java
+org/w3c/dom/views/DocumentView.java
+org/w3c/dom/CDATASection.java
+org/w3c/dom/Attr.java
+org/w3c/dom/DOMConfiguration.java
+org/w3c/dom/CharacterData.java
+org/w3c/dom/Comment.java
+org/w3c/dom/DOMErrorHandler.java
+org/w3c/dom/DOMError.java
+org/w3c/dom/DOMException.java
+org/w3c/dom/DOMImplementation.java
+org/w3c/dom/DOMLocator.java
+org/w3c/dom/Entity.java
+org/w3c/dom/NamedNodeMap.java
+org/w3c/dom/DOMImplementationList.java
+org/w3c/dom/DOMImplementationSource.java
+org/w3c/dom/DOMStringList.java
+org/w3c/dom/Document.java
+org/w3c/dom/DocumentFragment.java
+org/w3c/dom/DocumentType.java
+org/w3c/dom/Element.java
+org/w3c/dom/NameList.java
+org/w3c/dom/EntityReference.java
+org/w3c/dom/Node.java
+org/w3c/dom/NodeList.java
+org/w3c/dom/Notation.java
+org/w3c/dom/ProcessingInstruction.java
+org/w3c/dom/Text.java
+org/w3c/dom/TypeInfo.java
+org/w3c/dom/UserDataHandler.java
+org/w3c/dom/package.html
+org/xml
+org/xml/sax
+org/xml/sax/SCCS
+org/xml/sax/SCCS/s.AttributeList.java
+org/xml/sax/SCCS/s.Attributes.java
+org/xml/sax/SCCS/s.COPYING
+org/xml/sax/SCCS/s.COPYING.txt
+org/xml/sax/SCCS/s.ContentHandler.java
+org/xml/sax/SCCS/s.DTDHandler.java
+org/xml/sax/SCCS/s.DocumentHandler.java
+org/xml/sax/SCCS/s.EntityResolver.java
+org/xml/sax/SCCS/s.ErrorHandler.java
+org/xml/sax/SCCS/s.HandlerBase.java
+org/xml/sax/SCCS/s.InputSource.java
+org/xml/sax/SCCS/s.Locator.java
+org/xml/sax/SCCS/s.Parser.java
+org/xml/sax/SCCS/s.SAXException.java
+org/xml/sax/SCCS/s.SAXNotRecognizedException.java
+org/xml/sax/SCCS/s.SAXNotSupportedException.java
+org/xml/sax/SCCS/s.SAXParseException.java
+org/xml/sax/SCCS/s.XMLFilter.java
+org/xml/sax/SCCS/s.XMLReader.java
+org/xml/sax/SCCS/s.package.html
+org/xml/sax/ext
+org/xml/sax/ext/SCCS
+org/xml/sax/ext/SCCS/s.Attributes2Impl.java
+org/xml/sax/ext/SCCS/s.Attributes2.java
+org/xml/sax/ext/SCCS/s.DeclHandler.java
+org/xml/sax/ext/SCCS/s.DefaultHandler2.java
+org/xml/sax/ext/SCCS/s.EntityResolver2.java
+org/xml/sax/ext/SCCS/s.LexicalHandler.java
+org/xml/sax/ext/SCCS/s.Locator2.java
+org/xml/sax/ext/SCCS/s.Locator2Impl.java
+org/xml/sax/ext/SCCS/s.package.html
+org/xml/sax/ext/Attributes2Impl.java
+org/xml/sax/ext/Attributes2.java
+org/xml/sax/ext/DeclHandler.java
+org/xml/sax/ext/DefaultHandler2.java
+org/xml/sax/ext/EntityResolver2.java
+org/xml/sax/ext/LexicalHandler.java
+org/xml/sax/ext/Locator2.java
+org/xml/sax/ext/Locator2Impl.java
+org/xml/sax/ext/package.html
+org/xml/sax/helpers
+org/xml/sax/helpers/SCCS
+org/xml/sax/helpers/SCCS/s.AttributeListImpl.java
+org/xml/sax/helpers/SCCS/s.AttributesImpl.java
+org/xml/sax/helpers/SCCS/s.DefaultHandler.java
+org/xml/sax/helpers/SCCS/s.LocatorImpl.java
+org/xml/sax/helpers/SCCS/s.NamespaceSupport.java
+org/xml/sax/helpers/SCCS/s.NewInstance.java
+org/xml/sax/helpers/SCCS/s.ParserAdapter.java
+org/xml/sax/helpers/SCCS/s.ParserFactory.java
+org/xml/sax/helpers/SCCS/s.XMLFilterImpl.java
+org/xml/sax/helpers/SCCS/s.XMLReaderAdapter.java
+org/xml/sax/helpers/SCCS/s.XMLReaderFactory.java
+org/xml/sax/helpers/SCCS/s.package.html
+org/xml/sax/helpers/AttributeListImpl.java
+org/xml/sax/helpers/AttributesImpl.java
+org/xml/sax/helpers/DefaultHandler.java
+org/xml/sax/helpers/LocatorImpl.java
+org/xml/sax/helpers/NamespaceSupport.java
+org/xml/sax/helpers/NewInstance.java
+org/xml/sax/helpers/ParserAdapter.java
+org/xml/sax/helpers/ParserFactory.java
+org/xml/sax/helpers/XMLFilterImpl.java
+org/xml/sax/helpers/XMLReaderAdapter.java
+org/xml/sax/helpers/XMLReaderFactory.java
+org/xml/sax/helpers/package.html
+org/xml/sax/DocumentHandler.java
+org/xml/sax/AttributeList.java
+org/xml/sax/Attributes.java
+org/xml/sax/COPYING
+org/xml/sax/COPYING.txt
+org/xml/sax/ContentHandler.java
+org/xml/sax/DTDHandler.java
+org/xml/sax/SAXNotRecognizedException.java
+org/xml/sax/EntityResolver.java
+org/xml/sax/ErrorHandler.java
+org/xml/sax/HandlerBase.java
+org/xml/sax/InputSource.java
+org/xml/sax/Locator.java
+org/xml/sax/Parser.java
+org/xml/sax/SAXException.java
+org/xml/sax/SAXNotSupportedException.java
+org/xml/sax/SAXParseException.java
+org/xml/sax/XMLFilter.java
+org/xml/sax/XMLReader.java
+org/xml/sax/package.html
+sun
+sun/applet
+sun/applet/SCCS
+sun/applet/SCCS/s.AppletClassLoader.java
+sun/applet/SCCS/s.AppletAudioClip.java
+sun/applet/SCCS/s.AppletIOException.java
+sun/applet/SCCS/s.AppletEvent.java
+sun/applet/SCCS/s.AppletIllegalArgumentException.java
+sun/applet/SCCS/s.AppletEventMulticaster.java
+sun/applet/SCCS/s.AppletObjectInputStream.java
+sun/applet/SCCS/s.AppletImageRef.java
+sun/applet/SCCS/s.AppletListener.java
+sun/applet/SCCS/s.AppletMessageHandler.java
+sun/applet/SCCS/s.AppletPanel.java
+sun/applet/SCCS/s.AppletProps.java
+sun/applet/SCCS/s.AppletSecurityException.java
+sun/applet/SCCS/s.AppletSecurity.java
+sun/applet/SCCS/s.AppletResourceLoader.java
+sun/applet/SCCS/s.AppletThreadGroup.java
+sun/applet/SCCS/s.AppletViewer.java
+sun/applet/SCCS/s.AppletViewerFactory.java
+sun/applet/SCCS/s.AppletViewerPanel.java
+sun/applet/SCCS/s.Main.java
+sun/applet/resources
+sun/applet/resources/SCCS
+sun/applet/resources/SCCS/s.MsgAppletViewer_de.java
+sun/applet/resources/SCCS/s.MsgAppletViewer.java
+sun/applet/resources/SCCS/s.MsgAppletViewer_es.java
+sun/applet/resources/SCCS/s.MsgAppletViewer_fr.java
+sun/applet/resources/SCCS/s.MsgAppletViewer_it.java
+sun/applet/resources/SCCS/s.MsgAppletViewer_ja.java
+sun/applet/resources/SCCS/s.MsgAppletViewer_ko.java
+sun/applet/resources/SCCS/s.MsgAppletViewer_sv.java
+sun/applet/resources/SCCS/s.MsgAppletViewer_zh_CN.java
+sun/applet/resources/SCCS/s.MsgAppletViewer_zh_TW.java
+sun/applet/resources/MsgAppletViewer_zh_CN.java
+sun/applet/resources/MsgAppletViewer.java
+sun/applet/resources/MsgAppletViewer_de.java
+sun/applet/resources/MsgAppletViewer_es.java
+sun/applet/resources/MsgAppletViewer_fr.java
+sun/applet/resources/MsgAppletViewer_it.java
+sun/applet/resources/MsgAppletViewer_ja.java
+sun/applet/resources/MsgAppletViewer_ko.java
+sun/applet/resources/MsgAppletViewer_sv.java
+sun/applet/resources/MsgAppletViewer_zh_TW.java
+sun/applet/AppletEventMulticaster.java
+sun/applet/AppletAudioClip.java
+sun/applet/AppletClassLoader.java
+sun/applet/AppletEvent.java
+sun/applet/AppletIOException.java
+sun/applet/AppletImageRef.java
+sun/applet/AppletPanel.java
+sun/applet/AppletIllegalArgumentException.java
+sun/applet/AppletListener.java
+sun/applet/AppletMessageHandler.java
+sun/applet/AppletObjectInputStream.java
+sun/applet/AppletProps.java
+sun/applet/Main.java
+sun/applet/AppletResourceLoader.java
+sun/applet/AppletSecurity.java
+sun/applet/AppletSecurityException.java
+sun/applet/AppletThreadGroup.java
+sun/applet/AppletViewer.java
+sun/applet/AppletViewerFactory.java
+sun/applet/AppletViewerPanel.java
+sun/audio
+sun/audio/SCCS
+sun/audio/SCCS/s.AudioDataStream.java
+sun/audio/SCCS/s.AudioData.java
+sun/audio/SCCS/s.AudioSecurityAction.java
+sun/audio/SCCS/s.AudioDevice.java
+sun/audio/SCCS/s.AudioPlayer.java
+sun/audio/SCCS/s.AudioSecurityExceptionAction.java
+sun/audio/SCCS/s.AudioStream.java
+sun/audio/SCCS/s.AudioStreamSequence.java
+sun/audio/SCCS/s.AudioTranslatorStream.java
+sun/audio/SCCS/s.ContinuousAudioDataStream.java
+sun/audio/SCCS/s.InvalidAudioFormatException.java
+sun/audio/SCCS/s.NativeAudioStream.java
+sun/audio/AudioDataStream.java
+sun/audio/AudioData.java
+sun/audio/AudioSecurityAction.java
+sun/audio/AudioDevice.java
+sun/audio/AudioPlayer.java
+sun/audio/AudioSecurityExceptionAction.java
+sun/audio/AudioStream.java
+sun/audio/AudioStreamSequence.java
+sun/audio/AudioTranslatorStream.java
+sun/audio/ContinuousAudioDataStream.java
+sun/audio/InvalidAudioFormatException.java
+sun/audio/NativeAudioStream.java
+sun/awt
+sun/awt/SCCS
+sun/awt/SCCS/s.AWTSecurityManager.java
+sun/awt/SCCS/s.AWTAutoShutdown.java
+sun/awt/SCCS/s.ConstrainableGraphics.java
+sun/awt/SCCS/s.AppContext.java
+sun/awt/SCCS/s.CharToByteSymbol.java
+sun/awt/SCCS/s.CharsetString.java
+sun/awt/SCCS/s.ComponentFactory.java
+sun/awt/SCCS/s.DebugHelper.java.m4
+sun/awt/SCCS/s.CustomCursor.java
+sun/awt/SCCS/s.DisplayChangedListener.java
+sun/awt/SCCS/s.DebugHelperImpl.java
+sun/awt/SCCS/s.DebugSettings.java
+sun/awt/SCCS/s.DefaultMouseInfoPeer.java
+sun/awt/SCCS/s.EmbeddedFrame.java
+sun/awt/SCCS/s.Mutex.java
+sun/awt/SCCS/s.EventListenerAggregate.java
+sun/awt/SCCS/s.FocusingTextField.java
+sun/awt/SCCS/s.FontConfiguration.java
+sun/awt/SCCS/s.FontDescriptor.java
+sun/awt/SCCS/s.GlobalCursorManager.java
+sun/awt/SCCS/s.Graphics2Delegate.java
+sun/awt/SCCS/s.HeadlessToolkit.java
+sun/awt/SCCS/s.HorizBagLayout.java
+sun/awt/SCCS/s.InputMethodSupport.java
+sun/awt/SCCS/s.KeyboardFocusManagerPeerImpl.java
+sun/awt/SCCS/s.ModalExclude.java
+sun/awt/SCCS/s.NativeLibLoader.java
+sun/awt/SCCS/s.NullComponentPeer.java
+sun/awt/SCCS/s.OrientableFlowLayout.java
+sun/awt/SCCS/s.PeerEvent.java
+sun/awt/SCCS/s.PlatformFont.java
+sun/awt/SCCS/s.RepaintArea.java
+sun/awt/SCCS/s.ScrollPaneWheelScroller.java
+sun/awt/SCCS/s.SunDisplayChanger.java
+sun/awt/SCCS/s.SunGraphicsCallback.java
+sun/awt/SCCS/s.SunHints.java
+sun/awt/SCCS/s.SunToolkit.java
+sun/awt/SCCS/s.TracedEventQueue.java
+sun/awt/SCCS/s.VariableGridLayout.java
+sun/awt/SCCS/s.VerticalBagLayout.java
+sun/awt/SCCS/s.WindowClosingListener.java
+sun/awt/SCCS/s.WindowClosingSupport.java
+sun/awt/color
+sun/awt/color/SCCS
+sun/awt/color/SCCS/s.CMM.java
+sun/awt/color/SCCS/s.CMMImageLayout.java
+sun/awt/color/SCCS/s.ICC_Transform.java
+sun/awt/color/SCCS/s.ProfileActivator.java
+sun/awt/color/SCCS/s.ProfileDeferralInfo.java
+sun/awt/color/SCCS/s.ProfileDeferralMgr.java
+sun/awt/color/CMMImageLayout.java
+sun/awt/color/CMM.java
+sun/awt/color/ProfileActivator.java
+sun/awt/color/ICC_Transform.java
+sun/awt/color/ProfileDeferralInfo.java
+sun/awt/color/ProfileDeferralMgr.java
+sun/awt/datatransfer
+sun/awt/datatransfer/SCCS
+sun/awt/datatransfer/SCCS/s.ToolkitThreadBlockedHandler.java
+sun/awt/datatransfer/SCCS/s.ClipboardTransferable.java
+sun/awt/datatransfer/SCCS/s.DataTransferer.java
+sun/awt/datatransfer/SCCS/s.SunClipboard.java
+sun/awt/datatransfer/SCCS/s.TransferableProxy.java
+sun/awt/datatransfer/ToolkitThreadBlockedHandler.java
+sun/awt/datatransfer/ClipboardTransferable.java
+sun/awt/datatransfer/DataTransferer.java
+sun/awt/datatransfer/SunClipboard.java
+sun/awt/datatransfer/TransferableProxy.java
+sun/awt/dnd
+sun/awt/dnd/SCCS
+sun/awt/dnd/SCCS/s.SunDragSourceContextPeer.java
+sun/awt/dnd/SCCS/s.SunDropTargetContextPeer.java
+sun/awt/dnd/SCCS/s.SunDropTargetEvent.java
+sun/awt/dnd/SunDragSourceContextPeer.java
+sun/awt/dnd/SunDropTargetContextPeer.java
+sun/awt/dnd/SunDropTargetEvent.java
+sun/awt/geom
+sun/awt/geom/SCCS
+sun/awt/geom/SCCS/s.Crossings.java
+sun/awt/geom/SCCS/s.AreaOp.java
+sun/awt/geom/SCCS/s.ChainEnd.java
+sun/awt/geom/SCCS/s.Curve.java
+sun/awt/geom/SCCS/s.CurveLink.java
+sun/awt/geom/SCCS/s.Edge.java
+sun/awt/geom/SCCS/s.Order0.java
+sun/awt/geom/SCCS/s.Order1.java
+sun/awt/geom/SCCS/s.Order2.java
+sun/awt/geom/SCCS/s.Order3.java
+sun/awt/geom/ChainEnd.java
+sun/awt/geom/AreaOp.java
+sun/awt/geom/Crossings.java
+sun/awt/geom/Curve.java
+sun/awt/geom/CurveLink.java
+sun/awt/geom/Edge.java
+sun/awt/geom/Order0.java
+sun/awt/geom/Order1.java
+sun/awt/geom/Order2.java
+sun/awt/geom/Order3.java
+sun/awt/im
+sun/awt/im/SCCS
+sun/awt/im/SCCS/s.CompositionAreaHandler.java
+sun/awt/im/SCCS/s.CompositionArea.java
+sun/awt/im/SCCS/s.InputMethodAdapter.java
+sun/awt/im/SCCS/s.InputContext.java
+sun/awt/im/SCCS/s.SimpleInputMethodWindow.java
+sun/awt/im/SCCS/s.InputMethodContext.java
+sun/awt/im/SCCS/s.InputMethodJFrame.java
+sun/awt/im/SCCS/s.InputMethodLocator.java
+sun/awt/im/SCCS/s.InputMethodManager.java
+sun/awt/im/SCCS/s.InputMethodPopupMenu.java
+sun/awt/im/SCCS/s.InputMethodWindow.java
+sun/awt/im/CompositionAreaHandler.java
+sun/awt/im/CompositionArea.java
+sun/awt/im/InputMethodPopupMenu.java
+sun/awt/im/InputContext.java
+sun/awt/im/InputMethodAdapter.java
+sun/awt/im/InputMethodContext.java
+sun/awt/im/InputMethodJFrame.java
+sun/awt/im/InputMethodLocator.java
+sun/awt/im/InputMethodManager.java
+sun/awt/im/SimpleInputMethodWindow.java
+sun/awt/im/InputMethodWindow.java
+sun/awt/image
+sun/awt/image/SCCS
+sun/awt/image/SCCS/s.BufImgVolatileSurfaceManager.java
+sun/awt/image/SCCS/s.BadDepthException.java
+sun/awt/image/SCCS/s.BufImgSurfaceData.java
+sun/awt/image/SCCS/s.BufferedImageGraphicsConfig.java
+sun/awt/image/SCCS/s.BufferedImageDevice.java
+sun/awt/image/SCCS/s.ByteInterleavedRaster.java
+sun/awt/image/SCCS/s.ByteArrayImageSource.java
+sun/awt/image/SCCS/s.ByteBandedRaster.java
+sun/awt/image/SCCS/s.ByteComponentRaster.java
+sun/awt/image/SCCS/s.CachingSurfaceManager.java
+sun/awt/image/SCCS/s.BytePackedRaster.java
+sun/awt/image/SCCS/s.InputStreamImageSource.java
+sun/awt/image/SCCS/s.DataBufferNative.java
+sun/awt/image/SCCS/s.FileImageSource.java
+sun/awt/image/SCCS/s.GifImageDecoder.java
+sun/awt/image/SCCS/s.ImageAccessException.java
+sun/awt/image/SCCS/s.ImageConsumerQueue.java
+sun/awt/image/SCCS/s.ImageDecoder.java
+sun/awt/image/SCCS/s.ImageFetchable.java
+sun/awt/image/SCCS/s.ImageFetcher.java
+sun/awt/image/SCCS/s.ImageFormatException.java
+sun/awt/image/SCCS/s.ImageRepresentation.java
+sun/awt/image/SCCS/s.ImageWatched.java
+sun/awt/image/SCCS/s.ImagingLib.java
+sun/awt/image/SCCS/s.IntegerComponentRaster.java
+sun/awt/image/SCCS/s.IntegerInterleavedRaster.java
+sun/awt/image/SCCS/s.JPEGImageDecoder.java
+sun/awt/image/SCCS/s.Manageable.java
+sun/awt/image/SCCS/s.NativeLibLoader.java
+sun/awt/image/SCCS/s.OffScreenImage.java
+sun/awt/image/SCCS/s.OffScreenImageSource.java
+sun/awt/image/SCCS/s.PNGImageDecoder.java
+sun/awt/image/SCCS/s.PixelConverter.java
+sun/awt/image/SCCS/s.RasterListener.java
+sun/awt/image/SCCS/s.RemoteOffScreenImage.java
+sun/awt/image/SCCS/s.ShortBandedRaster.java
+sun/awt/image/SCCS/s.ShortComponentRaster.java
+sun/awt/image/SCCS/s.ShortInterleavedRaster.java
+sun/awt/image/SCCS/s.SunVolatileImage.java
+sun/awt/image/SCCS/s.SunWritableRaster.java
+sun/awt/image/SCCS/s.SurfaceManager.java
+sun/awt/image/SCCS/s.ToolkitImage.java
+sun/awt/image/SCCS/s.URLImageSource.java
+sun/awt/image/SCCS/s.VolatileSurfaceManager.java
+sun/awt/image/SCCS/s.WritableRasterNative.java
+sun/awt/image/SCCS/s.XbmImageDecoder.java
+sun/awt/image/SCCS/s.OffScreenSurfaceManager.java
+sun/awt/image/codec
+sun/awt/image/codec/SCCS
+sun/awt/image/codec/SCCS/s.JPEGImageDecoderImpl.java
+sun/awt/image/codec/SCCS/s.JPEGImageEncoderImpl.java
+sun/awt/image/codec/SCCS/s.JPEGParam.java
+sun/awt/image/codec/JPEGImageDecoderImpl.java
+sun/awt/image/codec/JPEGImageEncoderImpl.java
+sun/awt/image/codec/JPEGParam.java
+sun/awt/image/BufferedImageDevice.java
+sun/awt/image/BadDepthException.java
+sun/awt/image/BufImgSurfaceData.java
+sun/awt/image/BufImgVolatileSurfaceManager.java
+sun/awt/image/BufferedImageGraphicsConfig.java
+sun/awt/image/ByteArrayImageSource.java
+sun/awt/image/ByteBandedRaster.java
+sun/awt/image/ByteComponentRaster.java
+sun/awt/image/ByteInterleavedRaster.java
+sun/awt/image/BytePackedRaster.java
+sun/awt/image/CachingSurfaceManager.java
+sun/awt/image/DataBufferNative.java
+sun/awt/image/ImageDecoder.java
+sun/awt/image/FileImageSource.java
+sun/awt/image/GifImageDecoder.java
+sun/awt/image/ImageAccessException.java
+sun/awt/image/ImageConsumerQueue.java
+sun/awt/image/ImageFetchable.java
+sun/awt/image/ImageFetcher.java
+sun/awt/image/ImageFormatException.java
+sun/awt/image/ImageRepresentation.java
+sun/awt/image/ImageWatched.java
+sun/awt/image/ImagingLib.java
+sun/awt/image/InputStreamImageSource.java
+sun/awt/image/IntegerComponentRaster.java
+sun/awt/image/IntegerInterleavedRaster.java
+sun/awt/image/Manageable.java
+sun/awt/image/JPEGImageDecoder.java
+sun/awt/image/NativeLibLoader.java
+sun/awt/image/OffScreenImage.java
+sun/awt/image/OffScreenImageSource.java
+sun/awt/image/PNGImageDecoder.java
+sun/awt/image/PixelConverter.java
+sun/awt/image/RasterListener.java
+sun/awt/image/RemoteOffScreenImage.java
+sun/awt/image/ShortBandedRaster.java
+sun/awt/image/ShortComponentRaster.java
+sun/awt/image/ShortInterleavedRaster.java
+sun/awt/image/SunVolatileImage.java
+sun/awt/image/SunWritableRaster.java
+sun/awt/image/SurfaceManager.java
+sun/awt/image/ToolkitImage.java
+sun/awt/image/URLImageSource.java
+sun/awt/image/VolatileSurfaceManager.java
+sun/awt/image/WritableRasterNative.java
+sun/awt/image/XbmImageDecoder.java
+sun/awt/image/OffScreenSurfaceManager.java
+sun/awt/resources
+sun/awt/resources/SCCS
+sun/awt/resources/SCCS/s.awt_zh_CN.properties
+sun/awt/resources/SCCS/s.awt.properties
+sun/awt/resources/SCCS/s.awt_de.properties
+sun/awt/resources/SCCS/s.awt_es.properties
+sun/awt/resources/SCCS/s.awt_fr.properties
+sun/awt/resources/SCCS/s.awt_it.properties
+sun/awt/resources/SCCS/s.awt_ja.properties
+sun/awt/resources/SCCS/s.awt_ko.properties
+sun/awt/resources/SCCS/s.awt_sv.properties
+sun/awt/resources/SCCS/s.awt_zh_TW.properties
+sun/awt/resources/awt_de.properties
+sun/awt/resources/awt.properties
+sun/awt/resources/awt_es.properties
+sun/awt/resources/awt_fr.properties
+sun/awt/resources/awt_it.properties
+sun/awt/resources/awt_ja.properties
+sun/awt/resources/awt_ko.properties
+sun/awt/resources/awt_sv.properties
+sun/awt/resources/awt_zh_CN.properties
+sun/awt/resources/awt_zh_TW.properties
+sun/awt/robot
+sun/awt/robot/SCCS
+sun/awt/robot/SCCS/s.RobotPeer.java
+sun/awt/robot/SCCS/s.Robot.java
+sun/awt/robot/SCCS/s.ScreenCaptureProducer.java
+sun/awt/robot/SCCS/s.ScreenCapture.java
+sun/awt/robot/RobotPeer.java
+sun/awt/robot/Robot.java
+sun/awt/robot/ScreenCaptureProducer.java
+sun/awt/robot/ScreenCapture.java
+sun/awt/shell
+sun/awt/shell/SCCS
+sun/awt/shell/SCCS/s.DefaultShellFolder.java
+sun/awt/shell/SCCS/s.ShellFolder.java
+sun/awt/shell/SCCS/s.ShellFolderManager.java
+sun/awt/shell/DefaultShellFolder.java
+sun/awt/shell/ShellFolder.java
+sun/awt/shell/ShellFolderManager.java
+sun/awt/ConstrainableGraphics.java
+sun/awt/AWTAutoShutdown.java
+sun/awt/AWTSecurityManager.java
+sun/awt/AppContext.java
+sun/awt/CharToByteSymbol.java
+sun/awt/CharsetString.java
+sun/awt/ComponentFactory.java
+sun/awt/CustomCursor.java
+sun/awt/DebugHelper.java.m4
+sun/awt/Mutex.java
+sun/awt/PlatformFont.java
+sun/awt/DebugHelperImpl.java
+sun/awt/DebugSettings.java
+sun/awt/DefaultMouseInfoPeer.java
+sun/awt/DisplayChangedListener.java
+sun/awt/EmbeddedFrame.java
+sun/awt/EventListenerAggregate.java
+sun/awt/FocusingTextField.java
+sun/awt/FontConfiguration.java
+sun/awt/FontDescriptor.java
+sun/awt/GlobalCursorManager.java
+sun/awt/Graphics2Delegate.java
+sun/awt/HeadlessToolkit.java
+sun/awt/HorizBagLayout.java
+sun/awt/InputMethodSupport.java
+sun/awt/KeyboardFocusManagerPeerImpl.java
+sun/awt/ModalExclude.java
+sun/awt/OrientableFlowLayout.java
+sun/awt/NativeLibLoader.java
+sun/awt/NullComponentPeer.java
+sun/awt/PeerEvent.java
+sun/awt/RepaintArea.java
+sun/awt/SunDisplayChanger.java
+sun/awt/TracedEventQueue.java
+sun/awt/SunHints.java
+sun/awt/ScrollPaneWheelScroller.java
+sun/awt/SunGraphicsCallback.java
+sun/awt/SunToolkit.java
+sun/awt/VariableGridLayout.java
+sun/awt/VerticalBagLayout.java
+sun/awt/WindowClosingListener.java
+sun/awt/WindowClosingSupport.java
+sun/beans
+sun/beans/editors
+sun/beans/editors/SCCS
+sun/beans/editors/SCCS/s.BoolEditor.java
+sun/beans/editors/SCCS/s.ByteEditor.java
+sun/beans/editors/SCCS/s.ColorEditor.java
+sun/beans/editors/SCCS/s.DoubleEditor.java
+sun/beans/editors/SCCS/s.FloatEditor.java
+sun/beans/editors/SCCS/s.FontEditor.java
+sun/beans/editors/SCCS/s.IntEditor.java
+sun/beans/editors/SCCS/s.LongEditor.java
+sun/beans/editors/SCCS/s.NumberEditor.java
+sun/beans/editors/SCCS/s.ShortEditor.java
+sun/beans/editors/SCCS/s.StringEditor.java
+sun/beans/editors/ColorEditor.java
+sun/beans/editors/BoolEditor.java
+sun/beans/editors/ByteEditor.java
+sun/beans/editors/DoubleEditor.java
+sun/beans/editors/FloatEditor.java
+sun/beans/editors/FontEditor.java
+sun/beans/editors/IntEditor.java
+sun/beans/editors/LongEditor.java
+sun/beans/editors/NumberEditor.java
+sun/beans/editors/ShortEditor.java
+sun/beans/editors/StringEditor.java
+sun/beans/infos
+sun/beans/infos/SCCS
+sun/beans/infos/SCCS/s.ComponentBeanInfo.java
+sun/beans/infos/ComponentBeanInfo.java
+sun/corba
+sun/corba/SCCS
+sun/corba/SCCS/s.BridgePermission.java
+sun/corba/SCCS/s.Bridge.java
+sun/corba/SCCS/s.package.html
+sun/corba/package.html
+sun/corba/Bridge.java
+sun/corba/BridgePermission.java
+sun/dc
+sun/dc/path
+sun/dc/path/SCCS
+sun/dc/path/SCCS/s.FastPathProducer.java
+sun/dc/path/SCCS/s.PathConsumer.java
+sun/dc/path/SCCS/s.PathError.java
+sun/dc/path/SCCS/s.PathException.java
+sun/dc/path/FastPathProducer.java
+sun/dc/path/PathConsumer.java
+sun/dc/path/PathError.java
+sun/dc/path/PathException.java
+sun/dc/pr
+sun/dc/pr/SCCS
+sun/dc/pr/SCCS/s.PRException.java
+sun/dc/pr/SCCS/s.PRError.java
+sun/dc/pr/SCCS/s.PathDasher.java
+sun/dc/pr/SCCS/s.PathFiller.java
+sun/dc/pr/SCCS/s.PathStroker.java
+sun/dc/pr/SCCS/s.Rasterizer.java
+sun/dc/pr/PRException.java
+sun/dc/pr/PRError.java
+sun/dc/pr/PathDasher.java
+sun/dc/pr/PathFiller.java
+sun/dc/pr/PathStroker.java
+sun/dc/pr/Rasterizer.java
+sun/font
+sun/font/SCCS
+sun/font/SCCS/s.CharToGlyphMapper.java
+sun/font/SCCS/s.AdvanceCache.java
+sun/font/SCCS/s.BidiUtils.java
+sun/font/SCCS/s.CMap.java
+sun/font/SCCS/s.CompositeFontDescriptor.java
+sun/font/SCCS/s.CompositeFont.java
+sun/font/SCCS/s.ExtendedTextSourceLabel.java
+sun/font/SCCS/s.CompositeGlyphMapper.java
+sun/font/SCCS/s.CompositeStrike.java
+sun/font/SCCS/s.CoreMetrics.java
+sun/font/SCCS/s.Decoration.java
+sun/font/SCCS/s.DelegatingShape.java
+sun/font/SCCS/s.ExtendedTextLabel.java
+sun/font/SCCS/s.FileFont.java
+sun/font/SCCS/s.FileFontStrike.java
+sun/font/SCCS/s.Font2D.java
+sun/font/SCCS/s.Font2DHandle.java
+sun/font/SCCS/s.FontDesignMetrics.java
+sun/font/SCCS/s.FontFamily.java
+sun/font/SCCS/s.FontLineMetrics.java
+sun/font/SCCS/s.FontManager.java
+sun/font/SCCS/s.FontResolver.java
+sun/font/SCCS/s.FontRunIterator.java
+sun/font/SCCS/s.FontStrike.java
+sun/font/SCCS/s.FontStrikeDesc.java
+sun/font/SCCS/s.FontStrikeDisposer.java
+sun/font/SCCS/s.GlyphLayout.java
+sun/font/SCCS/s.GlyphList.java
+sun/font/SCCS/s.GraphicComponent.java
+sun/font/SCCS/s.PhysicalFont.java
+sun/font/SCCS/s.PhysicalStrike.java
+sun/font/SCCS/s.Script.java
+sun/font/SCCS/s.ScriptRun.java
+sun/font/SCCS/s.ScriptRunData.java
+sun/font/SCCS/s.StandardGlyphVector.java
+sun/font/SCCS/s.StandardTextSource.java
+sun/font/SCCS/s.StrikeCache.java
+sun/font/SCCS/s.StrikeMetrics.java
+sun/font/SCCS/s.SunLayoutEngine.java
+sun/font/SCCS/s.TextLabel.java
+sun/font/SCCS/s.TextLabelFactory.java
+sun/font/SCCS/s.TextLineComponent.java
+sun/font/SCCS/s.TextRecord.java
+sun/font/SCCS/s.TextSource.java
+sun/font/SCCS/s.TextSourceLabel.java
+sun/font/SCCS/s.TrueTypeFont.java
+sun/font/SCCS/s.TrueTypeGlyphMapper.java
+sun/font/SCCS/s.Type1Font.java
+sun/font/SCCS/s.Type1GlyphMapper.java
+sun/font/SCCS/s.Underline.java
+sun/font/CharToGlyphMapper.java
+sun/font/AdvanceCache.java
+sun/font/BidiUtils.java
+sun/font/CMap.java
+sun/font/CompositeGlyphMapper.java
+sun/font/CompositeFont.java
+sun/font/Font2DHandle.java
+sun/font/Font2D.java
+sun/font/CompositeFontDescriptor.java
+sun/font/CompositeStrike.java
+sun/font/CoreMetrics.java
+sun/font/Decoration.java
+sun/font/DelegatingShape.java
+sun/font/ExtendedTextLabel.java
+sun/font/ExtendedTextSourceLabel.java
+sun/font/FileFont.java
+sun/font/FileFontStrike.java
+sun/font/StandardGlyphVector.java
+sun/font/FontDesignMetrics.java
+sun/font/FontFamily.java
+sun/font/FontLineMetrics.java
+sun/font/FontManager.java
+sun/font/FontResolver.java
+sun/font/FontRunIterator.java
+sun/font/FontStrike.java
+sun/font/FontStrikeDesc.java
+sun/font/FontStrikeDisposer.java
+sun/font/GlyphLayout.java
+sun/font/GlyphList.java
+sun/font/GraphicComponent.java
+sun/font/PhysicalFont.java
+sun/font/PhysicalStrike.java
+sun/font/Script.java
+sun/font/ScriptRun.java
+sun/font/ScriptRunData.java
+sun/font/TrueTypeGlyphMapper.java
+sun/font/StandardTextSource.java
+sun/font/StrikeCache.java
+sun/font/StrikeMetrics.java
+sun/font/SunLayoutEngine.java
+sun/font/TextLabel.java
+sun/font/TextLabelFactory.java
+sun/font/TextLineComponent.java
+sun/font/TextRecord.java
+sun/font/TextSource.java
+sun/font/TextSourceLabel.java
+sun/font/TrueTypeFont.java
+sun/font/Type1GlyphMapper.java
+sun/font/Type1Font.java
+sun/font/Underline.java
+sun/instrument
+sun/instrument/SCCS
+sun/instrument/SCCS/s.InstrumentationImpl.java
+sun/instrument/SCCS/s.TransformerManager.java
+sun/instrument/InstrumentationImpl.java
+sun/instrument/TransformerManager.java
+sun/io
+sun/io/SCCS
+sun/io/SCCS/s.ByteToCharBig5_HKSCS.java
+sun/io/SCCS/s.ByteToCharASCII.java
+sun/io/SCCS/s.ByteToCharBig5.java
+sun/io/SCCS/s.ByteToCharBig5_Solaris.java
+sun/io/SCCS/s.ByteToCharConverter.java
+sun/io/SCCS/s.ByteToCharCp037.java
+sun/io/SCCS/s.ByteToCharCp1006.java
+sun/io/SCCS/s.ByteToCharCp1025.java
+sun/io/SCCS/s.ByteToCharCp1026.java
+sun/io/SCCS/s.ByteToCharCp1046.java
+sun/io/SCCS/s.ByteToCharCp1047.java
+sun/io/SCCS/s.ByteToCharCp1097.java
+sun/io/SCCS/s.ByteToCharCp1098.java
+sun/io/SCCS/s.ByteToCharCp1112.java
+sun/io/SCCS/s.ByteToCharCp1122.java
+sun/io/SCCS/s.ByteToCharCp1123.java
+sun/io/SCCS/s.ByteToCharCp1124.java
+sun/io/SCCS/s.ByteToCharCp1140.java
+sun/io/SCCS/s.ByteToCharCp1141.java
+sun/io/SCCS/s.ByteToCharCp1142.java
+sun/io/SCCS/s.ByteToCharCp1143.java
+sun/io/SCCS/s.ByteToCharCp1144.java
+sun/io/SCCS/s.ByteToCharCp1145.java
+sun/io/SCCS/s.ByteToCharCp1146.java
+sun/io/SCCS/s.ByteToCharCp1147.java
+sun/io/SCCS/s.ByteToCharCp1148.java
+sun/io/SCCS/s.ByteToCharCp1149.java
+sun/io/SCCS/s.ByteToCharCp1250.java
+sun/io/SCCS/s.ByteToCharCp1251.java
+sun/io/SCCS/s.ByteToCharCp1252.java
+sun/io/SCCS/s.ByteToCharCp1253.java
+sun/io/SCCS/s.ByteToCharCp1254.java
+sun/io/SCCS/s.ByteToCharCp1255.java
+sun/io/SCCS/s.ByteToCharCp1256.java
+sun/io/SCCS/s.ByteToCharCp1257.java
+sun/io/SCCS/s.ByteToCharCp1258.java
+sun/io/SCCS/s.ByteToCharCp1381.java
+sun/io/SCCS/s.ByteToCharCp1383.java
+sun/io/SCCS/s.ByteToCharCp273.java
+sun/io/SCCS/s.ByteToCharCp277.java
+sun/io/SCCS/s.ByteToCharCp278.java
+sun/io/SCCS/s.ByteToCharCp280.java
+sun/io/SCCS/s.ByteToCharCp284.java
+sun/io/SCCS/s.ByteToCharCp285.java
+sun/io/SCCS/s.ByteToCharCp297.java
+sun/io/SCCS/s.ByteToCharCp420.java
+sun/io/SCCS/s.ByteToCharCp33722.java
+sun/io/SCCS/s.ByteToCharCp424.java
+sun/io/SCCS/s.ByteToCharCp437.java
+sun/io/SCCS/s.ByteToCharCp500.java
+sun/io/SCCS/s.ByteToCharCp737.java
+sun/io/SCCS/s.ByteToCharCp775.java
+sun/io/SCCS/s.ByteToCharCp838.java
+sun/io/SCCS/s.ByteToCharCp850.java
+sun/io/SCCS/s.ByteToCharCp852.java
+sun/io/SCCS/s.ByteToCharCp855.java
+sun/io/SCCS/s.ByteToCharCp856.java
+sun/io/SCCS/s.ByteToCharCp857.java
+sun/io/SCCS/s.ByteToCharCp858.java
+sun/io/SCCS/s.ByteToCharCp860.java
+sun/io/SCCS/s.Converters.java
+sun/io/SCCS/s.ByteToCharCp861.java
+sun/io/SCCS/s.ByteToCharCp862.java
+sun/io/SCCS/s.ByteToCharCp863.java
+sun/io/SCCS/s.ByteToCharCp864.java
+sun/io/SCCS/s.ByteToCharCp865.java
+sun/io/SCCS/s.ByteToCharCp866.java
+sun/io/SCCS/s.ByteToCharCp868.java
+sun/io/SCCS/s.ByteToCharCp869.java
+sun/io/SCCS/s.ByteToCharCp870.java
+sun/io/SCCS/s.ByteToCharCp871.java
+sun/io/SCCS/s.ByteToCharCp874.java
+sun/io/SCCS/s.ByteToCharCp875.java
+sun/io/SCCS/s.ByteToCharCp918.java
+sun/io/SCCS/s.ByteToCharCp921.java
+sun/io/SCCS/s.ByteToCharCp922.java
+sun/io/SCCS/s.ByteToCharCp930.java
+sun/io/SCCS/s.ByteToCharCp933.java
+sun/io/SCCS/s.ByteToCharCp935.java
+sun/io/SCCS/s.ByteToCharCp937.java
+sun/io/SCCS/s.ByteToCharCp939.java
+sun/io/SCCS/s.ByteToCharCp942.java
+sun/io/SCCS/s.ByteToCharCp942C.java
+sun/io/SCCS/s.ByteToCharCp943.java
+sun/io/SCCS/s.ByteToCharCp943C.java
+sun/io/SCCS/s.ByteToCharCp948.java
+sun/io/SCCS/s.ByteToCharCp949.java
+sun/io/SCCS/s.ByteToCharCp949C.java
+sun/io/SCCS/s.ByteToCharCp950.java
+sun/io/SCCS/s.ByteToCharCp964.java
+sun/io/SCCS/s.ByteToCharCp970.java
+sun/io/SCCS/s.ByteToCharDBCS_ASCII.java
+sun/io/SCCS/s.ByteToCharDBCS_EBCDIC.java
+sun/io/SCCS/s.ByteToCharDoubleByte.java
+sun/io/SCCS/s.ByteToCharEUC.java
+sun/io/SCCS/s.ByteToCharEUC_CN.java
+sun/io/SCCS/s.ByteToCharEUC_JP.java
+sun/io/SCCS/s.ByteToCharEUC_JP_LINUX.java
+sun/io/SCCS/s.ByteToCharEUC_JP_Solaris.java
+sun/io/SCCS/s.ByteToCharEUC_KR.java
+sun/io/SCCS/s.ByteToCharEUC_TW.java
+sun/io/SCCS/s.ByteToCharGB18030.java
+sun/io/SCCS/s.ByteToCharGB18030DB.java
+sun/io/SCCS/s.ByteToCharGBK.java
+sun/io/SCCS/s.ByteToCharHKSCS.java
+sun/io/SCCS/s.ByteToCharHKSCS_2001.java
+sun/io/SCCS/s.ByteToCharISCII91.java
+sun/io/SCCS/s.ByteToCharISO2022.java
+sun/io/SCCS/s.ByteToCharISO2022CN.java
+sun/io/SCCS/s.ByteToCharISO2022JP.java
+sun/io/SCCS/s.ByteToCharISO2022KR.java
+sun/io/SCCS/s.ByteToCharISO8859_1.java
+sun/io/SCCS/s.ByteToCharISO8859_13.java
+sun/io/SCCS/s.ByteToCharISO8859_15.java
+sun/io/SCCS/s.ByteToCharISO8859_2.java
+sun/io/SCCS/s.ByteToCharISO8859_3.java
+sun/io/SCCS/s.ByteToCharISO8859_4.java
+sun/io/SCCS/s.ByteToCharISO8859_5.java
+sun/io/SCCS/s.ByteToCharISO8859_6.java
+sun/io/SCCS/s.ByteToCharISO8859_7.java
+sun/io/SCCS/s.ByteToCharISO8859_8.java
+sun/io/SCCS/s.ByteToCharISO8859_9.java
+sun/io/SCCS/s.ByteToCharJIS0201.java
+sun/io/SCCS/s.ByteToCharJIS0208.java
+sun/io/SCCS/s.ByteToCharJIS0208_Solaris.java
+sun/io/SCCS/s.ByteToCharJIS0212.java
+sun/io/SCCS/s.ByteToCharJIS0212_Solaris.java
+sun/io/SCCS/s.ByteToCharJISAutoDetect.java
+sun/io/SCCS/s.ByteToCharJohab.java
+sun/io/SCCS/s.ByteToCharKOI8_R.java
+sun/io/SCCS/s.ByteToCharMS874.java
+sun/io/SCCS/s.ByteToCharMS932.java
+sun/io/SCCS/s.ByteToCharMS932DB.java
+sun/io/SCCS/s.ByteToCharMS936.java
+sun/io/SCCS/s.ByteToCharMS949.java
+sun/io/SCCS/s.ByteToCharMS950.java
+sun/io/SCCS/s.ByteToCharMS950_HKSCS.java
+sun/io/SCCS/s.ByteToCharMacArabic.java
+sun/io/SCCS/s.ByteToCharMacCentralEurope.java
+sun/io/SCCS/s.ByteToCharMacCroatian.java
+sun/io/SCCS/s.ByteToCharMacCyrillic.java
+sun/io/SCCS/s.ByteToCharMacDingbat.java
+sun/io/SCCS/s.ByteToCharMacGreek.java
+sun/io/SCCS/s.ByteToCharMacHebrew.java
+sun/io/SCCS/s.ByteToCharMacIceland.java
+sun/io/SCCS/s.ByteToCharMacRoman.java
+sun/io/SCCS/s.ByteToCharMacRomania.java
+sun/io/SCCS/s.ByteToCharPCK.java
+sun/io/SCCS/s.ByteToCharSJIS.java
+sun/io/SCCS/s.ByteToCharMacSymbol.java
+sun/io/SCCS/s.ByteToCharMacThai.java
+sun/io/SCCS/s.ByteToCharMacTurkish.java
+sun/io/SCCS/s.ByteToCharMacUkraine.java
+sun/io/SCCS/s.ByteToCharSingleByte.java
+sun/io/SCCS/s.ByteToCharTIS620.java
+sun/io/SCCS/s.ByteToCharUTF16.java
+sun/io/SCCS/s.ByteToCharUTF8.java
+sun/io/SCCS/s.ByteToCharUnicode.java
+sun/io/SCCS/s.ByteToCharUnicodeBig.java
+sun/io/SCCS/s.ByteToCharUnicodeBigUnmarked.java
+sun/io/SCCS/s.ByteToCharUnicodeLittle.java
+sun/io/SCCS/s.ByteToCharUnicodeLittleUnmarked.java
+sun/io/SCCS/s.CharToByteASCII.java
+sun/io/SCCS/s.CharToByteBig5.java
+sun/io/SCCS/s.CharToByteBig5_HKSCS.java
+sun/io/SCCS/s.CharToByteBig5_Solaris.java
+sun/io/SCCS/s.CharToByteConverter.java
+sun/io/SCCS/s.CharToByteCp037.java
+sun/io/SCCS/s.CharToByteCp1006.java
+sun/io/SCCS/s.CharToByteCp1025.java
+sun/io/SCCS/s.CharToByteCp1026.java
+sun/io/SCCS/s.CharToByteCp1046.java
+sun/io/SCCS/s.CharToByteCp1047.java
+sun/io/SCCS/s.CharToByteCp1097.java
+sun/io/SCCS/s.CharToByteCp1098.java
+sun/io/SCCS/s.CharToByteCp1112.java
+sun/io/SCCS/s.CharToByteCp1122.java
+sun/io/SCCS/s.CharToByteCp1123.java
+sun/io/SCCS/s.CharToByteCp1124.java
+sun/io/SCCS/s.CharToByteCp1140.java
+sun/io/SCCS/s.CharToByteCp1141.java
+sun/io/SCCS/s.CharToByteCp1142.java
+sun/io/SCCS/s.CharToByteCp1143.java
+sun/io/SCCS/s.CharToByteCp1144.java
+sun/io/SCCS/s.CharToByteCp1145.java
+sun/io/SCCS/s.CharToByteCp1146.java
+sun/io/SCCS/s.CharToByteCp1147.java
+sun/io/SCCS/s.CharToByteCp1148.java
+sun/io/SCCS/s.CharToByteCp1149.java
+sun/io/SCCS/s.CharToByteCp1250.java
+sun/io/SCCS/s.CharToByteCp1251.java
+sun/io/SCCS/s.CharToByteCp1252.java
+sun/io/SCCS/s.CharToByteCp1253.java
+sun/io/SCCS/s.CharToByteCp1254.java
+sun/io/SCCS/s.CharToByteCp1255.java
+sun/io/SCCS/s.CharToByteCp1256.java
+sun/io/SCCS/s.CharToByteCp1257.java
+sun/io/SCCS/s.CharToByteCp1258.java
+sun/io/SCCS/s.CharToByteCp1381.java
+sun/io/SCCS/s.CharToByteCp1383.java
+sun/io/SCCS/s.CharToByteCp273.java
+sun/io/SCCS/s.CharToByteCp277.java
+sun/io/SCCS/s.CharToByteCp278.java
+sun/io/SCCS/s.CharToByteCp280.java
+sun/io/SCCS/s.CharToByteCp284.java
+sun/io/SCCS/s.CharToByteCp285.java
+sun/io/SCCS/s.CharToByteCp297.java
+sun/io/SCCS/s.CharToByteCp33722.java
+sun/io/SCCS/s.CharToByteCp420.java
+sun/io/SCCS/s.CharToByteCp424.java
+sun/io/SCCS/s.CharToByteCp437.java
+sun/io/SCCS/s.CharToByteCp500.java
+sun/io/SCCS/s.CharToByteCp737.java
+sun/io/SCCS/s.CharToByteCp775.java
+sun/io/SCCS/s.CharToByteCp838.java
+sun/io/SCCS/s.CharToByteCp850.java
+sun/io/SCCS/s.CharToByteCp852.java
+sun/io/SCCS/s.CharToByteCp855.java
+sun/io/SCCS/s.CharToByteCp856.java
+sun/io/SCCS/s.CharToByteCp857.java
+sun/io/SCCS/s.CharToByteCp858.java
+sun/io/SCCS/s.CharToByteCp860.java
+sun/io/SCCS/s.CharToByteCp861.java
+sun/io/SCCS/s.CharToByteCp862.java
+sun/io/SCCS/s.CharToByteCp863.java
+sun/io/SCCS/s.CharToByteCp864.java
+sun/io/SCCS/s.CharToByteCp865.java
+sun/io/SCCS/s.CharToByteCp866.java
+sun/io/SCCS/s.CharToByteCp868.java
+sun/io/SCCS/s.CharToByteCp869.java
+sun/io/SCCS/s.CharToByteCp870.java
+sun/io/SCCS/s.CharToByteCp871.java
+sun/io/SCCS/s.CharToByteCp874.java
+sun/io/SCCS/s.CharToByteCp875.java
+sun/io/SCCS/s.CharToByteCp918.java
+sun/io/SCCS/s.CharToByteCp921.java
+sun/io/SCCS/s.CharToByteCp922.java
+sun/io/SCCS/s.CharToByteCp930.java
+sun/io/SCCS/s.CharToByteCp933.java
+sun/io/SCCS/s.CharToByteCp935.java
+sun/io/SCCS/s.CharToByteCp937.java
+sun/io/SCCS/s.CharToByteCp939.java
+sun/io/SCCS/s.CharToByteCp942.java
+sun/io/SCCS/s.CharToByteCp942C.java
+sun/io/SCCS/s.CharToByteCp943.java
+sun/io/SCCS/s.CharToByteCp943C.java
+sun/io/SCCS/s.CharToByteCp948.java
+sun/io/SCCS/s.CharToByteCp949.java
+sun/io/SCCS/s.CharToByteCp949C.java
+sun/io/SCCS/s.CharToByteCp950.java
+sun/io/SCCS/s.CharToByteCp964.java
+sun/io/SCCS/s.CharToByteCp970.java
+sun/io/SCCS/s.CharToByteDBCS_ASCII.java
+sun/io/SCCS/s.CharToByteDBCS_EBCDIC.java
+sun/io/SCCS/s.CharToByteDoubleByte.java
+sun/io/SCCS/s.CharToByteEUC.java
+sun/io/SCCS/s.CharToByteEUC_CN.java
+sun/io/SCCS/s.CharToByteEUC_JP.java
+sun/io/SCCS/s.CharToByteEUC_JP_LINUX.java
+sun/io/SCCS/s.CharToByteEUC_JP_Solaris.java
+sun/io/SCCS/s.CharToByteEUC_KR.java
+sun/io/SCCS/s.CharToByteEUC_TW.java
+sun/io/SCCS/s.CharToByteGB18030.java
+sun/io/SCCS/s.CharToByteGBK.java
+sun/io/SCCS/s.CharToByteHKSCS.java
+sun/io/SCCS/s.CharToByteHKSCS_2001.java
+sun/io/SCCS/s.CharToByteISCII91.java
+sun/io/SCCS/s.CharToByteISO2022.java
+sun/io/SCCS/s.CharToByteISO2022CN_CNS.java
+sun/io/SCCS/s.CharToByteISO2022CN_GB.java
+sun/io/SCCS/s.CharToByteISO2022JP.java
+sun/io/SCCS/s.CharToByteISO2022KR.java
+sun/io/SCCS/s.CharToByteISO8859_1.java
+sun/io/SCCS/s.CharToByteISO8859_13.java
+sun/io/SCCS/s.CharToByteISO8859_15.java
+sun/io/SCCS/s.CharToByteISO8859_2.java
+sun/io/SCCS/s.CharToByteISO8859_3.java
+sun/io/SCCS/s.CharToByteISO8859_4.java
+sun/io/SCCS/s.CharToByteISO8859_5.java
+sun/io/SCCS/s.CharToByteISO8859_6.java
+sun/io/SCCS/s.CharToByteISO8859_7.java
+sun/io/SCCS/s.CharToByteISO8859_8.java
+sun/io/SCCS/s.CharToByteISO8859_9.java
+sun/io/SCCS/s.CharToByteJIS0201.java
+sun/io/SCCS/s.CharToByteJIS0208.java
+sun/io/SCCS/s.CharToByteJIS0208_Solaris.java
+sun/io/SCCS/s.CharToByteJIS0212.java
+sun/io/SCCS/s.CharToByteJIS0212_Solaris.java
+sun/io/SCCS/s.CharToByteJohab.java
+sun/io/SCCS/s.CharToByteKOI8_R.java
+sun/io/SCCS/s.CharToByteMS874.java
+sun/io/SCCS/s.CharToByteMS932.java
+sun/io/SCCS/s.CharToByteMS932DB.java
+sun/io/SCCS/s.CharToByteMS936.java
+sun/io/SCCS/s.CharToByteMS949.java
+sun/io/SCCS/s.CharToByteMS950.java
+sun/io/SCCS/s.CharToByteMS950_HKSCS.java
+sun/io/SCCS/s.CharToByteMacArabic.java
+sun/io/SCCS/s.CharToByteMacCentralEurope.java
+sun/io/SCCS/s.CharToByteMacCroatian.java
+sun/io/SCCS/s.CharToByteMacCyrillic.java
+sun/io/SCCS/s.CharToByteMacDingbat.java
+sun/io/SCCS/s.CharToByteMacGreek.java
+sun/io/SCCS/s.CharToByteMacHebrew.java
+sun/io/SCCS/s.CharToByteMacIceland.java
+sun/io/SCCS/s.CharToByteMacRoman.java
+sun/io/SCCS/s.CharToByteMacRomania.java
+sun/io/SCCS/s.CharToByteMacSymbol.java
+sun/io/SCCS/s.CharToByteMacThai.java
+sun/io/SCCS/s.CharToByteMacTurkish.java
+sun/io/SCCS/s.CharToByteMacUkraine.java
+sun/io/SCCS/s.CharToBytePCK.java
+sun/io/SCCS/s.CharToByteSJIS.java
+sun/io/SCCS/s.CharToByteSingleByte.java
+sun/io/SCCS/s.CharToByteTIS620.java
+sun/io/SCCS/s.CharToByteUTF16.java
+sun/io/SCCS/s.CharToByteUTF8.java
+sun/io/SCCS/s.CharToByteUnicode.java
+sun/io/SCCS/s.CharToByteUnicodeBig.java
+sun/io/SCCS/s.CharToByteUnicodeBigUnmarked.java
+sun/io/SCCS/s.CharToByteUnicodeLittle.java
+sun/io/SCCS/s.CharToByteUnicodeLittleUnmarked.java
+sun/io/SCCS/s.CharacterEncoding.java
+sun/io/SCCS/s.MalformedInputException.java
+sun/io/SCCS/s.ConversionBufferFullException.java
+sun/io/SCCS/s.UnknownCharacterException.java
+sun/io/ByteToCharBig5_HKSCS.java
+sun/io/ByteToCharASCII.java
+sun/io/ByteToCharBig5.java
+sun/io/ByteToCharUnicodeBigUnmarked.java
+sun/io/ByteToCharBig5_Solaris.java
+sun/io/ByteToCharConverter.java
+sun/io/ByteToCharCp037.java
+sun/io/ByteToCharCp1006.java
+sun/io/ByteToCharCp1025.java
+sun/io/ByteToCharCp1026.java
+sun/io/ByteToCharCp1046.java
+sun/io/ByteToCharCp1047.java
+sun/io/ByteToCharCp1097.java
+sun/io/ByteToCharCp1098.java
+sun/io/ByteToCharCp1112.java
+sun/io/ByteToCharCp1122.java
+sun/io/ByteToCharCp1123.java
+sun/io/ByteToCharCp1124.java
+sun/io/ByteToCharCp1140.java
+sun/io/ByteToCharCp1141.java
+sun/io/ByteToCharCp1142.java
+sun/io/ByteToCharCp1143.java
+sun/io/ByteToCharCp1144.java
+sun/io/ByteToCharCp1145.java
+sun/io/ByteToCharCp1146.java
+sun/io/ByteToCharCp1147.java
+sun/io/ByteToCharCp1148.java
+sun/io/ByteToCharCp1149.java
+sun/io/ByteToCharCp1250.java
+sun/io/ByteToCharCp1251.java
+sun/io/ByteToCharCp1252.java
+sun/io/ByteToCharCp1253.java
+sun/io/ByteToCharCp1254.java
+sun/io/ByteToCharCp1255.java
+sun/io/ByteToCharCp1256.java
+sun/io/ByteToCharCp1257.java
+sun/io/ByteToCharCp1258.java
+sun/io/ByteToCharCp1381.java
+sun/io/ByteToCharCp1383.java
+sun/io/ByteToCharCp273.java
+sun/io/ByteToCharCp277.java
+sun/io/ByteToCharCp278.java
+sun/io/ByteToCharCp280.java
+sun/io/ByteToCharCp284.java
+sun/io/ByteToCharCp285.java
+sun/io/ByteToCharCp297.java
+sun/io/ByteToCharCp33722.java
+sun/io/ByteToCharCp420.java
+sun/io/ByteToCharCp424.java
+sun/io/ByteToCharCp437.java
+sun/io/ByteToCharCp500.java
+sun/io/ByteToCharCp737.java
+sun/io/ByteToCharCp775.java
+sun/io/ByteToCharCp838.java
+sun/io/ByteToCharCp850.java
+sun/io/ByteToCharCp852.java
+sun/io/ByteToCharCp855.java
+sun/io/ByteToCharCp856.java
+sun/io/ByteToCharCp857.java
+sun/io/ByteToCharCp858.java
+sun/io/ByteToCharCp860.java
+sun/io/ByteToCharCp861.java
+sun/io/ByteToCharCp862.java
+sun/io/ByteToCharCp863.java
+sun/io/ByteToCharCp864.java
+sun/io/ByteToCharCp865.java
+sun/io/ByteToCharCp866.java
+sun/io/ByteToCharCp868.java
+sun/io/ByteToCharCp869.java
+sun/io/ByteToCharCp870.java
+sun/io/ByteToCharCp871.java
+sun/io/ByteToCharCp874.java
+sun/io/ByteToCharCp875.java
+sun/io/ByteToCharCp918.java
+sun/io/ByteToCharCp921.java
+sun/io/ByteToCharCp922.java
+sun/io/ByteToCharCp930.java
+sun/io/ByteToCharCp933.java
+sun/io/ByteToCharCp935.java
+sun/io/ByteToCharCp937.java
+sun/io/ByteToCharCp939.java
+sun/io/ByteToCharCp942.java
+sun/io/ByteToCharCp942C.java
+sun/io/ByteToCharCp943.java
+sun/io/ByteToCharCp943C.java
+sun/io/ByteToCharCp948.java
+sun/io/ByteToCharCp949.java
+sun/io/ByteToCharCp949C.java
+sun/io/ByteToCharCp950.java
+sun/io/ByteToCharCp964.java
+sun/io/ByteToCharCp970.java
+sun/io/ByteToCharDBCS_ASCII.java
+sun/io/ByteToCharDBCS_EBCDIC.java
+sun/io/Converters.java
+sun/io/ByteToCharDoubleByte.java
+sun/io/ByteToCharEUC.java
+sun/io/ByteToCharEUC_CN.java
+sun/io/ByteToCharEUC_JP.java
+sun/io/ByteToCharEUC_JP_LINUX.java
+sun/io/ByteToCharEUC_JP_Solaris.java
+sun/io/ByteToCharEUC_KR.java
+sun/io/ByteToCharEUC_TW.java
+sun/io/ByteToCharGB18030.java
+sun/io/ByteToCharGB18030DB.java
+sun/io/ByteToCharGBK.java
+sun/io/ByteToCharHKSCS.java
+sun/io/ByteToCharHKSCS_2001.java
+sun/io/ByteToCharISCII91.java
+sun/io/ByteToCharISO2022.java
+sun/io/ByteToCharISO2022CN.java
+sun/io/ByteToCharISO2022JP.java
+sun/io/ByteToCharISO2022KR.java
+sun/io/ByteToCharISO8859_1.java
+sun/io/ByteToCharISO8859_13.java
+sun/io/ByteToCharISO8859_15.java
+sun/io/ByteToCharISO8859_2.java
+sun/io/ByteToCharISO8859_3.java
+sun/io/ByteToCharISO8859_4.java
+sun/io/ByteToCharISO8859_5.java
+sun/io/ByteToCharISO8859_6.java
+sun/io/ByteToCharISO8859_7.java
+sun/io/ByteToCharISO8859_8.java
+sun/io/ByteToCharISO8859_9.java
+sun/io/ByteToCharJIS0201.java
+sun/io/ByteToCharJIS0208.java
+sun/io/ByteToCharJIS0208_Solaris.java
+sun/io/ByteToCharJIS0212.java
+sun/io/ByteToCharJIS0212_Solaris.java
+sun/io/ByteToCharJISAutoDetect.java
+sun/io/ByteToCharJohab.java
+sun/io/ByteToCharKOI8_R.java
+sun/io/ByteToCharMS874.java
+sun/io/ByteToCharMS932.java
+sun/io/ByteToCharMS932DB.java
+sun/io/ByteToCharMS936.java
+sun/io/ByteToCharMS949.java
+sun/io/ByteToCharMS950.java
+sun/io/ByteToCharMS950_HKSCS.java
+sun/io/ByteToCharMacArabic.java
+sun/io/ByteToCharMacCentralEurope.java
+sun/io/ByteToCharMacCroatian.java
+sun/io/ByteToCharMacCyrillic.java
+sun/io/ByteToCharMacDingbat.java
+sun/io/ByteToCharMacGreek.java
+sun/io/ByteToCharMacHebrew.java
+sun/io/ByteToCharMacIceland.java
+sun/io/ByteToCharMacRoman.java
+sun/io/ByteToCharMacRomania.java
+sun/io/ByteToCharMacSymbol.java
+sun/io/ByteToCharMacThai.java
+sun/io/ByteToCharMacTurkish.java
+sun/io/ByteToCharMacUkraine.java
+sun/io/ByteToCharPCK.java
+sun/io/ByteToCharSJIS.java
+sun/io/ByteToCharSingleByte.java
+sun/io/ByteToCharTIS620.java
+sun/io/ByteToCharUTF16.java
+sun/io/ByteToCharUTF8.java
+sun/io/ByteToCharUnicode.java
+sun/io/ByteToCharUnicodeBig.java
+sun/io/ByteToCharUnicodeLittleUnmarked.java
+sun/io/ByteToCharUnicodeLittle.java
+sun/io/CharToByteBig5_HKSCS.java
+sun/io/CharToByteASCII.java
+sun/io/CharToByteBig5.java
+sun/io/CharToByteEUC_JP_Solaris.java
+sun/io/CharToByteCp037.java
+sun/io/CharToByteBig5_Solaris.java
+sun/io/CharToByteConverter.java
+sun/io/CharToByteCp1006.java
+sun/io/CharToByteCp1025.java
+sun/io/CharToByteCp1026.java
+sun/io/CharToByteCp1046.java
+sun/io/CharToByteCp1047.java
+sun/io/CharToByteCp1097.java
+sun/io/CharToByteCp1098.java
+sun/io/CharToByteCp1112.java
+sun/io/CharToByteCp1122.java
+sun/io/CharToByteCp1123.java
+sun/io/CharToByteCp1124.java
+sun/io/CharToByteCp1140.java
+sun/io/CharToByteCp1141.java
+sun/io/CharToByteCp1142.java
+sun/io/CharToByteCp1143.java
+sun/io/CharToByteCp1144.java
+sun/io/CharToByteCp1145.java
+sun/io/CharToByteCp1146.java
+sun/io/CharToByteCp1147.java
+sun/io/CharToByteCp1148.java
+sun/io/CharToByteCp1149.java
+sun/io/CharToByteCp1250.java
+sun/io/CharToByteCp1251.java
+sun/io/CharToByteCp1252.java
+sun/io/CharToByteCp1253.java
+sun/io/CharToByteCp1254.java
+sun/io/CharToByteCp1255.java
+sun/io/CharToByteCp1256.java
+sun/io/CharToByteCp1257.java
+sun/io/CharToByteCp1258.java
+sun/io/CharToByteCp1381.java
+sun/io/CharToByteCp1383.java
+sun/io/CharToByteCp273.java
+sun/io/CharToByteCp277.java
+sun/io/CharToByteCp278.java
+sun/io/CharToByteCp280.java
+sun/io/CharToByteCp284.java
+sun/io/CharToByteCp285.java
+sun/io/CharToByteCp297.java
+sun/io/CharToByteCp33722.java
+sun/io/CharToByteCp420.java
+sun/io/CharToByteCp424.java
+sun/io/CharToByteCp437.java
+sun/io/CharToByteCp500.java
+sun/io/CharToByteCp737.java
+sun/io/CharToByteCp775.java
+sun/io/CharToByteCp838.java
+sun/io/CharToByteCp850.java
+sun/io/CharToByteCp852.java
+sun/io/CharToByteCp855.java
+sun/io/CharToByteCp856.java
+sun/io/CharToByteCp857.java
+sun/io/CharToByteCp858.java
+sun/io/CharToByteCp860.java
+sun/io/CharToByteCp861.java
+sun/io/CharToByteCp862.java
+sun/io/CharToByteCp863.java
+sun/io/CharToByteCp864.java
+sun/io/CharToByteCp865.java
+sun/io/CharToByteCp866.java
+sun/io/CharToByteCp868.java
+sun/io/CharToByteCp869.java
+sun/io/CharToByteCp870.java
+sun/io/CharToByteCp871.java
+sun/io/CharToByteCp874.java
+sun/io/CharToByteCp875.java
+sun/io/CharToByteCp918.java
+sun/io/CharToByteCp921.java
+sun/io/CharToByteCp922.java
+sun/io/CharToByteCp930.java
+sun/io/CharToByteCp933.java
+sun/io/CharToByteCp935.java
+sun/io/CharToByteCp937.java
+sun/io/CharToByteCp939.java
+sun/io/CharToByteCp942.java
+sun/io/CharToByteCp942C.java
+sun/io/CharToByteCp943.java
+sun/io/CharToByteCp943C.java
+sun/io/CharToByteCp948.java
+sun/io/CharToByteCp949.java
+sun/io/CharToByteCp949C.java
+sun/io/CharToByteCp950.java
+sun/io/CharToByteCp964.java
+sun/io/CharToByteCp970.java
+sun/io/CharToByteDBCS_ASCII.java
+sun/io/CharToByteDBCS_EBCDIC.java
+sun/io/CharToByteDoubleByte.java
+sun/io/CharToByteEUC.java
+sun/io/CharToByteEUC_CN.java
+sun/io/CharToByteEUC_JP.java
+sun/io/CharToByteEUC_JP_LINUX.java
+sun/io/CharToByteUnicodeLittleUnmarked.java
+sun/io/CharToByteEUC_KR.java
+sun/io/CharToByteEUC_TW.java
+sun/io/CharToByteGB18030.java
+sun/io/CharToByteGBK.java
+sun/io/CharToByteHKSCS.java
+sun/io/CharToByteHKSCS_2001.java
+sun/io/CharToByteISCII91.java
+sun/io/CharToByteISO2022.java
+sun/io/CharToByteISO2022CN_CNS.java
+sun/io/CharToByteISO2022CN_GB.java
+sun/io/CharToByteISO2022JP.java
+sun/io/CharToByteISO2022KR.java
+sun/io/CharToByteISO8859_1.java
+sun/io/CharToByteISO8859_13.java
+sun/io/CharToByteISO8859_15.java
+sun/io/CharToByteISO8859_2.java
+sun/io/CharToByteISO8859_3.java
+sun/io/CharToByteISO8859_4.java
+sun/io/CharToByteISO8859_5.java
+sun/io/CharToByteISO8859_6.java
+sun/io/CharToByteISO8859_7.java
+sun/io/CharToByteISO8859_8.java
+sun/io/CharToByteISO8859_9.java
+sun/io/CharToByteJIS0201.java
+sun/io/CharToByteJIS0208.java
+sun/io/CharToByteJIS0208_Solaris.java
+sun/io/CharToByteJIS0212.java
+sun/io/CharToByteJIS0212_Solaris.java
+sun/io/CharToByteJohab.java
+sun/io/CharToByteKOI8_R.java
+sun/io/CharToByteMS874.java
+sun/io/CharToByteMS932.java
+sun/io/CharToByteMS932DB.java
+sun/io/CharToByteMS936.java
+sun/io/CharToByteMS949.java
+sun/io/CharToByteMS950.java
+sun/io/CharToByteMS950_HKSCS.java
+sun/io/CharToByteMacArabic.java
+sun/io/CharToByteMacCentralEurope.java
+sun/io/CharToByteMacCroatian.java
+sun/io/CharToByteMacCyrillic.java
+sun/io/CharToByteMacDingbat.java
+sun/io/CharToByteMacGreek.java
+sun/io/CharToByteMacHebrew.java
+sun/io/CharToByteMacIceland.java
+sun/io/CharToByteMacRoman.java
+sun/io/CharToByteMacRomania.java
+sun/io/CharToByteMacSymbol.java
+sun/io/CharToByteMacThai.java
+sun/io/CharToByteMacTurkish.java
+sun/io/CharToByteMacUkraine.java
+sun/io/CharToBytePCK.java
+sun/io/CharToByteSJIS.java
+sun/io/CharToByteSingleByte.java
+sun/io/CharToByteTIS620.java
+sun/io/CharToByteUTF16.java
+sun/io/CharToByteUTF8.java
+sun/io/CharToByteUnicode.java
+sun/io/CharToByteUnicodeBig.java
+sun/io/CharToByteUnicodeBigUnmarked.java
+sun/io/CharToByteUnicodeLittle.java
+sun/io/MalformedInputException.java
+sun/io/CharacterEncoding.java
+sun/io/ConversionBufferFullException.java
+sun/io/UnknownCharacterException.java
+sun/java2d
+sun/java2d/SCCS
+sun/java2d/SCCS/s.HeadlessGraphicsEnvironment.java
+sun/java2d/SCCS/s.DefaultDisposerRecord.java
+sun/java2d/SCCS/s.Disposer.java
+sun/java2d/SCCS/s.DisposerRecord.java
+sun/java2d/SCCS/s.DisposerTarget.java
+sun/java2d/SCCS/s.FontSupport.java
+sun/java2d/SCCS/s.InvalidPipeException.java
+sun/java2d/SCCS/s.NullSurfaceData.java
+sun/java2d/SCCS/s.Spans.java
+sun/java2d/SCCS/s.SunCompositeContext.java
+sun/java2d/SCCS/s.SunGraphics2D.java
+sun/java2d/SCCS/s.SunGraphicsEnvironment.java
+sun/java2d/SCCS/s.SurfaceData.java
+sun/java2d/loops
+sun/java2d/loops/SCCS
+sun/java2d/loops/SCCS/s.BlitBg.java
+sun/java2d/loops/SCCS/s.Blit.java
+sun/java2d/loops/SCCS/s.CompositeType.java
+sun/java2d/loops/SCCS/s.CustomComponent.java
+sun/java2d/loops/SCCS/s.DrawGlyphList.java
+sun/java2d/loops/SCCS/s.DrawGlyphListAA.java
+sun/java2d/loops/SCCS/s.DrawLine.java
+sun/java2d/loops/SCCS/s.DrawPolygons.java
+sun/java2d/loops/SCCS/s.DrawRect.java
+sun/java2d/loops/SCCS/s.FillRect.java
+sun/java2d/loops/SCCS/s.FillSpans.java
+sun/java2d/loops/SCCS/s.FontInfo.java
+sun/java2d/loops/SCCS/s.GeneralRenderer.java
+sun/java2d/loops/SCCS/s.GraphicsPrimitive.java
+sun/java2d/loops/SCCS/s.GraphicsPrimitiveMgr.java
+sun/java2d/loops/SCCS/s.MaskBlit.java
+sun/java2d/loops/SCCS/s.TransformBlit.java
+sun/java2d/loops/SCCS/s.GraphicsPrimitiveProxy.java
+sun/java2d/loops/SCCS/s.MaskFill.java
+sun/java2d/loops/SCCS/s.RenderCache.java
+sun/java2d/loops/SCCS/s.RenderLoops.java
+sun/java2d/loops/SCCS/s.ScaledBlit.java
+sun/java2d/loops/SCCS/s.SurfaceType.java
+sun/java2d/loops/SCCS/s.TransformHelper.java
+sun/java2d/loops/SCCS/s.XORComposite.java
+sun/java2d/loops/CompositeType.java
+sun/java2d/loops/Blit.java
+sun/java2d/loops/BlitBg.java
+sun/java2d/loops/GraphicsPrimitiveMgr.java
+sun/java2d/loops/CustomComponent.java
+sun/java2d/loops/DrawGlyphList.java
+sun/java2d/loops/DrawGlyphListAA.java
+sun/java2d/loops/DrawLine.java
+sun/java2d/loops/DrawPolygons.java
+sun/java2d/loops/DrawRect.java
+sun/java2d/loops/FillRect.java
+sun/java2d/loops/FillSpans.java
+sun/java2d/loops/FontInfo.java
+sun/java2d/loops/GeneralRenderer.java
+sun/java2d/loops/GraphicsPrimitive.java
+sun/java2d/loops/MaskBlit.java
+sun/java2d/loops/GraphicsPrimitiveProxy.java
+sun/java2d/loops/MaskFill.java
+sun/java2d/loops/RenderCache.java
+sun/java2d/loops/RenderLoops.java
+sun/java2d/loops/ScaledBlit.java
+sun/java2d/loops/SurfaceType.java
+sun/java2d/loops/TransformBlit.java
+sun/java2d/loops/XORComposite.java
+sun/java2d/loops/TransformHelper.java
+sun/java2d/opengl
+sun/java2d/opengl/SCCS
+sun/java2d/opengl/SCCS/s.OGLSurfaceData.java
+sun/java2d/opengl/SCCS/s.OGLBlitLoops.java
+sun/java2d/opengl/SCCS/s.OGLContext.java
+sun/java2d/opengl/SCCS/s.OGLDrawImage.java
+sun/java2d/opengl/SCCS/s.OGLMaskBlit.java
+sun/java2d/opengl/SCCS/s.OGLMaskFill.java
+sun/java2d/opengl/SCCS/s.OGLRenderer.java
+sun/java2d/opengl/SCCS/s.OGLTextRenderer.java
+sun/java2d/opengl/OGLTextRenderer.java
+sun/java2d/opengl/OGLBlitLoops.java
+sun/java2d/opengl/OGLContext.java
+sun/java2d/opengl/OGLDrawImage.java
+sun/java2d/opengl/OGLMaskBlit.java
+sun/java2d/opengl/OGLMaskFill.java
+sun/java2d/opengl/OGLRenderer.java
+sun/java2d/opengl/OGLSurfaceData.java
+sun/java2d/pipe
+sun/java2d/pipe/SCCS
+sun/java2d/pipe/SCCS/s.DuctusShapeRenderer.java
+sun/java2d/pipe/SCCS/s.AATextRenderer.java
+sun/java2d/pipe/SCCS/s.AlphaColorPipe.java
+sun/java2d/pipe/SCCS/s.AlphaPaintPipe.java
+sun/java2d/pipe/SCCS/s.CompositePipe.java
+sun/java2d/pipe/SCCS/s.DrawImage.java
+sun/java2d/pipe/SCCS/s.DrawImagePipe.java
+sun/java2d/pipe/SCCS/s.DuctusRenderer.java
+sun/java2d/pipe/SCCS/s.GeneralCompositePipe.java
+sun/java2d/pipe/SCCS/s.GlyphListPipe.java
+sun/java2d/pipe/SCCS/s.LoopPipe.java
+sun/java2d/pipe/SCCS/s.NullPipe.java
+sun/java2d/pipe/SCCS/s.OutlineTextRenderer.java
+sun/java2d/pipe/SCCS/s.PixelDrawPipe.java
+sun/java2d/pipe/SCCS/s.PixelFillPipe.java
+sun/java2d/pipe/SCCS/s.PixelToShapeConverter.java
+sun/java2d/pipe/SCCS/s.Region.java
+sun/java2d/pipe/SCCS/s.RegionClipSpanIterator.java
+sun/java2d/pipe/SCCS/s.RegionIterator.java
+sun/java2d/pipe/SCCS/s.RegionSpanIterator.java
+sun/java2d/pipe/SCCS/s.ShapeDrawPipe.java
+sun/java2d/pipe/SCCS/s.ShapeSpanIterator.java
+sun/java2d/pipe/SCCS/s.SolidTextRenderer.java
+sun/java2d/pipe/SCCS/s.SpanClipRenderer.java
+sun/java2d/pipe/SCCS/s.SpanIterator.java
+sun/java2d/pipe/SCCS/s.SpanShapeRenderer.java
+sun/java2d/pipe/SCCS/s.TextPipe.java
+sun/java2d/pipe/SCCS/s.TextRenderer.java
+sun/java2d/pipe/SCCS/s.ValidatePipe.java
+sun/java2d/pipe/DuctusShapeRenderer.java
+sun/java2d/pipe/AATextRenderer.java
+sun/java2d/pipe/AlphaColorPipe.java
+sun/java2d/pipe/AlphaPaintPipe.java
+sun/java2d/pipe/CompositePipe.java
+sun/java2d/pipe/DrawImage.java
+sun/java2d/pipe/DrawImagePipe.java
+sun/java2d/pipe/DuctusRenderer.java
+sun/java2d/pipe/PixelToShapeConverter.java
+sun/java2d/pipe/GeneralCompositePipe.java
+sun/java2d/pipe/GlyphListPipe.java
+sun/java2d/pipe/LoopPipe.java
+sun/java2d/pipe/NullPipe.java
+sun/java2d/pipe/OutlineTextRenderer.java
+sun/java2d/pipe/PixelDrawPipe.java
+sun/java2d/pipe/PixelFillPipe.java
+sun/java2d/pipe/RegionIterator.java
+sun/java2d/pipe/Region.java
+sun/java2d/pipe/RegionClipSpanIterator.java
+sun/java2d/pipe/RegionSpanIterator.java
+sun/java2d/pipe/ShapeDrawPipe.java
+sun/java2d/pipe/ShapeSpanIterator.java
+sun/java2d/pipe/SolidTextRenderer.java
+sun/java2d/pipe/SpanClipRenderer.java
+sun/java2d/pipe/SpanIterator.java
+sun/java2d/pipe/SpanShapeRenderer.java
+sun/java2d/pipe/TextPipe.java
+sun/java2d/pipe/TextRenderer.java
+sun/java2d/pipe/ValidatePipe.java
+sun/java2d/HeadlessGraphicsEnvironment.java
+sun/java2d/DefaultDisposerRecord.java
+sun/java2d/Disposer.java
+sun/java2d/DisposerRecord.java
+sun/java2d/DisposerTarget.java
+sun/java2d/FontSupport.java
+sun/java2d/InvalidPipeException.java
+sun/java2d/NullSurfaceData.java
+sun/java2d/Spans.java
+sun/java2d/SunCompositeContext.java
+sun/java2d/SunGraphics2D.java
+sun/java2d/SunGraphicsEnvironment.java
+sun/java2d/SurfaceData.java
+sun/jdbc
+sun/jdbc/odbc
+sun/jdbc/odbc/SCCS
+sun/jdbc/odbc/SCCS/s.JdbcOdbcBoundCol.java
+sun/jdbc/odbc/SCCS/s.JdbcOdbc.c
+sun/jdbc/odbc/SCCS/s.JdbcOdbc.java
+sun/jdbc/odbc/SCCS/s.JdbcOdbcPreparedStatement.java
+sun/jdbc/odbc/SCCS/s.JdbcOdbcBatchUpdateException.java
+sun/jdbc/odbc/SCCS/s.JdbcOdbcBoundArrayOfParams.java
+sun/jdbc/odbc/SCCS/s.JdbcOdbcBoundParam.java
+sun/jdbc/odbc/SCCS/s.JdbcOdbcCallableStatement.java
+sun/jdbc/odbc/SCCS/s.JdbcOdbcConnection.java
+sun/jdbc/odbc/SCCS/s.JdbcOdbcConnectionInterface.java
+sun/jdbc/odbc/SCCS/s.JdbcOdbcDatabaseMetaData.java
+sun/jdbc/odbc/SCCS/s.JdbcOdbcDriver.java
+sun/jdbc/odbc/SCCS/s.JdbcOdbcDriverInterface.java
+sun/jdbc/odbc/SCCS/s.JdbcOdbcInputStream.java
+sun/jdbc/odbc/SCCS/s.JdbcOdbcLimits.java
+sun/jdbc/odbc/SCCS/s.JdbcOdbcObject.java
+sun/jdbc/odbc/SCCS/s.JdbcOdbcPlatform.java
+sun/jdbc/odbc/SCCS/s.JdbcOdbcResultSetInterface.java
+sun/jdbc/odbc/SCCS/s.JdbcOdbcPseudoCol.java
+sun/jdbc/odbc/SCCS/s.JdbcOdbcResultSet.java
+sun/jdbc/odbc/SCCS/s.odbcver.h
+sun/jdbc/odbc/SCCS/s.JdbcOdbcResultSetMetaData.java
+sun/jdbc/odbc/SCCS/s.JdbcOdbcSQLWarning.java
+sun/jdbc/odbc/SCCS/s.JdbcOdbcStatement.java
+sun/jdbc/odbc/SCCS/s.JdbcOdbcTracer.java
+sun/jdbc/odbc/SCCS/s.JdbcOdbcTypeInfo.java
+sun/jdbc/odbc/SCCS/s.JdbcOdbcTypes.java
+sun/jdbc/odbc/SCCS/s.JdbcOdbcUtils.java
+sun/jdbc/odbc/SCCS/s.OdbcDef.java
+sun/jdbc/odbc/SCCS/s.odbcinst.h
+sun/jdbc/odbc/SCCS/s.sql.h
+sun/jdbc/odbc/SCCS/s.sqlext.h
+sun/jdbc/odbc/SCCS/s.sqltypes.h
+sun/jdbc/odbc/SCCS/s.sqlucode.h
+sun/jdbc/odbc/SCCS/s.sqlunx.h
+sun/jdbc/odbc/SCCS/s.wodbcinst.h
+sun/jdbc/odbc/SCCS/s.wodbcver.h
+sun/jdbc/odbc/SCCS/s.wsql.h
+sun/jdbc/odbc/SCCS/s.wsqlext.h
+sun/jdbc/odbc/SCCS/s.wsqltypes.h
+sun/jdbc/odbc/SCCS/s.wsqlucode.h
+sun/jdbc/odbc/ee
+sun/jdbc/odbc/ee/SCCS
+sun/jdbc/odbc/ee/SCCS/s.ConnectionAttributes.java
+sun/jdbc/odbc/ee/SCCS/s.CommonDataSource.java
+sun/jdbc/odbc/ee/SCCS/s.ConnectionEventListener.java
+sun/jdbc/odbc/ee/SCCS/s.ConnectionHandler.java
+sun/jdbc/odbc/ee/SCCS/s.ConnectionPool.java
+sun/jdbc/odbc/ee/SCCS/s.ConnectionPoolDataSource.java
+sun/jdbc/odbc/ee/SCCS/s.ConnectionPoolFactory.java
+sun/jdbc/odbc/ee/SCCS/s.DataSource.java
+sun/jdbc/odbc/ee/SCCS/s.ObjectFactory.java
+sun/jdbc/odbc/ee/SCCS/s.ObjectPool.java
+sun/jdbc/odbc/ee/SCCS/s.PoolProperties.java
+sun/jdbc/odbc/ee/SCCS/s.PoolWorker.java
+sun/jdbc/odbc/ee/SCCS/s.PooledConnection.java
+sun/jdbc/odbc/ee/SCCS/s.PooledObject.java
+sun/jdbc/odbc/ee/ConnectionAttributes.java
+sun/jdbc/odbc/ee/CommonDataSource.java
+sun/jdbc/odbc/ee/ConnectionEventListener.java
+sun/jdbc/odbc/ee/ConnectionHandler.java
+sun/jdbc/odbc/ee/ConnectionPool.java
+sun/jdbc/odbc/ee/ConnectionPoolDataSource.java
+sun/jdbc/odbc/ee/ConnectionPoolFactory.java
+sun/jdbc/odbc/ee/DataSource.java
+sun/jdbc/odbc/ee/ObjectFactory.java
+sun/jdbc/odbc/ee/ObjectPool.java
+sun/jdbc/odbc/ee/PoolProperties.java
+sun/jdbc/odbc/ee/PoolWorker.java
+sun/jdbc/odbc/ee/PooledConnection.java
+sun/jdbc/odbc/ee/PooledObject.java
+sun/jdbc/odbc/JdbcOdbc.java
+sun/jdbc/odbc/JdbcOdbc.c
+sun/jdbc/odbc/OdbcDef.java
+sun/jdbc/odbc/JdbcOdbcBatchUpdateException.java
+sun/jdbc/odbc/JdbcOdbcBoundArrayOfParams.java
+sun/jdbc/odbc/JdbcOdbcBoundCol.java
+sun/jdbc/odbc/JdbcOdbcBoundParam.java
+sun/jdbc/odbc/JdbcOdbcCallableStatement.java
+sun/jdbc/odbc/JdbcOdbcConnection.java
+sun/jdbc/odbc/JdbcOdbcConnectionInterface.java
+sun/jdbc/odbc/JdbcOdbcDatabaseMetaData.java
+sun/jdbc/odbc/JdbcOdbcDriver.java
+sun/jdbc/odbc/JdbcOdbcLimits.java
+sun/jdbc/odbc/JdbcOdbcObject.java
+sun/jdbc/odbc/JdbcOdbcDriverInterface.java
+sun/jdbc/odbc/JdbcOdbcInputStream.java
+sun/jdbc/odbc/JdbcOdbcPlatform.java
+sun/jdbc/odbc/JdbcOdbcPreparedStatement.java
+sun/jdbc/odbc/JdbcOdbcPseudoCol.java
+sun/jdbc/odbc/JdbcOdbcResultSet.java
+sun/jdbc/odbc/JdbcOdbcResultSetInterface.java
+sun/jdbc/odbc/JdbcOdbcResultSetMetaData.java
+sun/jdbc/odbc/JdbcOdbcSQLWarning.java
+sun/jdbc/odbc/JdbcOdbcStatement.java
+sun/jdbc/odbc/JdbcOdbcTracer.java
+sun/jdbc/odbc/JdbcOdbcTypeInfo.java
+sun/jdbc/odbc/JdbcOdbcTypes.java
+sun/jdbc/odbc/JdbcOdbcUtils.java
+sun/jdbc/odbc/odbcinst.h
+sun/jdbc/odbc/odbcver.h
+sun/jdbc/odbc/sql.h
+sun/jdbc/odbc/sqlext.h
+sun/jdbc/odbc/sqltypes.h
+sun/jdbc/odbc/sqlucode.h
+sun/jdbc/odbc/sqlunx.h
+sun/jdbc/odbc/wodbcinst.h
+sun/jdbc/odbc/wodbcver.h
+sun/jdbc/odbc/wsql.h
+sun/jdbc/odbc/wsqlext.h
+sun/jdbc/odbc/wsqltypes.h
+sun/jdbc/odbc/wsqlucode.h
+sun/jvmstat
+sun/jvmstat/monitor
+sun/jvmstat/monitor/SCCS
+sun/jvmstat/monitor/SCCS/s.AbstractMonitor.java
+sun/jvmstat/monitor/SCCS/s.ByteArrayMonitor.java
+sun/jvmstat/monitor/SCCS/s.HostIdentifier.java
+sun/jvmstat/monitor/SCCS/s.IntegerMonitor.java
+sun/jvmstat/monitor/SCCS/s.LongMonitor.java
+sun/jvmstat/monitor/SCCS/s.Monitor.java
+sun/jvmstat/monitor/SCCS/s.MonitorException.java
+sun/jvmstat/monitor/SCCS/s.MonitoredHost.java
+sun/jvmstat/monitor/SCCS/s.MonitoredVm.java
+sun/jvmstat/monitor/SCCS/s.MonitoredVmUtil.java
+sun/jvmstat/monitor/SCCS/s.StringMonitor.java
+sun/jvmstat/monitor/SCCS/s.VmIdentifier.java
+sun/jvmstat/monitor/SCCS/s.package.html
+sun/jvmstat/monitor/event
+sun/jvmstat/monitor/event/SCCS
+sun/jvmstat/monitor/event/SCCS/s.HostEvent.java
+sun/jvmstat/monitor/event/SCCS/s.HostListener.java
+sun/jvmstat/monitor/event/SCCS/s.VmEvent.java
+sun/jvmstat/monitor/event/SCCS/s.package.html
+sun/jvmstat/monitor/event/SCCS/s.MonitorStatusChangeEvent.java
+sun/jvmstat/monitor/event/SCCS/s.VmListener.java
+sun/jvmstat/monitor/event/SCCS/s.VmStatusChangeEvent.java
+sun/jvmstat/monitor/event/HostListener.java
+sun/jvmstat/monitor/event/HostEvent.java
+sun/jvmstat/monitor/event/MonitorStatusChangeEvent.java
+sun/jvmstat/monitor/event/VmEvent.java
+sun/jvmstat/monitor/event/VmListener.java
+sun/jvmstat/monitor/event/VmStatusChangeEvent.java
+sun/jvmstat/monitor/event/package.html
+sun/jvmstat/monitor/remote
+sun/jvmstat/monitor/remote/SCCS
+sun/jvmstat/monitor/remote/SCCS/s.BufferedMonitoredVm.java
+sun/jvmstat/monitor/remote/SCCS/s.RemoteHost.java
+sun/jvmstat/monitor/remote/SCCS/s.RemoteVm.java
+sun/jvmstat/monitor/remote/SCCS/s.package.html
+sun/jvmstat/monitor/remote/BufferedMonitoredVm.java
+sun/jvmstat/monitor/remote/RemoteHost.java
+sun/jvmstat/monitor/remote/RemoteVm.java
+sun/jvmstat/monitor/remote/package.html
+sun/jvmstat/monitor/AbstractMonitor.java
+sun/jvmstat/monitor/ByteArrayMonitor.java
+sun/jvmstat/monitor/HostIdentifier.java
+sun/jvmstat/monitor/IntegerMonitor.java
+sun/jvmstat/monitor/LongMonitor.java
+sun/jvmstat/monitor/Monitor.java
+sun/jvmstat/monitor/MonitorException.java
+sun/jvmstat/monitor/MonitoredHost.java
+sun/jvmstat/monitor/MonitoredVm.java
+sun/jvmstat/monitor/MonitoredVmUtil.java
+sun/jvmstat/monitor/StringMonitor.java
+sun/jvmstat/monitor/VmIdentifier.java
+sun/jvmstat/monitor/package.html
+sun/jvmstat/perfdata
+sun/jvmstat/perfdata/monitor
+sun/jvmstat/perfdata/monitor/SCCS
+sun/jvmstat/perfdata/monitor/SCCS/s.AbstractPerfDataBuffer.java
+sun/jvmstat/perfdata/monitor/SCCS/s.AbstractMonitoredVm.java
+sun/jvmstat/perfdata/monitor/SCCS/s.package.html
+sun/jvmstat/perfdata/monitor/SCCS/s.AbstractPerfDataBufferPrologue.java
+sun/jvmstat/perfdata/monitor/SCCS/s.AliasFileParser.java
+sun/jvmstat/perfdata/monitor/SCCS/s.CountedTimerTask.java
+sun/jvmstat/perfdata/monitor/SCCS/s.CountedTimerTaskUtils.java
+sun/jvmstat/perfdata/monitor/SCCS/s.MonitorDataException.java
+sun/jvmstat/perfdata/monitor/SCCS/s.MonitorStatus.java
+sun/jvmstat/perfdata/monitor/SCCS/s.MonitorStructureException.java
+sun/jvmstat/perfdata/monitor/SCCS/s.MonitorTypeException.java
+sun/jvmstat/perfdata/monitor/SCCS/s.MonitorVersionException.java
+sun/jvmstat/perfdata/monitor/SCCS/s.PerfByteArrayMonitor.java
+sun/jvmstat/perfdata/monitor/SCCS/s.PerfDataBufferImpl.java
+sun/jvmstat/perfdata/monitor/SCCS/s.PerfIntegerMonitor.java
+sun/jvmstat/perfdata/monitor/SCCS/s.PerfLongMonitor.java
+sun/jvmstat/perfdata/monitor/SCCS/s.PerfStringConstantMonitor.java
+sun/jvmstat/perfdata/monitor/SCCS/s.PerfStringMonitor.java
+sun/jvmstat/perfdata/monitor/SCCS/s.PerfStringVariableMonitor.java
+sun/jvmstat/perfdata/monitor/SCCS/s.SyntaxException.java
+sun/jvmstat/perfdata/monitor/protocol
+sun/jvmstat/perfdata/monitor/protocol/file
+sun/jvmstat/perfdata/monitor/protocol/file/SCCS
+sun/jvmstat/perfdata/monitor/protocol/file/SCCS/s.MonitoredHostProvider.java
+sun/jvmstat/perfdata/monitor/protocol/file/SCCS/s.FileMonitoredVm.java
+sun/jvmstat/perfdata/monitor/protocol/file/SCCS/s.PerfDataBuffer.java
+sun/jvmstat/perfdata/monitor/protocol/file/SCCS/s.package.html
+sun/jvmstat/perfdata/monitor/protocol/file/MonitoredHostProvider.java
+sun/jvmstat/perfdata/monitor/protocol/file/FileMonitoredVm.java
+sun/jvmstat/perfdata/monitor/protocol/file/PerfDataBuffer.java
+sun/jvmstat/perfdata/monitor/protocol/file/package.html
+sun/jvmstat/perfdata/monitor/protocol/local
+sun/jvmstat/perfdata/monitor/protocol/local/SCCS
+sun/jvmstat/perfdata/monitor/protocol/local/SCCS/s.MonitoredHostProvider.java
+sun/jvmstat/perfdata/monitor/protocol/local/SCCS/s.LocalEventTimer.java
+sun/jvmstat/perfdata/monitor/protocol/local/SCCS/s.LocalMonitoredVm.java
+sun/jvmstat/perfdata/monitor/protocol/local/SCCS/s.LocalVmManager.java
+sun/jvmstat/perfdata/monitor/protocol/local/SCCS/s.PerfDataBuffer.java
+sun/jvmstat/perfdata/monitor/protocol/local/SCCS/s.PerfDataFile.java
+sun/jvmstat/perfdata/monitor/protocol/local/SCCS/s.package.html
+sun/jvmstat/perfdata/monitor/protocol/local/MonitoredHostProvider.java
+sun/jvmstat/perfdata/monitor/protocol/local/LocalEventTimer.java
+sun/jvmstat/perfdata/monitor/protocol/local/LocalMonitoredVm.java
+sun/jvmstat/perfdata/monitor/protocol/local/LocalVmManager.java
+sun/jvmstat/perfdata/monitor/protocol/local/PerfDataBuffer.java
+sun/jvmstat/perfdata/monitor/protocol/local/PerfDataFile.java
+sun/jvmstat/perfdata/monitor/protocol/local/package.html
+sun/jvmstat/perfdata/monitor/protocol/rmi
+sun/jvmstat/perfdata/monitor/protocol/rmi/SCCS
+sun/jvmstat/perfdata/monitor/protocol/rmi/SCCS/s.MonitoredHostProvider.java
+sun/jvmstat/perfdata/monitor/protocol/rmi/SCCS/s.PerfDataBuffer.java
+sun/jvmstat/perfdata/monitor/protocol/rmi/SCCS/s.RemoteMonitoredVm.java
+sun/jvmstat/perfdata/monitor/protocol/rmi/SCCS/s.RemoteVmManager.java
+sun/jvmstat/perfdata/monitor/protocol/rmi/SCCS/s.package.html
+sun/jvmstat/perfdata/monitor/protocol/rmi/MonitoredHostProvider.java
+sun/jvmstat/perfdata/monitor/protocol/rmi/PerfDataBuffer.java
+sun/jvmstat/perfdata/monitor/protocol/rmi/RemoteMonitoredVm.java
+sun/jvmstat/perfdata/monitor/protocol/rmi/RemoteVmManager.java
+sun/jvmstat/perfdata/monitor/protocol/rmi/package.html
+sun/jvmstat/perfdata/monitor/v1_0
+sun/jvmstat/perfdata/monitor/v1_0/SCCS
+sun/jvmstat/perfdata/monitor/v1_0/SCCS/s.PerfDataBuffer.java
+sun/jvmstat/perfdata/monitor/v1_0/SCCS/s.BasicType.java
+sun/jvmstat/perfdata/monitor/v1_0/SCCS/s.PerfDataBufferPrologue.java
+sun/jvmstat/perfdata/monitor/v1_0/PerfDataBuffer.java
+sun/jvmstat/perfdata/monitor/v1_0/BasicType.java
+sun/jvmstat/perfdata/monitor/v1_0/PerfDataBufferPrologue.java
+sun/jvmstat/perfdata/monitor/v2_0
+sun/jvmstat/perfdata/monitor/v2_0/SCCS
+sun/jvmstat/perfdata/monitor/v2_0/SCCS/s.PerfDataBufferPrologue.java
+sun/jvmstat/perfdata/monitor/v2_0/SCCS/s.PerfDataBuffer.java
+sun/jvmstat/perfdata/monitor/v2_0/SCCS/s.TypeCode.java
+sun/jvmstat/perfdata/monitor/v2_0/PerfDataBufferPrologue.java
+sun/jvmstat/perfdata/monitor/v2_0/PerfDataBuffer.java
+sun/jvmstat/perfdata/monitor/v2_0/TypeCode.java
+sun/jvmstat/perfdata/monitor/AbstractPerfDataBufferPrologue.java
+sun/jvmstat/perfdata/monitor/AbstractMonitoredVm.java
+sun/jvmstat/perfdata/monitor/AbstractPerfDataBuffer.java
+sun/jvmstat/perfdata/monitor/CountedTimerTaskUtils.java
+sun/jvmstat/perfdata/monitor/AliasFileParser.java
+sun/jvmstat/perfdata/monitor/CountedTimerTask.java
+sun/jvmstat/perfdata/monitor/MonitorDataException.java
+sun/jvmstat/perfdata/monitor/MonitorStatus.java
+sun/jvmstat/perfdata/monitor/MonitorStructureException.java
+sun/jvmstat/perfdata/monitor/MonitorTypeException.java
+sun/jvmstat/perfdata/monitor/MonitorVersionException.java
+sun/jvmstat/perfdata/monitor/package.html
+sun/jvmstat/perfdata/monitor/PerfByteArrayMonitor.java
+sun/jvmstat/perfdata/monitor/PerfDataBufferImpl.java
+sun/jvmstat/perfdata/monitor/PerfIntegerMonitor.java
+sun/jvmstat/perfdata/monitor/PerfLongMonitor.java
+sun/jvmstat/perfdata/monitor/PerfStringConstantMonitor.java
+sun/jvmstat/perfdata/monitor/PerfStringMonitor.java
+sun/jvmstat/perfdata/monitor/PerfStringVariableMonitor.java
+sun/jvmstat/perfdata/monitor/SyntaxException.java
+sun/jvmstat/perfdata/resources
+sun/jvmstat/perfdata/resources/SCCS
+sun/jvmstat/perfdata/resources/SCCS/s.aliasmap
+sun/jvmstat/perfdata/resources/aliasmap
+sun/management
+sun/management/SCCS
+sun/management/SCCS/s.BooleanFlag.java
+sun/management/SCCS/s.Agent.java
+sun/management/SCCS/s.Flag.java
+sun/management/SCCS/s.AgentConfigurationError.java
+sun/management/SCCS/s.ClassLoadingImpl.java
+sun/management/SCCS/s.CompilationImpl.java
+sun/management/SCCS/s.CompilerThreadStat.java
+sun/management/SCCS/s.ConnectorAddressLink.java
+sun/management/SCCS/s.FileSystem.java
+sun/management/SCCS/s.GarbageCollectorImpl.java
+sun/management/SCCS/s.GcInfoBuilder.java
+sun/management/SCCS/s.GcInfoCompositeData.java
+sun/management/SCCS/s.HotspotClassLoading.java
+sun/management/SCCS/s.HotspotInternalMBean.java
+sun/management/SCCS/s.HotspotInternal.java
+sun/management/SCCS/s.HotspotClassLoadingMBean.java
+sun/management/SCCS/s.HotspotCompilation.java
+sun/management/SCCS/s.HotspotCompilationMBean.java
+sun/management/SCCS/s.HotspotMemoryMBean.java
+sun/management/SCCS/s.HotspotMemory.java
+sun/management/SCCS/s.HotspotRuntime.java
+sun/management/SCCS/s.HotspotRuntimeMBean.java
+sun/management/SCCS/s.HotspotThread.java
+sun/management/SCCS/s.HotspotThreadMBean.java
+sun/management/SCCS/s.LazyCompositeData.java
+sun/management/SCCS/s.LongFlag.java
+sun/management/SCCS/s.MXBeanSupport.java
+sun/management/SCCS/s.ManagementFactory.java
+sun/management/SCCS/s.OperatingSystemImpl.java
+sun/management/SCCS/s.MethodInfo.java
+sun/management/SCCS/s.MappedMXBeanType.java
+sun/management/SCCS/s.MemoryImpl.java
+sun/management/SCCS/s.MemoryManagerImpl.java
+sun/management/SCCS/s.MemoryNotifInfoCompositeData.java
+sun/management/SCCS/s.MemoryPoolImpl.java
+sun/management/SCCS/s.MemoryUsageCompositeData.java
+sun/management/SCCS/s.PlatformMXBeanInvocationHandler.java
+sun/management/SCCS/s.NotificationEmitterSupport.java
+sun/management/SCCS/s.ThreadInfoCompositeData.java
+sun/management/SCCS/s.RuntimeImpl.java
+sun/management/SCCS/s.Sensor.java
+sun/management/SCCS/s.StringFlag.java
+sun/management/SCCS/s.ThreadImpl.java
+sun/management/SCCS/s.Util.java
+sun/management/SCCS/s.VMManagement.java
+sun/management/SCCS/s.VMManagementImpl.java
+sun/management/counter
+sun/management/counter/SCCS
+sun/management/counter/SCCS/s.AbstractCounter.java
+sun/management/counter/SCCS/s.ByteArrayCounter.java
+sun/management/counter/SCCS/s.Counter.java
+sun/management/counter/SCCS/s.LongArrayCounter.java
+sun/management/counter/SCCS/s.LongCounter.java
+sun/management/counter/SCCS/s.StringCounter.java
+sun/management/counter/SCCS/s.Units.java
+sun/management/counter/SCCS/s.Variability.java
+sun/management/counter/perf
+sun/management/counter/perf/SCCS
+sun/management/counter/perf/SCCS/s.ByteArrayCounterSnapshot.java
+sun/management/counter/perf/SCCS/s.InstrumentationException.java
+sun/management/counter/perf/SCCS/s.LongArrayCounterSnapshot.java
+sun/management/counter/perf/SCCS/s.LongCounterSnapshot.java
+sun/management/counter/perf/SCCS/s.PerfByteArrayCounter.java
+sun/management/counter/perf/SCCS/s.PerfDataEntry.java
+sun/management/counter/perf/SCCS/s.PerfDataType.java
+sun/management/counter/perf/SCCS/s.PerfInstrumentation.java
+sun/management/counter/perf/SCCS/s.PerfLongArrayCounter.java
+sun/management/counter/perf/SCCS/s.PerfLongCounter.java
+sun/management/counter/perf/SCCS/s.PerfStringCounter.java
+sun/management/counter/perf/SCCS/s.Prologue.java
+sun/management/counter/perf/SCCS/s.StringCounterSnapshot.java
+sun/management/counter/perf/ByteArrayCounterSnapshot.java
+sun/management/counter/perf/InstrumentationException.java
+sun/management/counter/perf/LongArrayCounterSnapshot.java
+sun/management/counter/perf/LongCounterSnapshot.java
+sun/management/counter/perf/PerfByteArrayCounter.java
+sun/management/counter/perf/PerfDataEntry.java
+sun/management/counter/perf/PerfDataType.java
+sun/management/counter/perf/PerfInstrumentation.java
+sun/management/counter/perf/PerfLongArrayCounter.java
+sun/management/counter/perf/PerfLongCounter.java
+sun/management/counter/perf/PerfStringCounter.java
+sun/management/counter/perf/Prologue.java
+sun/management/counter/perf/StringCounterSnapshot.java
+sun/management/counter/AbstractCounter.java
+sun/management/counter/ByteArrayCounter.java
+sun/management/counter/Counter.java
+sun/management/counter/LongArrayCounter.java
+sun/management/counter/LongCounter.java
+sun/management/counter/StringCounter.java
+sun/management/counter/Units.java
+sun/management/counter/Variability.java
+sun/management/jmxremote
+sun/management/jmxremote/SCCS
+sun/management/jmxremote/SCCS/s.ConnectorBootstrap.java
+sun/management/jmxremote/SCCS/s.SingleEntryRegistry.java
+sun/management/jmxremote/SCCS/s.package.html
+sun/management/jmxremote/SingleEntryRegistry.java
+sun/management/jmxremote/ConnectorBootstrap.java
+sun/management/jmxremote/package.html
+sun/management/resources
+sun/management/resources/SCCS
+sun/management/resources/SCCS/s.agent_de.properties
+sun/management/resources/SCCS/s.agent.properties
+sun/management/resources/SCCS/s.agent_es.properties
+sun/management/resources/SCCS/s.agent_fr.properties
+sun/management/resources/SCCS/s.agent_it.properties
+sun/management/resources/SCCS/s.agent_ja.properties
+sun/management/resources/SCCS/s.agent_ko.properties
+sun/management/resources/SCCS/s.agent_sv.properties
+sun/management/resources/SCCS/s.agent_zh_CN.properties
+sun/management/resources/SCCS/s.agent_zh_TW.properties
+sun/management/resources/agent_zh_CN.properties
+sun/management/resources/agent.properties
+sun/management/resources/agent_de.properties
+sun/management/resources/agent_es.properties
+sun/management/resources/agent_fr.properties
+sun/management/resources/agent_it.properties
+sun/management/resources/agent_ja.properties
+sun/management/resources/agent_ko.properties
+sun/management/resources/agent_sv.properties
+sun/management/resources/agent_zh_TW.properties
+sun/management/snmp
+sun/management/snmp/SCCS
+sun/management/snmp/SCCS/s.JVM-MANAGEMENT-MIB.mib
+sun/management/snmp/SCCS/s.AdaptorBootstrap.java
+sun/management/snmp/SCCS/s.README
+sun/management/snmp/SCCS/s.mib_core.txt
+sun/management/snmp/SCCS/s.package.html
+sun/management/snmp/SCCS/s.mibgen.properties.tiger
+sun/management/snmp/SCCS/s.rfc2287.txt
+sun/management/snmp/SCCS/s.rfc2564.txt
+sun/management/snmp/jvminstr
+sun/management/snmp/jvminstr/SCCS
+sun/management/snmp/jvminstr/SCCS/s.JvmMemManagerTableMetaImpl.java
+sun/management/snmp/jvminstr/SCCS/s.JVM_MANAGEMENT_MIB_IMPL.java
+sun/management/snmp/jvminstr/SCCS/s.JvmClassLoadingImpl.java
+sun/management/snmp/jvminstr/SCCS/s.JvmCompilationImpl.java
+sun/management/snmp/jvminstr/SCCS/s.JvmMemGCEntryImpl.java
+sun/management/snmp/jvminstr/SCCS/s.JvmMemGCTableMetaImpl.java
+sun/management/snmp/jvminstr/SCCS/s.JvmMemManagerEntryImpl.java
+sun/management/snmp/jvminstr/SCCS/s.JvmRTBootClassPathEntryImpl.java
+sun/management/snmp/jvminstr/SCCS/s.JvmMemMgrPoolRelEntryImpl.java
+sun/management/snmp/jvminstr/SCCS/s.JvmMemMgrPoolRelTableMetaImpl.java
+sun/management/snmp/jvminstr/SCCS/s.JvmMemPoolEntryImpl.java
+sun/management/snmp/jvminstr/SCCS/s.JvmMemPoolTableMetaImpl.java
+sun/management/snmp/jvminstr/SCCS/s.JvmMemoryImpl.java
+sun/management/snmp/jvminstr/SCCS/s.JvmMemoryMetaImpl.java
+sun/management/snmp/jvminstr/SCCS/s.JvmOSImpl.java
+sun/management/snmp/jvminstr/SCCS/s.README
+sun/management/snmp/jvminstr/SCCS/s.JvmRTBootClassPathTableMetaImpl.java
+sun/management/snmp/jvminstr/SCCS/s.JvmRTClassPathEntryImpl.java
+sun/management/snmp/jvminstr/SCCS/s.JvmRTClassPathTableMetaImpl.java
+sun/management/snmp/jvminstr/SCCS/s.JvmRTInputArgsEntryImpl.java
+sun/management/snmp/jvminstr/SCCS/s.JvmRTInputArgsTableMetaImpl.java
+sun/management/snmp/jvminstr/SCCS/s.JvmRTLibraryPathEntryImpl.java
+sun/management/snmp/jvminstr/SCCS/s.JvmRTLibraryPathTableMetaImpl.java
+sun/management/snmp/jvminstr/SCCS/s.JvmRuntimeImpl.java
+sun/management/snmp/jvminstr/SCCS/s.JvmRuntimeMetaImpl.java
+sun/management/snmp/jvminstr/SCCS/s.JvmThreadInstanceEntryImpl.java
+sun/management/snmp/jvminstr/SCCS/s.JvmThreadInstanceTableMetaImpl.java
+sun/management/snmp/jvminstr/SCCS/s.JvmThreadingImpl.java
+sun/management/snmp/jvminstr/SCCS/s.JvmThreadingMetaImpl.java
+sun/management/snmp/jvminstr/SCCS/s.NotificationTarget.java
+sun/management/snmp/jvminstr/SCCS/s.NotificationTargetImpl.java
+sun/management/snmp/jvminstr/SCCS/s.package.html
+sun/management/snmp/jvminstr/JvmMemMgrPoolRelTableMetaImpl.java
+sun/management/snmp/jvminstr/JVM_MANAGEMENT_MIB_IMPL.java
+sun/management/snmp/jvminstr/JvmClassLoadingImpl.java
+sun/management/snmp/jvminstr/JvmCompilationImpl.java
+sun/management/snmp/jvminstr/JvmMemGCEntryImpl.java
+sun/management/snmp/jvminstr/JvmMemGCTableMetaImpl.java
+sun/management/snmp/jvminstr/JvmMemManagerEntryImpl.java
+sun/management/snmp/jvminstr/JvmMemManagerTableMetaImpl.java
+sun/management/snmp/jvminstr/JvmMemMgrPoolRelEntryImpl.java
+sun/management/snmp/jvminstr/JvmMemPoolEntryImpl.java
+sun/management/snmp/jvminstr/JvmMemPoolTableMetaImpl.java
+sun/management/snmp/jvminstr/README
+sun/management/snmp/jvminstr/JvmMemoryImpl.java
+sun/management/snmp/jvminstr/JvmMemoryMetaImpl.java
+sun/management/snmp/jvminstr/JvmOSImpl.java
+sun/management/snmp/jvminstr/JvmRTBootClassPathEntryImpl.java
+sun/management/snmp/jvminstr/JvmRTBootClassPathTableMetaImpl.java
+sun/management/snmp/jvminstr/JvmRTClassPathEntryImpl.java
+sun/management/snmp/jvminstr/JvmRTClassPathTableMetaImpl.java
+sun/management/snmp/jvminstr/JvmRTInputArgsEntryImpl.java
+sun/management/snmp/jvminstr/JvmRTInputArgsTableMetaImpl.java
+sun/management/snmp/jvminstr/JvmRTLibraryPathEntryImpl.java
+sun/management/snmp/jvminstr/JvmRTLibraryPathTableMetaImpl.java
+sun/management/snmp/jvminstr/JvmRuntimeImpl.java
+sun/management/snmp/jvminstr/JvmRuntimeMetaImpl.java
+sun/management/snmp/jvminstr/package.html
+sun/management/snmp/jvminstr/JvmThreadInstanceEntryImpl.java
+sun/management/snmp/jvminstr/JvmThreadInstanceTableMetaImpl.java
+sun/management/snmp/jvminstr/JvmThreadingImpl.java
+sun/management/snmp/jvminstr/JvmThreadingMetaImpl.java
+sun/management/snmp/jvminstr/NotificationTarget.java
+sun/management/snmp/jvminstr/NotificationTargetImpl.java
+sun/management/snmp/jvmmib
+sun/management/snmp/jvmmib/SCCS
+sun/management/snmp/jvmmib/SCCS/s.EnumJvmJITCompilerTimeMonitoring.java
+sun/management/snmp/jvmmib/SCCS/s.EnumJvmClassesVerboseLevel.java
+sun/management/snmp/jvmmib/SCCS/s.EnumJvmMemManagerState.java
+sun/management/snmp/jvmmib/SCCS/s.EnumJvmMemPoolState.java
+sun/management/snmp/jvmmib/SCCS/s.EnumJvmMemPoolCollectThreshdSupport.java
+sun/management/snmp/jvmmib/SCCS/s.EnumJvmMemPoolThreshdSupport.java
+sun/management/snmp/jvmmib/SCCS/s.EnumJvmMemPoolType.java
+sun/management/snmp/jvmmib/SCCS/s.EnumJvmMemoryGCCall.java
+sun/management/snmp/jvmmib/SCCS/s.EnumJvmMemoryGCVerboseLevel.java
+sun/management/snmp/jvmmib/SCCS/s.EnumJvmRTBootClassPathSupport.java
+sun/management/snmp/jvmmib/SCCS/s.package.html
+sun/management/snmp/jvmmib/SCCS/s.JVM_MANAGEMENT_MIB.java
+sun/management/snmp/jvmmib/SCCS/s.EnumJvmThreadContentionMonitoring.java
+sun/management/snmp/jvmmib/SCCS/s.EnumJvmThreadCpuTimeMonitoring.java
+sun/management/snmp/jvmmib/SCCS/s.JVM_MANAGEMENT_MIBOidTable.java
+sun/management/snmp/jvmmib/SCCS/s.JvmClassLoadingMBean.java
+sun/management/snmp/jvmmib/SCCS/s.JvmClassLoadingMeta.java
+sun/management/snmp/jvmmib/SCCS/s.JvmCompilationMBean.java
+sun/management/snmp/jvmmib/SCCS/s.JvmCompilationMeta.java
+sun/management/snmp/jvmmib/SCCS/s.JvmMemGCEntryMBean.java
+sun/management/snmp/jvmmib/SCCS/s.JvmMemGCEntryMeta.java
+sun/management/snmp/jvmmib/SCCS/s.JvmMemGCTableMeta.java
+sun/management/snmp/jvmmib/SCCS/s.JvmMemManagerEntryMBean.java
+sun/management/snmp/jvmmib/SCCS/s.JvmMemManagerEntryMeta.java
+sun/management/snmp/jvmmib/SCCS/s.JvmMemPoolEntryMBean.java
+sun/management/snmp/jvmmib/SCCS/s.JvmMemManagerTableMeta.java
+sun/management/snmp/jvmmib/SCCS/s.JvmMemMgrPoolRelEntryMBean.java
+sun/management/snmp/jvmmib/SCCS/s.JvmMemMgrPoolRelEntryMeta.java
+sun/management/snmp/jvmmib/SCCS/s.JvmMemMgrPoolRelTableMeta.java
+sun/management/snmp/jvmmib/SCCS/s.JvmMemPoolEntryMeta.java
+sun/management/snmp/jvmmib/SCCS/s.JvmMemPoolTableMeta.java
+sun/management/snmp/jvmmib/SCCS/s.JvmMemoryMBean.java
+sun/management/snmp/jvmmib/SCCS/s.JvmMemoryMeta.java
+sun/management/snmp/jvmmib/SCCS/s.JvmOSMBean.java
+sun/management/snmp/jvmmib/SCCS/s.JvmOSMeta.java
+sun/management/snmp/jvmmib/SCCS/s.JvmRTBootClassPathEntryMBean.java
+sun/management/snmp/jvmmib/SCCS/s.JvmRTBootClassPathEntryMeta.java
+sun/management/snmp/jvmmib/SCCS/s.JvmRTBootClassPathTableMeta.java
+sun/management/snmp/jvmmib/SCCS/s.JvmRTClassPathEntryMBean.java
+sun/management/snmp/jvmmib/SCCS/s.JvmRTClassPathEntryMeta.java
+sun/management/snmp/jvmmib/SCCS/s.JvmRTClassPathTableMeta.java
+sun/management/snmp/jvmmib/SCCS/s.JvmRTInputArgsEntryMBean.java
+sun/management/snmp/jvmmib/SCCS/s.JvmRTInputArgsEntryMeta.java
+sun/management/snmp/jvmmib/SCCS/s.JvmRTInputArgsTableMeta.java
+sun/management/snmp/jvmmib/SCCS/s.JvmRTLibraryPathEntryMBean.java
+sun/management/snmp/jvmmib/SCCS/s.JvmRTLibraryPathEntryMeta.java
+sun/management/snmp/jvmmib/SCCS/s.JvmRTLibraryPathTableMeta.java
+sun/management/snmp/jvmmib/SCCS/s.JvmRuntimeMBean.java
+sun/management/snmp/jvmmib/SCCS/s.JvmRuntimeMeta.java
+sun/management/snmp/jvmmib/SCCS/s.JvmThreadingMeta.java
+sun/management/snmp/jvmmib/SCCS/s.JvmThreadInstanceEntryMBean.java
+sun/management/snmp/jvmmib/SCCS/s.JvmThreadInstanceEntryMeta.java
+sun/management/snmp/jvmmib/SCCS/s.JvmThreadInstanceTableMeta.java
+sun/management/snmp/jvmmib/SCCS/s.JvmThreadingMBean.java
+sun/management/snmp/jvmmib/EnumJvmJITCompilerTimeMonitoring.java
+sun/management/snmp/jvmmib/EnumJvmClassesVerboseLevel.java
+sun/management/snmp/jvmmib/EnumJvmMemManagerState.java
+sun/management/snmp/jvmmib/EnumJvmMemPoolState.java
+sun/management/snmp/jvmmib/EnumJvmMemPoolCollectThreshdSupport.java
+sun/management/snmp/jvmmib/EnumJvmMemPoolThreshdSupport.java
+sun/management/snmp/jvmmib/EnumJvmMemPoolType.java
+sun/management/snmp/jvmmib/EnumJvmMemoryGCCall.java
+sun/management/snmp/jvmmib/EnumJvmMemoryGCVerboseLevel.java
+sun/management/snmp/jvmmib/EnumJvmRTBootClassPathSupport.java
+sun/management/snmp/jvmmib/JvmRuntimeMBean.java
+sun/management/snmp/jvmmib/JvmOSMBean.java
+sun/management/snmp/jvmmib/EnumJvmThreadContentionMonitoring.java
+sun/management/snmp/jvmmib/EnumJvmThreadCpuTimeMonitoring.java
+sun/management/snmp/jvmmib/JVM_MANAGEMENT_MIB.java
+sun/management/snmp/jvmmib/JVM_MANAGEMENT_MIBOidTable.java
+sun/management/snmp/jvmmib/JvmClassLoadingMBean.java
+sun/management/snmp/jvmmib/JvmClassLoadingMeta.java
+sun/management/snmp/jvmmib/JvmCompilationMBean.java
+sun/management/snmp/jvmmib/JvmCompilationMeta.java
+sun/management/snmp/jvmmib/JvmMemGCEntryMBean.java
+sun/management/snmp/jvmmib/JvmMemGCEntryMeta.java
+sun/management/snmp/jvmmib/JvmMemGCTableMeta.java
+sun/management/snmp/jvmmib/JvmMemManagerEntryMBean.java
+sun/management/snmp/jvmmib/JvmMemManagerEntryMeta.java
+sun/management/snmp/jvmmib/JvmMemManagerTableMeta.java
+sun/management/snmp/jvmmib/JvmMemMgrPoolRelEntryMBean.java
+sun/management/snmp/jvmmib/JvmMemMgrPoolRelEntryMeta.java
+sun/management/snmp/jvmmib/JvmMemMgrPoolRelTableMeta.java
+sun/management/snmp/jvmmib/JvmMemPoolEntryMBean.java
+sun/management/snmp/jvmmib/JvmMemPoolEntryMeta.java
+sun/management/snmp/jvmmib/JvmMemPoolTableMeta.java
+sun/management/snmp/jvmmib/JvmMemoryMBean.java
+sun/management/snmp/jvmmib/JvmMemoryMeta.java
+sun/management/snmp/jvmmib/JvmOSMeta.java
+sun/management/snmp/jvmmib/JvmRTBootClassPathEntryMBean.java
+sun/management/snmp/jvmmib/JvmRTBootClassPathEntryMeta.java
+sun/management/snmp/jvmmib/JvmRTBootClassPathTableMeta.java
+sun/management/snmp/jvmmib/JvmThreadingMBean.java
+sun/management/snmp/jvmmib/JvmRTClassPathEntryMBean.java
+sun/management/snmp/jvmmib/JvmRTClassPathEntryMeta.java
+sun/management/snmp/jvmmib/JvmRTClassPathTableMeta.java
+sun/management/snmp/jvmmib/JvmRTInputArgsEntryMBean.java
+sun/management/snmp/jvmmib/JvmRTInputArgsEntryMeta.java
+sun/management/snmp/jvmmib/JvmRTInputArgsTableMeta.java
+sun/management/snmp/jvmmib/JvmRTLibraryPathEntryMBean.java
+sun/management/snmp/jvmmib/JvmRTLibraryPathEntryMeta.java
+sun/management/snmp/jvmmib/JvmRTLibraryPathTableMeta.java
+sun/management/snmp/jvmmib/JvmRuntimeMeta.java
+sun/management/snmp/jvmmib/JvmThreadInstanceEntryMBean.java
+sun/management/snmp/jvmmib/JvmThreadInstanceEntryMeta.java
+sun/management/snmp/jvmmib/JvmThreadInstanceTableMeta.java
+sun/management/snmp/jvmmib/JvmThreadingMeta.java
+sun/management/snmp/jvmmib/package.html
+sun/management/snmp/util
+sun/management/snmp/util/SCCS
+sun/management/snmp/util/SCCS/s.SnmpNamedListTableCache.java
+sun/management/snmp/util/SCCS/s.JvmContextFactory.java
+sun/management/snmp/util/SCCS/s.MibLogger.java
+sun/management/snmp/util/SCCS/s.SnmpCachedData.java
+sun/management/snmp/util/SCCS/s.SnmpListTableCache.java
+sun/management/snmp/util/SCCS/s.SnmpLoadedClassData.java
+sun/management/snmp/util/SCCS/s.SnmpTableCache.java
+sun/management/snmp/util/SCCS/s.SnmpTableHandler.java
+sun/management/snmp/util/SCCS/s.package.html
+sun/management/snmp/util/SnmpLoadedClassData.java
+sun/management/snmp/util/JvmContextFactory.java
+sun/management/snmp/util/MibLogger.java
+sun/management/snmp/util/SnmpCachedData.java
+sun/management/snmp/util/SnmpListTableCache.java
+sun/management/snmp/util/SnmpNamedListTableCache.java
+sun/management/snmp/util/SnmpTableCache.java
+sun/management/snmp/util/SnmpTableHandler.java
+sun/management/snmp/util/package.html
+sun/management/snmp/mib_core.txt
+sun/management/snmp/README
+sun/management/snmp/AdaptorBootstrap.java
+sun/management/snmp/JVM-MANAGEMENT-MIB.mib
+sun/management/snmp/mibgen.properties.tiger
+sun/management/snmp/package.html
+sun/management/snmp/rfc2287.txt
+sun/management/snmp/rfc2564.txt
+sun/management/BooleanFlag.java
+sun/management/Agent.java
+sun/management/GcInfoBuilder.java
+sun/management/Flag.java
+sun/management/AgentConfigurationError.java
+sun/management/ClassLoadingImpl.java
+sun/management/CompilationImpl.java
+sun/management/CompilerThreadStat.java
+sun/management/ConnectorAddressLink.java
+sun/management/FileSystem.java
+sun/management/GarbageCollectorImpl.java
+sun/management/HotspotCompilationMBean.java
+sun/management/HotspotCompilation.java
+sun/management/GcInfoCompositeData.java
+sun/management/HotspotClassLoading.java
+sun/management/HotspotClassLoadingMBean.java
+sun/management/HotspotInternalMBean.java
+sun/management/HotspotInternal.java
+sun/management/HotspotRuntimeMBean.java
+sun/management/HotspotMemory.java
+sun/management/HotspotMemoryMBean.java
+sun/management/HotspotRuntime.java
+sun/management/MemoryUsageCompositeData.java
+sun/management/HotspotThread.java
+sun/management/HotspotThreadMBean.java
+sun/management/LazyCompositeData.java
+sun/management/LongFlag.java
+sun/management/MXBeanSupport.java
+sun/management/MemoryImpl.java
+sun/management/ManagementFactory.java
+sun/management/MappedMXBeanType.java
+sun/management/MemoryManagerImpl.java
+sun/management/MemoryPoolImpl.java
+sun/management/MethodInfo.java
+sun/management/MemoryNotifInfoCompositeData.java
+sun/management/PlatformMXBeanInvocationHandler.java
+sun/management/NotificationEmitterSupport.java
+sun/management/OperatingSystemImpl.java
+sun/management/RuntimeImpl.java
+sun/management/Sensor.java
+sun/management/StringFlag.java
+sun/management/ThreadImpl.java
+sun/management/Util.java
+sun/management/ThreadInfoCompositeData.java
+sun/management/VMManagement.java
+sun/management/VMManagementImpl.java
+sun/misc
+sun/misc/SCCS
+sun/misc/SCCS/s.CharacterDecoder.java
+sun/misc/SCCS/s.CRC16.java
+sun/misc/SCCS/s.ASCIICaseInsensitiveComparator.java
+sun/misc/SCCS/s.AtomicLong.java
+sun/misc/SCCS/s.AtomicLongCSImpl.java
+sun/misc/SCCS/s.AtomicLongLockImpl.java
+sun/misc/SCCS/s.BASE64Decoder.java
+sun/misc/SCCS/s.BASE64Encoder.java
+sun/misc/SCCS/s.CEFormatException.java
+sun/misc/SCCS/s.CEStreamExhausted.java
+sun/misc/SCCS/s.Cache.java
+sun/misc/SCCS/s.ClassFileTransformer.java
+sun/misc/SCCS/s.CharacterEncoder.java
+sun/misc/SCCS/s.ConditionLock.java
+sun/misc/SCCS/s.Cleaner.java
+sun/misc/SCCS/s.Compare.java
+sun/misc/SCCS/s.CompoundEnumeration.java
+sun/misc/SCCS/s.DoubleConsts.java
+sun/misc/SCCS/s.ExtensionDependency.java
+sun/misc/SCCS/s.ExtensionInfo.java
+sun/misc/SCCS/s.FloatConsts.java
+sun/misc/SCCS/s.FpUtils.java
+sun/misc/SCCS/s.Lock.java
+sun/misc/SCCS/s.ExtensionInstallationException.java
+sun/misc/SCCS/s.ExtensionInstallationProvider.java
+sun/misc/SCCS/s.FloatingDecimal.java
+sun/misc/SCCS/s.FormattedFloatingDecimal.java
+sun/misc/SCCS/s.GC.java
+sun/misc/SCCS/s.HexDumpEncoder.java
+sun/misc/SCCS/s.JarFilter.java
+sun/misc/SCCS/s.NativeSignalHandler.java
+sun/misc/SCCS/s.InvalidJarIndexException.java
+sun/misc/SCCS/s.JarIndex.java
+sun/misc/SCCS/s.JavaLangAccess.java
+sun/misc/SCCS/s.JavaUtilJarAccess.java
+sun/misc/SCCS/s.LRUCache.java
+sun/misc/SCCS/s.Launcher.java
+sun/misc/SCCS/s.MessageUtils.java
+sun/misc/SCCS/s.Queue.java
+sun/misc/SCCS/s.Perf.java
+sun/misc/SCCS/s.PerformanceLogger.java
+sun/misc/SCCS/s.ProxyGenerator.java
+sun/misc/SCCS/s.REException.java
+sun/misc/SCCS/s.Ref.java
+sun/misc/SCCS/s.Regexp.java
+sun/misc/SCCS/s.RegexpPool.java
+sun/misc/SCCS/s.RegexpTarget.java
+sun/misc/SCCS/s.Request.java
+sun/misc/SCCS/s.RequestProcessor.java
+sun/misc/SCCS/s.Resource.java
+sun/misc/SCCS/s.SelfTest.java
+sun/misc/SCCS/s.Service.java
+sun/misc/SCCS/s.SharedSecrets.java
+sun/misc/SCCS/s.Sort.java
+sun/misc/SCCS/s.ServiceConfigurationError.java
+sun/misc/SCCS/s.Signal.java
+sun/misc/SCCS/s.SignalHandler.java
+sun/misc/SCCS/s.SoftCache.java
+sun/misc/SCCS/s.Timeable.java
+sun/misc/SCCS/s.Timer.java
+sun/misc/SCCS/s.UCDecoder.java
+sun/misc/SCCS/s.UCEncoder.java
+sun/misc/SCCS/s.URLClassPath.java
+sun/misc/SCCS/s.UUDecoder.java
+sun/misc/SCCS/s.UUEncoder.java
+sun/misc/SCCS/s.Unsafe.java
+sun/misc/SCCS/s.VM.java
+sun/misc/SCCS/s.VMNotification.java
+sun/misc/SCCS/s.Version-template.java
+sun/misc/resources
+sun/misc/resources/SCCS
+sun/misc/resources/SCCS/s.Messages_de.java
+sun/misc/resources/SCCS/s.Messages.java
+sun/misc/resources/SCCS/s.Messages_es.java
+sun/misc/resources/SCCS/s.Messages_fr.java
+sun/misc/resources/SCCS/s.Messages_it.java
+sun/misc/resources/SCCS/s.Messages_ja.java
+sun/misc/resources/SCCS/s.Messages_ko.java
+sun/misc/resources/SCCS/s.Messages_sv.java
+sun/misc/resources/SCCS/s.Messages_zh_CN.java
+sun/misc/resources/SCCS/s.Messages_zh_TW.java
+sun/misc/resources/Messages_de.java
+sun/misc/resources/Messages.java
+sun/misc/resources/Messages_es.java
+sun/misc/resources/Messages_fr.java
+sun/misc/resources/Messages_it.java
+sun/misc/resources/Messages_ja.java
+sun/misc/resources/Messages_ko.java
+sun/misc/resources/Messages_sv.java
+sun/misc/resources/Messages_zh_CN.java
+sun/misc/resources/Messages_zh_TW.java
+sun/misc/CRC16.java
+sun/misc/ASCIICaseInsensitiveComparator.java
+sun/misc/AtomicLong.java
+sun/misc/AtomicLongCSImpl.java
+sun/misc/AtomicLongLockImpl.java
+sun/misc/BASE64Decoder.java
+sun/misc/BASE64Encoder.java
+sun/misc/CEFormatException.java
+sun/misc/CEStreamExhausted.java
+sun/misc/Cache.java
+sun/misc/CharacterDecoder.java
+sun/misc/CharacterEncoder.java
+sun/misc/ClassFileTransformer.java
+sun/misc/Cleaner.java
+sun/misc/ExtensionDependency.java
+sun/misc/Compare.java
+sun/misc/ConditionLock.java
+sun/misc/CompoundEnumeration.java
+sun/misc/DoubleConsts.java
+sun/misc/GC.java
+sun/misc/ExtensionInfo.java
+sun/misc/ExtensionInstallationException.java
+sun/misc/ExtensionInstallationProvider.java
+sun/misc/FloatConsts.java
+sun/misc/FloatingDecimal.java
+sun/misc/FormattedFloatingDecimal.java
+sun/misc/FpUtils.java
+sun/misc/HexDumpEncoder.java
+sun/misc/MessageUtils.java
+sun/misc/Lock.java
+sun/misc/InvalidJarIndexException.java
+sun/misc/JarFilter.java
+sun/misc/JarIndex.java
+sun/misc/JavaLangAccess.java
+sun/misc/JavaUtilJarAccess.java
+sun/misc/LRUCache.java
+sun/misc/Launcher.java
+sun/misc/ServiceConfigurationError.java
+sun/misc/NativeSignalHandler.java
+sun/misc/Perf.java
+sun/misc/PerformanceLogger.java
+sun/misc/ProxyGenerator.java
+sun/misc/Queue.java
+sun/misc/REException.java
+sun/misc/Ref.java
+sun/misc/Regexp.java
+sun/misc/RegexpPool.java
+sun/misc/RegexpTarget.java
+sun/misc/Request.java
+sun/misc/RequestProcessor.java
+sun/misc/Resource.java
+sun/misc/SelfTest.java
+sun/misc/Service.java
+sun/misc/Version-template.java
+sun/misc/SharedSecrets.java
+sun/misc/Signal.java
+sun/misc/SignalHandler.java
+sun/misc/SoftCache.java
+sun/misc/Sort.java
+sun/misc/Timeable.java
+sun/misc/Timer.java
+sun/misc/UCDecoder.java
+sun/misc/UCEncoder.java
+sun/misc/URLClassPath.java
+sun/misc/UUDecoder.java
+sun/misc/UUEncoder.java
+sun/misc/Unsafe.java
+sun/misc/VM.java
+sun/misc/VMNotification.java
+sun/net
+sun/net/SCCS
+sun/net/SCCS/s.ConnectionResetException.java
+sun/net/SCCS/s.InetAddressCachePolicy.java
+sun/net/SCCS/s.NetProperties.java
+sun/net/SCCS/s.NetworkClient.java
+sun/net/SCCS/s.NetworkServer.java
+sun/net/SCCS/s.ProgressEvent.java
+sun/net/SCCS/s.ProgressListener.java
+sun/net/SCCS/s.ProgressMeteringPolicy.java
+sun/net/SCCS/s.ProgressMonitor.java
+sun/net/SCCS/s.ProgressSource.java
+sun/net/SCCS/s.TelnetInputStream.java
+sun/net/SCCS/s.TelnetOutputStream.java
+sun/net/SCCS/s.TelnetProtocolException.java
+sun/net/SCCS/s.URLCanonicalizer.java
+sun/net/SCCS/s.TransferProtocolClient.java
+sun/net/dns
+sun/net/dns/SCCS
+sun/net/dns/SCCS/s.ResolverConfiguration.java
+sun/net/dns/ResolverConfiguration.java
+sun/net/ftp
+sun/net/ftp/SCCS
+sun/net/ftp/SCCS/s.FtpLoginException.java
+sun/net/ftp/SCCS/s.FtpClient.java
+sun/net/ftp/SCCS/s.FtpProtocolException.java
+sun/net/ftp/FtpLoginException.java
+sun/net/ftp/FtpClient.java
+sun/net/ftp/FtpProtocolException.java
+sun/net/smtp
+sun/net/smtp/SCCS
+sun/net/smtp/SCCS/s.SmtpClient.java
+sun/net/smtp/SCCS/s.SmtpProtocolException.java
+sun/net/smtp/SmtpClient.java
+sun/net/smtp/SmtpProtocolException.java
+sun/net/spi
+sun/net/spi/SCCS
+sun/net/spi/SCCS/s.DefaultProxySelector.java
+sun/net/spi/nameservice
+sun/net/spi/nameservice/SCCS
+sun/net/spi/nameservice/SCCS/s.NameService.java
+sun/net/spi/nameservice/SCCS/s.NameServiceDescriptor.java
+sun/net/spi/nameservice/dns
+sun/net/spi/nameservice/dns/META-INF
+sun/net/spi/nameservice/dns/META-INF/services
+sun/net/spi/nameservice/dns/META-INF/services/SCCS
+sun/net/spi/nameservice/dns/META-INF/services/SCCS/s.sun.net.spi.nameservice.NameServiceDescriptor
+sun/net/spi/nameservice/dns/META-INF/services/sun.net.spi.nameservice.NameServiceDescriptor
+sun/net/spi/nameservice/dns/SCCS
+sun/net/spi/nameservice/dns/SCCS/s.DNSNameServiceDescriptor.java
+sun/net/spi/nameservice/dns/SCCS/s.DNSNameService.java
+sun/net/spi/nameservice/dns/DNSNameService.java
+sun/net/spi/nameservice/dns/DNSNameServiceDescriptor.java
+sun/net/spi/nameservice/NameServiceDescriptor.java
+sun/net/spi/nameservice/NameService.java
+sun/net/spi/DefaultProxySelector.java
+sun/net/util
+sun/net/util/SCCS
+sun/net/util/SCCS/s.IPAddressUtil.java
+sun/net/util/IPAddressUtil.java
+sun/net/www
+sun/net/www/SCCS
+sun/net/www/SCCS/s.ApplicationLaunchException.java
+sun/net/www/SCCS/s.HeaderParser.java
+sun/net/www/SCCS/s.MessageHeader.java
+sun/net/www/SCCS/s.MeteredStream.java
+sun/net/www/SCCS/s.MimeEntry.java
+sun/net/www/SCCS/s.MimeLauncher.java
+sun/net/www/SCCS/s.MimeTable.java
+sun/net/www/SCCS/s.ParseUtil.java
+sun/net/www/SCCS/s.URLConnection.java
+sun/net/www/content
+sun/net/www/content/audio
+sun/net/www/content/audio/SCCS
+sun/net/www/content/audio/SCCS/s.basic.java
+sun/net/www/content/audio/SCCS/s.aiff.java
+sun/net/www/content/audio/SCCS/s.wav.java
+sun/net/www/content/audio/SCCS/s.x_aiff.java
+sun/net/www/content/audio/SCCS/s.x_wav.java
+sun/net/www/content/audio/aiff.java
+sun/net/www/content/audio/basic.java
+sun/net/www/content/audio/wav.java
+sun/net/www/content/audio/x_aiff.java
+sun/net/www/content/audio/x_wav.java
+sun/net/www/content/image
+sun/net/www/content/image/SCCS
+sun/net/www/content/image/SCCS/s.x_xbitmap.java
+sun/net/www/content/image/SCCS/s.gif.java
+sun/net/www/content/image/SCCS/s.jpeg.java
+sun/net/www/content/image/SCCS/s.png.java
+sun/net/www/content/image/SCCS/s.x_xpixmap.java
+sun/net/www/content/image/x_xbitmap.java
+sun/net/www/content/image/gif.java
+sun/net/www/content/image/jpeg.java
+sun/net/www/content/image/png.java
+sun/net/www/content/image/x_xpixmap.java
+sun/net/www/content/text
+sun/net/www/content/text/SCCS
+sun/net/www/content/text/SCCS/s.Generic.java
+sun/net/www/content/text/SCCS/s.plain.java
+sun/net/www/content/text/SCCS/s.PlainTextInputStream.java
+sun/net/www/content/text/Generic.java
+sun/net/www/content/text/plain.java
+sun/net/www/content/text/PlainTextInputStream.java
+sun/net/www/http
+sun/net/www/http/SCCS
+sun/net/www/http/SCCS/s.ChunkedInputStream.java
+sun/net/www/http/SCCS/s.ChunkedOutputStream.java
+sun/net/www/http/SCCS/s.HttpClient.java
+sun/net/www/http/SCCS/s.Hurryable.java
+sun/net/www/http/SCCS/s.KeepAliveCache.java
+sun/net/www/http/SCCS/s.KeepAliveStream.java
+sun/net/www/http/SCCS/s.PosterOutputStream.java
+sun/net/www/http/ChunkedOutputStream.java
+sun/net/www/http/ChunkedInputStream.java
+sun/net/www/http/KeepAliveStream.java
+sun/net/www/http/HttpClient.java
+sun/net/www/http/Hurryable.java
+sun/net/www/http/KeepAliveCache.java
+sun/net/www/http/PosterOutputStream.java
+sun/net/www/protocol
+sun/net/www/protocol/doc
+sun/net/www/protocol/doc/SCCS
+sun/net/www/protocol/doc/SCCS/s.DocURLConnection.java
+sun/net/www/protocol/doc/SCCS/s.Handler.java
+sun/net/www/protocol/doc/DocURLConnection.java
+sun/net/www/protocol/doc/Handler.java
+sun/net/www/protocol/file
+sun/net/www/protocol/file/SCCS
+sun/net/www/protocol/file/SCCS/s.FileURLConnection.java
+sun/net/www/protocol/file/FileURLConnection.java
+sun/net/www/protocol/ftp
+sun/net/www/protocol/ftp/SCCS
+sun/net/www/protocol/ftp/SCCS/s.FtpURLConnection.java
+sun/net/www/protocol/ftp/SCCS/s.Handler.java
+sun/net/www/protocol/ftp/FtpURLConnection.java
+sun/net/www/protocol/ftp/Handler.java
+sun/net/www/protocol/gopher
+sun/net/www/protocol/gopher/SCCS
+sun/net/www/protocol/gopher/SCCS/s.GopherClient.java
+sun/net/www/protocol/gopher/SCCS/s.Handler.java
+sun/net/www/protocol/gopher/GopherClient.java
+sun/net/www/protocol/gopher/Handler.java
+sun/net/www/protocol/http
+sun/net/www/protocol/http/SCCS
+sun/net/www/protocol/http/SCCS/s.AuthCacheImpl.java
+sun/net/www/protocol/http/SCCS/s.AuthCache.java
+sun/net/www/protocol/http/SCCS/s.AuthCacheValue.java
+sun/net/www/protocol/http/SCCS/s.AuthenticationHeader.java
+sun/net/www/protocol/http/SCCS/s.AuthenticationInfo.java
+sun/net/www/protocol/http/SCCS/s.BasicAuthentication.java
+sun/net/www/protocol/http/SCCS/s.DigestAuthentication.java
+sun/net/www/protocol/http/SCCS/s.Handler.java
+sun/net/www/protocol/http/SCCS/s.HttpAuthenticator.java
+sun/net/www/protocol/http/SCCS/s.HttpURLConnection.java
+sun/net/www/protocol/http/SCCS/s.NTLMAuthentication.java
+sun/net/www/protocol/http/AuthCacheImpl.java
+sun/net/www/protocol/http/AuthCache.java
+sun/net/www/protocol/http/AuthenticationHeader.java
+sun/net/www/protocol/http/AuthCacheValue.java
+sun/net/www/protocol/http/AuthenticationInfo.java
+sun/net/www/protocol/http/BasicAuthentication.java
+sun/net/www/protocol/http/DigestAuthentication.java
+sun/net/www/protocol/http/Handler.java
+sun/net/www/protocol/http/HttpAuthenticator.java
+sun/net/www/protocol/http/HttpURLConnection.java
+sun/net/www/protocol/http/NTLMAuthentication.java
+sun/net/www/protocol/jar
+sun/net/www/protocol/jar/SCCS
+sun/net/www/protocol/jar/SCCS/s.JarURLConnection.java
+sun/net/www/protocol/jar/SCCS/s.Handler.java
+sun/net/www/protocol/jar/SCCS/s.URLJarFileCallBack.java
+sun/net/www/protocol/jar/SCCS/s.URLJarFile.java
+sun/net/www/protocol/jar/JarURLConnection.java
+sun/net/www/protocol/jar/Handler.java
+sun/net/www/protocol/jar/URLJarFileCallBack.java
+sun/net/www/protocol/jar/URLJarFile.java
+sun/net/www/protocol/mailto
+sun/net/www/protocol/mailto/SCCS
+sun/net/www/protocol/mailto/SCCS/s.Handler.java
+sun/net/www/protocol/mailto/SCCS/s.MailToURLConnection.java
+sun/net/www/protocol/mailto/Handler.java
+sun/net/www/protocol/mailto/MailToURLConnection.java
+sun/net/www/protocol/netdoc
+sun/net/www/protocol/netdoc/SCCS
+sun/net/www/protocol/netdoc/SCCS/s.Handler.java
+sun/net/www/protocol/netdoc/Handler.java
+sun/net/www/protocol/systemresource
+sun/net/www/protocol/systemresource/SCCS
+sun/net/www/protocol/systemresource/SCCS/s.Handler.java
+sun/net/www/protocol/systemresource/SCCS/s.SystemResourceURLConnection.java
+sun/net/www/protocol/systemresource/Handler.java
+sun/net/www/protocol/systemresource/SystemResourceURLConnection.java
+sun/net/www/protocol/verbatim
+sun/net/www/protocol/verbatim/SCCS
+sun/net/www/protocol/verbatim/SCCS/s.Handler.java
+sun/net/www/protocol/verbatim/Handler.java
+sun/net/www/ApplicationLaunchException.java
+sun/net/www/HeaderParser.java
+sun/net/www/MessageHeader.java
+sun/net/www/MeteredStream.java
+sun/net/www/MimeEntry.java
+sun/net/www/MimeLauncher.java
+sun/net/www/MimeTable.java
+sun/net/www/ParseUtil.java
+sun/net/www/URLConnection.java
+sun/net/TelnetProtocolException.java
+sun/net/ConnectionResetException.java
+sun/net/InetAddressCachePolicy.java
+sun/net/NetProperties.java
+sun/net/NetworkClient.java
+sun/net/NetworkServer.java
+sun/net/ProgressEvent.java
+sun/net/ProgressListener.java
+sun/net/ProgressMeteringPolicy.java
+sun/net/ProgressMonitor.java
+sun/net/ProgressSource.java
+sun/net/TelnetInputStream.java
+sun/net/TelnetOutputStream.java
+sun/net/TransferProtocolClient.java
+sun/net/URLCanonicalizer.java
+sun/nio
+sun/nio/SCCS
+sun/nio/SCCS/s.ByteBuffered.java
+sun/nio/ch
+sun/nio/ch/SCCS
+sun/nio/ch/SCCS/s.Net.java
+sun/nio/ch/SCCS/s.AbstractPollArrayWrapper.java
+sun/nio/ch/SCCS/s.AbstractPollSelectorImpl.java
+sun/nio/ch/SCCS/s.AllocatedNativeObject.java
+sun/nio/ch/SCCS/s.ChannelInputStream.java
+sun/nio/ch/SCCS/s.DatagramChannelImpl.java
+sun/nio/ch/SCCS/s.DatagramSocketAdaptor.java
+sun/nio/ch/SCCS/s.DevPollSelectorProvider.java
+sun/nio/ch/SCCS/s.DirectBuffer.java
+sun/nio/ch/SCCS/s.FileChannelImpl.java
+sun/nio/ch/SCCS/s.FileLockImpl.java
+sun/nio/ch/SCCS/s.IOStatus.java
+sun/nio/ch/SCCS/s.IOUtil.java
+sun/nio/ch/SCCS/s.IOVecWrapper.java
+sun/nio/ch/SCCS/s.SelChImpl.java
+sun/nio/ch/SCCS/s.Interruptible.java
+sun/nio/ch/SCCS/s.NativeDispatcher.java
+sun/nio/ch/SCCS/s.NativeObject.java
+sun/nio/ch/SCCS/s.NativeThreadSet.java
+sun/nio/ch/SCCS/s.PollSelectorProvider.java
+sun/nio/ch/SCCS/s.OptionAdaptor.java
+sun/nio/ch/SCCS/s.Reflect.java
+sun/nio/ch/SCCS/s.ServerSocketChannelImpl.java
+sun/nio/ch/SCCS/s.SelectionKeyImpl.java
+sun/nio/ch/SCCS/s.SelectorImpl.java
+sun/nio/ch/SCCS/s.SelectorProviderImpl.java
+sun/nio/ch/SCCS/s.ServerSocketAdaptor.java
+sun/nio/ch/SCCS/s.SocketAdaptor.java
+sun/nio/ch/SCCS/s.SocketChannelImpl.java
+sun/nio/ch/SCCS/s.SocketOpts.java
+sun/nio/ch/SCCS/s.Util.java
+sun/nio/ch/SCCS/s.SocketOptsImpl.java
+sun/nio/ch/SCCS/s.exceptions
+sun/nio/ch/IOVecWrapper.java
+sun/nio/ch/IOUtil.java
+sun/nio/ch/AbstractPollArrayWrapper.java
+sun/nio/ch/AbstractPollSelectorImpl.java
+sun/nio/ch/AllocatedNativeObject.java
+sun/nio/ch/ChannelInputStream.java
+sun/nio/ch/DatagramChannelImpl.java
+sun/nio/ch/DatagramSocketAdaptor.java
+sun/nio/ch/DevPollSelectorProvider.java
+sun/nio/ch/DirectBuffer.java
+sun/nio/ch/FileChannelImpl.java
+sun/nio/ch/FileLockImpl.java
+sun/nio/ch/IOStatus.java
+sun/nio/ch/OptionAdaptor.java
+sun/nio/ch/Net.java
+sun/nio/ch/Interruptible.java
+sun/nio/ch/NativeDispatcher.java
+sun/nio/ch/NativeObject.java
+sun/nio/ch/NativeThreadSet.java
+sun/nio/ch/ServerSocketChannelImpl.java
+sun/nio/ch/PollSelectorProvider.java
+sun/nio/ch/Reflect.java
+sun/nio/ch/SelChImpl.java
+sun/nio/ch/SelectionKeyImpl.java
+sun/nio/ch/SelectorImpl.java
+sun/nio/ch/SelectorProviderImpl.java
+sun/nio/ch/ServerSocketAdaptor.java
+sun/nio/ch/SocketAdaptor.java
+sun/nio/ch/SocketChannelImpl.java
+sun/nio/ch/SocketOpts.java
+sun/nio/ch/SocketOptsImpl.java
+sun/nio/ch/Util.java
+sun/nio/ch/exceptions
+sun/nio/cs
+sun/nio/cs/SCCS
+sun/nio/cs/SCCS/s.AbstractCharsetProvider.java
+sun/nio/cs/SCCS/s.FastCharsetProvider.java
+sun/nio/cs/SCCS/s.HistoricallyNamedCharset.java
+sun/nio/cs/SCCS/s.ISO_8859_1.java
+sun/nio/cs/SCCS/s.ISO_8859_13.java
+sun/nio/cs/SCCS/s.ISO_8859_15.java
+sun/nio/cs/SCCS/s.ISO_8859_2.java
+sun/nio/cs/SCCS/s.ISO_8859_4.java
+sun/nio/cs/SCCS/s.ISO_8859_5.java
+sun/nio/cs/SCCS/s.ISO_8859_7.java
+sun/nio/cs/SCCS/s.ISO_8859_9.java
+sun/nio/cs/SCCS/s.KOI8_R.java
+sun/nio/cs/SCCS/s.MS1250.java
+sun/nio/cs/SCCS/s.MS1251.java
+sun/nio/cs/SCCS/s.MS1252.java
+sun/nio/cs/SCCS/s.MS1253.java
+sun/nio/cs/SCCS/s.MS1254.java
+sun/nio/cs/SCCS/s.MS1257.java
+sun/nio/cs/SCCS/s.SingleByteDecoder.java
+sun/nio/cs/SCCS/s.SingleByteEncoder.java
+sun/nio/cs/SCCS/s.StreamDecoder.java
+sun/nio/cs/SCCS/s.StreamEncoder.java
+sun/nio/cs/SCCS/s.Surrogate.java
+sun/nio/cs/SCCS/s.ThreadLocalCoders.java
+sun/nio/cs/SCCS/s.US_ASCII.java
+sun/nio/cs/SCCS/s.UTF_16.java
+sun/nio/cs/SCCS/s.UTF_16BE.java
+sun/nio/cs/SCCS/s.UTF_16LE.java
+sun/nio/cs/SCCS/s.UTF_8.java
+sun/nio/cs/SCCS/s.UnicodeDecoder.java
+sun/nio/cs/SCCS/s.UnicodeEncoder.java
+sun/nio/cs/SCCS/s.standard-charsets
+sun/nio/cs/SCCS/s.UTF_16LE_BOM.java
+sun/nio/cs/SCCS/s.Unicode.java
+sun/nio/cs/ext
+sun/nio/cs/ext/META-INF
+sun/nio/cs/ext/META-INF/services
+sun/nio/cs/ext/META-INF/services/SCCS
+sun/nio/cs/ext/META-INF/services/SCCS/s.java.nio.charset.spi.CharsetProvider
+sun/nio/cs/ext/META-INF/services/java.nio.charset.spi.CharsetProvider
+sun/nio/cs/ext/SCCS
+sun/nio/cs/ext/SCCS/s.Big5_HKSCS.java
+sun/nio/cs/ext/SCCS/s.Big5.java
+sun/nio/cs/ext/SCCS/s.DBCSDecoderMapping.java
+sun/nio/cs/ext/SCCS/s.Big5_Solaris.java
+sun/nio/cs/ext/SCCS/s.GBK.java
+sun/nio/cs/ext/SCCS/s.DBCS_IBM_ASCII_Decoder.java
+sun/nio/cs/ext/SCCS/s.DBCS_IBM_ASCII_Encoder.java
+sun/nio/cs/ext/SCCS/s.DBCS_IBM_EBCDIC_Decoder.java
+sun/nio/cs/ext/SCCS/s.DBCS_IBM_EBCDIC_Encoder.java
+sun/nio/cs/ext/SCCS/s.DelegatableDecoder.java
+sun/nio/cs/ext/SCCS/s.DoubleByteDecoder.java
+sun/nio/cs/ext/SCCS/s.DoubleByteEncoder.java
+sun/nio/cs/ext/SCCS/s.EUC_CN.java
+sun/nio/cs/ext/SCCS/s.EUC_JP.java
+sun/nio/cs/ext/SCCS/s.JIS_X_0208_Decoder.java
+sun/nio/cs/ext/SCCS/s.EUC_JP_LINUX.java
+sun/nio/cs/ext/SCCS/s.EUC_JP_Open.java
+sun/nio/cs/ext/SCCS/s.EUC_KR.java
+sun/nio/cs/ext/SCCS/s.EUC_TW.java
+sun/nio/cs/ext/SCCS/s.ExtendedCharsets.java
+sun/nio/cs/ext/SCCS/s.GB18030.java
+sun/nio/cs/ext/SCCS/s.HKSCS.java
+sun/nio/cs/ext/SCCS/s.HKSCS_2001.java
+sun/nio/cs/ext/SCCS/s.IBM037.java
+sun/nio/cs/ext/SCCS/s.IBM1006.java
+sun/nio/cs/ext/SCCS/s.IBM1025.java
+sun/nio/cs/ext/SCCS/s.IBM1026.java
+sun/nio/cs/ext/SCCS/s.IBM1046.java
+sun/nio/cs/ext/SCCS/s.IBM1047.java
+sun/nio/cs/ext/SCCS/s.IBM1097.java
+sun/nio/cs/ext/SCCS/s.IBM1098.java
+sun/nio/cs/ext/SCCS/s.IBM1112.java
+sun/nio/cs/ext/SCCS/s.IBM1122.java
+sun/nio/cs/ext/SCCS/s.IBM1123.java
+sun/nio/cs/ext/SCCS/s.IBM1124.java
+sun/nio/cs/ext/SCCS/s.IBM1140.java
+sun/nio/cs/ext/SCCS/s.IBM1141.java
+sun/nio/cs/ext/SCCS/s.IBM1142.java
+sun/nio/cs/ext/SCCS/s.IBM1143.java
+sun/nio/cs/ext/SCCS/s.IBM1144.java
+sun/nio/cs/ext/SCCS/s.IBM1145.java
+sun/nio/cs/ext/SCCS/s.IBM1146.java
+sun/nio/cs/ext/SCCS/s.IBM1147.java
+sun/nio/cs/ext/SCCS/s.IBM1148.java
+sun/nio/cs/ext/SCCS/s.IBM1149.java
+sun/nio/cs/ext/SCCS/s.IBM1381.java
+sun/nio/cs/ext/SCCS/s.IBM1383.java
+sun/nio/cs/ext/SCCS/s.IBM273.java
+sun/nio/cs/ext/SCCS/s.IBM277.java
+sun/nio/cs/ext/SCCS/s.IBM278.java
+sun/nio/cs/ext/SCCS/s.IBM280.java
+sun/nio/cs/ext/SCCS/s.IBM284.java
+sun/nio/cs/ext/SCCS/s.IBM285.java
+sun/nio/cs/ext/SCCS/s.IBM297.java
+sun/nio/cs/ext/SCCS/s.IBM33722.java
+sun/nio/cs/ext/SCCS/s.IBM420.java
+sun/nio/cs/ext/SCCS/s.IBM424.java
+sun/nio/cs/ext/SCCS/s.IBM437.java
+sun/nio/cs/ext/SCCS/s.IBM500.java
+sun/nio/cs/ext/SCCS/s.IBM737.java
+sun/nio/cs/ext/SCCS/s.IBM775.java
+sun/nio/cs/ext/SCCS/s.IBM838.java
+sun/nio/cs/ext/SCCS/s.IBM850.java
+sun/nio/cs/ext/SCCS/s.IBM852.java
+sun/nio/cs/ext/SCCS/s.IBM855.java
+sun/nio/cs/ext/SCCS/s.IBM856.java
+sun/nio/cs/ext/SCCS/s.IBM857.java
+sun/nio/cs/ext/SCCS/s.IBM858.java
+sun/nio/cs/ext/SCCS/s.IBM860.java
+sun/nio/cs/ext/SCCS/s.IBM861.java
+sun/nio/cs/ext/SCCS/s.IBM862.java
+sun/nio/cs/ext/SCCS/s.IBM863.java
+sun/nio/cs/ext/SCCS/s.IBM864.java
+sun/nio/cs/ext/SCCS/s.IBM865.java
+sun/nio/cs/ext/SCCS/s.IBM866.java
+sun/nio/cs/ext/SCCS/s.IBM868.java
+sun/nio/cs/ext/SCCS/s.IBM869.java
+sun/nio/cs/ext/SCCS/s.IBM870.java
+sun/nio/cs/ext/SCCS/s.IBM871.java
+sun/nio/cs/ext/SCCS/s.IBM874.java
+sun/nio/cs/ext/SCCS/s.IBM875.java
+sun/nio/cs/ext/SCCS/s.IBM918.java
+sun/nio/cs/ext/SCCS/s.IBM921.java
+sun/nio/cs/ext/SCCS/s.IBM922.java
+sun/nio/cs/ext/SCCS/s.IBM930.java
+sun/nio/cs/ext/SCCS/s.IBM933.java
+sun/nio/cs/ext/SCCS/s.IBM935.java
+sun/nio/cs/ext/SCCS/s.IBM937.java
+sun/nio/cs/ext/SCCS/s.IBM939.java
+sun/nio/cs/ext/SCCS/s.IBM942.java
+sun/nio/cs/ext/SCCS/s.IBM942C.java
+sun/nio/cs/ext/SCCS/s.IBM943.java
+sun/nio/cs/ext/SCCS/s.IBM943C.java
+sun/nio/cs/ext/SCCS/s.IBM948.java
+sun/nio/cs/ext/SCCS/s.IBM949.java
+sun/nio/cs/ext/SCCS/s.IBM949C.java
+sun/nio/cs/ext/SCCS/s.IBM950.java
+sun/nio/cs/ext/SCCS/s.IBM964.java
+sun/nio/cs/ext/SCCS/s.IBM970.java
+sun/nio/cs/ext/SCCS/s.ISCII91.java
+sun/nio/cs/ext/SCCS/s.ISO2022.java
+sun/nio/cs/ext/SCCS/s.ISO2022_CN.java
+sun/nio/cs/ext/SCCS/s.ISO2022_CN_CNS.java
+sun/nio/cs/ext/SCCS/s.ISO2022_CN_GB.java
+sun/nio/cs/ext/SCCS/s.ISO2022_JP.java
+sun/nio/cs/ext/SCCS/s.ISO2022_KR.java
+sun/nio/cs/ext/SCCS/s.ISO_8859_11.java
+sun/nio/cs/ext/SCCS/s.ISO_8859_3.java
+sun/nio/cs/ext/SCCS/s.ISO_8859_6.java
+sun/nio/cs/ext/SCCS/s.ISO_8859_8.java
+sun/nio/cs/ext/SCCS/s.JISAutoDetect.java
+sun/nio/cs/ext/SCCS/s.JIS_X_0201.java
+sun/nio/cs/ext/SCCS/s.JIS_X_0208.java
+sun/nio/cs/ext/SCCS/s.JIS_X_0208_Encoder.java
+sun/nio/cs/ext/SCCS/s.MS950_HKSCS.java
+sun/nio/cs/ext/SCCS/s.Johab.java
+sun/nio/cs/ext/SCCS/s.JIS_X_0208_Solaris_Decoder.java
+sun/nio/cs/ext/SCCS/s.JIS_X_0208_Solaris_Encoder.java
+sun/nio/cs/ext/SCCS/s.JIS_X_0212.java
+sun/nio/cs/ext/SCCS/s.JIS_X_0212_Decoder.java
+sun/nio/cs/ext/SCCS/s.JIS_X_0212_Encoder.java
+sun/nio/cs/ext/SCCS/s.JIS_X_0212_Solaris_Decoder.java
+sun/nio/cs/ext/SCCS/s.JIS_X_0212_Solaris_Encoder.java
+sun/nio/cs/ext/SCCS/s.MS1255.java
+sun/nio/cs/ext/SCCS/s.MS1256.java
+sun/nio/cs/ext/SCCS/s.MS1258.java
+sun/nio/cs/ext/SCCS/s.MS874.java
+sun/nio/cs/ext/SCCS/s.MS932.java
+sun/nio/cs/ext/SCCS/s.MS932DB.java
+sun/nio/cs/ext/SCCS/s.MS936.java
+sun/nio/cs/ext/SCCS/s.MS949.java
+sun/nio/cs/ext/SCCS/s.MS950.java
+sun/nio/cs/ext/SCCS/s.PCK.java
+sun/nio/cs/ext/SCCS/s.MacCentralEurope.java
+sun/nio/cs/ext/SCCS/s.MacArabic.java
+sun/nio/cs/ext/SCCS/s.MacCroatian.java
+sun/nio/cs/ext/SCCS/s.MacCyrillic.java
+sun/nio/cs/ext/SCCS/s.MacDingbat.java
+sun/nio/cs/ext/SCCS/s.MacGreek.java
+sun/nio/cs/ext/SCCS/s.MacHebrew.java
+sun/nio/cs/ext/SCCS/s.MacIceland.java
+sun/nio/cs/ext/SCCS/s.MacRoman.java
+sun/nio/cs/ext/SCCS/s.MacRomania.java
+sun/nio/cs/ext/SCCS/s.MacSymbol.java
+sun/nio/cs/ext/SCCS/s.MacThai.java
+sun/nio/cs/ext/SCCS/s.MacTurkish.java
+sun/nio/cs/ext/SCCS/s.MacUkraine.java
+sun/nio/cs/ext/SCCS/s.SJIS.java
+sun/nio/cs/ext/SCCS/s.SimpleEUCDecoder.java
+sun/nio/cs/ext/SCCS/s.SimpleEUCEncoder.java
+sun/nio/cs/ext/SCCS/s.TIS_620.java
+sun/nio/cs/ext/Big5_HKSCS.java
+sun/nio/cs/ext/Big5.java
+sun/nio/cs/ext/DBCS_IBM_ASCII_Decoder.java
+sun/nio/cs/ext/Big5_Solaris.java
+sun/nio/cs/ext/DBCSDecoderMapping.java
+sun/nio/cs/ext/EUC_CN.java
+sun/nio/cs/ext/DBCS_IBM_ASCII_Encoder.java
+sun/nio/cs/ext/DBCS_IBM_EBCDIC_Decoder.java
+sun/nio/cs/ext/DBCS_IBM_EBCDIC_Encoder.java
+sun/nio/cs/ext/DelegatableDecoder.java
+sun/nio/cs/ext/DoubleByteDecoder.java
+sun/nio/cs/ext/DoubleByteEncoder.java
+sun/nio/cs/ext/EUC_JP.java
+sun/nio/cs/ext/EUC_KR.java
+sun/nio/cs/ext/JIS_X_0208_Solaris_Decoder.java
+sun/nio/cs/ext/EUC_JP_LINUX.java
+sun/nio/cs/ext/EUC_JP_Open.java
+sun/nio/cs/ext/EUC_TW.java
+sun/nio/cs/ext/ExtendedCharsets.java
+sun/nio/cs/ext/GB18030.java
+sun/nio/cs/ext/GBK.java
+sun/nio/cs/ext/HKSCS.java
+sun/nio/cs/ext/HKSCS_2001.java
+sun/nio/cs/ext/IBM037.java
+sun/nio/cs/ext/IBM1006.java
+sun/nio/cs/ext/IBM1025.java
+sun/nio/cs/ext/IBM1026.java
+sun/nio/cs/ext/IBM1046.java
+sun/nio/cs/ext/IBM1047.java
+sun/nio/cs/ext/IBM1097.java
+sun/nio/cs/ext/IBM1098.java
+sun/nio/cs/ext/IBM1112.java
+sun/nio/cs/ext/IBM1122.java
+sun/nio/cs/ext/IBM1123.java
+sun/nio/cs/ext/IBM1124.java
+sun/nio/cs/ext/IBM1140.java
+sun/nio/cs/ext/IBM1141.java
+sun/nio/cs/ext/IBM1142.java
+sun/nio/cs/ext/IBM1143.java
+sun/nio/cs/ext/IBM1144.java
+sun/nio/cs/ext/IBM1145.java
+sun/nio/cs/ext/IBM1146.java
+sun/nio/cs/ext/IBM1147.java
+sun/nio/cs/ext/IBM1148.java
+sun/nio/cs/ext/IBM1149.java
+sun/nio/cs/ext/IBM1381.java
+sun/nio/cs/ext/IBM1383.java
+sun/nio/cs/ext/IBM273.java
+sun/nio/cs/ext/IBM277.java
+sun/nio/cs/ext/IBM278.java
+sun/nio/cs/ext/IBM280.java
+sun/nio/cs/ext/IBM284.java
+sun/nio/cs/ext/IBM285.java
+sun/nio/cs/ext/IBM297.java
+sun/nio/cs/ext/IBM33722.java
+sun/nio/cs/ext/IBM420.java
+sun/nio/cs/ext/IBM424.java
+sun/nio/cs/ext/IBM437.java
+sun/nio/cs/ext/IBM500.java
+sun/nio/cs/ext/IBM737.java
+sun/nio/cs/ext/IBM775.java
+sun/nio/cs/ext/IBM838.java
+sun/nio/cs/ext/IBM850.java
+sun/nio/cs/ext/IBM852.java
+sun/nio/cs/ext/IBM855.java
+sun/nio/cs/ext/IBM856.java
+sun/nio/cs/ext/IBM857.java
+sun/nio/cs/ext/IBM858.java
+sun/nio/cs/ext/IBM860.java
+sun/nio/cs/ext/IBM861.java
+sun/nio/cs/ext/IBM862.java
+sun/nio/cs/ext/IBM863.java
+sun/nio/cs/ext/IBM864.java
+sun/nio/cs/ext/IBM865.java
+sun/nio/cs/ext/IBM866.java
+sun/nio/cs/ext/IBM868.java
+sun/nio/cs/ext/IBM869.java
+sun/nio/cs/ext/IBM870.java
+sun/nio/cs/ext/IBM871.java
+sun/nio/cs/ext/IBM874.java
+sun/nio/cs/ext/IBM875.java
+sun/nio/cs/ext/IBM918.java
+sun/nio/cs/ext/IBM921.java
+sun/nio/cs/ext/IBM922.java
+sun/nio/cs/ext/IBM930.java
+sun/nio/cs/ext/IBM933.java
+sun/nio/cs/ext/IBM935.java
+sun/nio/cs/ext/IBM937.java
+sun/nio/cs/ext/IBM939.java
+sun/nio/cs/ext/IBM942.java
+sun/nio/cs/ext/IBM942C.java
+sun/nio/cs/ext/IBM943.java
+sun/nio/cs/ext/IBM943C.java
+sun/nio/cs/ext/IBM948.java
+sun/nio/cs/ext/IBM949.java
+sun/nio/cs/ext/IBM949C.java
+sun/nio/cs/ext/IBM950.java
+sun/nio/cs/ext/IBM964.java
+sun/nio/cs/ext/IBM970.java
+sun/nio/cs/ext/ISCII91.java
+sun/nio/cs/ext/ISO2022.java
+sun/nio/cs/ext/ISO2022_CN.java
+sun/nio/cs/ext/ISO2022_CN_CNS.java
+sun/nio/cs/ext/ISO2022_CN_GB.java
+sun/nio/cs/ext/ISO2022_JP.java
+sun/nio/cs/ext/ISO2022_KR.java
+sun/nio/cs/ext/ISO_8859_3.java
+sun/nio/cs/ext/ISO_8859_11.java
+sun/nio/cs/ext/ISO_8859_6.java
+sun/nio/cs/ext/ISO_8859_8.java
+sun/nio/cs/ext/JISAutoDetect.java
+sun/nio/cs/ext/JIS_X_0201.java
+sun/nio/cs/ext/JIS_X_0208.java
+sun/nio/cs/ext/JIS_X_0208_Decoder.java
+sun/nio/cs/ext/JIS_X_0208_Encoder.java
+sun/nio/cs/ext/MS932DB.java
+sun/nio/cs/ext/Johab.java
+sun/nio/cs/ext/JIS_X_0208_Solaris_Encoder.java
+sun/nio/cs/ext/JIS_X_0212.java
+sun/nio/cs/ext/JIS_X_0212_Decoder.java
+sun/nio/cs/ext/JIS_X_0212_Encoder.java
+sun/nio/cs/ext/JIS_X_0212_Solaris_Decoder.java
+sun/nio/cs/ext/JIS_X_0212_Solaris_Encoder.java
+sun/nio/cs/ext/MS1255.java
+sun/nio/cs/ext/MS1256.java
+sun/nio/cs/ext/MS1258.java
+sun/nio/cs/ext/MS874.java
+sun/nio/cs/ext/MS932.java
+sun/nio/cs/ext/MS950_HKSCS.java
+sun/nio/cs/ext/MS936.java
+sun/nio/cs/ext/MS949.java
+sun/nio/cs/ext/MS950.java
+sun/nio/cs/ext/MacCentralEurope.java
+sun/nio/cs/ext/MacArabic.java
+sun/nio/cs/ext/SimpleEUCDecoder.java
+sun/nio/cs/ext/MacCroatian.java
+sun/nio/cs/ext/MacCyrillic.java
+sun/nio/cs/ext/MacDingbat.java
+sun/nio/cs/ext/MacGreek.java
+sun/nio/cs/ext/MacHebrew.java
+sun/nio/cs/ext/MacIceland.java
+sun/nio/cs/ext/MacRoman.java
+sun/nio/cs/ext/MacRomania.java
+sun/nio/cs/ext/MacSymbol.java
+sun/nio/cs/ext/MacThai.java
+sun/nio/cs/ext/MacTurkish.java
+sun/nio/cs/ext/MacUkraine.java
+sun/nio/cs/ext/PCK.java
+sun/nio/cs/ext/SJIS.java
+sun/nio/cs/ext/SimpleEUCEncoder.java
+sun/nio/cs/ext/TIS_620.java
+sun/nio/cs/KOI8_R.java
+sun/nio/cs/AbstractCharsetProvider.java
+sun/nio/cs/FastCharsetProvider.java
+sun/nio/cs/HistoricallyNamedCharset.java
+sun/nio/cs/ISO_8859_1.java
+sun/nio/cs/ISO_8859_13.java
+sun/nio/cs/ISO_8859_15.java
+sun/nio/cs/ISO_8859_2.java
+sun/nio/cs/ISO_8859_4.java
+sun/nio/cs/ISO_8859_5.java
+sun/nio/cs/ISO_8859_7.java
+sun/nio/cs/ISO_8859_9.java
+sun/nio/cs/MS1250.java
+sun/nio/cs/MS1251.java
+sun/nio/cs/MS1252.java
+sun/nio/cs/MS1253.java
+sun/nio/cs/MS1254.java
+sun/nio/cs/MS1257.java
+sun/nio/cs/SingleByteDecoder.java
+sun/nio/cs/SingleByteEncoder.java
+sun/nio/cs/StreamDecoder.java
+sun/nio/cs/StreamEncoder.java
+sun/nio/cs/Surrogate.java
+sun/nio/cs/ThreadLocalCoders.java
+sun/nio/cs/US_ASCII.java
+sun/nio/cs/UTF_16.java
+sun/nio/cs/UTF_16BE.java
+sun/nio/cs/UTF_16LE.java
+sun/nio/cs/UTF_8.java
+sun/nio/cs/UnicodeDecoder.java
+sun/nio/cs/UnicodeEncoder.java
+sun/nio/cs/standard-charsets
+sun/nio/cs/UTF_16LE_BOM.java
+sun/nio/cs/Unicode.java
+sun/nio/ByteBuffered.java
+sun/print
+sun/print/SCCS
+sun/print/SCCS/s.BackgroundLookupListener.java
+sun/print/SCCS/s.AttributeUpdater.java
+sun/print/SCCS/s.BackgroundServiceLookup.java
+sun/print/SCCS/s.CustomMediaSizeName.java
+sun/print/SCCS/s.CustomMediaTray.java
+sun/print/SCCS/s.DialogTypeSelection.java
+sun/print/SCCS/s.ImagePrinter.java
+sun/print/SCCS/s.OpenBook.java
+sun/print/SCCS/s.PSPathGraphics.java
+sun/print/SCCS/s.PSPrinterJob.java
+sun/print/SCCS/s.PSStreamPrintJob.java
+sun/print/SCCS/s.PSStreamPrintService.java
+sun/print/SCCS/s.PSStreamPrinterFactory.java
+sun/print/SCCS/s.PageableDoc.java
+sun/print/SCCS/s.PathGraphics.java
+sun/print/SCCS/s.PeekGraphics.java
+sun/print/SCCS/s.PeekMetrics.java
+sun/print/SCCS/s.PrintJob2D.java
+sun/print/SCCS/s.PrintJobAttributeException.java
+sun/print/SCCS/s.PrintJobFlavorException.java
+sun/print/SCCS/s.ProxyGraphics.java
+sun/print/SCCS/s.ProxyGraphics2D.java
+sun/print/SCCS/s.ProxyPrintGraphics.java
+sun/print/SCCS/s.RasterPrinterJob.java
+sun/print/SCCS/s.ServiceDialog.java
+sun/print/SCCS/s.ServiceNotifier.java
+sun/print/SCCS/s.SunAlternateMedia.java
+sun/print/SCCS/s.SunMinMaxPage.java
+sun/print/SCCS/s.SunPageSelection.java
+sun/print/SCCS/s.SunPrinterJobService.java
+sun/print/SCCS/s.psfont.properties.ja
+sun/print/SCCS/s.psfontj2d.properties
+sun/print/SCCS/s.PrinterGraphicsConfig.java
+sun/print/SCCS/s.PrinterGraphicsDevice.java
+sun/print/resources
+sun/print/resources/SCCS
+sun/print/resources/SCCS/s.orientLandscape.gif
+sun/print/resources/SCCS/s.duplex.gif
+sun/print/resources/SCCS/s.oneside.gif
+sun/print/resources/SCCS/s.orientRevLandscape.gif
+sun/print/resources/SCCS/s.orientPortrait.gif
+sun/print/resources/SCCS/s.orientRevPortrait.gif
+sun/print/resources/SCCS/s.serviceui.properties
+sun/print/resources/SCCS/s.serviceui_de.properties
+sun/print/resources/SCCS/s.serviceui_es.properties
+sun/print/resources/SCCS/s.serviceui_fr.properties
+sun/print/resources/SCCS/s.serviceui_it.properties
+sun/print/resources/SCCS/s.serviceui_ja.properties
+sun/print/resources/SCCS/s.serviceui_ko.properties
+sun/print/resources/SCCS/s.tumble.gif
+sun/print/resources/SCCS/s.serviceui_sv.properties
+sun/print/resources/SCCS/s.serviceui_zh_CN.properties
+sun/print/resources/SCCS/s.serviceui_zh_TW.properties
+sun/print/resources/orientLandscape.gif
+sun/print/resources/duplex.gif
+sun/print/resources/oneside.gif
+sun/print/resources/orientRevLandscape.gif
+sun/print/resources/orientPortrait.gif
+sun/print/resources/orientRevPortrait.gif
+sun/print/resources/serviceui.properties
+sun/print/resources/serviceui_de.properties
+sun/print/resources/serviceui_es.properties
+sun/print/resources/serviceui_fr.properties
+sun/print/resources/serviceui_it.properties
+sun/print/resources/serviceui_ja.properties
+sun/print/resources/serviceui_ko.properties
+sun/print/resources/serviceui_sv.properties
+sun/print/resources/serviceui_zh_CN.properties
+sun/print/resources/tumble.gif
+sun/print/resources/serviceui_zh_TW.properties
+sun/print/BackgroundLookupListener.java
+sun/print/AttributeUpdater.java
+sun/print/BackgroundServiceLookup.java
+sun/print/CustomMediaSizeName.java
+sun/print/CustomMediaTray.java
+sun/print/DialogTypeSelection.java
+sun/print/ImagePrinter.java
+sun/print/OpenBook.java
+sun/print/PSPathGraphics.java
+sun/print/PSPrinterJob.java
+sun/print/PSStreamPrintJob.java
+sun/print/PSStreamPrintService.java
+sun/print/PSStreamPrinterFactory.java
+sun/print/PrintJob2D.java
+sun/print/PageableDoc.java
+sun/print/PathGraphics.java
+sun/print/PeekGraphics.java
+sun/print/PeekMetrics.java
+sun/print/PrintJobAttributeException.java
+sun/print/PrintJobFlavorException.java
+sun/print/ProxyGraphics.java
+sun/print/ProxyGraphics2D.java
+sun/print/ProxyPrintGraphics.java
+sun/print/RasterPrinterJob.java
+sun/print/ServiceDialog.java
+sun/print/ServiceNotifier.java
+sun/print/SunAlternateMedia.java
+sun/print/SunMinMaxPage.java
+sun/print/SunPageSelection.java
+sun/print/SunPrinterJobService.java
+sun/print/psfont.properties.ja
+sun/print/psfontj2d.properties
+sun/print/PrinterGraphicsConfig.java
+sun/print/PrinterGraphicsDevice.java
+sun/reflect
+sun/reflect/SCCS
+sun/reflect/SCCS/s.ConstructorAccessorImpl.java
+sun/reflect/SCCS/s.AccessorGenerator.java
+sun/reflect/SCCS/s.ByteVector.java
+sun/reflect/SCCS/s.ClassDefiner.java
+sun/reflect/SCCS/s.BootstrapConstructorAccessorImpl.java
+sun/reflect/SCCS/s.ByteVectorFactory.java
+sun/reflect/SCCS/s.ByteVectorImpl.java
+sun/reflect/SCCS/s.ClassFileAssembler.java
+sun/reflect/SCCS/s.ClassFileConstants.java
+sun/reflect/SCCS/s.ConstantPool.java
+sun/reflect/SCCS/s.ConstructorAccessor.java
+sun/reflect/SCCS/s.DelegatingMethodAccessorImpl.java
+sun/reflect/SCCS/s.UTF8.java
+sun/reflect/SCCS/s.FieldAccessor.java
+sun/reflect/SCCS/s.DelegatingConstructorAccessorImpl.java
+sun/reflect/SCCS/s.FieldAccessorImpl.java
+sun/reflect/SCCS/s.FieldInfo.java
+sun/reflect/SCCS/s.Label.java
+sun/reflect/SCCS/s.LangReflectAccess.java
+sun/reflect/SCCS/s.InstantiationExceptionConstructorAccessorImpl.java
+sun/reflect/SCCS/s.MagicAccessorImpl.java
+sun/reflect/SCCS/s.MethodAccessor.java
+sun/reflect/SCCS/s.MethodAccessorGenerator.java
+sun/reflect/SCCS/s.MethodAccessorImpl.java
+sun/reflect/SCCS/s.NativeConstructorAccessorImpl.java
+sun/reflect/SCCS/s.NativeMethodAccessorImpl.java
+sun/reflect/SCCS/s.Reflection.java
+sun/reflect/SCCS/s.ReflectionFactory.java
+sun/reflect/SCCS/s.SerializationConstructorAccessorImpl.java
+sun/reflect/SCCS/s.SignatureIterator.java
+sun/reflect/SCCS/s.UnsafeBooleanFieldAccessorImpl.java
+sun/reflect/SCCS/s.UnsafeByteFieldAccessorImpl.java
+sun/reflect/SCCS/s.UnsafeCharacterFieldAccessorImpl.java
+sun/reflect/SCCS/s.UnsafeDoubleFieldAccessorImpl.java
+sun/reflect/SCCS/s.UnsafeFieldAccessorFactory.java
+sun/reflect/SCCS/s.UnsafeFieldAccessorImpl.java
+sun/reflect/SCCS/s.package.html
+sun/reflect/SCCS/s.UnsafeFloatFieldAccessorImpl.java
+sun/reflect/SCCS/s.UnsafeIntegerFieldAccessorImpl.java
+sun/reflect/SCCS/s.UnsafeLongFieldAccessorImpl.java
+sun/reflect/SCCS/s.UnsafeObjectFieldAccessorImpl.java
+sun/reflect/SCCS/s.UnsafeQualifiedBooleanFieldAccessorImpl.java
+sun/reflect/SCCS/s.UnsafeQualifiedByteFieldAccessorImpl.java
+sun/reflect/SCCS/s.UnsafeQualifiedCharacterFieldAccessorImpl.java
+sun/reflect/SCCS/s.UnsafeQualifiedDoubleFieldAccessorImpl.java
+sun/reflect/SCCS/s.UnsafeQualifiedFieldAccessorImpl.java
+sun/reflect/SCCS/s.UnsafeQualifiedFloatFieldAccessorImpl.java
+sun/reflect/SCCS/s.UnsafeQualifiedIntegerFieldAccessorImpl.java
+sun/reflect/SCCS/s.UnsafeQualifiedLongFieldAccessorImpl.java
+sun/reflect/SCCS/s.UnsafeQualifiedObjectFieldAccessorImpl.java
+sun/reflect/SCCS/s.UnsafeQualifiedShortFieldAccessorImpl.java
+sun/reflect/SCCS/s.UnsafeQualifiedStaticBooleanFieldAccessorImpl.java
+sun/reflect/SCCS/s.UnsafeQualifiedStaticByteFieldAccessorImpl.java
+sun/reflect/SCCS/s.UnsafeQualifiedStaticCharacterFieldAccessorImpl.java
+sun/reflect/SCCS/s.UnsafeQualifiedStaticDoubleFieldAccessorImpl.java
+sun/reflect/SCCS/s.UnsafeShortFieldAccessorImpl.java
+sun/reflect/SCCS/s.UnsafeQualifiedStaticFieldAccessorImpl.java
+sun/reflect/SCCS/s.UnsafeQualifiedStaticFloatFieldAccessorImpl.java
+sun/reflect/SCCS/s.UnsafeQualifiedStaticIntegerFieldAccessorImpl.java
+sun/reflect/SCCS/s.UnsafeQualifiedStaticLongFieldAccessorImpl.java
+sun/reflect/SCCS/s.UnsafeQualifiedStaticObjectFieldAccessorImpl.java
+sun/reflect/SCCS/s.UnsafeQualifiedStaticShortFieldAccessorImpl.java
+sun/reflect/SCCS/s.UnsafeStaticBooleanFieldAccessorImpl.java
+sun/reflect/SCCS/s.UnsafeStaticByteFieldAccessorImpl.java
+sun/reflect/SCCS/s.UnsafeStaticFieldAccessorImpl.java
+sun/reflect/SCCS/s.UnsafeStaticCharacterFieldAccessorImpl.java
+sun/reflect/SCCS/s.UnsafeStaticDoubleFieldAccessorImpl.java
+sun/reflect/SCCS/s.UnsafeStaticFloatFieldAccessorImpl.java
+sun/reflect/SCCS/s.UnsafeStaticIntegerFieldAccessorImpl.java
+sun/reflect/SCCS/s.UnsafeStaticLongFieldAccessorImpl.java
+sun/reflect/SCCS/s.UnsafeStaticObjectFieldAccessorImpl.java
+sun/reflect/SCCS/s.UnsafeStaticShortFieldAccessorImpl.java
+sun/reflect/annotation
+sun/reflect/annotation/SCCS
+sun/reflect/annotation/SCCS/s.AnnotationTypeMismatchExceptionProxy.java
+sun/reflect/annotation/SCCS/s.AnnotationInvocationHandler.java
+sun/reflect/annotation/SCCS/s.AnnotationParser.java
+sun/reflect/annotation/SCCS/s.AnnotationType.java
+sun/reflect/annotation/SCCS/s.EnumConstantNotPresentExceptionProxy.java
+sun/reflect/annotation/SCCS/s.ExceptionProxy.java
+sun/reflect/annotation/SCCS/s.TypeNotPresentExceptionProxy.java
+sun/reflect/annotation/AnnotationTypeMismatchExceptionProxy.java
+sun/reflect/annotation/AnnotationInvocationHandler.java
+sun/reflect/annotation/AnnotationParser.java
+sun/reflect/annotation/AnnotationType.java
+sun/reflect/annotation/EnumConstantNotPresentExceptionProxy.java
+sun/reflect/annotation/ExceptionProxy.java
+sun/reflect/annotation/TypeNotPresentExceptionProxy.java
+sun/reflect/generics
+sun/reflect/generics/factory
+sun/reflect/generics/factory/SCCS
+sun/reflect/generics/factory/SCCS/s.CoreReflectionFactory.java
+sun/reflect/generics/factory/SCCS/s.GenericsFactory.java
+sun/reflect/generics/factory/CoreReflectionFactory.java
+sun/reflect/generics/factory/GenericsFactory.java
+sun/reflect/generics/parser
+sun/reflect/generics/parser/SCCS
+sun/reflect/generics/parser/SCCS/s.SignatureParser.java
+sun/reflect/generics/parser/SignatureParser.java
+sun/reflect/generics/reflectiveObjects
+sun/reflect/generics/reflectiveObjects/SCCS
+sun/reflect/generics/reflectiveObjects/SCCS/s.NotImplementedException.java
+sun/reflect/generics/reflectiveObjects/SCCS/s.GenericArrayTypeImpl.java
+sun/reflect/generics/reflectiveObjects/SCCS/s.LazyReflectiveObjectGenerator.java
+sun/reflect/generics/reflectiveObjects/SCCS/s.ParameterizedTypeImpl.java
+sun/reflect/generics/reflectiveObjects/SCCS/s.TypeVariableImpl.java
+sun/reflect/generics/reflectiveObjects/SCCS/s.WildcardTypeImpl.java
+sun/reflect/generics/reflectiveObjects/LazyReflectiveObjectGenerator.java
+sun/reflect/generics/reflectiveObjects/GenericArrayTypeImpl.java
+sun/reflect/generics/reflectiveObjects/NotImplementedException.java
+sun/reflect/generics/reflectiveObjects/ParameterizedTypeImpl.java
+sun/reflect/generics/reflectiveObjects/TypeVariableImpl.java
+sun/reflect/generics/reflectiveObjects/WildcardTypeImpl.java
+sun/reflect/generics/repository
+sun/reflect/generics/repository/SCCS
+sun/reflect/generics/repository/SCCS/s.ConstructorRepository.java
+sun/reflect/generics/repository/SCCS/s.AbstractRepository.java
+sun/reflect/generics/repository/SCCS/s.ClassRepository.java
+sun/reflect/generics/repository/SCCS/s.GenericDeclRepository.java
+sun/reflect/generics/repository/SCCS/s.FieldRepository.java
+sun/reflect/generics/repository/SCCS/s.MethodRepository.java
+sun/reflect/generics/repository/ConstructorRepository.java
+sun/reflect/generics/repository/AbstractRepository.java
+sun/reflect/generics/repository/ClassRepository.java
+sun/reflect/generics/repository/FieldRepository.java
+sun/reflect/generics/repository/GenericDeclRepository.java
+sun/reflect/generics/repository/MethodRepository.java
+sun/reflect/generics/scope
+sun/reflect/generics/scope/SCCS
+sun/reflect/generics/scope/SCCS/s.AbstractScope.java
+sun/reflect/generics/scope/SCCS/s.ClassScope.java
+sun/reflect/generics/scope/SCCS/s.ConstructorScope.java
+sun/reflect/generics/scope/SCCS/s.DummyScope.java
+sun/reflect/generics/scope/SCCS/s.MethodScope.java
+sun/reflect/generics/scope/SCCS/s.Scope.java
+sun/reflect/generics/scope/ConstructorScope.java
+sun/reflect/generics/scope/AbstractScope.java
+sun/reflect/generics/scope/ClassScope.java
+sun/reflect/generics/scope/DummyScope.java
+sun/reflect/generics/scope/MethodScope.java
+sun/reflect/generics/scope/Scope.java
+sun/reflect/generics/tree
+sun/reflect/generics/tree/SCCS
+sun/reflect/generics/tree/SCCS/s.ArrayTypeSignature.java
+sun/reflect/generics/tree/SCCS/s.BaseType.java
+sun/reflect/generics/tree/SCCS/s.BooleanSignature.java
+sun/reflect/generics/tree/SCCS/s.BottomSignature.java
+sun/reflect/generics/tree/SCCS/s.ByteSignature.java
+sun/reflect/generics/tree/SCCS/s.CharSignature.java
+sun/reflect/generics/tree/SCCS/s.ClassSignature.java
+sun/reflect/generics/tree/SCCS/s.ClassTypeSignature.java
+sun/reflect/generics/tree/SCCS/s.DoubleSignature.java
+sun/reflect/generics/tree/SCCS/s.FieldTypeSignature.java
+sun/reflect/generics/tree/SCCS/s.FloatSignature.java
+sun/reflect/generics/tree/SCCS/s.FormalTypeParameter.java
+sun/reflect/generics/tree/SCCS/s.IntSignature.java
+sun/reflect/generics/tree/SCCS/s.Tree.java
+sun/reflect/generics/tree/SCCS/s.LongSignature.java
+sun/reflect/generics/tree/SCCS/s.MethodTypeSignature.java
+sun/reflect/generics/tree/SCCS/s.ReturnType.java
+sun/reflect/generics/tree/SCCS/s.ShortSignature.java
+sun/reflect/generics/tree/SCCS/s.Signature.java
+sun/reflect/generics/tree/SCCS/s.SimpleClassTypeSignature.java
+sun/reflect/generics/tree/SCCS/s.TypeArgument.java
+sun/reflect/generics/tree/SCCS/s.TypeSignature.java
+sun/reflect/generics/tree/SCCS/s.TypeTree.java
+sun/reflect/generics/tree/SCCS/s.TypeVariableSignature.java
+sun/reflect/generics/tree/SCCS/s.VoidDescriptor.java
+sun/reflect/generics/tree/SCCS/s.Wildcard.java
+sun/reflect/generics/tree/FormalTypeParameter.java
+sun/reflect/generics/tree/ArrayTypeSignature.java
+sun/reflect/generics/tree/BaseType.java
+sun/reflect/generics/tree/BooleanSignature.java
+sun/reflect/generics/tree/BottomSignature.java
+sun/reflect/generics/tree/ByteSignature.java
+sun/reflect/generics/tree/CharSignature.java
+sun/reflect/generics/tree/ClassSignature.java
+sun/reflect/generics/tree/ClassTypeSignature.java
+sun/reflect/generics/tree/DoubleSignature.java
+sun/reflect/generics/tree/FieldTypeSignature.java
+sun/reflect/generics/tree/FloatSignature.java
+sun/reflect/generics/tree/IntSignature.java
+sun/reflect/generics/tree/LongSignature.java
+sun/reflect/generics/tree/TypeArgument.java
+sun/reflect/generics/tree/Tree.java
+sun/reflect/generics/tree/MethodTypeSignature.java
+sun/reflect/generics/tree/ReturnType.java
+sun/reflect/generics/tree/ShortSignature.java
+sun/reflect/generics/tree/Signature.java
+sun/reflect/generics/tree/SimpleClassTypeSignature.java
+sun/reflect/generics/tree/TypeVariableSignature.java
+sun/reflect/generics/tree/TypeSignature.java
+sun/reflect/generics/tree/TypeTree.java
+sun/reflect/generics/tree/VoidDescriptor.java
+sun/reflect/generics/tree/Wildcard.java
+sun/reflect/generics/visitor
+sun/reflect/generics/visitor/SCCS
+sun/reflect/generics/visitor/SCCS/s.TypeTreeVisitor.java
+sun/reflect/generics/visitor/SCCS/s.Reifier.java
+sun/reflect/generics/visitor/SCCS/s.Visitor.java
+sun/reflect/generics/visitor/TypeTreeVisitor.java
+sun/reflect/generics/visitor/Reifier.java
+sun/reflect/generics/visitor/Visitor.java
+sun/reflect/ConstructorAccessor.java
+sun/reflect/AccessorGenerator.java
+sun/reflect/ByteVector.java
+sun/reflect/ByteVectorFactory.java
+sun/reflect/BootstrapConstructorAccessorImpl.java
+sun/reflect/ByteVectorImpl.java
+sun/reflect/ClassDefiner.java
+sun/reflect/ClassFileAssembler.java
+sun/reflect/ClassFileConstants.java
+sun/reflect/ConstantPool.java
+sun/reflect/ConstructorAccessorImpl.java
+sun/reflect/FieldAccessor.java
+sun/reflect/MethodAccessorGenerator.java
+sun/reflect/DelegatingConstructorAccessorImpl.java
+sun/reflect/DelegatingMethodAccessorImpl.java
+sun/reflect/FieldAccessorImpl.java
+sun/reflect/FieldInfo.java
+sun/reflect/Label.java
+sun/reflect/LangReflectAccess.java
+sun/reflect/InstantiationExceptionConstructorAccessorImpl.java
+sun/reflect/MagicAccessorImpl.java
+sun/reflect/MethodAccessor.java
+sun/reflect/Reflection.java
+sun/reflect/MethodAccessorImpl.java
+sun/reflect/NativeConstructorAccessorImpl.java
+sun/reflect/NativeMethodAccessorImpl.java
+sun/reflect/SerializationConstructorAccessorImpl.java
+sun/reflect/ReflectionFactory.java
+sun/reflect/SignatureIterator.java
+sun/reflect/UTF8.java
+sun/reflect/UnsafeFieldAccessorFactory.java
+sun/reflect/UnsafeBooleanFieldAccessorImpl.java
+sun/reflect/UnsafeByteFieldAccessorImpl.java
+sun/reflect/UnsafeCharacterFieldAccessorImpl.java
+sun/reflect/UnsafeDoubleFieldAccessorImpl.java
+sun/reflect/UnsafeFieldAccessorImpl.java
+sun/reflect/UnsafeFloatFieldAccessorImpl.java
+sun/reflect/UnsafeIntegerFieldAccessorImpl.java
+sun/reflect/package.html
+sun/reflect/UnsafeLongFieldAccessorImpl.java
+sun/reflect/UnsafeObjectFieldAccessorImpl.java
+sun/reflect/UnsafeQualifiedBooleanFieldAccessorImpl.java
+sun/reflect/UnsafeQualifiedByteFieldAccessorImpl.java
+sun/reflect/UnsafeQualifiedCharacterFieldAccessorImpl.java
+sun/reflect/UnsafeQualifiedDoubleFieldAccessorImpl.java
+sun/reflect/UnsafeQualifiedFieldAccessorImpl.java
+sun/reflect/UnsafeQualifiedFloatFieldAccessorImpl.java
+sun/reflect/UnsafeQualifiedIntegerFieldAccessorImpl.java
+sun/reflect/UnsafeQualifiedLongFieldAccessorImpl.java
+sun/reflect/UnsafeShortFieldAccessorImpl.java
+sun/reflect/UnsafeQualifiedObjectFieldAccessorImpl.java
+sun/reflect/UnsafeQualifiedShortFieldAccessorImpl.java
+sun/reflect/UnsafeQualifiedStaticBooleanFieldAccessorImpl.java
+sun/reflect/UnsafeQualifiedStaticByteFieldAccessorImpl.java
+sun/reflect/UnsafeQualifiedStaticCharacterFieldAccessorImpl.java
+sun/reflect/UnsafeQualifiedStaticDoubleFieldAccessorImpl.java
+sun/reflect/UnsafeQualifiedStaticFieldAccessorImpl.java
+sun/reflect/UnsafeQualifiedStaticFloatFieldAccessorImpl.java
+sun/reflect/UnsafeQualifiedStaticLongFieldAccessorImpl.java
+sun/reflect/UnsafeQualifiedStaticIntegerFieldAccessorImpl.java
+sun/reflect/UnsafeQualifiedStaticObjectFieldAccessorImpl.java
+sun/reflect/UnsafeQualifiedStaticShortFieldAccessorImpl.java
+sun/reflect/UnsafeStaticBooleanFieldAccessorImpl.java
+sun/reflect/UnsafeStaticByteFieldAccessorImpl.java
+sun/reflect/UnsafeStaticCharacterFieldAccessorImpl.java
+sun/reflect/UnsafeStaticDoubleFieldAccessorImpl.java
+sun/reflect/UnsafeStaticFieldAccessorImpl.java
+sun/reflect/UnsafeStaticFloatFieldAccessorImpl.java
+sun/reflect/UnsafeStaticIntegerFieldAccessorImpl.java
+sun/reflect/UnsafeStaticLongFieldAccessorImpl.java
+sun/reflect/UnsafeStaticObjectFieldAccessorImpl.java
+sun/reflect/UnsafeStaticShortFieldAccessorImpl.java
+sun/rmi
+sun/rmi/log
+sun/rmi/log/SCCS
+sun/rmi/log/SCCS/s.LogInputStream.java
+sun/rmi/log/SCCS/s.LogHandler.java
+sun/rmi/log/SCCS/s.LogOutputStream.java
+sun/rmi/log/SCCS/s.ReliableLog.java
+sun/rmi/log/LogInputStream.java
+sun/rmi/log/LogHandler.java
+sun/rmi/log/LogOutputStream.java
+sun/rmi/log/ReliableLog.java
+sun/rmi/registry
+sun/rmi/registry/SCCS
+sun/rmi/registry/SCCS/s.RegistryImpl.java
+sun/rmi/registry/resources
+sun/rmi/registry/resources/SCCS
+sun/rmi/registry/resources/SCCS/s.rmiregistry_zh_CN.properties
+sun/rmi/registry/resources/SCCS/s.rmiregistry.properties
+sun/rmi/registry/resources/SCCS/s.rmiregistry_de.properties
+sun/rmi/registry/resources/SCCS/s.rmiregistry_es.properties
+sun/rmi/registry/resources/SCCS/s.rmiregistry_fr.properties
+sun/rmi/registry/resources/SCCS/s.rmiregistry_it.properties
+sun/rmi/registry/resources/SCCS/s.rmiregistry_ja.properties
+sun/rmi/registry/resources/SCCS/s.rmiregistry_ko.properties
+sun/rmi/registry/resources/SCCS/s.rmiregistry_sv.properties
+sun/rmi/registry/resources/SCCS/s.rmiregistry_zh_TW.properties
+sun/rmi/registry/resources/rmiregistry_de.properties
+sun/rmi/registry/resources/rmiregistry.properties
+sun/rmi/registry/resources/rmiregistry_es.properties
+sun/rmi/registry/resources/rmiregistry_fr.properties
+sun/rmi/registry/resources/rmiregistry_it.properties
+sun/rmi/registry/resources/rmiregistry_ja.properties
+sun/rmi/registry/resources/rmiregistry_ko.properties
+sun/rmi/registry/resources/rmiregistry_sv.properties
+sun/rmi/registry/resources/rmiregistry_zh_CN.properties
+sun/rmi/registry/resources/rmiregistry_zh_TW.properties
+sun/rmi/registry/RegistryImpl.java
+sun/rmi/rmic
+sun/rmi/rmic/SCCS
+sun/rmi/rmic/SCCS/s.BatchEnvironment.java
+sun/rmi/rmic/SCCS/s.Constants.java
+sun/rmi/rmic/SCCS/s.Generator.java
+sun/rmi/rmic/SCCS/s.IndentingWriter.java
+sun/rmi/rmic/SCCS/s.Main.java
+sun/rmi/rmic/SCCS/s.Names.java
+sun/rmi/rmic/SCCS/s.RMIConstants.java
+sun/rmi/rmic/SCCS/s.RMIGenerator.java
+sun/rmi/rmic/SCCS/s.RemoteClass.java
+sun/rmi/rmic/SCCS/s.Util.java
+sun/rmi/rmic/iiop
+sun/rmi/rmic/iiop/SCCS
+sun/rmi/rmic/iiop/SCCS/s.BatchEnvironment.java
+sun/rmi/rmic/iiop/SCCS/s.AbstractType.java
+sun/rmi/rmic/iiop/SCCS/s.ArrayType.java
+sun/rmi/rmic/iiop/SCCS/s.ClassPathLoader.java
+sun/rmi/rmic/iiop/SCCS/s.ClassType.java
+sun/rmi/rmic/iiop/SCCS/s.CompoundType.java
+sun/rmi/rmic/iiop/SCCS/s.Constants.java
+sun/rmi/rmic/iiop/SCCS/s.ContextElement.java
+sun/rmi/rmic/iiop/SCCS/s.ContextStack.java
+sun/rmi/rmic/iiop/SCCS/s.DirectoryLoader.java
+sun/rmi/rmic/iiop/SCCS/s.Generator.java
+sun/rmi/rmic/iiop/SCCS/s.IDLGenerator.java
+sun/rmi/rmic/iiop/SCCS/s.IDLNames.java
+sun/rmi/rmic/iiop/SCCS/s.ImplementationType.java
+sun/rmi/rmic/iiop/SCCS/s.InterfaceType.java
+sun/rmi/rmic/iiop/SCCS/s.NCClassType.java
+sun/rmi/rmic/iiop/SCCS/s.NCInterfaceType.java
+sun/rmi/rmic/iiop/SCCS/s.NameContext.java
+sun/rmi/rmic/iiop/SCCS/s.PrimitiveType.java
+sun/rmi/rmic/iiop/SCCS/s.PrintGenerator.java
+sun/rmi/rmic/iiop/SCCS/s.RemoteType.java
+sun/rmi/rmic/iiop/SCCS/s.SpecialClassType.java
+sun/rmi/rmic/iiop/SCCS/s.SpecialInterfaceType.java
+sun/rmi/rmic/iiop/SCCS/s.StaticStringsHash.java
+sun/rmi/rmic/iiop/SCCS/s.StubGenerator.java
+sun/rmi/rmic/iiop/SCCS/s.Type.java
+sun/rmi/rmic/iiop/SCCS/s.Util.java
+sun/rmi/rmic/iiop/SCCS/s.ValueType.java
+sun/rmi/rmic/iiop/BatchEnvironment.java
+sun/rmi/rmic/iiop/AbstractType.java
+sun/rmi/rmic/iiop/ArrayType.java
+sun/rmi/rmic/iiop/ClassPathLoader.java
+sun/rmi/rmic/iiop/ClassType.java
+sun/rmi/rmic/iiop/CompoundType.java
+sun/rmi/rmic/iiop/Constants.java
+sun/rmi/rmic/iiop/ContextElement.java
+sun/rmi/rmic/iiop/ContextStack.java
+sun/rmi/rmic/iiop/DirectoryLoader.java
+sun/rmi/rmic/iiop/Generator.java
+sun/rmi/rmic/iiop/IDLGenerator.java
+sun/rmi/rmic/iiop/IDLNames.java
+sun/rmi/rmic/iiop/ImplementationType.java
+sun/rmi/rmic/iiop/InterfaceType.java
+sun/rmi/rmic/iiop/NCClassType.java
+sun/rmi/rmic/iiop/NameContext.java
+sun/rmi/rmic/iiop/NCInterfaceType.java
+sun/rmi/rmic/iiop/PrimitiveType.java
+sun/rmi/rmic/iiop/PrintGenerator.java
+sun/rmi/rmic/iiop/RemoteType.java
+sun/rmi/rmic/iiop/SpecialClassType.java
+sun/rmi/rmic/iiop/SpecialInterfaceType.java
+sun/rmi/rmic/iiop/StaticStringsHash.java
+sun/rmi/rmic/iiop/StubGenerator.java
+sun/rmi/rmic/iiop/Type.java
+sun/rmi/rmic/iiop/Util.java
+sun/rmi/rmic/iiop/ValueType.java
+sun/rmi/rmic/newrmic
+sun/rmi/rmic/newrmic/SCCS
+sun/rmi/rmic/newrmic/SCCS/s.BatchEnvironment.java
+sun/rmi/rmic/newrmic/SCCS/s.Constants.java
+sun/rmi/rmic/newrmic/SCCS/s.Generator.java
+sun/rmi/rmic/newrmic/SCCS/s.IndentingWriter.java
+sun/rmi/rmic/newrmic/SCCS/s.Main.java
+sun/rmi/rmic/newrmic/SCCS/s.Resources.java
+sun/rmi/rmic/newrmic/jrmp
+sun/rmi/rmic/newrmic/jrmp/SCCS
+sun/rmi/rmic/newrmic/jrmp/SCCS/s.JrmpGenerator.java
+sun/rmi/rmic/newrmic/jrmp/SCCS/s.Constants.java
+sun/rmi/rmic/newrmic/jrmp/SCCS/s.StubSkeletonWriter.java
+sun/rmi/rmic/newrmic/jrmp/SCCS/s.RemoteClass.java
+sun/rmi/rmic/newrmic/jrmp/SCCS/s.Util.java
+sun/rmi/rmic/newrmic/jrmp/JrmpGenerator.java
+sun/rmi/rmic/newrmic/jrmp/Constants.java
+sun/rmi/rmic/newrmic/jrmp/RemoteClass.java
+sun/rmi/rmic/newrmic/jrmp/StubSkeletonWriter.java
+sun/rmi/rmic/newrmic/jrmp/Util.java
+sun/rmi/rmic/newrmic/BatchEnvironment.java
+sun/rmi/rmic/newrmic/Constants.java
+sun/rmi/rmic/newrmic/Generator.java
+sun/rmi/rmic/newrmic/IndentingWriter.java
+sun/rmi/rmic/newrmic/Main.java
+sun/rmi/rmic/newrmic/Resources.java
+sun/rmi/rmic/resources
+sun/rmi/rmic/resources/SCCS
+sun/rmi/rmic/resources/SCCS/s.rmic_ja.properties
+sun/rmi/rmic/resources/SCCS/s.rmic.properties
+sun/rmi/rmic/resources/rmic_ja.properties
+sun/rmi/rmic/resources/rmic.properties
+sun/rmi/rmic/BatchEnvironment.java
+sun/rmi/rmic/Constants.java
+sun/rmi/rmic/Generator.java
+sun/rmi/rmic/IndentingWriter.java
+sun/rmi/rmic/Main.java
+sun/rmi/rmic/Names.java
+sun/rmi/rmic/RMIConstants.java
+sun/rmi/rmic/RMIGenerator.java
+sun/rmi/rmic/RemoteClass.java
+sun/rmi/rmic/Util.java
+sun/rmi/runtime
+sun/rmi/runtime/SCCS
+sun/rmi/runtime/SCCS/s.Executor.java
+sun/rmi/runtime/SCCS/s.Log.java
+sun/rmi/runtime/SCCS/s.WeakKey.java
+sun/rmi/runtime/SCCS/s.GetThreadPoolAction.java
+sun/rmi/runtime/SCCS/s.NewThreadAction.java
+sun/rmi/runtime/SCCS/s.ThreadPool.java
+sun/rmi/runtime/Executor.java
+sun/rmi/runtime/Log.java
+sun/rmi/runtime/ThreadPool.java
+sun/rmi/runtime/GetThreadPoolAction.java
+sun/rmi/runtime/NewThreadAction.java
+sun/rmi/runtime/WeakKey.java
+sun/rmi/server
+sun/rmi/server/SCCS
+sun/rmi/server/SCCS/s.ActivatableServerRef.java
+sun/rmi/server/SCCS/s.ActivatableRef.java
+sun/rmi/server/SCCS/s.ActivationGroupImpl.java
+sun/rmi/server/SCCS/s.Activation.java
+sun/rmi/server/SCCS/s.Util.java
+sun/rmi/server/SCCS/s.ActivationGroupInit.java
+sun/rmi/server/SCCS/s.Dispatcher.java
+sun/rmi/server/SCCS/s.LoaderHandler.java
+sun/rmi/server/SCCS/s.MarshalInputStream.java
+sun/rmi/server/SCCS/s.MarshalOutputStream.java
+sun/rmi/server/SCCS/s.UnicastRef.java
+sun/rmi/server/SCCS/s.UnicastRef2.java
+sun/rmi/server/SCCS/s.UnicastServerRef.java
+sun/rmi/server/SCCS/s.UnicastServerRef2.java
+sun/rmi/server/SCCS/s.WeakClassHashMap.java
+sun/rmi/server/resources
+sun/rmi/server/resources/SCCS
+sun/rmi/server/resources/SCCS/s.rmid_de.properties
+sun/rmi/server/resources/SCCS/s.rmid.properties
+sun/rmi/server/resources/SCCS/s.rmid_es.properties
+sun/rmi/server/resources/SCCS/s.rmid_fr.properties
+sun/rmi/server/resources/SCCS/s.rmid_it.properties
+sun/rmi/server/resources/SCCS/s.rmid_ja.properties
+sun/rmi/server/resources/SCCS/s.rmid_ko.properties
+sun/rmi/server/resources/SCCS/s.rmid_sv.properties
+sun/rmi/server/resources/SCCS/s.rmid_zh_CN.properties
+sun/rmi/server/resources/SCCS/s.rmid_zh_TW.properties
+sun/rmi/server/resources/rmid_de.properties
+sun/rmi/server/resources/rmid.properties
+sun/rmi/server/resources/rmid_es.properties
+sun/rmi/server/resources/rmid_fr.properties
+sun/rmi/server/resources/rmid_it.properties
+sun/rmi/server/resources/rmid_ja.properties
+sun/rmi/server/resources/rmid_ko.properties
+sun/rmi/server/resources/rmid_sv.properties
+sun/rmi/server/resources/rmid_zh_CN.properties
+sun/rmi/server/resources/rmid_zh_TW.properties
+sun/rmi/server/ActivatableServerRef.java
+sun/rmi/server/ActivatableRef.java
+sun/rmi/server/Activation.java
+sun/rmi/server/Dispatcher.java
+sun/rmi/server/Util.java
+sun/rmi/server/ActivationGroupImpl.java
+sun/rmi/server/ActivationGroupInit.java
+sun/rmi/server/LoaderHandler.java
+sun/rmi/server/MarshalInputStream.java
+sun/rmi/server/MarshalOutputStream.java
+sun/rmi/server/UnicastRef.java
+sun/rmi/server/UnicastRef2.java
+sun/rmi/server/UnicastServerRef.java
+sun/rmi/server/UnicastServerRef2.java
+sun/rmi/server/WeakClassHashMap.java
+sun/rmi/transport
+sun/rmi/transport/SCCS
+sun/rmi/transport/SCCS/s.Connection.java
+sun/rmi/transport/SCCS/s.Channel.java
+sun/rmi/transport/SCCS/s.ConnectionInputStream.java
+sun/rmi/transport/SCCS/s.ConnectionOutputStream.java
+sun/rmi/transport/SCCS/s.DGCAckHandler.java
+sun/rmi/transport/SCCS/s.DGCClient.java
+sun/rmi/transport/SCCS/s.DGCImpl.java
+sun/rmi/transport/SCCS/s.Endpoint.java
+sun/rmi/transport/SCCS/s.LiveRef.java
+sun/rmi/transport/SCCS/s.ObjectEndpoint.java
+sun/rmi/transport/SCCS/s.ObjectTable.java
+sun/rmi/transport/SCCS/s.StreamRemoteCall.java
+sun/rmi/transport/SCCS/s.Target.java
+sun/rmi/transport/SCCS/s.Transport.java
+sun/rmi/transport/SCCS/s.TransportConstants.java
+sun/rmi/transport/SCCS/s.WeakRef.java
+sun/rmi/transport/proxy
+sun/rmi/transport/proxy/SCCS
+sun/rmi/transport/proxy/SCCS/s.HttpInputStream.java
+sun/rmi/transport/proxy/SCCS/s.CGIHandler.java
+sun/rmi/transport/proxy/SCCS/s.HttpAwareServerSocket.java
+sun/rmi/transport/proxy/SCCS/s.HttpOutputStream.java
+sun/rmi/transport/proxy/SCCS/s.HttpReceiveSocket.java
+sun/rmi/transport/proxy/SCCS/s.HttpSendInputStream.java
+sun/rmi/transport/proxy/SCCS/s.HttpSendOutputStream.java
+sun/rmi/transport/proxy/SCCS/s.HttpSendSocket.java
+sun/rmi/transport/proxy/SCCS/s.RMIDirectSocketFactory.java
+sun/rmi/transport/proxy/SCCS/s.RMIHttpToCGISocketFactory.java
+sun/rmi/transport/proxy/SCCS/s.RMIHttpToPortSocketFactory.java
+sun/rmi/transport/proxy/SCCS/s.RMIMasterSocketFactory.java
+sun/rmi/transport/proxy/SCCS/s.RMISocketInfo.java
+sun/rmi/transport/proxy/SCCS/s.WrappedSocket.java
+sun/rmi/transport/proxy/HttpInputStream.java
+sun/rmi/transport/proxy/CGIHandler.java
+sun/rmi/transport/proxy/RMIHttpToCGISocketFactory.java
+sun/rmi/transport/proxy/HttpAwareServerSocket.java
+sun/rmi/transport/proxy/HttpOutputStream.java
+sun/rmi/transport/proxy/HttpReceiveSocket.java
+sun/rmi/transport/proxy/HttpSendInputStream.java
+sun/rmi/transport/proxy/HttpSendOutputStream.java
+sun/rmi/transport/proxy/HttpSendSocket.java
+sun/rmi/transport/proxy/RMIDirectSocketFactory.java
+sun/rmi/transport/proxy/RMIHttpToPortSocketFactory.java
+sun/rmi/transport/proxy/RMIMasterSocketFactory.java
+sun/rmi/transport/proxy/RMISocketInfo.java
+sun/rmi/transport/proxy/WrappedSocket.java
+sun/rmi/transport/tcp
+sun/rmi/transport/tcp/SCCS
+sun/rmi/transport/tcp/SCCS/s.ConnectionMultiplexer.java
+sun/rmi/transport/tcp/SCCS/s.MultiplexConnectionInfo.java
+sun/rmi/transport/tcp/SCCS/s.MultiplexInputStream.java
+sun/rmi/transport/tcp/SCCS/s.MultiplexOutputStream.java
+sun/rmi/transport/tcp/SCCS/s.TCPChannel.java
+sun/rmi/transport/tcp/SCCS/s.TCPConnection.java
+sun/rmi/transport/tcp/SCCS/s.TCPEndpoint.java
+sun/rmi/transport/tcp/SCCS/s.TCPTransport.java
+sun/rmi/transport/tcp/MultiplexConnectionInfo.java
+sun/rmi/transport/tcp/ConnectionMultiplexer.java
+sun/rmi/transport/tcp/MultiplexInputStream.java
+sun/rmi/transport/tcp/MultiplexOutputStream.java
+sun/rmi/transport/tcp/TCPChannel.java
+sun/rmi/transport/tcp/TCPConnection.java
+sun/rmi/transport/tcp/TCPEndpoint.java
+sun/rmi/transport/tcp/TCPTransport.java
+sun/rmi/transport/DGCAckHandler.java
+sun/rmi/transport/Channel.java
+sun/rmi/transport/Connection.java
+sun/rmi/transport/ConnectionInputStream.java
+sun/rmi/transport/ConnectionOutputStream.java
+sun/rmi/transport/DGCClient.java
+sun/rmi/transport/DGCImpl.java
+sun/rmi/transport/Endpoint.java
+sun/rmi/transport/LiveRef.java
+sun/rmi/transport/ObjectEndpoint.java
+sun/rmi/transport/ObjectTable.java
+sun/rmi/transport/StreamRemoteCall.java
+sun/rmi/transport/Target.java
+sun/rmi/transport/Transport.java
+sun/rmi/transport/TransportConstants.java
+sun/rmi/transport/WeakRef.java
+sun/security
+sun/security/acl
+sun/security/acl/SCCS
+sun/security/acl/SCCS/s.AllPermissionsImpl.java
+sun/security/acl/SCCS/s.AclEntryImpl.java
+sun/security/acl/SCCS/s.AclImpl.java
+sun/security/acl/SCCS/s.PermissionImpl.java
+sun/security/acl/SCCS/s.GroupImpl.java
+sun/security/acl/SCCS/s.OwnerImpl.java
+sun/security/acl/SCCS/s.PrincipalImpl.java
+sun/security/acl/SCCS/s.WorldGroupImpl.java
+sun/security/acl/AllPermissionsImpl.java
+sun/security/acl/AclEntryImpl.java
+sun/security/acl/AclImpl.java
+sun/security/acl/GroupImpl.java
+sun/security/acl/OwnerImpl.java
+sun/security/acl/PermissionImpl.java
+sun/security/acl/PrincipalImpl.java
+sun/security/acl/WorldGroupImpl.java
+sun/security/action
+sun/security/action/SCCS
+sun/security/action/SCCS/s.GetPropertyAction.java
+sun/security/action/SCCS/s.GetBooleanAction.java
+sun/security/action/SCCS/s.GetIntegerAction.java
+sun/security/action/SCCS/s.GetLongAction.java
+sun/security/action/SCCS/s.OpenFileInputStreamAction.java
+sun/security/action/SCCS/s.LoadLibraryAction.java
+sun/security/action/SCCS/s.PutAllAction.java
+sun/security/action/OpenFileInputStreamAction.java
+sun/security/action/GetBooleanAction.java
+sun/security/action/GetIntegerAction.java
+sun/security/action/GetLongAction.java
+sun/security/action/GetPropertyAction.java
+sun/security/action/LoadLibraryAction.java
+sun/security/action/PutAllAction.java
+sun/security/jca
+sun/security/jca/SCCS
+sun/security/jca/SCCS/s.ProviderConfig.java
+sun/security/jca/SCCS/s.GetInstance.java
+sun/security/jca/SCCS/s.JCAUtil.java
+sun/security/jca/SCCS/s.ProviderList.java
+sun/security/jca/SCCS/s.Providers.java
+sun/security/jca/SCCS/s.ServiceId.java
+sun/security/jca/GetInstance.java
+sun/security/jca/JCAUtil.java
+sun/security/jca/ProviderConfig.java
+sun/security/jca/ProviderList.java
+sun/security/jca/Providers.java
+sun/security/jca/ServiceId.java
+sun/security/jgss
+sun/security/jgss/SCCS
+sun/security/jgss/SCCS/s.GSSCredentialImpl.java
+sun/security/jgss/SCCS/s.GSSContextImpl.java
+sun/security/jgss/SCCS/s.GSSExceptionImpl.java
+sun/security/jgss/SCCS/s.GSSHeader.java
+sun/security/jgss/SCCS/s.GSSManagerImpl.java
+sun/security/jgss/SCCS/s.GSSNameImpl.java
+sun/security/jgss/SCCS/s.GSSUtil.java
+sun/security/jgss/SCCS/s.LoginUtility.java
+sun/security/jgss/SCCS/s.ProviderList.java
+sun/security/jgss/SCCS/s.SunProvider.java
+sun/security/jgss/SCCS/s.TokenTracker.java
+sun/security/jgss/krb5
+sun/security/jgss/krb5/SCCS
+sun/security/jgss/krb5/SCCS/s.AcceptSecContextToken.java
+sun/security/jgss/krb5/SCCS/s.CipherHelper.java
+sun/security/jgss/krb5/SCCS/s.InitSecContextToken.java
+sun/security/jgss/krb5/SCCS/s.InitialToken.java
+sun/security/jgss/krb5/SCCS/s.Krb5AcceptCredential.java
+sun/security/jgss/krb5/SCCS/s.Krb5Context.java
+sun/security/jgss/krb5/SCCS/s.Krb5CredElement.java
+sun/security/jgss/krb5/SCCS/s.Krb5InitCredential.java
+sun/security/jgss/krb5/SCCS/s.Krb5MechFactory.java
+sun/security/jgss/krb5/SCCS/s.Krb5NameElement.java
+sun/security/jgss/krb5/SCCS/s.Krb5Token.java
+sun/security/jgss/krb5/SCCS/s.Krb5Util.java
+sun/security/jgss/krb5/SCCS/s.MessageToken.java
+sun/security/jgss/krb5/SCCS/s.MicToken.java
+sun/security/jgss/krb5/SCCS/s.SubjectComber.java
+sun/security/jgss/krb5/SCCS/s.WrapToken.java
+sun/security/jgss/krb5/SCCS/s.MessageToken_v2.java
+sun/security/jgss/krb5/SCCS/s.MicToken_v2.java
+sun/security/jgss/krb5/SCCS/s.WrapToken_v2.java
+sun/security/jgss/krb5/AcceptSecContextToken.java
+sun/security/jgss/krb5/CipherHelper.java
+sun/security/jgss/krb5/InitSecContextToken.java
+sun/security/jgss/krb5/InitialToken.java
+sun/security/jgss/krb5/Krb5AcceptCredential.java
+sun/security/jgss/krb5/Krb5Context.java
+sun/security/jgss/krb5/Krb5CredElement.java
+sun/security/jgss/krb5/Krb5InitCredential.java
+sun/security/jgss/krb5/Krb5MechFactory.java
+sun/security/jgss/krb5/Krb5NameElement.java
+sun/security/jgss/krb5/Krb5Token.java
+sun/security/jgss/krb5/Krb5Util.java
+sun/security/jgss/krb5/MessageToken.java
+sun/security/jgss/krb5/MicToken.java
+sun/security/jgss/krb5/SubjectComber.java
+sun/security/jgss/krb5/WrapToken.java
+sun/security/jgss/krb5/MessageToken_v2.java
+sun/security/jgss/krb5/MicToken_v2.java
+sun/security/jgss/krb5/WrapToken_v2.java
+sun/security/jgss/spi
+sun/security/jgss/spi/SCCS
+sun/security/jgss/spi/SCCS/s.GSSCredentialSpi.java
+sun/security/jgss/spi/SCCS/s.GSSNameSpi.java
+sun/security/jgss/spi/SCCS/s.MechanismFactory.java
+sun/security/jgss/spi/GSSCredentialSpi.java
+sun/security/jgss/spi/GSSNameSpi.java
+sun/security/jgss/spi/MechanismFactory.java
+sun/security/jgss/GSSCredentialImpl.java
+sun/security/jgss/GSSContextImpl.java
+sun/security/jgss/GSSExceptionImpl.java
+sun/security/jgss/GSSHeader.java
+sun/security/jgss/GSSManagerImpl.java
+sun/security/jgss/GSSNameImpl.java
+sun/security/jgss/GSSUtil.java
+sun/security/jgss/LoginUtility.java
+sun/security/jgss/ProviderList.java
+sun/security/jgss/SunProvider.java
+sun/security/jgss/TokenTracker.java
+sun/security/pkcs
+sun/security/pkcs/SCCS
+sun/security/pkcs/SCCS/s.EncodingException.java
+sun/security/pkcs/SCCS/s.ContentInfo.java
+sun/security/pkcs/SCCS/s.EncryptedPrivateKeyInfo.java
+sun/security/pkcs/SCCS/s.PKCS10.java
+sun/security/pkcs/SCCS/s.PKCS10Attribute.java
+sun/security/pkcs/SCCS/s.PKCS10Attributes.java
+sun/security/pkcs/SCCS/s.PKCS7.java
+sun/security/pkcs/SCCS/s.PKCS8Key.java
+sun/security/pkcs/SCCS/s.PKCS9Attribute.java
+sun/security/pkcs/SCCS/s.PKCS9Attributes.java
+sun/security/pkcs/SCCS/s.ParsingException.java
+sun/security/pkcs/SCCS/s.SignerInfo.java
+sun/security/pkcs/SCCS/s.SigningCertificateInfo.java
+sun/security/pkcs/EncodingException.java
+sun/security/pkcs/ContentInfo.java
+sun/security/pkcs/PKCS10.java
+sun/security/pkcs/EncryptedPrivateKeyInfo.java
+sun/security/pkcs/PKCS7.java
+sun/security/pkcs/PKCS10Attribute.java
+sun/security/pkcs/PKCS10Attributes.java
+sun/security/pkcs/PKCS8Key.java
+sun/security/pkcs/PKCS9Attribute.java
+sun/security/pkcs/PKCS9Attributes.java
+sun/security/pkcs/ParsingException.java
+sun/security/pkcs/SignerInfo.java
+sun/security/pkcs/SigningCertificateInfo.java
+sun/security/provider
+sun/security/provider/SCCS
+sun/security/provider/SCCS/s.DSA.java
+sun/security/provider/SCCS/s.DSAPublicKey.java
+sun/security/provider/SCCS/s.DSAKeyFactory.java
+sun/security/provider/SCCS/s.DSAKeyPairGenerator.java
+sun/security/provider/SCCS/s.DSAParameterGenerator.java
+sun/security/provider/SCCS/s.DSAParameters.java
+sun/security/provider/SCCS/s.DSAPrivateKey.java
+sun/security/provider/SCCS/s.DigestBase.java
+sun/security/provider/SCCS/s.IdentityDatabase.java
+sun/security/provider/SCCS/s.JavaKeyStore.java
+sun/security/provider/SCCS/s.KeyProtector.java
+sun/security/provider/SCCS/s.MD2.java
+sun/security/provider/SCCS/s.MD5.java
+sun/security/provider/SCCS/s.ParameterCache.java
+sun/security/provider/SCCS/s.PolicyFile.java
+sun/security/provider/SCCS/s.PolicyParser.java
+sun/security/provider/SCCS/s.SHA.java
+sun/security/provider/SCCS/s.SHA2.java
+sun/security/provider/SCCS/s.SHA5.java
+sun/security/provider/SCCS/s.SecureRandom.java
+sun/security/provider/SCCS/s.SeedGenerator.java
+sun/security/provider/SCCS/s.Sun.java
+sun/security/provider/SCCS/s.SystemIdentity.java
+sun/security/provider/SCCS/s.SystemSigner.java
+sun/security/provider/SCCS/s.X509Factory.java
+sun/security/provider/certpath
+sun/security/provider/certpath/SCCS
+sun/security/provider/certpath/SCCS/s.CollectionCertStore.java
+sun/security/provider/certpath/SCCS/s.AdjacencyList.java
+sun/security/provider/certpath/SCCS/s.BasicChecker.java
+sun/security/provider/certpath/SCCS/s.BuildStep.java
+sun/security/provider/certpath/SCCS/s.Builder.java
+sun/security/provider/certpath/SCCS/s.CertId.java
+sun/security/provider/certpath/SCCS/s.CertPathHelper.java
+sun/security/provider/certpath/SCCS/s.IndexedCollectionCertStore.java
+sun/security/provider/certpath/SCCS/s.ConstraintsChecker.java
+sun/security/provider/certpath/SCCS/s.CrlRevocationChecker.java
+sun/security/provider/certpath/SCCS/s.DistributionPointFetcher.java
+sun/security/provider/certpath/SCCS/s.ForwardBuilder.java
+sun/security/provider/certpath/SCCS/s.ForwardState.java
+sun/security/provider/certpath/SCCS/s.PKIXCertPathValidator.java
+sun/security/provider/certpath/SCCS/s.KeyChecker.java
+sun/security/provider/certpath/SCCS/s.LDAPCertStore.java
+sun/security/provider/certpath/SCCS/s.OCSPChecker.java
+sun/security/provider/certpath/SCCS/s.OCSPRequest.java
+sun/security/provider/certpath/SCCS/s.OCSPResponse.java
+sun/security/provider/certpath/SCCS/s.PKIXMasterCertPathValidator.java
+sun/security/provider/certpath/SCCS/s.PolicyChecker.java
+sun/security/provider/certpath/SCCS/s.PolicyNodeImpl.java
+sun/security/provider/certpath/SCCS/s.ReverseBuilder.java
+sun/security/provider/certpath/SCCS/s.ReverseState.java
+sun/security/provider/certpath/SCCS/s.State.java
+sun/security/provider/certpath/SCCS/s.SunCertPathBuilder.java
+sun/security/provider/certpath/SCCS/s.SunCertPathBuilderException.java
+sun/security/provider/certpath/SCCS/s.SunCertPathBuilderParameters.java
+sun/security/provider/certpath/SCCS/s.Vertex.java
+sun/security/provider/certpath/SCCS/s.SunCertPathBuilderResult.java
+sun/security/provider/certpath/SCCS/s.X509CertPath.java
+sun/security/provider/certpath/SCCS/s.X509CertificatePair.java
+sun/security/provider/certpath/CollectionCertStore.java
+sun/security/provider/certpath/AdjacencyList.java
+sun/security/provider/certpath/BasicChecker.java
+sun/security/provider/certpath/BuildStep.java
+sun/security/provider/certpath/Builder.java
+sun/security/provider/certpath/CertId.java
+sun/security/provider/certpath/CertPathHelper.java
+sun/security/provider/certpath/CrlRevocationChecker.java
+sun/security/provider/certpath/ConstraintsChecker.java
+sun/security/provider/certpath/State.java
+sun/security/provider/certpath/DistributionPointFetcher.java
+sun/security/provider/certpath/ForwardBuilder.java
+sun/security/provider/certpath/ForwardState.java
+sun/security/provider/certpath/IndexedCollectionCertStore.java
+sun/security/provider/certpath/KeyChecker.java
+sun/security/provider/certpath/X509CertificatePair.java
+sun/security/provider/certpath/LDAPCertStore.java
+sun/security/provider/certpath/OCSPChecker.java
+sun/security/provider/certpath/OCSPRequest.java
+sun/security/provider/certpath/OCSPResponse.java
+sun/security/provider/certpath/PKIXCertPathValidator.java
+sun/security/provider/certpath/PKIXMasterCertPathValidator.java
+sun/security/provider/certpath/PolicyChecker.java
+sun/security/provider/certpath/PolicyNodeImpl.java
+sun/security/provider/certpath/ReverseBuilder.java
+sun/security/provider/certpath/ReverseState.java
+sun/security/provider/certpath/SunCertPathBuilder.java
+sun/security/provider/certpath/Vertex.java
+sun/security/provider/certpath/X509CertPath.java
+sun/security/provider/certpath/SunCertPathBuilderException.java
+sun/security/provider/certpath/SunCertPathBuilderParameters.java
+sun/security/provider/certpath/SunCertPathBuilderResult.java
+sun/security/provider/DSAKeyFactory.java
+sun/security/provider/DSA.java
+sun/security/provider/DSAKeyPairGenerator.java
+sun/security/provider/DSAParameterGenerator.java
+sun/security/provider/DSAParameters.java
+sun/security/provider/DSAPrivateKey.java
+sun/security/provider/DSAPublicKey.java
+sun/security/provider/DigestBase.java
+sun/security/provider/IdentityDatabase.java
+sun/security/provider/JavaKeyStore.java
+sun/security/provider/KeyProtector.java
+sun/security/provider/MD2.java
+sun/security/provider/MD5.java
+sun/security/provider/ParameterCache.java
+sun/security/provider/PolicyFile.java
+sun/security/provider/PolicyParser.java
+sun/security/provider/SHA.java
+sun/security/provider/SHA2.java
+sun/security/provider/SHA5.java
+sun/security/provider/SecureRandom.java
+sun/security/provider/SeedGenerator.java
+sun/security/provider/Sun.java
+sun/security/provider/SystemIdentity.java
+sun/security/provider/SystemSigner.java
+sun/security/provider/X509Factory.java
+sun/security/rsa
+sun/security/rsa/SCCS
+sun/security/rsa/SCCS/s.RSAKeyFactory.java
+sun/security/rsa/SCCS/s.RSACore.java
+sun/security/rsa/SCCS/s.RSAKeyPairGenerator.java
+sun/security/rsa/SCCS/s.RSAPadding.java
+sun/security/rsa/SCCS/s.RSAPrivateCrtKeyImpl.java
+sun/security/rsa/SCCS/s.RSAPrivateKeyImpl.java
+sun/security/rsa/SCCS/s.RSAPublicKeyImpl.java
+sun/security/rsa/SCCS/s.RSASignature.java
+sun/security/rsa/SCCS/s.SunRsaSign.java
+sun/security/rsa/RSAKeyFactory.java
+sun/security/rsa/RSACore.java
+sun/security/rsa/RSAKeyPairGenerator.java
+sun/security/rsa/RSAPadding.java
+sun/security/rsa/RSAPrivateCrtKeyImpl.java
+sun/security/rsa/RSAPrivateKeyImpl.java
+sun/security/rsa/RSAPublicKeyImpl.java
+sun/security/rsa/RSASignature.java
+sun/security/rsa/SunRsaSign.java
+sun/security/timestamp
+sun/security/timestamp/SCCS
+sun/security/timestamp/SCCS/s.HttpTimestamper.java
+sun/security/timestamp/SCCS/s.TSRequest.java
+sun/security/timestamp/SCCS/s.TSResponse.java
+sun/security/timestamp/SCCS/s.TimestampToken.java
+sun/security/timestamp/SCCS/s.Timestamper.java
+sun/security/timestamp/HttpTimestamper.java
+sun/security/timestamp/TSRequest.java
+sun/security/timestamp/TSResponse.java
+sun/security/timestamp/TimestampToken.java
+sun/security/timestamp/Timestamper.java
+sun/security/tools
+sun/security/tools/SCCS
+sun/security/tools/SCCS/s.JarSignerResources.java
+sun/security/tools/SCCS/s.JarSigner.java
+sun/security/tools/SCCS/s.JarSignerResources_ja.java
+sun/security/tools/SCCS/s.KeyTool.java
+sun/security/tools/SCCS/s.PolicyTool.java
+sun/security/tools/SCCS/s.TimestampedSigner.java
+sun/security/tools/JarSignerResources.java
+sun/security/tools/JarSigner.java
+sun/security/tools/JarSignerResources_ja.java
+sun/security/tools/KeyTool.java
+sun/security/tools/PolicyTool.java
+sun/security/tools/TimestampedSigner.java
+sun/security/util
+sun/security/util/SCCS
+sun/security/util/SCCS/s.AuthResources_zh_CN.java
+sun/security/util/SCCS/s.AuthResources.java
+sun/security/util/SCCS/s.AuthResources_de.java
+sun/security/util/SCCS/s.AuthResources_es.java
+sun/security/util/SCCS/s.AuthResources_fr.java
+sun/security/util/SCCS/s.AuthResources_it.java
+sun/security/util/SCCS/s.AuthResources_ja.java
+sun/security/util/SCCS/s.AuthResources_ko.java
+sun/security/util/SCCS/s.AuthResources_sv.java
+sun/security/util/SCCS/s.AuthResources_zh_TW.java
+sun/security/util/SCCS/s.BigInt.java
+sun/security/util/SCCS/s.BitArray.java
+sun/security/util/SCCS/s.ByteArrayLexOrder.java
+sun/security/util/SCCS/s.Cache.java
+sun/security/util/SCCS/s.ByteArrayTagOrder.java
+sun/security/util/SCCS/s.Debug.java
+sun/security/util/SCCS/s.DerEncoder.java
+sun/security/util/SCCS/s.DerIndefLenConverter.java
+sun/security/util/SCCS/s.DerInputBuffer.java
+sun/security/util/SCCS/s.DerInputStream.java
+sun/security/util/SCCS/s.DerOutputStream.java
+sun/security/util/SCCS/s.DerValue.java
+sun/security/util/SCCS/s.HostnameChecker.java
+sun/security/util/SCCS/s.ManifestDigester.java
+sun/security/util/SCCS/s.ManifestEntryVerifier.java
+sun/security/util/SCCS/s.ObjectIdentifier.java
+sun/security/util/SCCS/s.Password.java
+sun/security/util/SCCS/s.PendingException.java
+sun/security/util/SCCS/s.PropertyExpander.java
+sun/security/util/SCCS/s.Resources.java
+sun/security/util/SCCS/s.ResourcesMgr.java
+sun/security/util/SCCS/s.PathList.java
+sun/security/util/SCCS/s.Resources_de.java
+sun/security/util/SCCS/s.Resources_es.java
+sun/security/util/SCCS/s.Resources_fr.java
+sun/security/util/SCCS/s.Resources_it.java
+sun/security/util/SCCS/s.Resources_ja.java
+sun/security/util/SCCS/s.Resources_ko.java
+sun/security/util/SCCS/s.Resources_sv.java
+sun/security/util/SCCS/s.Resources_zh_CN.java
+sun/security/util/SCCS/s.Resources_zh_TW.java
+sun/security/util/SCCS/s.SecurityConstants.java
+sun/security/util/SCCS/s.SignatureFileVerifier.java
+sun/security/util/SCCS/s.PolicyUtil.java
+sun/security/util/AuthResources_de.java
+sun/security/util/AuthResources.java
+sun/security/util/DerIndefLenConverter.java
+sun/security/util/AuthResources_es.java
+sun/security/util/AuthResources_fr.java
+sun/security/util/AuthResources_it.java
+sun/security/util/AuthResources_ja.java
+sun/security/util/AuthResources_ko.java
+sun/security/util/AuthResources_sv.java
+sun/security/util/AuthResources_zh_CN.java
+sun/security/util/AuthResources_zh_TW.java
+sun/security/util/BigInt.java
+sun/security/util/BitArray.java
+sun/security/util/ByteArrayLexOrder.java
+sun/security/util/ByteArrayTagOrder.java
+sun/security/util/Cache.java
+sun/security/util/Debug.java
+sun/security/util/DerEncoder.java
+sun/security/util/DerOutputStream.java
+sun/security/util/DerInputBuffer.java
+sun/security/util/DerInputStream.java
+sun/security/util/HostnameChecker.java
+sun/security/util/DerValue.java
+sun/security/util/Resources_zh_CN.java
+sun/security/util/ManifestDigester.java
+sun/security/util/ManifestEntryVerifier.java
+sun/security/util/ObjectIdentifier.java
+sun/security/util/Password.java
+sun/security/util/PendingException.java
+sun/security/util/PropertyExpander.java
+sun/security/util/Resources.java
+sun/security/util/ResourcesMgr.java
+sun/security/util/Resources_de.java
+sun/security/util/Resources_es.java
+sun/security/util/Resources_fr.java
+sun/security/util/Resources_it.java
+sun/security/util/Resources_ja.java
+sun/security/util/Resources_ko.java
+sun/security/util/Resources_sv.java
+sun/security/util/SignatureFileVerifier.java
+sun/security/util/Resources_zh_TW.java
+sun/security/util/SecurityConstants.java
+sun/security/util/PolicyUtil.java
+sun/security/util/PathList.java
+sun/security/validator
+sun/security/validator/SCCS
+sun/security/validator/SCCS/s.ValidatorException.java
+sun/security/validator/SCCS/s.EndEntityChecker.java
+sun/security/validator/SCCS/s.KeyStores.java
+sun/security/validator/SCCS/s.PKIXValidator.java
+sun/security/validator/SCCS/s.SimpleValidator.java
+sun/security/validator/SCCS/s.Validator.java
+sun/security/validator/EndEntityChecker.java
+sun/security/validator/KeyStores.java
+sun/security/validator/PKIXValidator.java
+sun/security/validator/SimpleValidator.java
+sun/security/validator/Validator.java
+sun/security/validator/ValidatorException.java
+sun/security/x509
+sun/security/x509/SCCS
+sun/security/x509/SCCS/s.AlgIdDSA.java
+sun/security/x509/SCCS/s.AVA.java
+sun/security/x509/SCCS/s.AuthorityKeyIdentifierExtension.java
+sun/security/x509/SCCS/s.AccessDescription.java
+sun/security/x509/SCCS/s.AlgorithmId.java
+sun/security/x509/SCCS/s.AttributeNameEnumeration.java
+sun/security/x509/SCCS/s.CRLDistributionPointsExtension.java
+sun/security/x509/SCCS/s.BasicConstraintsExtension.java
+sun/security/x509/SCCS/s.CRLReasonCodeExtension.java
+sun/security/x509/SCCS/s.CRLExtensions.java
+sun/security/x509/SCCS/s.CRLNumberExtension.java
+sun/security/x509/SCCS/s.CertAndKeyGen.java
+sun/security/x509/SCCS/s.DNSName.java
+sun/security/x509/SCCS/s.GeneralNameInterface.java
+sun/security/x509/SCCS/s.CertAttrSet.java
+sun/security/x509/SCCS/s.CertException.java
+sun/security/x509/SCCS/s.CertParseError.java
+sun/security/x509/SCCS/s.CertificateAlgorithmId.java
+sun/security/x509/SCCS/s.CertificateExtensions.java
+sun/security/x509/SCCS/s.CertificateIssuerExtension.java
+sun/security/x509/SCCS/s.CertificateIssuerName.java
+sun/security/x509/SCCS/s.CertificateIssuerUniqueIdentity.java
+sun/security/x509/SCCS/s.CertificatePoliciesExtension.java
+sun/security/x509/SCCS/s.CertificatePolicyId.java
+sun/security/x509/SCCS/s.CertificatePolicyMap.java
+sun/security/x509/SCCS/s.CertificatePolicySet.java
+sun/security/x509/SCCS/s.CertificateSerialNumber.java
+sun/security/x509/SCCS/s.CertificateSubjectName.java
+sun/security/x509/SCCS/s.CertificateSubjectUniqueIdentity.java
+sun/security/x509/SCCS/s.CertificateValidity.java
+sun/security/x509/SCCS/s.CertificateVersion.java
+sun/security/x509/SCCS/s.CertificateX509Key.java
+sun/security/x509/SCCS/s.EDIPartyName.java
+sun/security/x509/SCCS/s.DistributionPoint.java
+sun/security/x509/SCCS/s.Extension.java
+sun/security/x509/SCCS/s.ExtendedKeyUsageExtension.java
+sun/security/x509/SCCS/s.GeneralName.java
+sun/security/x509/SCCS/s.GeneralNames.java
+sun/security/x509/SCCS/s.GeneralSubtree.java
+sun/security/x509/SCCS/s.GeneralSubtrees.java
+sun/security/x509/SCCS/s.OIDMap.java
+sun/security/x509/SCCS/s.PKIXExtensions.java
+sun/security/x509/SCCS/s.IPAddressName.java
+sun/security/x509/SCCS/s.InhibitAnyPolicyExtension.java
+sun/security/x509/SCCS/s.IssuerAlternativeNameExtension.java
+sun/security/x509/SCCS/s.KeyIdentifier.java
+sun/security/x509/SCCS/s.KeyUsageExtension.java
+sun/security/x509/SCCS/s.NameConstraintsExtension.java
+sun/security/x509/SCCS/s.NetscapeCertTypeExtension.java
+sun/security/x509/SCCS/s.OIDName.java
+sun/security/x509/SCCS/s.OtherName.java
+sun/security/x509/SCCS/s.RDN.java
+sun/security/x509/SCCS/s.PolicyConstraintsExtension.java
+sun/security/x509/SCCS/s.PolicyInformation.java
+sun/security/x509/SCCS/s.PolicyMappingsExtension.java
+sun/security/x509/SCCS/s.AuthorityInfoAccessExtension.java
+sun/security/x509/SCCS/s.PrivateKeyUsageExtension.java
+sun/security/x509/SCCS/s.README
+sun/security/x509/SCCS/s.RFC822Name.java
+sun/security/x509/SCCS/s.ReasonFlags.java
+sun/security/x509/SCCS/s.SerialNumber.java
+sun/security/x509/SCCS/s.URIName.java
+sun/security/x509/SCCS/s.UniqueIdentity.java
+sun/security/x509/SCCS/s.SubjectAlternativeNameExtension.java
+sun/security/x509/SCCS/s.SubjectKeyIdentifierExtension.java
+sun/security/x509/SCCS/s.X400Address.java
+sun/security/x509/SCCS/s.X500Name.java
+sun/security/x509/SCCS/s.X500Signer.java
+sun/security/x509/SCCS/s.X509AttributeName.java
+sun/security/x509/SCCS/s.X509CRLEntryImpl.java
+sun/security/x509/SCCS/s.X509CRLImpl.java
+sun/security/x509/SCCS/s.X509Cert.java
+sun/security/x509/SCCS/s.X509CertImpl.java
+sun/security/x509/SCCS/s.X509CertInfo.java
+sun/security/x509/SCCS/s.X509Key.java
+sun/security/x509/SCCS/s.certAttributes.html
+sun/security/x509/AlgIdDSA.java
+sun/security/x509/AVA.java
+sun/security/x509/AttributeNameEnumeration.java
+sun/security/x509/AccessDescription.java
+sun/security/x509/AlgorithmId.java
+sun/security/x509/AuthorityKeyIdentifierExtension.java
+sun/security/x509/BasicConstraintsExtension.java
+sun/security/x509/CRLDistributionPointsExtension.java
+sun/security/x509/CRLExtensions.java
+sun/security/x509/CRLNumberExtension.java
+sun/security/x509/CRLReasonCodeExtension.java
+sun/security/x509/CertAndKeyGen.java
+sun/security/x509/CertAttrSet.java
+sun/security/x509/CertificateIssuerExtension.java
+sun/security/x509/CertException.java
+sun/security/x509/CertParseError.java
+sun/security/x509/CertificateAlgorithmId.java
+sun/security/x509/CertificateExtensions.java
+sun/security/x509/CertificatePoliciesExtension.java
+sun/security/x509/CertificateIssuerName.java
+sun/security/x509/DNSName.java
+sun/security/x509/CertificateIssuerUniqueIdentity.java
+sun/security/x509/CertificatePolicyId.java
+sun/security/x509/CertificatePolicyMap.java
+sun/security/x509/CertificatePolicySet.java
+sun/security/x509/CertificateSerialNumber.java
+sun/security/x509/CertificateSubjectName.java
+sun/security/x509/IssuerAlternativeNameExtension.java
+sun/security/x509/CertificateSubjectUniqueIdentity.java
+sun/security/x509/CertificateValidity.java
+sun/security/x509/CertificateVersion.java
+sun/security/x509/CertificateX509Key.java
+sun/security/x509/DistributionPoint.java
+sun/security/x509/EDIPartyName.java
+sun/security/x509/ExtendedKeyUsageExtension.java
+sun/security/x509/Extension.java
+sun/security/x509/GeneralName.java
+sun/security/x509/GeneralNameInterface.java
+sun/security/x509/GeneralNames.java
+sun/security/x509/GeneralSubtree.java
+sun/security/x509/GeneralSubtrees.java
+sun/security/x509/IPAddressName.java
+sun/security/x509/InhibitAnyPolicyExtension.java
+sun/security/x509/OIDMap.java
+sun/security/x509/KeyUsageExtension.java
+sun/security/x509/KeyIdentifier.java
+sun/security/x509/ReasonFlags.java
+sun/security/x509/RDN.java
+sun/security/x509/NameConstraintsExtension.java
+sun/security/x509/NetscapeCertTypeExtension.java
+sun/security/x509/OIDName.java
+sun/security/x509/OtherName.java
+sun/security/x509/PKIXExtensions.java
+sun/security/x509/PolicyConstraintsExtension.java
+sun/security/x509/PolicyInformation.java
+sun/security/x509/PolicyMappingsExtension.java
+sun/security/x509/PrivateKeyUsageExtension.java
+sun/security/x509/README
+sun/security/x509/RFC822Name.java
+sun/security/x509/UniqueIdentity.java
+sun/security/x509/URIName.java
+sun/security/x509/SerialNumber.java
+sun/security/x509/SubjectAlternativeNameExtension.java
+sun/security/x509/SubjectKeyIdentifierExtension.java
+sun/security/x509/X509AttributeName.java
+sun/security/x509/X400Address.java
+sun/security/x509/X500Name.java
+sun/security/x509/X500Signer.java
+sun/security/x509/X509CRLEntryImpl.java
+sun/security/x509/X509CRLImpl.java
+sun/security/x509/X509Cert.java
+sun/security/x509/X509CertImpl.java
+sun/security/x509/X509CertInfo.java
+sun/security/x509/X509Key.java
+sun/security/x509/certAttributes.html
+sun/security/x509/AuthorityInfoAccessExtension.java
+sun/security/pkcs11
+sun/security/pkcs11/SCCS
+sun/security/pkcs11/SCCS/s.JarVerifierImpl.java
+sun/security/pkcs11/SCCS/s.Config.java
+sun/security/pkcs11/SCCS/s.P11Cipher.java
+sun/security/pkcs11/SCCS/s.KeyCache.java
+sun/security/pkcs11/SCCS/s.P11DHKeyFactory.java
+sun/security/pkcs11/SCCS/s.P11DSAKeyFactory.java
+sun/security/pkcs11/SCCS/s.P11Digest.java
+sun/security/pkcs11/SCCS/s.P11Key.java
+sun/security/pkcs11/SCCS/s.P11KeyAgreement.java
+sun/security/pkcs11/SCCS/s.P11KeyFactory.java
+sun/security/pkcs11/SCCS/s.P11KeyGenerator.java
+sun/security/pkcs11/SCCS/s.P11KeyPairGenerator.java
+sun/security/pkcs11/SCCS/s.P11KeyStore.java
+sun/security/pkcs11/SCCS/s.P11Mac.java
+sun/security/pkcs11/SCCS/s.P11RSACipher.java
+sun/security/pkcs11/SCCS/s.P11RSAKeyFactory.java
+sun/security/pkcs11/SCCS/s.P11SecretKeyFactory.java
+sun/security/pkcs11/SCCS/s.P11SecureRandom.java
+sun/security/pkcs11/SCCS/s.P11Signature.java
+sun/security/pkcs11/SCCS/s.P11Util.java
+sun/security/pkcs11/SCCS/s.Session.java
+sun/security/pkcs11/SCCS/s.SessionManager.java
+sun/security/pkcs11/SCCS/s.SunPKCS11.java
+sun/security/pkcs11/SCCS/s.TemplateManager.java
+sun/security/pkcs11/SCCS/s.Token.java
+sun/security/pkcs11/wrapper
+sun/security/pkcs11/wrapper/SCCS
+sun/security/pkcs11/wrapper/SCCS/s.CK_CREATEMUTEX.java
+sun/security/pkcs11/wrapper/SCCS/s.CK_ATTRIBUTE.java
+sun/security/pkcs11/wrapper/SCCS/s.CK_X9_42_DH1_DERIVE_PARAMS.java
+sun/security/pkcs11/wrapper/SCCS/s.CK_C_INITIALIZE_ARGS.java
+sun/security/pkcs11/wrapper/SCCS/s.CK_DATE.java
+sun/security/pkcs11/wrapper/SCCS/s.CK_DESTROYMUTEX.java
+sun/security/pkcs11/wrapper/SCCS/s.CK_ECDH1_DERIVE_PARAMS.java
+sun/security/pkcs11/wrapper/SCCS/s.CK_ECDH2_DERIVE_PARAMS.java
+sun/security/pkcs11/wrapper/SCCS/s.CK_INFO.java
+sun/security/pkcs11/wrapper/SCCS/s.CK_LOCKMUTEX.java
+sun/security/pkcs11/wrapper/SCCS/s.CK_MECHANISM.java
+sun/security/pkcs11/wrapper/SCCS/s.CK_MECHANISM_INFO.java
+sun/security/pkcs11/wrapper/SCCS/s.CK_NOTIFY.java
+sun/security/pkcs11/wrapper/SCCS/s.CK_PBE_PARAMS.java
+sun/security/pkcs11/wrapper/SCCS/s.CK_SESSION_INFO.java
+sun/security/pkcs11/wrapper/SCCS/s.CK_PKCS5_PBKD2_PARAMS.java
+sun/security/pkcs11/wrapper/SCCS/s.CK_RSA_PKCS_OAEP_PARAMS.java
+sun/security/pkcs11/wrapper/SCCS/s.CK_RSA_PKCS_PSS_PARAMS.java
+sun/security/pkcs11/wrapper/SCCS/s.CK_SLOT_INFO.java
+sun/security/pkcs11/wrapper/SCCS/s.CK_TOKEN_INFO.java
+sun/security/pkcs11/wrapper/SCCS/s.CK_UNLOCKMUTEX.java
+sun/security/pkcs11/wrapper/SCCS/s.CK_VERSION.java
+sun/security/pkcs11/wrapper/SCCS/s.CK_X9_42_DH2_DERIVE_PARAMS.java
+sun/security/pkcs11/wrapper/SCCS/s.Constants.java
+sun/security/pkcs11/wrapper/SCCS/s.Functions.java
+sun/security/pkcs11/wrapper/SCCS/s.PKCS11.java
+sun/security/pkcs11/wrapper/SCCS/s.PKCS11Constants.java
+sun/security/pkcs11/wrapper/SCCS/s.PKCS11Exception.java
+sun/security/pkcs11/wrapper/SCCS/s.PKCS11RuntimeException.java
+sun/security/pkcs11/wrapper/CK_C_INITIALIZE_ARGS.java
+sun/security/pkcs11/wrapper/CK_ATTRIBUTE.java
+sun/security/pkcs11/wrapper/CK_CREATEMUTEX.java
+sun/security/pkcs11/wrapper/CK_DESTROYMUTEX.java
+sun/security/pkcs11/wrapper/CK_DATE.java
+sun/security/pkcs11/wrapper/CK_ECDH1_DERIVE_PARAMS.java
+sun/security/pkcs11/wrapper/CK_ECDH2_DERIVE_PARAMS.java
+sun/security/pkcs11/wrapper/CK_INFO.java
+sun/security/pkcs11/wrapper/CK_LOCKMUTEX.java
+sun/security/pkcs11/wrapper/CK_MECHANISM.java
+sun/security/pkcs11/wrapper/CK_MECHANISM_INFO.java
+sun/security/pkcs11/wrapper/CK_NOTIFY.java
+sun/security/pkcs11/wrapper/CK_PBE_PARAMS.java
+sun/security/pkcs11/wrapper/CK_PKCS5_PBKD2_PARAMS.java
+sun/security/pkcs11/wrapper/PKCS11.java
+sun/security/pkcs11/wrapper/CK_SESSION_INFO.java
+sun/security/pkcs11/wrapper/CK_RSA_PKCS_OAEP_PARAMS.java
+sun/security/pkcs11/wrapper/CK_RSA_PKCS_PSS_PARAMS.java
+sun/security/pkcs11/wrapper/CK_SLOT_INFO.java
+sun/security/pkcs11/wrapper/CK_TOKEN_INFO.java
+sun/security/pkcs11/wrapper/CK_UNLOCKMUTEX.java
+sun/security/pkcs11/wrapper/CK_VERSION.java
+sun/security/pkcs11/wrapper/CK_X9_42_DH1_DERIVE_PARAMS.java
+sun/security/pkcs11/wrapper/CK_X9_42_DH2_DERIVE_PARAMS.java
+sun/security/pkcs11/wrapper/Constants.java
+sun/security/pkcs11/wrapper/Functions.java
+sun/security/pkcs11/wrapper/PKCS11RuntimeException.java
+sun/security/pkcs11/wrapper/PKCS11Constants.java
+sun/security/pkcs11/wrapper/PKCS11Exception.java
+sun/security/pkcs11/KeyCache.java
+sun/security/pkcs11/Config.java
+sun/security/pkcs11/JarVerifierImpl.java
+sun/security/pkcs11/P11Cipher.java
+sun/security/pkcs11/P11DHKeyFactory.java
+sun/security/pkcs11/P11DSAKeyFactory.java
+sun/security/pkcs11/P11Digest.java
+sun/security/pkcs11/P11Key.java
+sun/security/pkcs11/P11KeyAgreement.java
+sun/security/pkcs11/P11KeyFactory.java
+sun/security/pkcs11/P11KeyGenerator.java
+sun/security/pkcs11/P11KeyPairGenerator.java
+sun/security/pkcs11/P11KeyStore.java
+sun/security/pkcs11/P11Mac.java
+sun/security/pkcs11/P11RSACipher.java
+sun/security/pkcs11/P11RSAKeyFactory.java
+sun/security/pkcs11/P11SecretKeyFactory.java
+sun/security/pkcs11/P11SecureRandom.java
+sun/security/pkcs11/P11Signature.java
+sun/security/pkcs11/P11Util.java
+sun/security/pkcs11/Session.java
+sun/security/pkcs11/SessionManager.java
+sun/security/pkcs11/SunPKCS11.java
+sun/security/pkcs11/TemplateManager.java
+sun/security/pkcs11/Token.java
+sun/swing
+sun/swing/SCCS
+sun/swing/SCCS/s.PrintColorUIResource.java
+sun/swing/SCCS/s.BakedArrayList.java
+sun/swing/SCCS/s.DefaultLookup.java
+sun/swing/SCCS/s.FilePane.java
+sun/swing/SCCS/s.SwingLazyValue.java
+sun/swing/SCCS/s.UIAction.java
+sun/swing/SCCS/s.WindowsPlacesBar.java
+sun/swing/SCCS/s.CachedPainter.java
+sun/swing/SCCS/s.ImageIconUIResource.java
+sun/swing/plaf
+sun/swing/plaf/synth
+sun/swing/plaf/synth/SCCS
+sun/swing/plaf/synth/SCCS/s.SynthFileChooserUIImpl.java
+sun/swing/plaf/synth/SCCS/s.DefaultSynthStyle.java
+sun/swing/plaf/synth/SCCS/s.StyleAssociation.java
+sun/swing/plaf/synth/SCCS/s.SynthFileChooserUI.java
+sun/swing/plaf/synth/SCCS/s.SynthIcon.java
+sun/swing/plaf/synth/SCCS/s.SynthUI.java
+sun/swing/plaf/synth/SCCS/s.Paint9Painter.java
+sun/swing/plaf/synth/SynthFileChooserUIImpl.java
+sun/swing/plaf/synth/DefaultSynthStyle.java
+sun/swing/plaf/synth/StyleAssociation.java
+sun/swing/plaf/synth/SynthFileChooserUI.java
+sun/swing/plaf/synth/SynthIcon.java
+sun/swing/plaf/synth/SynthUI.java
+sun/swing/plaf/synth/Paint9Painter.java
+sun/swing/WindowsPlacesBar.java
+sun/swing/BakedArrayList.java
+sun/swing/DefaultLookup.java
+sun/swing/FilePane.java
+sun/swing/SwingLazyValue.java
+sun/swing/UIAction.java
+sun/swing/PrintColorUIResource.java
+sun/swing/CachedPainter.java
+sun/swing/ImageIconUIResource.java
+sun/text
+sun/text/SCCS
+sun/text/SCCS/s.CompactByteArray.java
+sun/text/SCCS/s.CharTrie.java
+sun/text/SCCS/s.CodePointIterator.java
+sun/text/SCCS/s.CompactCharArray.java
+sun/text/SCCS/s.CompactIntArray.java
+sun/text/SCCS/s.CompactShortArray.java
+sun/text/SCCS/s.ComposedCharIter.java
+sun/text/SCCS/s.ICUBinary.java
+sun/text/SCCS/s.IntHashtable.java
+sun/text/SCCS/s.IntTrie.java
+sun/text/SCCS/s.Normalizer.java
+sun/text/SCCS/s.NormalizerDataReader.java
+sun/text/SCCS/s.NormalizerImpl.java
+sun/text/SCCS/s.NormalizerUtilities.java
+sun/text/SCCS/s.Trie.java
+sun/text/SCCS/s.Utility.java
+sun/text/SCCS/s.SupplementaryCharacterData.java
+sun/text/SCCS/s.UCharacterIterator.java
+sun/text/SCCS/s.UCompactIntArray.java
+sun/text/resources
+sun/text/resources/SCCS
+sun/text/resources/SCCS/s.BreakIteratorRules_th.java
+sun/text/resources/SCCS/s.BreakIteratorInfo.java
+sun/text/resources/SCCS/s.BreakIteratorInfo_th.java
+sun/text/resources/SCCS/s.BreakIteratorRules.java
+sun/text/resources/SCCS/s.DateFormatZoneData.java
+sun/text/resources/SCCS/s.DateFormatZoneData_ar.java
+sun/text/resources/SCCS/s.DateFormatZoneData_be.java
+sun/text/resources/SCCS/s.DateFormatZoneData_bg.java
+sun/text/resources/SCCS/s.DateFormatZoneData_ca.java
+sun/text/resources/SCCS/s.DateFormatZoneData_cs.java
+sun/text/resources/SCCS/s.DateFormatZoneData_da.java
+sun/text/resources/SCCS/s.LocaleElements.java
+sun/text/resources/SCCS/s.LocaleData.java
+sun/text/resources/SCCS/s.DateFormatZoneData_de.java
+sun/text/resources/SCCS/s.DateFormatZoneData_de_AT.java
+sun/text/resources/SCCS/s.DateFormatZoneData_de_CH.java
+sun/text/resources/SCCS/s.DateFormatZoneData_el.java
+sun/text/resources/SCCS/s.DateFormatZoneData_en.java
+sun/text/resources/SCCS/s.DateFormatZoneData_en_CA.java
+sun/text/resources/SCCS/s.DateFormatZoneData_en_GB.java
+sun/text/resources/SCCS/s.DateFormatZoneData_en_IE.java
+sun/text/resources/SCCS/s.DateFormatZoneData_en_IN.java
+sun/text/resources/SCCS/s.DateFormatZoneData_es.java
+sun/text/resources/SCCS/s.DateFormatZoneData_et.java
+sun/text/resources/SCCS/s.DateFormatZoneData_fi.java
+sun/text/resources/SCCS/s.thai_dict
+sun/text/resources/SCCS/s.DateFormatZoneData_fr.java
+sun/text/resources/SCCS/s.DateFormatZoneData_fr_BE.java
+sun/text/resources/SCCS/s.DateFormatZoneData_fr_CA.java
+sun/text/resources/SCCS/s.DateFormatZoneData_fr_CH.java
+sun/text/resources/SCCS/s.DateFormatZoneData_hi_IN.java
+sun/text/resources/SCCS/s.DateFormatZoneData_hr.java
+sun/text/resources/SCCS/s.DateFormatZoneData_hu.java
+sun/text/resources/SCCS/s.DateFormatZoneData_is.java
+sun/text/resources/SCCS/s.DateFormatZoneData_it.java
+sun/text/resources/SCCS/s.DateFormatZoneData_it_CH.java
+sun/text/resources/SCCS/s.DateFormatZoneData_iw.java
+sun/text/resources/SCCS/s.DateFormatZoneData_ja.java
+sun/text/resources/SCCS/s.unorm.icu
+sun/text/resources/SCCS/s.DateFormatZoneData_ko.java
+sun/text/resources/SCCS/s.DateFormatZoneData_lt.java
+sun/text/resources/SCCS/s.DateFormatZoneData_lv.java
+sun/text/resources/SCCS/s.DateFormatZoneData_mk.java
+sun/text/resources/SCCS/s.DateFormatZoneData_nl.java
+sun/text/resources/SCCS/s.DateFormatZoneData_nl_BE.java
+sun/text/resources/SCCS/s.DateFormatZoneData_no.java
+sun/text/resources/SCCS/s.DateFormatZoneData_no_NO_NY.java
+sun/text/resources/SCCS/s.DateFormatZoneData_pl.java
+sun/text/resources/SCCS/s.DateFormatZoneData_pt.java
+sun/text/resources/SCCS/s.DateFormatZoneData_ro.java
+sun/text/resources/SCCS/s.DateFormatZoneData_ru.java
+sun/text/resources/SCCS/s.DateFormatZoneData_sk.java
+sun/text/resources/SCCS/s.DateFormatZoneData_sl.java
+sun/text/resources/SCCS/s.DateFormatZoneData_sq.java
+sun/text/resources/SCCS/s.DateFormatZoneData_sv.java
+sun/text/resources/SCCS/s.DateFormatZoneData_th.java
+sun/text/resources/SCCS/s.DateFormatZoneData_tr.java
+sun/text/resources/SCCS/s.DateFormatZoneData_uk.java
+sun/text/resources/SCCS/s.DateFormatZoneData_zh_CN.java
+sun/text/resources/SCCS/s.DateFormatZoneData_zh_HK.java
+sun/text/resources/SCCS/s.DateFormatZoneData_zh_TW.java
+sun/text/resources/SCCS/s.LocaleElements_ar.java
+sun/text/resources/SCCS/s.LocaleElements_ar_AE.java
+sun/text/resources/SCCS/s.LocaleElements_ar_BH.java
+sun/text/resources/SCCS/s.LocaleElements_ar_DZ.java
+sun/text/resources/SCCS/s.LocaleElements_ar_EG.java
+sun/text/resources/SCCS/s.LocaleElements_ar_IQ.java
+sun/text/resources/SCCS/s.LocaleElements_ar_JO.java
+sun/text/resources/SCCS/s.LocaleElements_ar_KW.java
+sun/text/resources/SCCS/s.LocaleElements_ar_LB.java
+sun/text/resources/SCCS/s.LocaleElements_ar_LY.java
+sun/text/resources/SCCS/s.LocaleElements_ar_MA.java
+sun/text/resources/SCCS/s.LocaleElements_ar_OM.java
+sun/text/resources/SCCS/s.LocaleElements_ar_QA.java
+sun/text/resources/SCCS/s.LocaleElements_ar_SA.java
+sun/text/resources/SCCS/s.LocaleElements_ar_SD.java
+sun/text/resources/SCCS/s.LocaleElements_ar_SY.java
+sun/text/resources/SCCS/s.LocaleElements_ar_TN.java
+sun/text/resources/SCCS/s.LocaleElements_ar_YE.java
+sun/text/resources/SCCS/s.LocaleElements_be.java
+sun/text/resources/SCCS/s.LocaleElements_be_BY.java
+sun/text/resources/SCCS/s.LocaleElements_bg.java
+sun/text/resources/SCCS/s.LocaleElements_bg_BG.java
+sun/text/resources/SCCS/s.LocaleElements_ca.java
+sun/text/resources/SCCS/s.LocaleElements_ca_ES.java
+sun/text/resources/SCCS/s.LocaleElements_cs.java
+sun/text/resources/SCCS/s.LocaleElements_cs_CZ.java
+sun/text/resources/SCCS/s.LocaleElements_da.java
+sun/text/resources/SCCS/s.LocaleElements_da_DK.java
+sun/text/resources/SCCS/s.LocaleElements_de.java
+sun/text/resources/SCCS/s.LocaleElements_de_AT.java
+sun/text/resources/SCCS/s.LocaleElements_de_CH.java
+sun/text/resources/SCCS/s.LocaleElements_de_DE.java
+sun/text/resources/SCCS/s.LocaleElements_de_LU.java
+sun/text/resources/SCCS/s.LocaleElements_el.java
+sun/text/resources/SCCS/s.LocaleElements_el_GR.java
+sun/text/resources/SCCS/s.LocaleElements_en.java
+sun/text/resources/SCCS/s.LocaleElements_en_AU.java
+sun/text/resources/SCCS/s.LocaleElements_en_CA.java
+sun/text/resources/SCCS/s.LocaleElements_en_GB.java
+sun/text/resources/SCCS/s.LocaleElements_en_IE.java
+sun/text/resources/SCCS/s.LocaleElements_en_IN.java
+sun/text/resources/SCCS/s.LocaleElements_en_NZ.java
+sun/text/resources/SCCS/s.LocaleElements_en_US.java
+sun/text/resources/SCCS/s.LocaleElements_en_ZA.java
+sun/text/resources/SCCS/s.LocaleElements_es.java
+sun/text/resources/SCCS/s.LocaleElements_es_AR.java
+sun/text/resources/SCCS/s.LocaleElements_es_BO.java
+sun/text/resources/SCCS/s.LocaleElements_es_CL.java
+sun/text/resources/SCCS/s.LocaleElements_es_CO.java
+sun/text/resources/SCCS/s.LocaleElements_es_CR.java
+sun/text/resources/SCCS/s.LocaleElements_es_DO.java
+sun/text/resources/SCCS/s.LocaleElements_es_EC.java
+sun/text/resources/SCCS/s.LocaleElements_es_ES.java
+sun/text/resources/SCCS/s.LocaleElements_es_GT.java
+sun/text/resources/SCCS/s.LocaleElements_es_HN.java
+sun/text/resources/SCCS/s.LocaleElements_es_MX.java
+sun/text/resources/SCCS/s.LocaleElements_es_NI.java
+sun/text/resources/SCCS/s.LocaleElements_es_PA.java
+sun/text/resources/SCCS/s.LocaleElements_es_PE.java
+sun/text/resources/SCCS/s.LocaleElements_es_PR.java
+sun/text/resources/SCCS/s.LocaleElements_es_PY.java
+sun/text/resources/SCCS/s.LocaleElements_es_SV.java
+sun/text/resources/SCCS/s.LocaleElements_es_UY.java
+sun/text/resources/SCCS/s.LocaleElements_es_VE.java
+sun/text/resources/SCCS/s.LocaleElements_et.java
+sun/text/resources/SCCS/s.LocaleElements_et_EE.java
+sun/text/resources/SCCS/s.LocaleElements_fi.java
+sun/text/resources/SCCS/s.LocaleElements_fi_FI.java
+sun/text/resources/SCCS/s.LocaleElements_fr.java
+sun/text/resources/SCCS/s.LocaleElements_fr_BE.java
+sun/text/resources/SCCS/s.LocaleElements_fr_CA.java
+sun/text/resources/SCCS/s.LocaleElements_fr_CH.java
+sun/text/resources/SCCS/s.LocaleElements_fr_FR.java
+sun/text/resources/SCCS/s.LocaleElements_fr_LU.java
+sun/text/resources/SCCS/s.LocaleElements_hi_IN.java
+sun/text/resources/SCCS/s.LocaleElements_hr.java
+sun/text/resources/SCCS/s.LocaleElements_hr_HR.java
+sun/text/resources/SCCS/s.LocaleElements_hu.java
+sun/text/resources/SCCS/s.LocaleElements_hu_HU.java
+sun/text/resources/SCCS/s.LocaleElements_is.java
+sun/text/resources/SCCS/s.LocaleElements_is_IS.java
+sun/text/resources/SCCS/s.LocaleElements_it.java
+sun/text/resources/SCCS/s.LocaleElements_it_CH.java
+sun/text/resources/SCCS/s.LocaleElements_it_IT.java
+sun/text/resources/SCCS/s.LocaleElements_iw.java
+sun/text/resources/SCCS/s.LocaleElements_iw_IL.java
+sun/text/resources/SCCS/s.LocaleElements_ja.java
+sun/text/resources/SCCS/s.LocaleElements_ja_JP.java
+sun/text/resources/SCCS/s.LocaleElements_ko.java
+sun/text/resources/SCCS/s.LocaleElements_ko_KR.java
+sun/text/resources/SCCS/s.LocaleElements_lt.java
+sun/text/resources/SCCS/s.LocaleElements_lt_LT.java
+sun/text/resources/SCCS/s.LocaleElements_lv.java
+sun/text/resources/SCCS/s.LocaleElements_lv_LV.java
+sun/text/resources/SCCS/s.LocaleElements_mk.java
+sun/text/resources/SCCS/s.LocaleElements_mk_MK.java
+sun/text/resources/SCCS/s.LocaleElements_nl.java
+sun/text/resources/SCCS/s.LocaleElements_nl_BE.java
+sun/text/resources/SCCS/s.LocaleElements_nl_NL.java
+sun/text/resources/SCCS/s.LocaleElements_no.java
+sun/text/resources/SCCS/s.LocaleElements_no_NO.java
+sun/text/resources/SCCS/s.LocaleElements_no_NO_NY.java
+sun/text/resources/SCCS/s.LocaleElements_pl.java
+sun/text/resources/SCCS/s.LocaleElements_pl_PL.java
+sun/text/resources/SCCS/s.LocaleElements_pt.java
+sun/text/resources/SCCS/s.LocaleElements_pt_BR.java
+sun/text/resources/SCCS/s.LocaleElements_pt_PT.java
+sun/text/resources/SCCS/s.LocaleElements_ro.java
+sun/text/resources/SCCS/s.LocaleElements_ro_RO.java
+sun/text/resources/SCCS/s.LocaleElements_ru.java
+sun/text/resources/SCCS/s.LocaleElements_ru_RU.java
+sun/text/resources/SCCS/s.LocaleElements_sk.java
+sun/text/resources/SCCS/s.LocaleElements_sk_SK.java
+sun/text/resources/SCCS/s.LocaleElements_sl.java
+sun/text/resources/SCCS/s.LocaleElements_sl_SI.java
+sun/text/resources/SCCS/s.LocaleElements_sq.java
+sun/text/resources/SCCS/s.LocaleElements_sq_AL.java
+sun/text/resources/SCCS/s.LocaleElements_sv.java
+sun/text/resources/SCCS/s.LocaleElements_sv_SE.java
+sun/text/resources/SCCS/s.LocaleElements_th.java
+sun/text/resources/SCCS/s.LocaleElements_th_TH.java
+sun/text/resources/SCCS/s.LocaleElements_th_TH_TH.java
+sun/text/resources/SCCS/s.LocaleElements_tr.java
+sun/text/resources/SCCS/s.LocaleElements_tr_TR.java
+sun/text/resources/SCCS/s.LocaleElements_uk.java
+sun/text/resources/SCCS/s.LocaleElements_uk_UA.java
+sun/text/resources/SCCS/s.LocaleElements_vi.java
+sun/text/resources/SCCS/s.LocaleElements_vi_VN.java
+sun/text/resources/SCCS/s.LocaleElements_zh.java
+sun/text/resources/SCCS/s.LocaleElements_zh_CN.java
+sun/text/resources/SCCS/s.LocaleElements_zh_HK.java
+sun/text/resources/SCCS/s.LocaleElements_zh_TW.java
+sun/text/resources/BreakIteratorInfo_th.java
+sun/text/resources/BreakIteratorInfo.java
+sun/text/resources/BreakIteratorRules.java
+sun/text/resources/BreakIteratorRules_th.java
+sun/text/resources/DateFormatZoneData.java
+sun/text/resources/DateFormatZoneData_ar.java
+sun/text/resources/DateFormatZoneData_be.java
+sun/text/resources/DateFormatZoneData_bg.java
+sun/text/resources/DateFormatZoneData_ca.java
+sun/text/resources/DateFormatZoneData_cs.java
+sun/text/resources/DateFormatZoneData_da.java
+sun/text/resources/DateFormatZoneData_de.java
+sun/text/resources/thai_dict
+sun/text/resources/LocaleData.java
+sun/text/resources/DateFormatZoneData_de_AT.java
+sun/text/resources/DateFormatZoneData_de_CH.java
+sun/text/resources/DateFormatZoneData_el.java
+sun/text/resources/DateFormatZoneData_en.java
+sun/text/resources/DateFormatZoneData_en_CA.java
+sun/text/resources/DateFormatZoneData_en_GB.java
+sun/text/resources/DateFormatZoneData_en_IE.java
+sun/text/resources/DateFormatZoneData_en_IN.java
+sun/text/resources/DateFormatZoneData_es.java
+sun/text/resources/DateFormatZoneData_et.java
+sun/text/resources/DateFormatZoneData_fi.java
+sun/text/resources/DateFormatZoneData_fr.java
+sun/text/resources/DateFormatZoneData_fr_BE.java
+sun/text/resources/DateFormatZoneData_fr_CA.java
+sun/text/resources/DateFormatZoneData_fr_CH.java
+sun/text/resources/DateFormatZoneData_hi_IN.java
+sun/text/resources/DateFormatZoneData_hr.java
+sun/text/resources/DateFormatZoneData_hu.java
+sun/text/resources/DateFormatZoneData_is.java
+sun/text/resources/DateFormatZoneData_it.java
+sun/text/resources/DateFormatZoneData_it_CH.java
+sun/text/resources/DateFormatZoneData_iw.java
+sun/text/resources/DateFormatZoneData_ja.java
+sun/text/resources/DateFormatZoneData_ko.java
+sun/text/resources/DateFormatZoneData_lt.java
+sun/text/resources/DateFormatZoneData_lv.java
+sun/text/resources/LocaleElements.java
+sun/text/resources/DateFormatZoneData_mk.java
+sun/text/resources/DateFormatZoneData_nl.java
+sun/text/resources/DateFormatZoneData_nl_BE.java
+sun/text/resources/DateFormatZoneData_no.java
+sun/text/resources/DateFormatZoneData_no_NO_NY.java
+sun/text/resources/DateFormatZoneData_pl.java
+sun/text/resources/DateFormatZoneData_pt.java
+sun/text/resources/DateFormatZoneData_ro.java
+sun/text/resources/DateFormatZoneData_ru.java
+sun/text/resources/DateFormatZoneData_sk.java
+sun/text/resources/DateFormatZoneData_sl.java
+sun/text/resources/DateFormatZoneData_sq.java
+sun/text/resources/DateFormatZoneData_sv.java
+sun/text/resources/LocaleElements_ar.java
+sun/text/resources/DateFormatZoneData_th.java
+sun/text/resources/DateFormatZoneData_tr.java
+sun/text/resources/DateFormatZoneData_uk.java
+sun/text/resources/DateFormatZoneData_zh_CN.java
+sun/text/resources/DateFormatZoneData_zh_HK.java
+sun/text/resources/DateFormatZoneData_zh_TW.java
+sun/text/resources/LocaleElements_ar_AE.java
+sun/text/resources/LocaleElements_ar_BH.java
+sun/text/resources/LocaleElements_ar_DZ.java
+sun/text/resources/LocaleElements_ar_EG.java
+sun/text/resources/LocaleElements_ar_IQ.java
+sun/text/resources/LocaleElements_ar_JO.java
+sun/text/resources/LocaleElements_ar_KW.java
+sun/text/resources/LocaleElements_be.java
+sun/text/resources/LocaleElements_ar_LB.java
+sun/text/resources/LocaleElements_ar_LY.java
+sun/text/resources/LocaleElements_ar_MA.java
+sun/text/resources/LocaleElements_ar_OM.java
+sun/text/resources/LocaleElements_ar_QA.java
+sun/text/resources/LocaleElements_ar_SA.java
+sun/text/resources/LocaleElements_ar_SD.java
+sun/text/resources/LocaleElements_ar_SY.java
+sun/text/resources/LocaleElements_ar_TN.java
+sun/text/resources/LocaleElements_ar_YE.java
+sun/text/resources/LocaleElements_be_BY.java
+sun/text/resources/LocaleElements_bg.java
+sun/text/resources/LocaleElements_bg_BG.java
+sun/text/resources/LocaleElements_ca.java
+sun/text/resources/LocaleElements_ca_ES.java
+sun/text/resources/LocaleElements_cs.java
+sun/text/resources/LocaleElements_cs_CZ.java
+sun/text/resources/LocaleElements_da.java
+sun/text/resources/LocaleElements_da_DK.java
+sun/text/resources/LocaleElements_de.java
+sun/text/resources/LocaleElements_de_AT.java
+sun/text/resources/LocaleElements_de_CH.java
+sun/text/resources/LocaleElements_de_DE.java
+sun/text/resources/LocaleElements_de_LU.java
+sun/text/resources/LocaleElements_el.java
+sun/text/resources/LocaleElements_el_GR.java
+sun/text/resources/LocaleElements_en.java
+sun/text/resources/LocaleElements_es.java
+sun/text/resources/LocaleElements_et.java
+sun/text/resources/LocaleElements_en_AU.java
+sun/text/resources/LocaleElements_en_CA.java
+sun/text/resources/LocaleElements_en_GB.java
+sun/text/resources/LocaleElements_en_IE.java
+sun/text/resources/LocaleElements_en_IN.java
+sun/text/resources/LocaleElements_en_NZ.java
+sun/text/resources/LocaleElements_en_US.java
+sun/text/resources/LocaleElements_en_ZA.java
+sun/text/resources/LocaleElements_es_AR.java
+sun/text/resources/LocaleElements_es_BO.java
+sun/text/resources/LocaleElements_es_CL.java
+sun/text/resources/LocaleElements_es_CO.java
+sun/text/resources/LocaleElements_es_CR.java
+sun/text/resources/LocaleElements_es_DO.java
+sun/text/resources/LocaleElements_es_EC.java
+sun/text/resources/LocaleElements_es_ES.java
+sun/text/resources/LocaleElements_es_GT.java
+sun/text/resources/LocaleElements_es_HN.java
+sun/text/resources/LocaleElements_es_MX.java
+sun/text/resources/LocaleElements_es_NI.java
+sun/text/resources/LocaleElements_es_PA.java
+sun/text/resources/LocaleElements_es_PE.java
+sun/text/resources/LocaleElements_es_PR.java
+sun/text/resources/LocaleElements_es_PY.java
+sun/text/resources/LocaleElements_es_SV.java
+sun/text/resources/LocaleElements_es_UY.java
+sun/text/resources/LocaleElements_es_VE.java
+sun/text/resources/LocaleElements_et_EE.java
+sun/text/resources/LocaleElements_fi.java
+sun/text/resources/LocaleElements_fi_FI.java
+sun/text/resources/LocaleElements_fr.java
+sun/text/resources/LocaleElements_fr_BE.java
+sun/text/resources/LocaleElements_fr_CA.java
+sun/text/resources/LocaleElements_fr_CH.java
+sun/text/resources/LocaleElements_fr_FR.java
+sun/text/resources/LocaleElements_fr_LU.java
+sun/text/resources/LocaleElements_hi_IN.java
+sun/text/resources/LocaleElements_hr.java
+sun/text/resources/LocaleElements_hr_HR.java
+sun/text/resources/LocaleElements_hu.java
+sun/text/resources/LocaleElements_hu_HU.java
+sun/text/resources/unorm.icu
+sun/text/resources/LocaleElements_is.java
+sun/text/resources/LocaleElements_is_IS.java
+sun/text/resources/LocaleElements_it.java
+sun/text/resources/LocaleElements_it_CH.java
+sun/text/resources/LocaleElements_it_IT.java
+sun/text/resources/LocaleElements_iw.java
+sun/text/resources/LocaleElements_iw_IL.java
+sun/text/resources/LocaleElements_ja.java
+sun/text/resources/LocaleElements_ja_JP.java
+sun/text/resources/LocaleElements_ko.java
+sun/text/resources/LocaleElements_ko_KR.java
+sun/text/resources/LocaleElements_lt.java
+sun/text/resources/LocaleElements_lt_LT.java
+sun/text/resources/LocaleElements_lv.java
+sun/text/resources/LocaleElements_lv_LV.java
+sun/text/resources/LocaleElements_mk.java
+sun/text/resources/LocaleElements_mk_MK.java
+sun/text/resources/LocaleElements_nl.java
+sun/text/resources/LocaleElements_nl_BE.java
+sun/text/resources/LocaleElements_nl_NL.java
+sun/text/resources/LocaleElements_no.java
+sun/text/resources/LocaleElements_no_NO.java
+sun/text/resources/LocaleElements_no_NO_NY.java
+sun/text/resources/LocaleElements_pl.java
+sun/text/resources/LocaleElements_pl_PL.java
+sun/text/resources/LocaleElements_pt.java
+sun/text/resources/LocaleElements_pt_BR.java
+sun/text/resources/LocaleElements_pt_PT.java
+sun/text/resources/LocaleElements_ro.java
+sun/text/resources/LocaleElements_ro_RO.java
+sun/text/resources/LocaleElements_ru.java
+sun/text/resources/LocaleElements_ru_RU.java
+sun/text/resources/LocaleElements_sk.java
+sun/text/resources/LocaleElements_sk_SK.java
+sun/text/resources/LocaleElements_sl.java
+sun/text/resources/LocaleElements_sl_SI.java
+sun/text/resources/LocaleElements_sq.java
+sun/text/resources/LocaleElements_sq_AL.java
+sun/text/resources/LocaleElements_sv.java
+sun/text/resources/LocaleElements_sv_SE.java
+sun/text/resources/LocaleElements_th.java
+sun/text/resources/LocaleElements_th_TH.java
+sun/text/resources/LocaleElements_th_TH_TH.java
+sun/text/resources/LocaleElements_tr.java
+sun/text/resources/LocaleElements_uk.java
+sun/text/resources/LocaleElements_tr_TR.java
+sun/text/resources/LocaleElements_uk_UA.java
+sun/text/resources/LocaleElements_vi.java
+sun/text/resources/LocaleElements_vi_VN.java
+sun/text/resources/LocaleElements_zh.java
+sun/text/resources/LocaleElements_zh_CN.java
+sun/text/resources/LocaleElements_zh_HK.java
+sun/text/resources/LocaleElements_zh_TW.java
+sun/text/CodePointIterator.java
+sun/text/CharTrie.java
+sun/text/NormalizerDataReader.java
+sun/text/CompactByteArray.java
+sun/text/CompactCharArray.java
+sun/text/CompactIntArray.java
+sun/text/CompactShortArray.java
+sun/text/ComposedCharIter.java
+sun/text/ICUBinary.java
+sun/text/IntHashtable.java
+sun/text/IntTrie.java
+sun/text/Normalizer.java
+sun/text/NormalizerImpl.java
+sun/text/Trie.java
+sun/text/NormalizerUtilities.java
+sun/text/SupplementaryCharacterData.java
+sun/text/UCharacterIterator.java
+sun/text/UCompactIntArray.java
+sun/text/Utility.java
+sun/tools
+sun/tools/asm
+sun/tools/asm/SCCS
+sun/tools/asm/SCCS/s.ClassConstantData.java
+sun/tools/asm/SCCS/s.ArrayData.java
+sun/tools/asm/SCCS/s.Assembler.java
+sun/tools/asm/SCCS/s.CatchData.java
+sun/tools/asm/SCCS/s.ConstantPoolData.java
+sun/tools/asm/SCCS/s.ConstantPool.java
+sun/tools/asm/SCCS/s.Cover.java
+sun/tools/asm/SCCS/s.Instruction.java
+sun/tools/asm/SCCS/s.FieldConstantData.java
+sun/tools/asm/SCCS/s.Label.java
+sun/tools/asm/SCCS/s.LocalVariable.java
+sun/tools/asm/SCCS/s.LocalVariableTable.java
+sun/tools/asm/SCCS/s.NameAndTypeConstantData.java
+sun/tools/asm/SCCS/s.NameAndTypeData.java
+sun/tools/asm/SCCS/s.NumberConstantData.java
+sun/tools/asm/SCCS/s.StringConstantData.java
+sun/tools/asm/SCCS/s.StringExpressionConstantData.java
+sun/tools/asm/SCCS/s.SwitchData.java
+sun/tools/asm/SCCS/s.TryData.java
+sun/tools/asm/ClassConstantData.java
+sun/tools/asm/ArrayData.java
+sun/tools/asm/Assembler.java
+sun/tools/asm/CatchData.java
+sun/tools/asm/ConstantPoolData.java
+sun/tools/asm/ConstantPool.java
+sun/tools/asm/Instruction.java
+sun/tools/asm/Cover.java
+sun/tools/asm/NameAndTypeConstantData.java
+sun/tools/asm/FieldConstantData.java
+sun/tools/asm/Label.java
+sun/tools/asm/LocalVariable.java
+sun/tools/asm/LocalVariableTable.java
+sun/tools/asm/NameAndTypeData.java
+sun/tools/asm/NumberConstantData.java
+sun/tools/asm/StringConstantData.java
+sun/tools/asm/SwitchData.java
+sun/tools/asm/TryData.java
+sun/tools/asm/StringExpressionConstantData.java
+sun/tools/hprof
+sun/tools/hprof/SCCS
+sun/tools/hprof/SCCS/s.Tracker.java
+sun/tools/hprof/Tracker.java
+sun/tools/jar
+sun/tools/jar/SCCS
+sun/tools/jar/SCCS/s.JarImageSource.java
+sun/tools/jar/SCCS/s.CommandLine.java
+sun/tools/jar/SCCS/s.JarException.java
+sun/tools/jar/SCCS/s.JarVerifierStream.java
+sun/tools/jar/SCCS/s.Main.java
+sun/tools/jar/SCCS/s.Manifest.java
+sun/tools/jar/SCCS/s.SignatureFile.java
+sun/tools/jar/resources
+sun/tools/jar/resources/SCCS
+sun/tools/jar/resources/SCCS/s.jar_zh_CN.properties
+sun/tools/jar/resources/SCCS/s.jar.properties
+sun/tools/jar/resources/SCCS/s.jar_de.properties
+sun/tools/jar/resources/SCCS/s.jar_es.properties
+sun/tools/jar/resources/SCCS/s.jar_fr.properties
+sun/tools/jar/resources/SCCS/s.jar_it.properties
+sun/tools/jar/resources/SCCS/s.jar_ja.properties
+sun/tools/jar/resources/SCCS/s.jar_ko.properties
+sun/tools/jar/resources/SCCS/s.jar_sv.properties
+sun/tools/jar/resources/SCCS/s.jar_zh_TW.properties
+sun/tools/jar/resources/jar_de.properties
+sun/tools/jar/resources/jar.properties
+sun/tools/jar/resources/jar_es.properties
+sun/tools/jar/resources/jar_fr.properties
+sun/tools/jar/resources/jar_it.properties
+sun/tools/jar/resources/jar_ja.properties
+sun/tools/jar/resources/jar_ko.properties
+sun/tools/jar/resources/jar_sv.properties
+sun/tools/jar/resources/jar_zh_CN.properties
+sun/tools/jar/resources/jar_zh_TW.properties
+sun/tools/jar/JarVerifierStream.java
+sun/tools/jar/CommandLine.java
+sun/tools/jar/JarException.java
+sun/tools/jar/JarImageSource.java
+sun/tools/jar/SignatureFile.java
+sun/tools/jar/Main.java
+sun/tools/jar/Manifest.java
+sun/tools/java
+sun/tools/java/SCCS
+sun/tools/java/SCCS/s.BinaryConstantPool.java
+sun/tools/java/SCCS/s.AmbiguousClass.java
+sun/tools/java/SCCS/s.AmbiguousMember.java
+sun/tools/java/SCCS/s.ArrayType.java
+sun/tools/java/SCCS/s.BinaryAttribute.java
+sun/tools/java/SCCS/s.BinaryClass.java
+sun/tools/java/SCCS/s.BinaryCode.java
+sun/tools/java/SCCS/s.Type.java
+sun/tools/java/SCCS/s.BinaryExceptionHandler.java
+sun/tools/java/SCCS/s.BinaryMember.java
+sun/tools/java/SCCS/s.ClassDeclaration.java
+sun/tools/java/SCCS/s.ClassDefinition.java
+sun/tools/java/SCCS/s.ClassFile.java
+sun/tools/java/SCCS/s.ClassNotFound.java
+sun/tools/java/SCCS/s.ClassPath.java
+sun/tools/java/SCCS/s.ClassType.java
+sun/tools/java/SCCS/s.CompilerError.java
+sun/tools/java/SCCS/s.Constants.java
+sun/tools/java/SCCS/s.Environment.java
+sun/tools/java/SCCS/s.Identifier.java
+sun/tools/java/SCCS/s.IdentifierToken.java
+sun/tools/java/SCCS/s.Imports.java
+sun/tools/java/SCCS/s.MemberDefinition.java
+sun/tools/java/SCCS/s.MethodSet.java
+sun/tools/java/SCCS/s.MethodType.java
+sun/tools/java/SCCS/s.Package.java
+sun/tools/java/SCCS/s.Parser.java
+sun/tools/java/SCCS/s.ParserActions.java
+sun/tools/java/SCCS/s.RuntimeConstants.java
+sun/tools/java/SCCS/s.Scanner.java
+sun/tools/java/SCCS/s.ScannerInputReader.java
+sun/tools/java/SCCS/s.SyntaxError.java
+sun/tools/java/AmbiguousMember.java
+sun/tools/java/AmbiguousClass.java
+sun/tools/java/BinaryAttribute.java
+sun/tools/java/ArrayType.java
+sun/tools/java/BinaryExceptionHandler.java
+sun/tools/java/BinaryClass.java
+sun/tools/java/BinaryCode.java
+sun/tools/java/BinaryConstantPool.java
+sun/tools/java/BinaryMember.java
+sun/tools/java/ClassDeclaration.java
+sun/tools/java/ClassDefinition.java
+sun/tools/java/ClassFile.java
+sun/tools/java/ClassNotFound.java
+sun/tools/java/ClassPath.java
+sun/tools/java/ClassType.java
+sun/tools/java/CompilerError.java
+sun/tools/java/Constants.java
+sun/tools/java/Environment.java
+sun/tools/java/Identifier.java
+sun/tools/java/IdentifierToken.java
+sun/tools/java/Imports.java
+sun/tools/java/MemberDefinition.java
+sun/tools/java/MethodSet.java
+sun/tools/java/MethodType.java
+sun/tools/java/Package.java
+sun/tools/java/Parser.java
+sun/tools/java/ParserActions.java
+sun/tools/java/RuntimeConstants.java
+sun/tools/java/Scanner.java
+sun/tools/java/ScannerInputReader.java
+sun/tools/java/SyntaxError.java
+sun/tools/java/Type.java
+sun/tools/javac
+sun/tools/javac/SCCS
+sun/tools/javac/SCCS/s.BatchEnvironment.java
+sun/tools/javac/SCCS/s.BatchParser.java
+sun/tools/javac/SCCS/s.CompilerMember.java
+sun/tools/javac/SCCS/s.ErrorConsumer.java
+sun/tools/javac/SCCS/s.ErrorMessage.java
+sun/tools/javac/SCCS/s.Main.java
+sun/tools/javac/SCCS/s.SourceClass.java
+sun/tools/javac/SCCS/s.SourceMember.java
+sun/tools/javac/resources
+sun/tools/javac/resources/SCCS
+sun/tools/javac/resources/SCCS/s.javac_ja.properties
+sun/tools/javac/resources/SCCS/s.javac.properties
+sun/tools/javac/resources/javac.properties
+sun/tools/javac/resources/javac_ja.properties
+sun/tools/javac/BatchEnvironment.java
+sun/tools/javac/BatchParser.java
+sun/tools/javac/CompilerMember.java
+sun/tools/javac/ErrorConsumer.java
+sun/tools/javac/ErrorMessage.java
+sun/tools/javac/Main.java
+sun/tools/javac/SourceClass.java
+sun/tools/javac/SourceMember.java
+sun/tools/javap
+sun/tools/javap/SCCS
+sun/tools/javap/SCCS/s.ClassData.java
+sun/tools/javap/SCCS/s.AttrData.java
+sun/tools/javap/SCCS/s.CPX.java
+sun/tools/javap/SCCS/s.CPX2.java
+sun/tools/javap/SCCS/s.Constants.java
+sun/tools/javap/SCCS/s.FieldData.java
+sun/tools/javap/SCCS/s.InnerClassData.java
+sun/tools/javap/SCCS/s.JavapEnvironment.java
+sun/tools/javap/SCCS/s.JavapPrinter.java
+sun/tools/javap/SCCS/s.LineNumData.java
+sun/tools/javap/SCCS/s.LocVarData.java
+sun/tools/javap/SCCS/s.Main.java
+sun/tools/javap/SCCS/s.MethodData.java
+sun/tools/javap/SCCS/s.RuntimeConstants.java
+sun/tools/javap/SCCS/s.Tables.java
+sun/tools/javap/SCCS/s.TrapData.java
+sun/tools/javap/SCCS/s.TypeSignature.java
+sun/tools/javap/oldjavap
+sun/tools/javap/oldjavap/SCCS
+sun/tools/javap/oldjavap/SCCS/s.JavaPClassPrinter.java
+sun/tools/javap/oldjavap/SCCS/s.ConstantPrinter.java
+sun/tools/javap/oldjavap/SCCS/s.JavaP.java
+sun/tools/javap/oldjavap/SCCS/s.JavaPBinaryCode.java
+sun/tools/javap/oldjavap/SCCS/s.JavaPEnvironment.java
+sun/tools/javap/oldjavap/ConstantPrinter.java
+sun/tools/javap/oldjavap/JavaP.java
+sun/tools/javap/oldjavap/JavaPBinaryCode.java
+sun/tools/javap/oldjavap/JavaPClassPrinter.java
+sun/tools/javap/oldjavap/JavaPEnvironment.java
+sun/tools/javap/InnerClassData.java
+sun/tools/javap/AttrData.java
+sun/tools/javap/CPX.java
+sun/tools/javap/CPX2.java
+sun/tools/javap/ClassData.java
+sun/tools/javap/Constants.java
+sun/tools/javap/FieldData.java
+sun/tools/javap/JavapEnvironment.java
+sun/tools/javap/JavapPrinter.java
+sun/tools/javap/LineNumData.java
+sun/tools/javap/LocVarData.java
+sun/tools/javap/Main.java
+sun/tools/javap/MethodData.java
+sun/tools/javap/RuntimeConstants.java
+sun/tools/javap/Tables.java
+sun/tools/javap/TrapData.java
+sun/tools/javap/TypeSignature.java
+sun/tools/javazic
+sun/tools/javazic/SCCS
+sun/tools/javazic/SCCS/s.DayOfWeek.java
+sun/tools/javazic/SCCS/s.BackEnd.java
+sun/tools/javazic/SCCS/s.Checksum.java
+sun/tools/javazic/SCCS/s.Gen.java
+sun/tools/javazic/SCCS/s.GenDoc.java
+sun/tools/javazic/SCCS/s.GenSrc.java
+sun/tools/javazic/SCCS/s.Main.java
+sun/tools/javazic/SCCS/s.Mappings.java
+sun/tools/javazic/SCCS/s.Month.java
+sun/tools/javazic/SCCS/s.Rule.java
+sun/tools/javazic/SCCS/s.RuleDay.java
+sun/tools/javazic/SCCS/s.RuleRec.java
+sun/tools/javazic/SCCS/s.Simple.java
+sun/tools/javazic/SCCS/s.Time.java
+sun/tools/javazic/SCCS/s.Timezone.java
+sun/tools/javazic/SCCS/s.Zone.java
+sun/tools/javazic/SCCS/s.ZoneRec.java
+sun/tools/javazic/SCCS/s.Zoneinfo.java
+sun/tools/javazic/BackEnd.java
+sun/tools/javazic/Checksum.java
+sun/tools/javazic/Gen.java
+sun/tools/javazic/GenDoc.java
+sun/tools/javazic/GenSrc.java
+sun/tools/javazic/Main.java
+sun/tools/javazic/Mappings.java
+sun/tools/javazic/Month.java
+sun/tools/javazic/Rule.java
+sun/tools/javazic/RuleDay.java
+sun/tools/javazic/RuleRec.java
+sun/tools/javazic/Simple.java
+sun/tools/javazic/Time.java
+sun/tools/javazic/Timezone.java
+sun/tools/javazic/Zone.java
+sun/tools/javazic/ZoneRec.java
+sun/tools/javazic/Zoneinfo.java
+sun/tools/javazic/DayOfWeek.java
+sun/tools/jconsole
+sun/tools/jconsole/SCCS
+sun/tools/jconsole/SCCS/s.BorderedComponent.java
+sun/tools/jconsole/SCCS/s.ClassTab.java
+sun/tools/jconsole/SCCS/s.ConnectDialog.java
+sun/tools/jconsole/SCCS/s.ConnectionParameters.java
+sun/tools/jconsole/SCCS/s.CreateMBeanDialog.java
+sun/tools/jconsole/SCCS/s.Formatter.java
+sun/tools/jconsole/SCCS/s.JConsole.java
+sun/tools/jconsole/SCCS/s.LabeledComponent.java
+sun/tools/jconsole/SCCS/s.MBeansTab.java
+sun/tools/jconsole/SCCS/s.MemoryPoolProxy.java
+sun/tools/jconsole/SCCS/s.MemoryPoolStat.java
+sun/tools/jconsole/SCCS/s.MemoryTab.java
+sun/tools/jconsole/SCCS/s.Plotter.java
+sun/tools/jconsole/SCCS/s.PlotterPanel.java
+sun/tools/jconsole/SCCS/s.ProxyClient.java
+sun/tools/jconsole/SCCS/s.VariableGridLayout.java
+sun/tools/jconsole/SCCS/s.Resources.java
+sun/tools/jconsole/SCCS/s.SummaryTab.java
+sun/tools/jconsole/SCCS/s.Tab.java
+sun/tools/jconsole/SCCS/s.ThreadTab.java
+sun/tools/jconsole/SCCS/s.TimeComboBox.java
+sun/tools/jconsole/SCCS/s.VMInternalFrame.java
+sun/tools/jconsole/SCCS/s.VMPanel.java
+sun/tools/jconsole/SCCS/s.VMTab.java
+sun/tools/jconsole/SCCS/s.Version-template.java
+sun/tools/jconsole/SCCS/s.Worker.java
+sun/tools/jconsole/SCCS/s.manifest
+sun/tools/jconsole/inspector
+sun/tools/jconsole/inspector/SCCS
+sun/tools/jconsole/inspector/SCCS/s.OperationEntry.java
+sun/tools/jconsole/inspector/SCCS/s.IconManager.java
+sun/tools/jconsole/inspector/SCCS/s.XJdmkTreeRenderer.java
+sun/tools/jconsole/inspector/SCCS/s.TableSorter.java
+sun/tools/jconsole/inspector/SCCS/s.ThreadDialog.java
+sun/tools/jconsole/inspector/SCCS/s.Utils.java
+sun/tools/jconsole/inspector/SCCS/s.XArrayDataViewer.java
+sun/tools/jconsole/inspector/SCCS/s.XDataViewer.java
+sun/tools/jconsole/inspector/SCCS/s.XMBeanAttributes.java
+sun/tools/jconsole/inspector/SCCS/s.XMBean.java
+sun/tools/jconsole/inspector/SCCS/s.XMBeanNotifications.java
+sun/tools/jconsole/inspector/SCCS/s.XMBeanInfo.java
+sun/tools/jconsole/inspector/SCCS/s.XMBeanOperations.java
+sun/tools/jconsole/inspector/SCCS/s.XMBeanTree.java
+sun/tools/jconsole/inspector/SCCS/s.XObject.java
+sun/tools/jconsole/inspector/SCCS/s.XOpenTypeViewer.java
+sun/tools/jconsole/inspector/SCCS/s.XOperations.java
+sun/tools/jconsole/inspector/SCCS/s.XPane.java
+sun/tools/jconsole/inspector/SCCS/s.XPlotter.java
+sun/tools/jconsole/inspector/SCCS/s.XPlottingViewer.java
+sun/tools/jconsole/inspector/SCCS/s.XSheet.java
+sun/tools/jconsole/inspector/SCCS/s.XTabbedPane.java
+sun/tools/jconsole/inspector/SCCS/s.XTable.java
+sun/tools/jconsole/inspector/SCCS/s.XTextField.java
+sun/tools/jconsole/inspector/SCCS/s.XTextFieldEditor.java
+sun/tools/jconsole/inspector/SCCS/s.XTree.java
+sun/tools/jconsole/inspector/SCCS/s.XTreeRenderer.java
+sun/tools/jconsole/inspector/XArrayDataViewer.java
+sun/tools/jconsole/inspector/IconManager.java
+sun/tools/jconsole/inspector/OperationEntry.java
+sun/tools/jconsole/inspector/TableSorter.java
+sun/tools/jconsole/inspector/ThreadDialog.java
+sun/tools/jconsole/inspector/Utils.java
+sun/tools/jconsole/inspector/XMBeanNotifications.java
+sun/tools/jconsole/inspector/XDataViewer.java
+sun/tools/jconsole/inspector/XJdmkTreeRenderer.java
+sun/tools/jconsole/inspector/XMBean.java
+sun/tools/jconsole/inspector/XMBeanAttributes.java
+sun/tools/jconsole/inspector/XMBeanInfo.java
+sun/tools/jconsole/inspector/XMBeanOperations.java
+sun/tools/jconsole/inspector/XMBeanTree.java
+sun/tools/jconsole/inspector/XObject.java
+sun/tools/jconsole/inspector/XOpenTypeViewer.java
+sun/tools/jconsole/inspector/XPane.java
+sun/tools/jconsole/inspector/XOperations.java
+sun/tools/jconsole/inspector/XPlotter.java
+sun/tools/jconsole/inspector/XPlottingViewer.java
+sun/tools/jconsole/inspector/XSheet.java
+sun/tools/jconsole/inspector/XTabbedPane.java
+sun/tools/jconsole/inspector/XTable.java
+sun/tools/jconsole/inspector/XTextField.java
+sun/tools/jconsole/inspector/XTextFieldEditor.java
+sun/tools/jconsole/inspector/XTree.java
+sun/tools/jconsole/inspector/XTreeRenderer.java
+sun/tools/jconsole/resources
+sun/tools/jconsole/resources/SCCS
+sun/tools/jconsole/resources/SCCS/s.JConsoleResources.java
+sun/tools/jconsole/resources/SCCS/s.JConsoleResources_ja.java
+sun/tools/jconsole/resources/SCCS/s.collapse.png
+sun/tools/jconsole/resources/SCCS/s.expand.png
+sun/tools/jconsole/resources/SCCS/s.mbeanserverdelegate.gif
+sun/tools/jconsole/resources/SCCS/s.mbeantree_root.gif
+sun/tools/jconsole/resources/SCCS/s.modelmbean.gif
+sun/tools/jconsole/resources/SCCS/s.openmbean.gif
+sun/tools/jconsole/resources/SCCS/s.standardmbean.gif
+sun/tools/jconsole/resources/SCCS/s.xobject.gif
+sun/tools/jconsole/resources/JConsoleResources_ja.java
+sun/tools/jconsole/resources/JConsoleResources.java
+sun/tools/jconsole/resources/mbeanserverdelegate.gif
+sun/tools/jconsole/resources/collapse.png
+sun/tools/jconsole/resources/expand.png
+sun/tools/jconsole/resources/mbeantree_root.gif
+sun/tools/jconsole/resources/modelmbean.gif
+sun/tools/jconsole/resources/openmbean.gif
+sun/tools/jconsole/resources/standardmbean.gif
+sun/tools/jconsole/resources/xobject.gif
+sun/tools/jconsole/ConnectionParameters.java
+sun/tools/jconsole/BorderedComponent.java
+sun/tools/jconsole/ClassTab.java
+sun/tools/jconsole/ConnectDialog.java
+sun/tools/jconsole/CreateMBeanDialog.java
+sun/tools/jconsole/Formatter.java
+sun/tools/jconsole/JConsole.java
+sun/tools/jconsole/LabeledComponent.java
+sun/tools/jconsole/MBeansTab.java
+sun/tools/jconsole/MemoryPoolProxy.java
+sun/tools/jconsole/MemoryPoolStat.java
+sun/tools/jconsole/MemoryTab.java
+sun/tools/jconsole/Plotter.java
+sun/tools/jconsole/PlotterPanel.java
+sun/tools/jconsole/ProxyClient.java
+sun/tools/jconsole/Resources.java
+sun/tools/jconsole/SummaryTab.java
+sun/tools/jconsole/Tab.java
+sun/tools/jconsole/ThreadTab.java
+sun/tools/jconsole/TimeComboBox.java
+sun/tools/jconsole/VMInternalFrame.java
+sun/tools/jconsole/VMPanel.java
+sun/tools/jconsole/VMTab.java
+sun/tools/jconsole/VariableGridLayout.java
+sun/tools/jconsole/Version-template.java
+sun/tools/jconsole/Worker.java
+sun/tools/jconsole/manifest
+sun/tools/jps
+sun/tools/jps/SCCS
+sun/tools/jps/SCCS/s.Arguments.java
+sun/tools/jps/SCCS/s.Jps.java
+sun/tools/jps/Arguments.java
+sun/tools/jps/Jps.java
+sun/tools/jstat
+sun/tools/jstat/SCCS
+sun/tools/jstat/SCCS/s.Alignment.java
+sun/tools/jstat/SCCS/s.Arguments.java
+sun/tools/jstat/SCCS/s.Closure.java
+sun/tools/jstat/SCCS/s.ColumnFormat.java
+sun/tools/jstat/SCCS/s.AscendingMonitorComparator.java
+sun/tools/jstat/SCCS/s.Expression.java
+sun/tools/jstat/SCCS/s.Jstat.java
+sun/tools/jstat/SCCS/s.DescendingMonitorComparator.java
+sun/tools/jstat/SCCS/s.ExpressionEvaluator.java
+sun/tools/jstat/SCCS/s.ExpressionExecuter.java
+sun/tools/jstat/SCCS/s.ExpressionResolver.java
+sun/tools/jstat/SCCS/s.HeaderClosure.java
+sun/tools/jstat/SCCS/s.Identifier.java
+sun/tools/jstat/SCCS/s.JStatLogger.java
+sun/tools/jstat/SCCS/s.SymbolResolutionClosure.java
+sun/tools/jstat/SCCS/s.Literal.java
+sun/tools/jstat/SCCS/s.Operator.java
+sun/tools/jstat/SCCS/s.OptionFinder.java
+sun/tools/jstat/SCCS/s.OptionFormat.java
+sun/tools/jstat/SCCS/s.OptionLister.java
+sun/tools/jstat/SCCS/s.OutputFormatter.java
+sun/tools/jstat/SCCS/s.OptionOutputFormatter.java
+sun/tools/jstat/SCCS/s.Parser.java
+sun/tools/jstat/SCCS/s.ParserException.java
+sun/tools/jstat/SCCS/s.RawOutputFormatter.java
+sun/tools/jstat/SCCS/s.RowClosure.java
+sun/tools/jstat/SCCS/s.Scale.java
+sun/tools/jstat/SCCS/s.SyntaxException.java
+sun/tools/jstat/SCCS/s.Token.java
+sun/tools/jstat/resources
+sun/tools/jstat/resources/SCCS
+sun/tools/jstat/resources/SCCS/s.jstat_options
+sun/tools/jstat/resources/jstat_options
+sun/tools/jstat/Alignment.java
+sun/tools/jstat/Arguments.java
+sun/tools/jstat/Closure.java
+sun/tools/jstat/ExpressionExecuter.java
+sun/tools/jstat/Expression.java
+sun/tools/jstat/AscendingMonitorComparator.java
+sun/tools/jstat/ColumnFormat.java
+sun/tools/jstat/DescendingMonitorComparator.java
+sun/tools/jstat/SymbolResolutionClosure.java
+sun/tools/jstat/ExpressionEvaluator.java
+sun/tools/jstat/ExpressionResolver.java
+sun/tools/jstat/HeaderClosure.java
+sun/tools/jstat/Identifier.java
+sun/tools/jstat/JStatLogger.java
+sun/tools/jstat/Jstat.java
+sun/tools/jstat/Literal.java
+sun/tools/jstat/Operator.java
+sun/tools/jstat/OptionFinder.java
+sun/tools/jstat/OptionFormat.java
+sun/tools/jstat/OptionLister.java
+sun/tools/jstat/OptionOutputFormatter.java
+sun/tools/jstat/OutputFormatter.java
+sun/tools/jstat/Parser.java
+sun/tools/jstat/ParserException.java
+sun/tools/jstat/RawOutputFormatter.java
+sun/tools/jstat/RowClosure.java
+sun/tools/jstat/Scale.java
+sun/tools/jstat/SyntaxException.java
+sun/tools/jstat/Token.java
+sun/tools/jstatd
+sun/tools/jstatd/SCCS
+sun/tools/jstatd/SCCS/s.RemoteHostImpl.java
+sun/tools/jstatd/SCCS/s.Jstatd.java
+sun/tools/jstatd/SCCS/s.RemoteVmImpl.java
+sun/tools/jstatd/RemoteHostImpl.java
+sun/tools/jstatd/Jstatd.java
+sun/tools/jstatd/RemoteVmImpl.java
+sun/tools/native2ascii
+sun/tools/native2ascii/SCCS
+sun/tools/native2ascii/SCCS/s.A2NFilter.java
+sun/tools/native2ascii/SCCS/s.Main.java
+sun/tools/native2ascii/SCCS/s.N2AFilter.java
+sun/tools/native2ascii/resources
+sun/tools/native2ascii/resources/SCCS
+sun/tools/native2ascii/resources/SCCS/s.MsgNative2ascii_ja.java
+sun/tools/native2ascii/resources/SCCS/s.MsgNative2ascii.java
+sun/tools/native2ascii/resources/MsgNative2ascii.java
+sun/tools/native2ascii/resources/MsgNative2ascii_ja.java
+sun/tools/native2ascii/A2NFilter.java
+sun/tools/native2ascii/Main.java
+sun/tools/native2ascii/N2AFilter.java
+sun/tools/serialver
+sun/tools/serialver/SCCS
+sun/tools/serialver/SCCS/s.serialver.properties
+sun/tools/serialver/SCCS/s.SerialVer.java
+sun/tools/serialver/SCCS/s.serialver_ja.properties
+sun/tools/serialver/serialver.properties
+sun/tools/serialver/SerialVer.java
+sun/tools/serialver/serialver_ja.properties
+sun/tools/tree
+sun/tools/tree/SCCS
+sun/tools/tree/SCCS/s.ArrayAccessExpression.java
+sun/tools/tree/SCCS/s.AddExpression.java
+sun/tools/tree/SCCS/s.AndExpression.java
+sun/tools/tree/SCCS/s.AssignAddExpression.java
+sun/tools/tree/SCCS/s.ArrayExpression.java
+sun/tools/tree/SCCS/s.AssignRemainderExpression.java
+sun/tools/tree/SCCS/s.AssignBitAndExpression.java
+sun/tools/tree/SCCS/s.AssignBitOrExpression.java
+sun/tools/tree/SCCS/s.AssignBitXorExpression.java
+sun/tools/tree/SCCS/s.AssignDivideExpression.java
+sun/tools/tree/SCCS/s.AssignExpression.java
+sun/tools/tree/SCCS/s.AssignMultiplyExpression.java
+sun/tools/tree/SCCS/s.AssignOpExpression.java
+sun/tools/tree/SCCS/s.AssignUnsignedShiftRightExpression.java
+sun/tools/tree/SCCS/s.AssignShiftLeftExpression.java
+sun/tools/tree/SCCS/s.AssignShiftRightExpression.java
+sun/tools/tree/SCCS/s.AssignSubtractExpression.java
+sun/tools/tree/SCCS/s.Node.java
+sun/tools/tree/SCCS/s.BinaryArithmeticExpression.java
+sun/tools/tree/SCCS/s.BinaryAssignExpression.java
+sun/tools/tree/SCCS/s.BinaryBitExpression.java
+sun/tools/tree/SCCS/s.BinaryCompareExpression.java
+sun/tools/tree/SCCS/s.BinaryEqualityExpression.java
+sun/tools/tree/SCCS/s.BinaryExpression.java
+sun/tools/tree/SCCS/s.BinaryLogicalExpression.java
+sun/tools/tree/SCCS/s.PositiveExpression.java
+sun/tools/tree/SCCS/s.BinaryShiftExpression.java
+sun/tools/tree/SCCS/s.BitAndExpression.java
+sun/tools/tree/SCCS/s.BitNotExpression.java
+sun/tools/tree/SCCS/s.BitOrExpression.java
+sun/tools/tree/SCCS/s.BitXorExpression.java
+sun/tools/tree/SCCS/s.BooleanExpression.java
+sun/tools/tree/SCCS/s.BreakStatement.java
+sun/tools/tree/SCCS/s.ByteExpression.java
+sun/tools/tree/SCCS/s.CaseStatement.java
+sun/tools/tree/SCCS/s.CastExpression.java
+sun/tools/tree/SCCS/s.CatchStatement.java
+sun/tools/tree/SCCS/s.CharExpression.java
+sun/tools/tree/SCCS/s.CheckContext.java
+sun/tools/tree/SCCS/s.CodeContext.java
+sun/tools/tree/SCCS/s.CommaExpression.java
+sun/tools/tree/SCCS/s.Context.java
+sun/tools/tree/SCCS/s.CompoundStatement.java
+sun/tools/tree/SCCS/s.ConditionVars.java
+sun/tools/tree/SCCS/s.ConditionalExpression.java
+sun/tools/tree/SCCS/s.ConstantExpression.java
+sun/tools/tree/SCCS/s.ContinueStatement.java
+sun/tools/tree/SCCS/s.ConvertExpression.java
+sun/tools/tree/SCCS/s.DeclarationStatement.java
+sun/tools/tree/SCCS/s.DivRemExpression.java
+sun/tools/tree/SCCS/s.DivideExpression.java
+sun/tools/tree/SCCS/s.DoStatement.java
+sun/tools/tree/SCCS/s.DoubleExpression.java
+sun/tools/tree/SCCS/s.EqualExpression.java
+sun/tools/tree/SCCS/s.ExprExpression.java
+sun/tools/tree/SCCS/s.Expression.java
+sun/tools/tree/SCCS/s.ExpressionStatement.java
+sun/tools/tree/SCCS/s.FieldExpression.java
+sun/tools/tree/SCCS/s.FieldUpdater.java
+sun/tools/tree/SCCS/s.FinallyStatement.java
+sun/tools/tree/SCCS/s.FloatExpression.java
+sun/tools/tree/SCCS/s.ForStatement.java
+sun/tools/tree/SCCS/s.GreaterExpression.java
+sun/tools/tree/SCCS/s.GreaterOrEqualExpression.java
+sun/tools/tree/SCCS/s.IdentifierExpression.java
+sun/tools/tree/SCCS/s.IfStatement.java
+sun/tools/tree/SCCS/s.IncDecExpression.java
+sun/tools/tree/SCCS/s.InlineMethodExpression.java
+sun/tools/tree/SCCS/s.InlineNewInstanceExpression.java
+sun/tools/tree/SCCS/s.InlineReturnStatement.java
+sun/tools/tree/SCCS/s.InstanceOfExpression.java
+sun/tools/tree/SCCS/s.LocalMember.java
+sun/tools/tree/SCCS/s.IntExpression.java
+sun/tools/tree/SCCS/s.IntegerExpression.java
+sun/tools/tree/SCCS/s.LengthExpression.java
+sun/tools/tree/SCCS/s.LessExpression.java
+sun/tools/tree/SCCS/s.LessOrEqualExpression.java
+sun/tools/tree/SCCS/s.LongExpression.java
+sun/tools/tree/SCCS/s.MethodExpression.java
+sun/tools/tree/SCCS/s.MultiplyExpression.java
+sun/tools/tree/SCCS/s.NaryExpression.java
+sun/tools/tree/SCCS/s.NegativeExpression.java
+sun/tools/tree/SCCS/s.NewArrayExpression.java
+sun/tools/tree/SCCS/s.NewInstanceExpression.java
+sun/tools/tree/SCCS/s.NotExpression.java
+sun/tools/tree/SCCS/s.NotEqualExpression.java
+sun/tools/tree/SCCS/s.OrExpression.java
+sun/tools/tree/SCCS/s.NullExpression.java
+sun/tools/tree/SCCS/s.PostDecExpression.java
+sun/tools/tree/SCCS/s.PostIncExpression.java
+sun/tools/tree/SCCS/s.PreDecExpression.java
+sun/tools/tree/SCCS/s.PreIncExpression.java
+sun/tools/tree/SCCS/s.RemainderExpression.java
+sun/tools/tree/SCCS/s.ReturnStatement.java
+sun/tools/tree/SCCS/s.ShiftLeftExpression.java
+sun/tools/tree/SCCS/s.ShiftRightExpression.java
+sun/tools/tree/SCCS/s.ShortExpression.java
+sun/tools/tree/SCCS/s.Statement.java
+sun/tools/tree/SCCS/s.StringExpression.java
+sun/tools/tree/SCCS/s.SubtractExpression.java
+sun/tools/tree/SCCS/s.UnsignedShiftRightExpression.java
+sun/tools/tree/SCCS/s.SuperExpression.java
+sun/tools/tree/SCCS/s.SwitchStatement.java
+sun/tools/tree/SCCS/s.SynchronizedStatement.java
+sun/tools/tree/SCCS/s.ThisExpression.java
+sun/tools/tree/SCCS/s.ThrowStatement.java
+sun/tools/tree/SCCS/s.TryStatement.java
+sun/tools/tree/SCCS/s.TypeExpression.java
+sun/tools/tree/SCCS/s.UnaryExpression.java
+sun/tools/tree/SCCS/s.VarDeclarationStatement.java
+sun/tools/tree/SCCS/s.UplevelReference.java
+sun/tools/tree/SCCS/s.Vset.java
+sun/tools/tree/SCCS/s.WhileStatement.java
+sun/tools/tree/ArrayAccessExpression.java
+sun/tools/tree/AddExpression.java
+sun/tools/tree/AndExpression.java
+sun/tools/tree/AssignAddExpression.java
+sun/tools/tree/ArrayExpression.java
+sun/tools/tree/AssignBitAndExpression.java
+sun/tools/tree/AssignBitOrExpression.java
+sun/tools/tree/AssignBitXorExpression.java
+sun/tools/tree/AssignDivideExpression.java
+sun/tools/tree/AssignExpression.java
+sun/tools/tree/AssignMultiplyExpression.java
+sun/tools/tree/AssignOpExpression.java
+sun/tools/tree/CommaExpression.java
+sun/tools/tree/BreakStatement.java
+sun/tools/tree/AssignRemainderExpression.java
+sun/tools/tree/AssignShiftLeftExpression.java
+sun/tools/tree/AssignShiftRightExpression.java
+sun/tools/tree/AssignSubtractExpression.java
+sun/tools/tree/AssignUnsignedShiftRightExpression.java
+sun/tools/tree/BinaryArithmeticExpression.java
+sun/tools/tree/BinaryAssignExpression.java
+sun/tools/tree/BinaryBitExpression.java
+sun/tools/tree/BinaryCompareExpression.java
+sun/tools/tree/BinaryEqualityExpression.java
+sun/tools/tree/BinaryExpression.java
+sun/tools/tree/BinaryLogicalExpression.java
+sun/tools/tree/BinaryShiftExpression.java
+sun/tools/tree/BitAndExpression.java
+sun/tools/tree/BitNotExpression.java
+sun/tools/tree/BitOrExpression.java
+sun/tools/tree/BitXorExpression.java
+sun/tools/tree/BooleanExpression.java
+sun/tools/tree/ByteExpression.java
+sun/tools/tree/CaseStatement.java
+sun/tools/tree/CastExpression.java
+sun/tools/tree/CatchStatement.java
+sun/tools/tree/CharExpression.java
+sun/tools/tree/CheckContext.java
+sun/tools/tree/CodeContext.java
+sun/tools/tree/ConditionalExpression.java
+sun/tools/tree/CompoundStatement.java
+sun/tools/tree/ConditionVars.java
+sun/tools/tree/ContinueStatement.java
+sun/tools/tree/Context.java
+sun/tools/tree/ConstantExpression.java
+sun/tools/tree/DeclarationStatement.java
+sun/tools/tree/ConvertExpression.java
+sun/tools/tree/GreaterOrEqualExpression.java
+sun/tools/tree/DivRemExpression.java
+sun/tools/tree/DivideExpression.java
+sun/tools/tree/DoStatement.java
+sun/tools/tree/DoubleExpression.java
+sun/tools/tree/EqualExpression.java
+sun/tools/tree/ExprExpression.java
+sun/tools/tree/Expression.java
+sun/tools/tree/ExpressionStatement.java
+sun/tools/tree/FieldExpression.java
+sun/tools/tree/FieldUpdater.java
+sun/tools/tree/FinallyStatement.java
+sun/tools/tree/FloatExpression.java
+sun/tools/tree/ForStatement.java
+sun/tools/tree/GreaterExpression.java
+sun/tools/tree/InlineNewInstanceExpression.java
+sun/tools/tree/IdentifierExpression.java
+sun/tools/tree/IfStatement.java
+sun/tools/tree/IncDecExpression.java
+sun/tools/tree/InlineMethodExpression.java
+sun/tools/tree/UnsignedShiftRightExpression.java
+sun/tools/tree/InlineReturnStatement.java
+sun/tools/tree/InstanceOfExpression.java
+sun/tools/tree/IntExpression.java
+sun/tools/tree/IntegerExpression.java
+sun/tools/tree/LengthExpression.java
+sun/tools/tree/LessExpression.java
+sun/tools/tree/LessOrEqualExpression.java
+sun/tools/tree/LocalMember.java
+sun/tools/tree/LongExpression.java
+sun/tools/tree/MethodExpression.java
+sun/tools/tree/MultiplyExpression.java
+sun/tools/tree/NaryExpression.java
+sun/tools/tree/NegativeExpression.java
+sun/tools/tree/NewArrayExpression.java
+sun/tools/tree/NewInstanceExpression.java
+sun/tools/tree/Node.java
+sun/tools/tree/NotEqualExpression.java
+sun/tools/tree/NotExpression.java
+sun/tools/tree/NullExpression.java
+sun/tools/tree/OrExpression.java
+sun/tools/tree/PositiveExpression.java
+sun/tools/tree/PostDecExpression.java
+sun/tools/tree/PostIncExpression.java
+sun/tools/tree/PreDecExpression.java
+sun/tools/tree/PreIncExpression.java
+sun/tools/tree/RemainderExpression.java
+sun/tools/tree/ReturnStatement.java
+sun/tools/tree/ShiftLeftExpression.java
+sun/tools/tree/ShiftRightExpression.java
+sun/tools/tree/ShortExpression.java
+sun/tools/tree/Statement.java
+sun/tools/tree/StringExpression.java
+sun/tools/tree/SubtractExpression.java
+sun/tools/tree/SuperExpression.java
+sun/tools/tree/SwitchStatement.java
+sun/tools/tree/SynchronizedStatement.java
+sun/tools/tree/ThisExpression.java
+sun/tools/tree/ThrowStatement.java
+sun/tools/tree/TryStatement.java
+sun/tools/tree/TypeExpression.java
+sun/tools/tree/UnaryExpression.java
+sun/tools/tree/VarDeclarationStatement.java
+sun/tools/tree/UplevelReference.java
+sun/tools/tree/WhileStatement.java
+sun/tools/tree/Vset.java
+sun/tools/util
+sun/tools/util/SCCS
+sun/tools/util/SCCS/s.ModifierFilter.java
+sun/tools/util/SCCS/s.CommandLine.java
+sun/tools/util/CommandLine.java
+sun/tools/util/ModifierFilter.java
+sun/util
+sun/util/SCCS
+sun/util/SCCS/s.BuddhistCalendar.java
+sun/util/SCCS/s.PreHashedMap.java
+sun/util/calendar
+sun/util/calendar/SCCS
+sun/util/calendar/SCCS/s.AbstractCalendar.java
+sun/util/calendar/SCCS/s.BaseCalendar.java
+sun/util/calendar/SCCS/s.CalendarDate.java
+sun/util/calendar/SCCS/s.CalendarSystem.java
+sun/util/calendar/SCCS/s.CalendarUtils.java
+sun/util/calendar/SCCS/s.Era.java
+sun/util/calendar/SCCS/s.Gregorian.java
+sun/util/calendar/SCCS/s.JulianCalendar.java
+sun/util/calendar/SCCS/s.ZoneInfo.java
+sun/util/calendar/SCCS/s.ZoneInfoFile.java
+sun/util/calendar/AbstractCalendar.java
+sun/util/calendar/BaseCalendar.java
+sun/util/calendar/CalendarDate.java
+sun/util/calendar/CalendarSystem.java
+sun/util/calendar/CalendarUtils.java
+sun/util/calendar/Era.java
+sun/util/calendar/Gregorian.java
+sun/util/calendar/JulianCalendar.java
+sun/util/calendar/ZoneInfo.java
+sun/util/calendar/ZoneInfoFile.java
+sun/util/logging
+sun/util/logging/resources
+sun/util/logging/resources/SCCS
+sun/util/logging/resources/SCCS/s.logging_zh_CN.properties
+sun/util/logging/resources/SCCS/s.logging.properties
+sun/util/logging/resources/SCCS/s.logging_de.properties
+sun/util/logging/resources/SCCS/s.logging_es.properties
+sun/util/logging/resources/SCCS/s.logging_fr.properties
+sun/util/logging/resources/SCCS/s.logging_it.properties
+sun/util/logging/resources/SCCS/s.logging_ja.properties
+sun/util/logging/resources/SCCS/s.logging_ko.properties
+sun/util/logging/resources/SCCS/s.logging_sv.properties
+sun/util/logging/resources/SCCS/s.logging_zh_TW.properties
+sun/util/logging/resources/logging_de.properties
+sun/util/logging/resources/logging.properties
+sun/util/logging/resources/logging_es.properties
+sun/util/logging/resources/logging_fr.properties
+sun/util/logging/resources/logging_it.properties
+sun/util/logging/resources/logging_ja.properties
+sun/util/logging/resources/logging_ko.properties
+sun/util/logging/resources/logging_sv.properties
+sun/util/logging/resources/logging_zh_CN.properties
+sun/util/logging/resources/logging_zh_TW.properties
+sun/util/BuddhistCalendar.java
+sun/util/PreHashedMap.java
+sunw
+sunw/io
+sunw/io/SCCS
+sunw/io/SCCS/s.Serializable.java
+sunw/io/Serializable.java
+sunw/util
+sunw/util/SCCS
+sunw/util/SCCS/s.EventListener.java
+sunw/util/SCCS/s.EventObject.java
+sunw/util/EventListener.java
+sunw/util/EventObject.java
+overview-bundled.html
+jdi-overview.html
+overview-core.html

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/words/ids.txt
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/words/ids.txt	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/words/ids.txt	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,29203 @@
+
+0
+00
+000
+0000
+000000000
+000000000000000000000000000000000000000000000000000000000000000
+0001
+0009
+000D
+000a
+000ms
+0010
+00123
+002
+0020
+0021
+002F
+003
+003A
+004
+0040
+005
+005B
+006
+0060
+007
+007B
+007E
+00am
+01
+010
+01004
+011
+012
+01234
+01234567
+0123456789
+0123456789abcdef
+0123456789abcdefghijklmnopqrstuvwxyz
+013
+014
+015
+016
+017
+02
+020
+0200
+0201
+0208
+021
+0212
+022
+023
+024
+025
+026
+027
+03
+030
+031
+032
+033
+034
+035
+036
+0369
+037
+04
+040
+042
+0430
+044
+046
+05
+050
+052
+054
+056
+06
+060
+062
+064
+066
+07
+070
+072
+074
+076
+08
+08001
+09
+092
+096139210x
+0D
+0F
+0L
+0X
+0d
+0e0
+0e0f
+0e1
+0e10
+0e10f
+0e11
+0e12
+0e13
+0e14
+0e15
+0e16
+0e17
+0e18
+0e19
+0e1f
+0e2
+0e20
+0e21
+0e22
+0e2f
+0e3
+0e300
+0e3f
+0e4
+0e4f
+0e5
+0e5f
+0e6
+0e6f
+0e7
+0e7f
+0e8
+0e8f
+0e9
+0e9f
+0f
+0s
+0t
+0th
+0x
+0x0
+0x00
+0x0000
+0x00000000
+0x00000001
+0x000000FF
+0x000000ff
+0x00000100
+0x00000400
+0x00000800
+0x00000C00
+0x00001000
+0x00003000
+0x00004000
+0x00005000
+0x00007000
+0x00008000
+0x0000FF00
+0x0000ff00
+0x0000ffff
+0x0001
+0x00010000
+0x00020000
+0x0008
+0x0009
+0x000A
+0x000C
+0x000D
+0x000F
+0x000FFFFFFFFFFFFFL
+0x000fffff
+0x000fffffffffffffL
+0x0010
+0x001F
+0x0020
+0x0027
+0x0060
+0x007F
+0x007e
+0x007fffff
+0x0080
+0x009F
+0x00F6
+0x00FF0000
+0x00ff
+0x00ff0000
+0x00s
+0x01
+0x0102030405060708L
+0x02
+0x03
+0x04
+0x0409
+0x05
+0x07FC0000
+0x07FF
+0x07ffffff
+0x08
+0x08000000
+0x0F
+0x0f
+0x0f0f0f0f
+0x0f0f0f0f0f0f0f0fL
+0x0ff
+0x1
+0x10
+0x100
+0x1000
+0x10000
+0x10000000
+0x1000000000000000L
+0x10000000000000L
+0x1001
+0x1002
+0x1003
+0x1006
+0x11
+0x1100
+0x1161
+0x11a7
+0x12
+0x1269ae40
+0x12bf307ae81ffd59L
+0x14adf4b7320334b9L
+0x159fd800
+0x16bcc41e90000000L
+0x17179149
+0x172588ad4f5f0981L
+0x18754571
+0x19a10000
+0x1A
+0x1C
+0x1E
+0x1F
+0x1L
+0x1cb91000
+0x1e39a5057d810000L
+0x1eca170c00000000L
+0x1f
+0x2
+0x20
+0x200
+0x2000
+0x20000
+0x211e44f7d02c1000L
+0x226ed36478bfa000L
+0x23744899
+0x247dbc80
+0x2700
+0x27b95e997e21d9f1L
+0x2E
+0x2b73a840
+0x2d04b7fdd9c0ef49L
+0x2ee56725f06e5c71L
+0x3
+0x30
+0x309f1021
+0x33333333
+0x3333333333333333L
+0x34e63b41
+0x3547667b
+0x3642798750226111L
+0x383d9170b85ff80bL
+0x39aa400
+0x3E0
+0x3F
+0x3b9aca00
+0x3f
+0x4
+0x40
+0x400
+0x4000
+0x40000
+0x40000000
+0x4000000000000000L
+0x41c21cb8e1000000L
+0x45
+0x4546b3db
+0x48c27395
+0x4c4b4000
+0x4c650
+0x4cfa3cc1
+0x4d28cb56c33fa539L
+0x4e900abb53e6b71L
+0x50
+0x53
+0x54
+0x56
+0x5658597bcaa24000L
+0x57f6c100
+0x5B
+0x5DEECE66DL
+0x5a3c23e39c000000L
+0x5b27ac993df97701L
+0x5c13d840
+0x5da0e1e53c5c8000L
+0x61
+0x64
+0x6765c793fa10079dL
+0x6E
+0x6b5a6e1d
+0x6c20a40
+0x6d91b519
+0x6feb266931a75b7L
+0x7
+0x70
+0x70000000
+0x71
+0x72
+0x73
+0x74
+0x75
+0x75db9c97
+0x76
+0x7600ec618141000L
+0x77
+0x78
+0x78000000
+0x780c7372621bd74dL
+0x79
+0x7A
+0x7B
+0x7C
+0x7D
+0x7E000000
+0x7F
+0x7F000000
+0x7FF0000000000000L
+0x7FFF0000
+0x7FFFFFFF
+0x7e0000
+0x7f
+0x7f7fffff
+0x7f800000
+0x7f800001
+0x7fc00000
+0x7fefffffffffffffL
+0x7ff0000000000000L
+0x7ff0000000000001L
+0x7ff8000000000000L
+0x7ffL
+0x7fffff
+0x7fffffff
+0x7fffffffffffffffL
+0x8
+0x80
+0x800
+0x8000
+0x80000
+0x800000
+0x80000000
+0x8000000000000000L
+0x85
+0x8d2d931
+0xA1
+0xAA
+0xAC
+0xB
+0xB1
+0xBA
+0xBE
+0xBL
+0xC
+0xC0
+0xC00
+0xC1
+0xCA
+0xCAFEBABE
+0xCE
+0xCF
+0xD0
+0xD8
+0xD800
+0xDBFF
+0xDC00
+0xDFFF
+0xE0
+0xE1
+0xED
+0xEE
+0xF
+0xF9
+0xFE
+0xFF
+0xFF00
+0xFF0000
+0xFF000000
+0xFF000080
+0xFF005C5C
+0xFF808080
+0xFFC0C0C0
+0xFFE0E000
+0xFFE0E0E0
+0xFFFF
+0xFFFFFFFF
+0xFFFFFFFFL
+0xFFFFL
+0xFFL
+0xa2f1b6f
+0xaaaaaaaa
+0xaaaaaaaaaaaaaaaaL
+0xac00
+0xaced
+0xaee5720ee830681L
+0xb16a458ef403f19L
+0xb640000
+0xc0
+0xc29e98000000000L
+0xcc6db61
+0xd7a4
+0xde0b6b3a7640000L
+0xe0
+0xe0000000
+0xe8d4a51
+0xf0000000
+0xfe
+0xff
+0xff00
+0xff0000
+0xff000000
+0xff00000000000000L
+0xff800000
+0xff800001
+0xfff0000000000000L
+0xfff0000000000001L
+0xffff
+0xffff0000
+0xffffff00
+0xfffffffL
+0xfffffffe
+0xffffffff
+0xffffffffL
+0xfffffffffffffL
+0xffffffffffffffffL
+0xxxxxxx
+1
+10
+100
+1000
+10000
+100000
+1000000
+100000000
+1000000000
+1000000000000000055511151231257827021181583404541015625
+1000070633030801713L
+1001
+1002
+1003
+1004
+1005
+1006
+1007
+1008
+100850
+1009
+1009836000000L
+1009839600000L
+1009843200000L
+100ms
+100x100
+101
+1010
+1011
+1012
+1013
+1014
+1015
+1016
+1017
+1018
+1019
+102
+1020
+1021
+1022
+1023
+1024
+1025
+102L
+1030
+1034234728574286014L
+104
+105
+106
+10646
+106749550580L
+106751991168
+1075
+108
+1080
+1098
+1099
+10L
+10x13
+10x14
+10x15
+10xx
+10xxxxxx
+11
+110
+1100110
+110592
+110L
+110x
+110xxxxx
+111
+1110
+1110xxxx
+1111
+1111xxxx
+112
+1125
+114
+116
+117
+118
+118526816881161077L
+1189
+11PM
+12
+120
+121
+122
+12219292800000L
+1224463164541339165L
+123
+1231
+1234
+1234321
+12345
+123456
+1234567
+1237
+12373
+124
+12472
+1249
+125
+126
+1265
+127
+128
+1297
+13
+130
+132
+134
+1349
+1356099454469L
+136
+1360826667806852920L
+137
+14
+140
+1414
+1415
+14159265358979323846
+142
+1421746759512286392L
+143
+143448358473180225L
+144
+1456
+146
+146097
+1461
+1464
+148
+15
+150
+1500
+151
+152
+1521711792217232256L
+153833
+154
+156
+1582
+1582296315990362920L
+16
+160
+162
+1624
+163
+164
+166
+167
+168
+1681126225205050147L
+1682
+169
+16BE
+16LE
+16x16
+17
+170
+172
+1721426
+174
+175
+176
+176091259
+179
+1793
+18
+180
+1800000
+1800467484195073863L
+1807547505821590642L
+181
+1819846354050686206L
+182
+1820017752578914078L
+1825314779160409405L
+1857741824849069317L
+186
+1889339587208144238L
+189
+19
+1900
+1900414231151323879L
+1903
+1904
+1905
+1918
+1919
+192
+1928
+1947
+1949
+195
+1952
+1964
+1969
+1970
+1978198479659022715L
+1986
+1993
+1994
+1995
+1996
+1997
+1998
+1999
+19991101
+19991106
+1L
+1e
+1e128
+1e16
+1e256
+1e32
+1e64
+1f
+1st
+1xx
+2
+20
+200
+2000
+2001
+2002
+2003
+2004
+2005
+2006
+201
+2010
+2012
+2018
+202
+2022
+203
+204
+2048
+205
+2053
+206
+21
+210
+212
+213
+2130706433
+214
+2147483647
+2147483648
+215
+216
+21757335363267194L
+21st
+22
+220
+2214773872412987419L
+222
+224
+225
+2250
+226
+2272572637695466749L
+2278
+2279
+228
+2284879212465893870L
+229
+2299161
+23
+230
+230798
+2308460125733713944L
+231
+232
+234
+234E3
+236
+2373
+2378
+238
+239
+2396
+23E4
+23E45
+24
+240
+241
+242
+243
+244
+2440588
+246
+2491878825643557906L
+25
+250
+252
+253
+254
+255
+255L
+255f
+256
+257
+259
+25th
+26
+260
+262
+264
+2648
+266
+2671257302660747028L
+2673458971256075116L
+27
+270
+270799
+2712
+272
+2728009084054400034L
+273
+2732
+2739099268398711800L
+274
+2745179027874758501L
+275
+276
+2764017481108945198L
+2767605614048989439L
+2781
+28
+283967356065247728L
+2875
+28800000
+289529654D
+29
+292269054
+292269055
+292272993
+292275056
+292278994
+2966288784432217853L
+297
+299
+299282585814624189L
+2A0
+2D
+2FCS
+2XX
+2a0
+2b4
+2e
+2h
+2nd
+2v
+2xx
+3
+30
+300
+301
+301029995663981
+301077366599181567L
+302
+303
+304
+3042686055658047285L
+305
+3053995032091335093L
+306
+3072
+308
+309
+3093736618740652951L
+3094126758329070636L
+30F3
+30pm
+31
+310
+312
+314
+316
+3166
+3193687207550431679L
+32
+320
+3200
+3206093459760846163L
+322
+324
+3247
+326
+32767
+32768
+3286316764910316507L
+32pm
+32x32
+33
+330
+3304312411574666869L
+331
+332
+3326426625597282442L
+334
+335
+3359745691033257079L
+336
+3387516993124229948L
+3388685877147921107L
+34
+340
+3402
+342
+344
+345
+3456
+345E3
+346
+34e
+35
+350
+352
+353
+354
+3543
+355
+356
+3581463369166924961L
+359
+36
+360
+3600000
+36000000
+3609922007826600659L
+362
+362498820763181265L
+364
+365
+36524
+365L
+366
+3665804199014368530L
+367
+3672
+3692302836626095722L
+37
+370
+371
+372
+3729780091441768983L
+374
+375
+376
+377
+3786198910865385080L
+3790
+38
+3856
+3899
+38f
+39
+3905348978240129619L
+3D
+3E
+3E3
+3L
+3XX
+3b
+3xx
+4
+40
+400
+4001
+4006245
+401
+402
+4023755556366636806L
+4028235e
+403
+403250971215465050L
+404
+405
+4059614
+406
+4061116
+407
+4075310674757313071L
+408
+409
+4096
+40foo
+41
+410
+4106658
+4106667
+411
+4112352
+4112578634029874840L
+4114077
+411787
+412
+4122683
+4124460
+4128923
+413
+414
+4147706
+4149677
+415
+4153860
+4154308
+4155217
+4162852
+4173516
+4173604
+4178589
+4179
+4181562
+4186
+42
+420
+4206021311591459213L
+4217
+4271
+4285201
+4290774380558885855L
+4298000515446427739L
+42pm
+43
+4300693
+4301064
+4320890
+4328196481005934313L
+4345857070255674764L
+4348425
+4350
+4352819
+4360508
+4389284
+4390019
+4395290
+44
+4407610
+4408108
+4418903
+4426
+4450867
+4461737
+4497834738069338734L
+4498
+45
+4503142729533789064L
+4536902356223894379L
+456
+4567
+456E3
+456e
+458
+45f
+46
+4613797578919906343L
+4620452533522760060L
+4633
+4696
+47
+4723952579491349524L
+4724086851538908602L
+473
+4739377000350280650L
+473L
+4756
+477
+4774881970558875024L
+4775845313121906682L
+48
+4814
+48282
+483174189758638095L
+4863550261346652506L
+4870
+49
+4923
+4930327919388951260L
+4940670005562187L
+4975
+4980196508277280342L
+4A0
+4E
+4HEXDIG
+4XX
+4a0
+4e
+4x
+4xx
+5
+50
+500
+5000
+500000
+501
+502
+5024744406713321676L
+5025
+503
+5035145889651310422L
+504
+505
+5074
+509
+5090210921595982017L
+51
+510
+512
+5120
+513
+5148567311918794206L
+515
+5166
+5184291520170872969L
+52
+5210
+52429
+5253
+5276940640259749850L
+5295
+53
+535
+54
+5488922509400504703L
+55
+56
+567
+57
+5772796243397350300L
+58
+5836846270535785031L
+59
+5920926903803293709L
+594
+594380845140740218L
+597
+5987973545549424702L
+5B
+5D
+5L
+5XX
+5d
+5f
+5xx
+6
+60
+600
+60000
+6034044314589513430L
+6052424284110960213L
+61
+6108874887143696463L
+6120832682080437368L
+6190621106981774043L
+62
+6223554758134037936L
+63
+6314925228044966088L
+639
+64
+6401253773779951803L
+6460061437900069969L
+6479157306784022952L
+648
+64K
+65
+6520786458950516097L
+65535
+65536
+66
+6603384152749567654L
+6619395951570472985L
+6640330810709497518L
+67
+673
+678
+6789
+68
+6849794470754667710L
+69
+6a
+6b
+6c
+6g
+6th
+6x9
+7
+70
+700
+701
+7034897190745766939L
+7054464920481467219L
+707
+7088199405468872373L
+71
+7182818284590452354
+7183698231559129828L
+7187392471159151072L
+72
+7200000
+7207038068494060240L
+7218322306649953788L
+7262534875583282631L
+7270714317450821763L
+728
+73
+74
+75
+7515723908773894738L
+7523967970034938905L
+754
+7589
+75f
+76
+7627629688361524110L
+7644114512714619750L
+768
+77
+7712
+7754090372962971524L
+7777
+78
+7930732926638008763L
+7956609840827222915L
+7976931348623157e
+7997698588986878753L
+7days
+7th
+7x9
+8
+80
+800
+8028237497568985504L
+8080
+8087809532704668744L
+81
+8125100834729963327L
+8152710247442114228L
+8192
+82
+822
+8287574255936472291L
+83
+836B
+837039928046
+84
+841
+8433406075740433514L
+8451667562882310543L
+8455284893909696482L
+85
+8575799808933029326L
+8601
+86400
+864000000L
+864413376551465018L
+8658291919501921765L
+8683452581122892189L
+87
+8742448824652078965L
+876323262645176354L
+8774683716313001058L
+88
+8809584163345499784L
+8838754796412211005L
+8842843931221139166L
+8859
+8859_1
+8888
+8890392402588814465L
+8988374069173025854L
+8th
+9
+90
+901
+9090
+91
+9142742483513960612L
+9149081749638150636L
+917
+9172774392245257468L
+9176873029745254542L
+919286545866124006L
+92
+9218657361741657110L
+9223372036794351616
+9223372036854775807
+9223372036854775807L
+9223372036854775808
+93
+94
+941st
+942
+94303
+95
+96
+97
+978
+98
+99
+999
+9999
+999999
+999999999
+9e
+9x11
+9x12
+A
+A0
+A1
+A10
+A2
+A3
+A4
+A5
+A6
+A7
+A8
+A9
+AA
+AAA
+AAD
+ABC
+ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ABORT
+ABORTED
+ABSTRACT
+ACC
+ACCEPT
+ACCESS
+ACCESSIBLE_CHILD_PROPERTY
+ACCESSIBLE_STATE_PROPERTY
+ACCESSIBLE_TEXT_PROPERTY
+ACCESSIBLE_VALUE_PROPERTY
+ACK
+ACM
+ACP
+ACTION_EVENT
+ACTION_EVENT_MASK
+ACTION_FIRST
+ACTION_LAST
+ACTION_PERFORMED
+ACTIVE
+ACTIVE_CAPTION
+ACTIVE_CAPTION_BORDER
+ACTIVE_CAPTION_TEXT
+AD
+ADAND
+ADDRESS_BITS_PER_UNIT
+ADDR_TYPE_NOT_SUP
+ADJUSTMENT_EVENT_MASK
+ADJUSTMENT_FIRST
+ADJUSTMENT_LAST
+ADJUSTMENT_VALUE_CHANGED
+ADP
+ADisk
+AE
+AEARE
+AFAFG
+AFTER
+AFTER_LAST_LINE
+AFTER_LINE_ENDS
+AGATG
+AGP
+AIAIA
+AINSWORTH
+AL
+ALALB
+ALIAS
+ALIGN
+ALL
+ALLBITS
+ALL_FLAGS
+ALPHABETIC_PRESENTATION_FORMS
+ALPHA_INTERPOLATION_DEFAULT
+ALPHA_INTERPOLATION_QUALITY
+ALPHA_INTERPOLATION_SPEED
+ALREADY
+ALT
+ALTER
+ALT_DOWN_MASK
+ALT_GRAPH_MASK
+ALT_MASK
+ALWAYS
+AM
+AMARM
+AM_PM
+AM_PM_FIELD
+AN
+ANANT
+ANCESTOR_MOVED
+ANCESTOR_RESIZED
+AND
+ANSI
+ANSI92
+ANY
+ANY_EVENT
+AOAGO
+API
+APIs
+APRIL
+AQATA
+ARABIC
+ARABIC_DECIMAL_SEPARATOR
+ARABIC_PERCENT_SIGN
+ARABIC_PRESENTATION_FORMS_A
+ARABIC_PRESENTATION_FORMS_B
+ARARG
+ARGB
+ARGUMENT
+ARMENIAN
+ARRAY
+ARRAYS
+ARRAY_SIZE_INCREMENT
+ARROWS
+ARchive
+AS
+ASASM
+ASCII
+ASCII_AMPERSAND
+ASCII_APOSTROPHE
+ASCII_CARRIAGE_RETURN
+ASCII_CENT_SIGN
+ASCII_COLON
+ASCII_COMMA
+ASCII_DOLLAR_SIGN
+ASCII_END_OF_TEXT
+ASCII_EXCLAMATION_MARK
+ASCII_FORM_FEED
+ASCII_FULL_STOP
+ASCII_HORIZONTAL_TABULATION
+ASCII_LINEFEED
+ASCII_NONBREAKING_SPACE
+ASCII_NUMBER_SIGN
+ASCII_PERCENT
+ASCII_POUND_SIGN
+ASCII_QUESTION_MARK
+ASCII_QUOTATION_MARK
+ASCII_SEMICOLON
+ASCII_SPACE
+ASCII_VERTICAL_TABULATION
+ASCII_YEN_SIGN
+ASC_OR_DESC
+ASN
+ASSERT
+AST
+AT
+ATAUT
+ATHLETES
+ATS
+ATTN
+ATTR_DEF
+ATTR_NAME
+ATTR_SIZE
+ATTR_TYPE_NAME
+AUAUS
+AUD
+AUGUST
+AUTOMATICALLY
+AUTO_INCREMENT
+AWABW
+AWT
+AWTAutoShutdown
+AWTError
+AWTEvent
+AWTEventListener
+AWTEventListenerProxy
+AWTEventListeners
+AWTEventMulticaster
+AWTEvents
+AWTException
+AWTInvocationLock
+AWTKeyStroke
+AWTKeyStrokes
+AWTPermission
+AWTTreeLock
+AWT_COMPONENT
+AZ
+AZAZE
+A_DATA
+A_TO_Z
+Abbrechen
+Aboriginal
+Above
+Absolute
+Absract
+Abstract
+AbstractButton
+AbstractChannel
+AbstractCollection
+AbstractList
+AbstractMap
+AbstractMethodError
+AbstractSelectableChannel
+AbstractSequentialList
+AbstractSet
+Accents
+Accept
+Acceptable
+Accepted
+Accepts
+Access
+AccessControl
+AccessControlContext
+AccessControlException
+AccessController
+AccessException
+Accessibility
+Accessible
+AccessibleAWTButton
+AccessibleAWTCanvas
+AccessibleAWTCheckbox
+AccessibleAWTCheckboxMenuItem
+AccessibleAWTChoice
+AccessibleAWTComponent
+AccessibleAWTComponentHandler
+AccessibleAWTContainer
+AccessibleAWTDialog
+AccessibleAWTFocusHandler
+AccessibleAWTFrame
+AccessibleAWTLabel
+AccessibleAWTList
+AccessibleAWTListChild
+AccessibleAWTMenu
+AccessibleAWTMenuBar
+AccessibleAWTMenuComponent
+AccessibleAWTMenuItem
+AccessibleAWTPanel
+AccessibleAWTPopupMenu
+AccessibleAWTScrollBar
+AccessibleAWTScrollPane
+AccessibleAWTTextArea
+AccessibleAWTTextComponent
+AccessibleAWTTextField
+AccessibleAWTWindow
+AccessibleAction
+AccessibleApplet
+AccessibleComponent
+AccessibleContainer
+AccessibleContainerHandler
+AccessibleContext
+AccessibleObject
+AccessibleRole
+AccessibleSelection
+AccessibleState
+AccessibleStateSet
+AccessibleStates
+AccessibleText
+AccessibleValue
+Accessing
+Accessor
+According
+Accumulating
+Accuracy
+Acme
+Acquires
+Action
+ActionEvent
+ActionListener
+ActionListenerK
+ActionListeners
+Actions
+Activatable
+Activate
+Activation
+ActivationSystem
+ActiveEvent
+Actually
+Ad
+Adapted
+Add
+Added
+Adding
+Addison
+Addition
+Additional
+Additionally
+Address
+Addresses
+Addressing
+Adds
+Adjacent
+Adjust
+AdjustForGravity
+Adjustable
+Adjustables
+Adjusting
+Adjustment
+AdjustmentEvent
+AdjustmentListener
+AdjustmentListeners
+Adjustments
+Adjusts
+Advance
+Advanced
+Advances
+AffineTransform
+AffineTransformOp
+After
+Again
+Aggressively
+Agreement
+Aho
+Akira
+Alan
+Alg
+Algorithm
+AlgorithmObject
+AlgorithmParameterGenerator
+AlgorithmParameterGeneratorSpi
+AlgorithmParameterSpec
+AlgorithmParameters
+AlgorithmParametersSpi
+Algorithms
+Alias
+Alice
+All
+AllPermission
+AllPermissionCollection
+AllPermissions
+Allocate
+Allocates
+Allow
+AllowUserInteraction
+Allowed
+Allowing
+Allows
+Almost
+Alpha
+AlphaComposite
+Alphabet
+Alphabetic
+Alphanumerics
+Already
+AlreadyBoundException
+Also
+Alt
+Alternate
+Alternatively
+Although
+Alto
+Always
+AmPmMarkers
+Ambiguity
+Amendment
+America
+American
+Among
+Amy
+An
+And
+Angles
+Ann
+Annex
+Anno
+Annotation
+Another
+Answer
+Antarctica
+Antialiasing
+Antonio
+Any
+AnyLocal
+Anything
+AppA
+AppContext
+AppContexts
+Appease
+Append
+Appendix
+Appends
+Applet
+AppletAudioClip
+AppletContext
+AppletInitializer
+AppletStub
+Applets
+Application
+Applications
+Applies
+Apply
+Applying
+Appropriate
+Approximate
+Apr
+April
+Arabic
+Architecture
+Are
+Area
+AreaAveragingScaleFilter
+Argh
+Argument
+ArgumentIndex
+Arial
+Arithmetic
+ArithmeticException
+Armenian
+Arnaud
+Arnold
+Arrange
+ArrangeGrid
+Array
+ArrayIndexOutOfBoundsException
+ArrayList
+ArrayPersistenceDelegate
+ArrayStoreException
+Arrays
+Arrow
+Arrows
+Art
+Arthur
+As
+Ascii
+Asian
+Aside
+Ask
+Asmus
+Assert
+Assertion
+AssertionError
+AssertionStatusDirectives
+Assign
+Assigns
+Assistive
+Associate
+Associated
+Associates
+Asssume
+Assume
+Assumes
+AsynchronousCloseException
+At
+Athletes
+Atomically
+Atop
+Attaches
+Attachments
+Attatching
+Attempt
+Attempted
+Attempting
+Attempts
+Attribute
+AttributeEntry
+AttributeList
+AttributeMap
+AttributeSet
+AttributeStrings
+AttributeValue
+AttributedCharacterIterator
+AttributedCharacterIterators
+AttributedString
+AttributedStringIterator
+AttributedStrings
+Attributes
+AudioClip
+Aug
+August
+Authentication
+Authenticator
+Author
+Authoritative
+Authorities
+Authority
+Automatic
+Automatically
+Averaging
+Avoid
+Away
+Axis
+B
+B0
+B1
+B10
+B2
+B3
+B4
+B5
+B6
+B7
+B8
+B9
+BABIH
+BACKGROUND
+BACKWARD_TRAVERSAL_KEY
+BACKWARD_TRAVERSAL_KEYS
+BACK_SPACE
+BASE
+BASE_TYPE
+BASIC_LATIN
+BA_DIRECTORY
+BA_EXISTS
+BA_HIDDEN
+BA_REGULAR
+BBB
+BBBRB
+BC
+BCE
+BDBGD
+BDK
+BEBEL
+BEF
+BEFORE
+BEFORE_FIRST_LINE
+BEFORE_LINE_BEGINS
+BEGIN
+BEGINNING
+BEHK
+BENGALI
+BEVEL
+BFBFA
+BGBGR
+BGL
+BHBHR
+BIBDI
+BIDI_EMBEDDING
+BIGINT
+BIG_ENDIAN
+BIN
+BINARY
+BINARYSEARCH_THRESHOLD
+BIND
+BIRs
+BIT
+BITARRAYMASK
+BITMASK
+BITS_PER_BYTE
+BITS_PER_UNIT
+BIT_DEPTH_MULTI
+BIT_INDEX_MASK
+BJBEN
+BL
+BLACK
+BLOB
+BLOCK_DECREMENT
+BLOCK_ELEMENTS
+BLOCK_INCREMENT
+BLUE
+BMBMU
+BMP
+BN
+BNBRN
+BO
+BOBOL
+BOLD
+BOLDITALIC
+BOOLEAN
+BOPOMOFO
+BOPOMOFO_EXTENDED
+BORDER
+BOTH
+BOTTOM_ALIGNMENT
+BOV
+BOX_DRAWING
+BR
+BRAILLE_PATTERNS
+BRBRA
+BREAK
+BREAKING
+BSBHS
+BSD
+BTBTN
+BUFFER_LENGTH
+BUNDLED
+BUSY
+BUTT
+BUTTON1_DOWN_MASK
+BUTTON1_MASK
+BUTTON2_DOWN_MASK
+BUTTON2_MASK
+BUTTON3_DOWN_MASK
+BUTTON3_MASK
+BVBVT
+BWBWA
+BY
+BYB
+BYBLR
+BYTEMASK
+BYTEPOWER
+BYTES_PER_INT
+BYTES_PER_VALUE
+BZBLZ
+Back
+BackSpace
+Backing
+Backward
+Backwards
+Bad
+Bags
+Bail
+Balancing
+Ball
+Bar
+Base
+Basic
+BasicPermission
+BasicPermissionCollection
+BasicPermissions
+BasicSplitPaneUI
+BasicStroke
+BasicVerticalLayoutManager
+Basically
+BatchUpdateException
+Bbits
+Be
+Bean
+BeanBox
+BeanContext
+BeanContextChild
+BeanContextMembershipListener
+BeanContextMembershipListeners
+BeanDescriptor
+BeanInfo
+Beans
+BeansAppletContext
+BeansAppletStub
+Beauty
+Because
+Before
+Begin
+Beginning
+Behaves
+Behavior
+Being
+Below
+Bengali
+Benjamin
+Bentley
+Besides
+Best
+BevelBorder
+BevelBorderUIResource
+Bidi
+Big
+BigDecimal
+BigDecimals
+BigDecmal
+BigInteger
+BigIntegers
+BigObjectThatShouldNotBeSerializedWithAButton
+Bill
+Binary
+Bind
+BindException
+Binding
+Binds
+Bit
+BitSet
+BitSets
+BitSieve
+Bits
+Bitset
+Bitwise
+Black
+Blank
+Blends
+Blob
+Bloch
+Block
+BlockDataInputStream
+BlockDataOutputStream
+Blocking
+BltBufferStrategy
+Blue
+Bob
+Bold
+Bonus
+BoolEditor
+Boolean
+Booleans
+Bopomofo
+BorderLayout
+BorderUIResource
+Both
+Bottom
+Bounds
+Box
+BoxLayout
+Boynton
+Braille
+Break
+BreakDictionary
+BreakIterator
+BreakIteratorCache
+BreakIteratorClasses
+BreakIteratorRules
+BreakIterators
+Breaking
+Breaks
+Brown
+BuddhistCalendar
+Buffer
+BufferB
+BufferCapabilities
+BufferOverflowException
+BufferS
+BufferStrategy
+BufferU
+BufferUnderflowException
+Buffered
+BufferedImage
+BufferedImageOp
+BufferedInputStream
+BufferedOutputStream
+BufferedReader
+BufferedWriter
+Buffering
+Bug
+BugTraq
+Build
+BuildAPI
+BuildDictionaryFile
+Builder
+Builds
+Bulk
+Bump
+Business
+But
+Button
+Button1
+Button10
+Button2
+Button3
+Button4
+Button5
+Button6
+Button7
+Button8
+Button9
+ButtonGrid
+ButtonPeer
+Buttons
+Bval
+By
+Byrne
+Byte
+ByteArrayInputStream
+ByteArrayOutputStream
+ByteBuffer
+ByteBufferAs
+ByteBufferAsCharBuffer
+ByteBufferAsCharBufferB
+ByteBufferAsCharBufferL
+ByteBufferAsCharBufferRB
+ByteBufferAsCharBufferRL
+ByteBufferAsDoubleBufferB
+ByteBufferAsDoubleBufferL
+ByteBufferAsDoubleBufferRB
+ByteBufferAsDoubleBufferRL
+ByteBufferAsFloatBufferB
+ByteBufferAsFloatBufferL
+ByteBufferAsFloatBufferRB
+ByteBufferAsFloatBufferRL
+ByteBufferAsIntBufferB
+ByteBufferAsIntBufferL
+ByteBufferAsIntBufferRB
+ByteBufferAsIntBufferRL
+ByteBufferAsLongBufferB
+ByteBufferAsLongBufferL
+ByteBufferAsLongBufferRB
+ByteBufferAsLongBufferRL
+ByteBufferAsShortBufferB
+ByteBufferAsShortBufferL
+ByteBufferAsShortBufferRB
+ByteBufferAsShortBufferRL
+ByteChannel
+ByteEditor
+ByteFilter
+ByteInterleavedRaster
+ByteOrder
+ByteOutputter
+ByteToCharConverter
+Bytes
+C
+C0
+C1
+C10
+C2
+C3
+C4
+C5
+C6
+C7
+C8
+C9
+CA
+CACAN
+CACHE_LOAD_FACTOR
+CANADA
+CANADA_FRENCH
+CANCEL
+CANCELLED
+CANONICAL_DECOMPOSITION
+CANVAS
+CAPITAL
+CAPS_LOCK
+CAP_BUTT
+CAP_ROUND
+CAP_SQUARE
+CARDINALITY
+CARET_POSITION_CHANGED
+CARON
+CARRIAGE
+CASE_INSENSITIVE_ORDER
+CASE_SENSITIVE
+CCCCK
+CDT
+CE
+CEASE
+CENTER
+CENTER_ALIGNMENT
+CENTER_BASELINE
+CERTIFICATES
+CFCAF
+CGCOG
+CH
+CHANGE
+CHAR
+CHARACTER
+CHARACTER_INDEX
+CHARINDEX
+CHAR_BUF_SIZE
+CHAR_ERROR
+CHAR_OCTET_LENGTH
+CHAR_UNDEFINED
+CHCHE
+CHECKED
+CHECK_BOX
+CHEROKEE
+CHF
+CHINA
+CHINESE
+CICIV
+CJK
+CJK_COMPATIBILITY
+CJK_COMPATIBILITY_F900
+CJK_COMPATIBILITY_FA2D
+CJK_COMPATIBILITY_FORMS
+CJK_COMPATIBILITY_IDEOGRAPHS
+CJK_RADICALS_SUPPLEMENT
+CJK_SYMBOLS_AND_PUNCTUATION
+CJK_UNIFIED_IDEOGRAPHS
+CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
+CKCOK
+CLASSPATH
+CLASS_NAME
+CLCHL
+CLEAR
+CLEAR_GLOBAL_FOCUS_OWNER
+CLF
+CLI
+CLIENT
+CLOB
+CLOSE_ALL_RESULTS
+CLOSE_CURRENT_RESULT
+CLOSE_CURSORS_AT_COMMIT
+CLR
+CMCMR
+CMD_NOT_SUPPORTED
+CMYK
+CN
+CNCHN
+CNFException
+COCOL
+CODE
+COLLATIONKEYOFFSET
+COLON
+COLOR
+COLOR_RENDER_DEFAULT
+COLOR_RENDER_QUALITY
+COLOR_RENDER_SPEED
+COLS
+COLUMN_DEF
+COLUMN_NAME
+COLUMN_SIZE
+COLUMN_TYPE
+COL_COUNT
+COM
+COMBINING_DIACRITICAL_MARKS
+COMBINING_HALF_MARKS
+COMBINING_KATAKANA_HIRAGANA_VOICED_SOUND_MARK
+COMBINING_MARKS_FOR_SYMBOLS
+COMBINING_SPACING_MARK
+COMBO_BOX
+COMMON
+COMPLETE
+COMPLETELY
+COMPONENT_ADDED
+COMPONENT_EVENT_MASK
+COMPONENT_FIRST
+COMPONENT_HIDDEN
+COMPONENT_LAST
+COMPONENT_MOVED
+COMPONENT_REMOVED
+COMPONENT_RESIZED
+COMPONENT_SHOWN
+COMPOSE
+CONCUR_READ_ONLY
+CONCUR_UPDATABLE
+CONNECT
+CONNECTOR_PUNCTUATION
+CONN_REFUSED
+CONSTANTS
+CONSTRUCTOR
+CONTAINER_EVENT_MASK
+CONTAINER_FIRST
+CONTAINER_LAST
+CONTRACTCHARINDEX
+CONTROL
+CONTROL_DK_SHADOW
+CONTROL_HIGHLIGHT
+CONTROL_LT_HIGHLIGHT
+CONTROL_PICTURES
+CONTROL_SHADOW
+CONTROL_TEXT
+CONVERSION
+CONVERSIONS
+CONVERT
+COPIED
+COPY_THRESHOLD
+COUNTRY_TYPE_MASK
+COUNTRY_WITHOUT_CURRENCY_ENTRY
+CR
+CRCRI
+CREATE
+CREATED
+CREATE_PARAMS
+CROSSHAIR_CURSOR
+CRs
+CS
+CST
+CS_sRGB
+CTRL
+CTRL_DOWN_MASK
+CTRL_MASK
+CTT
+CT_ALPHA
+CT_COMMENT
+CT_DIGIT
+CT_QUOTE
+CT_WHITESPACE
+CUCUB
+CURRENCY
+CURRENCYSTYLE
+CURRENCY_SIGN
+CURRENCY_SYMBOL
+CURRENCY_SYMBOLS
+CUSTOM_CURSOR
+CUSTOM_ID
+CVCPV
+CXCXR
+CYAN
+CYCYP
+CYRILLIC
+CZCZE
+Cable
+Cache
+CacheEntry
+Cached
+Caches
+Caculate
+Calculate
+Calculates
+Calendar
+CalendarDate
+Calendars
+California
+Call
+CallableStatement
+Callback
+Callbacks
+Called
+Callers
+Calling
+Calls
+Can
+Canada
+Canadian
+Cancel
+CancelKey
+Cancelled
+CancelledKeyException
+Cancelling
+Cancels
+Candidate
+Candidates
+Cannot
+Canonical
+Canvas
+CanvasPeer
+Canvases
+Capabilities
+Capacity
+Caps
+CarSet
+Card
+CardLayout
+Care
+Careful
+Carl
+Carry
+Cartesian
+Case
+CaseInsensitiveComparator
+Cause
+Caused
+Causes
+Caution
+Caveats
+Cc
+Cd
+Center
+Centers
+Central
+CertPathBuilder
+CertPathValidator
+CertStore
+CertStoreParameters
+Certain
+Certificate
+CertificateEncodingException
+CertificateException
+CertificateFactory
+Cerven
+Cervenec
+Cf
+Ch
+Chaining
+Chamness
+Change
+Changes
+Changing
+Channel
+Channels
+Char
+CharArrayReader
+CharArrayWriter
+CharBuffer
+CharConversionException
+CharSequence
+CharSet
+CharSets
+CharToByteConverter
+Character
+CharacterBreakData
+CharacterBreakDictionary
+CharacterBreakRules
+CharacterCodingException
+CharacterExceptionFlags
+CharacterIterater
+CharacterIterator
+CharacterIteratorFieldDelegate
+CharacterIterators
+Characters
+Chararcter
+Charset
+CharsetByteOutputter
+CharsetDecoder
+CharsetEncoder
+CharsetFiller
+CharsetProvider
+CharsetSD
+CharsetSE
+Charsets
+Cheap
+Check
+CheckBoxMenuItem
+Checkbox
+CheckboxGroup
+CheckboxMenuItem
+CheckboxMenuItemPeer
+CheckboxPeer
+Checked
+Checking
+Checks
+Chen
+Cherokee
+Child
+China
+Chinese
+Choice
+ChoiceFormat
+ChoicePeer
+Choices
+Choose
+Chris
+Christ
+Christophe
+Cipher
+Circumvent
+Claim
+Class
+ClassCastException
+ClassCircularityError
+ClassDataSlot
+ClassDataSlots
+ClassDescriptor
+ClassFormatError
+ClassID
+ClassLoader
+ClassLoaders
+ClassName
+ClassNotFoundException
+ClassNotFoundExceptions
+Classes
+Clean
+Cleans
+Clear
+ClearInterrupted
+Clearing
+Clears
+Clicking
+Client
+Clients
+Clip
+Clipboard
+Clob
+Clock
+Clone
+CloneNotSupportedException
+Cloneable
+Clones
+Cloning
+Close
+Closed
+ClosedByInterruptException
+ClosedChannelException
+ClosedSelectorException
+Closes
+Closing
+ClsID
+Cn
+Co
+Code
+CodeSource
+Coder
+Col
+Colin
+CollatinKey
+Collation
+CollationDecomp
+CollationElementIterator
+CollationElementIterators
+CollationElements
+CollationKey
+CollationKeys
+CollationRules
+Collator
+Collators
+Collect
+Collection
+Collections
+Collects
+Collet
+Color
+ColorChooser
+ColorModel
+ColorPaintContext
+ColorSpace
+ColorType
+ColorUIResource
+Colors
+Column
+Columns
+Combinations
+Combine
+Combiner
+Combining
+Command
+Comments
+Common
+CompactArray
+CompactByteArray
+CompactIntArray
+CompactShortArray
+Compacts
+Company
+Comparable
+Comparator
+Comparators
+Compare
+Compares
+Comparing
+Comparison
+Compatibility
+Compiler
+Compiles
+Complements
+Complete
+Completes
+Compliant
+Component
+ComponentEvent
+ComponentEvents
+ComponentFactory
+ComponentListener
+ComponentOrienation
+ComponentOrientation
+ComponentPeer
+Components
+Compose
+ComposedCharIter
+Composes
+Composite
+CompositeContext
+Compositing
+CompositionArea
+CompoundBorder
+CompoundBorderUIResource
+CompoundEnumeration
+Comprehensive
+Compute
+Computed
+Computer
+Computes
+Concatenates
+Conceptually
+Concrete
+Concurrency
+Concurrent
+ConcurrentModificationException
+ConcurrentModificationExceptions
+Conditional
+Condtional
+Confidential
+Conflict
+Conformant
+Conjoining
+Connect
+ConnectException
+ConnectIOException
+Connection
+Connects
+Connelly
+Consecutive
+Consequently
+Consider
+Consortium
+Constant
+Constants
+Constrain
+ConstrainableGraphics
+Constrained
+Construct
+Constructed
+Constructor
+Constructors
+Constructs
+Consult
+Consumes
+Contact
+Container
+ContainerEvent
+ContainerListener
+ContainerListner
+ContainerOrderFocusTraversalPolicy
+ContainerPeer
+Containers
+Contains
+Content
+ContentHandler
+ContentHandlerFactory
+Contents
+Context
+Continue
+Continues
+Continuing
+Control
+Controls
+Convenience
+ConversionBufferFullException
+Convert
+Converted
+Converter
+ConverterByteOutputter
+ConverterFiller
+ConverterSD
+ConverterSE
+Converters
+Converts
+Coordinate
+Coordinates
+Copies
+CopiesList
+Copy
+Copying
+Copyright
+Core
+Cormen
+Corp
+Correct
+Corresponding
+Corresponds
+Could
+Couldn
+Count
+Countries
+Country
+Counts
+Courier
+Create
+Created
+Creates
+Creating
+Creation
+Credit
+Croatia
+Croatian
+Crosshair
+CrosshairCursor
+Crossings
+CryptoSpec
+Cryptogaphy
+Cryptographic
+Cryptography
+Cs
+Ctrl
+Cubic
+Currencies
+Currency
+CurrencyData
+CurrencySymbols
+Current
+Currently
+Curso
+Cursor
+CursorDotPrefix
+Custom
+Customizer
+Cut
+Cx
+Cycle
+Cyrillic
+Czech
+D
+D1
+D2
+D3
+D4
+D5
+D6
+D7
+D8
+DARK_GRAY
+DASH_PUNCTUATION
+DATALINK
+DATA_TYPE
+DATE
+DATE_FIELD
+DAY
+DAY_OF_MONTH
+DAY_OF_WEEK
+DAY_OF_WEEK_FIELD
+DAY_OF_WEEK_IN_MONTH
+DAY_OF_WEEK_IN_MONTH_FIELD
+DAY_OF_YEAR
+DAY_OF_YEAR_FIELD
+DBL_DIG
+DBMS
+DBMSs
+DC
+DD
+DDD
+DDDD
+DDDDD
+DDDDDE
+DDL
+DE
+DEBUG
+DEBUGGING
+DECEMBER
+DECIMA
+DECIMAL
+DECIMAL_DIGITS
+DECIMAL_DIGIT_NUMBER
+DECIMAL_SEPARATOR
+DECLARATIONS
+DECLARED
+DEDEU
+DEFAULT
+DEFAULTRULES
+DEFAULT_CAPACITY
+DEFAULT_CURSOR
+DEFAULT_NOT_FOUND
+DEFAULT_PORT
+DEFAULT_VISIBLE_ROWS
+DEFERRABILITY
+DEGREE_CELSIUS
+DEGREE_FAHRENHEIT
+DELETE
+DELETED
+DELETEDs
+DELETE_RULE
+DEM
+DEPRECATE
+DERIVED
+DESCRIPTION
+DESELECTED
+DESKTOP
+DEVANAGARI
+DEVIATION
+DIALOG
+DIDN
+DIFFERENT
+DIGITS
+DIN
+DINGBATS
+DIRECTION
+DIRECTIONALITY_ARABIC_NUMBER
+DIRECTIONALITY_BOUNDARY_NEUTRAL
+DIRECTIONALITY_COMMON_NUMBER_SEPARATOR
+DIRECTIONALITY_EUROPEAN_NUMBER
+DIRECTIONALITY_EUROPEAN_NUMBER_SEPARATOR
+DIRECTIONALITY_EUROPEAN_NUMBER_TERMINATOR
+DIRECTIONALITY_LEFT_TO_RIGHT
+DIRECTIONALITY_LEFT_TO_RIGHT_EMBEDDING
+DIRECTIONALITY_LEFT_TO_RIGHT_OVERRIDE
+DIRECTIONALITY_NONSPACING_MARK
+DIRECTIONALITY_OTHER_NEUTRALS
+DIRECTIONALITY_PARAGRAPH_SEPARATOR
+DIRECTIONALITY_POP_DIRECTIONAL_FORMAT
+DIRECTIONALITY_RIGHT_TO_LEFT
+DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC
+DIRECTIONALITY_RIGHT_TO_LEFT_EMBEDDING
+DIRECTIONALITY_RIGHT_TO_LEFT_OVERRIDE
+DIRECTIONALITY_SEGMENT_SEPARATOR
+DIRECTIONALITY_UNDEFINED
+DIRECTIONALITY_WHITESPACE
+DIR_MIXED
+DISPLAYABILITY_CHANGED
+DISTINCT
+DJDJI
+DK
+DKDNK
+DKK
+DL
+DMDMA
+DNS
+DO
+DODOM
+DOES
+DOESN
+DOM
+DOMAIN_NAME
+DOM_MODE
+DON
+DONE
+DONT_LOOP_FLAG
+DOS
+DOUBLE
+DOUBLE_FRACTION_DIGITS
+DOUBLE_INTEGER_DIGITS
+DOUBLE_PRIME
+DOW
+DOWN
+DOWN_CYCLE_TRAVERSAL_KEY
+DOWN_CYCLE_TRAVERSAL_KEYS
+DOW_AFTER_DOM
+DOW_BEFORE_DOM
+DOW_GE_DOM_MODE
+DOW_IN_MONTH
+DOW_IN_MONTH_MODE
+DOW_LE_DOM_MODE
+DOY
+DRAFT
+DSA
+DSAParameterSpec
+DSAPrivateKey
+DSAPublicKey
+DSAPublicKeySpec
+DST
+DST_ATOP
+DST_IN
+DST_OFFSET
+DST_OUT
+DST_OVER
+DT
+DZDZA
+Dash
+Data
+DataBufferInt
+DataFlavor
+DataFlavors
+DataInput
+DataInputStream
+DataInputStreams
+DataOuputStream
+DataOutput
+DataOutputStream
+DataSource
+DataTruncation
+Database
+DatabaseMetaData
+Datagram
+DatagramChannel
+DatagramPacket
+DatagramSocket
+DatagramSocketImpl
+DatagramSocketImplFactory
+DatagramSockets
+Date
+DateFormat
+DateFormatSymbols
+DateFormatZoneData
+DateFormats
+DateFormatters
+DateTimeElements
+DateTimePatterns
+Datei
+Dateien
+Dates
+David
+Davidson
+Davis
+Day
+DayAbbreviations
+DayNames
+Daylight
+Daylignt
+Days
+De
+Deal
+Debug
+DebugHelper
+Debugging
+Dec
+December
+Deciding
+Decimal
+DecimalFormat
+DecimalFormatSymbols
+DecimalNumeral
+Declarations
+Declare
+DecodableString
+Decode
+Decodes
+Decoding
+DecompIterator
+Decompose
+Decomposes
+Decomposition
+Decrements
+Default
+DefaultBufferCapabilities
+DefaultCellEditor
+DefaultComboBoxModel
+DefaultCursor
+DefaultFocusTraversalPolicy
+DefaultKeyboardFocusManager
+DefaultKeyboardFocusManagerSentEvent
+DefaultKeyboardFocusManagers
+DefaultListModel
+DefaultListSelectionModel
+DefaultPersistenceDelegate
+DefaultSelectionType
+DefaultTreeModel
+DefaultUseCaches
+Defaults
+Define
+Defines
+Definition
+Definitive
+DefulatPD
+Delay
+Delays
+Delegate
+Delegates
+Delete
+Deletes
+Deletion
+Delimiter
+Deliver
+Delivers
+Delta
+Denver
+Deny
+Depending
+Deprecated
+Derive
+Describes
+Description
+Descriptions
+Descriptive
+Descriptor
+Descriptors
+Deselects
+Deserialization
+Deserialized
+Deserializes
+Deserializing
+Design
+DesignMode
+Designated
+DesintationType
+Desired
+Despite
+DessertTopping
+Destination
+DestinationType
+Destroy
+DestroyJavaVM
+Destroys
+Detailed
+Details
+Detect
+Detecting
+Determine
+Determines
+DevAxisVec
+Devanagari
+Devanigiri
+Developers
+Deviation
+Device
+Dewey
+Diacritical
+Dialog
+DialogInput
+DialogPeer
+DialogType
+Dialogs
+Dick
+Dictionary
+DictionaryBasedBreakIterator
+Didn
+Die
+Different
+Differs
+Diffie
+Digest
+DigestException
+DigestInputStream
+DigestOutputStream
+Digit
+DigitList
+DigitOnes
+DigitTens
+Digital
+Digits
+Dimension
+Dimension2D
+Dingbats
+Direct
+DirectBuffer
+DirectByteBuffer
+DirectByteBufferR
+DirectCharBuffer
+DirectCharBufferRS
+DirectCharBufferRU
+DirectCharBufferS
+DirectCharBufferU
+DirectColorModel
+DirectDoubleBufferRS
+DirectDoubleBufferRU
+DirectDoubleBufferS
+DirectDoubleBufferU
+DirectFloatBufferRS
+DirectFloatBufferRU
+DirectFloatBufferS
+DirectFloatBufferU
+DirectIntBufferRS
+DirectIntBufferRU
+DirectIntBufferS
+DirectIntBufferU
+DirectLongBufferRS
+DirectLongBufferRU
+DirectLongBufferS
+DirectLongBufferU
+DirectShortBufferRS
+DirectShortBufferRU
+DirectShortBufferS
+DirectShortBufferU
+Directorate
+Directory
+Disable
+Disables
+Disabling
+Disallow
+Discard
+Discards
+Disconnects
+Discover
+Disk
+Dispatch
+Dispatched
+Dispatches
+Dispatching
+Display
+DisplayMode
+Disposal
+DisposeAction
+Disposes
+Disposing
+Dissect
+Distinct
+Distinguish
+Distributable
+Distribute
+Dithering
+Divide
+Dividend
+Division
+Diwanji
+DnD
+DnDConstants
+Do
+DoInput
+DoOutput
+Document
+Does
+Doing
+Dollar
+DomainCombiner
+DomainCombiners
+Domini
+Don
+Donald
+Dot
+DotFileSuffix
+DotHotspotSuffix
+DotNameSuffix
+Double
+DoubleBuffer
+DoubleEditor
+Doubles
+Doug
+Douglas
+Down
+DragGestureEvent
+DragGestureListener
+DragGestureRecognizer
+DragSource
+DragSourceContext
+DragSourceContextPeer
+DragSourceListener
+Drain
+Drawing
+Draws
+Driver
+DriverInfo
+DriverManager
+DriverPropertyInfo
+Drivers
+Drop
+DropTarget
+DropTargetEventTargetFilter
+Drops
+Dst
+DstAtop
+DstIn
+DstOut
+DstOver
+Due
+Duff
+Dummy
+Dump
+DumpConstraints
+DumpLayoutInfo
+Duplicate
+During
+Dynamic
+E
+E0
+EAST
+ECECU
+EDITABLE
+EDT
+EEE
+EEEST
+EFFECT
+EG
+EGEGY
+EHESH
+EIGHTY
+EMPLOYEES
+EMPTY
+EMPTY_LIST
+EMPTY_MAP
+EMPTY_SET
+EN
+ENABLED
+ENCLOSED_ALPHANUMERICS
+ENCLOSED_CJK_LETTERS_AND_MONTHS
+ENCLOSING_MARK
+ENCODED
+END
+END_OF_STRING
+END_PUNCTUATION
+END_STATE
+END_STATE_FLAG
+ENGLISH
+ENTER
+ENTRIES
+ENV_10
+ENV_10X13
+ENV_10X14
+ENV_10X15
+ENV_11
+ENV_12
+ENV_14
+ENV_6X9
+ENV_7X9
+ENV_9
+ENV_9X11
+ENV_9X12
+ENV_INVITE
+ENV_ITALY
+ENV_MONARCH
+ENV_PERSONAL
+EOF
+EOFException
+EOL
+EOS
+EPOCH_JULIAN_DAY
+EPOCH_YEAR
+EQUAL
+ERA
+ERA_FIELD
+ERERI
+ERROR
+ERRORED
+EResizeCursor
+ES
+ESCAPE
+ESESP
+ESP
+EST
+ET
+ETETH
+ETHIOPIC
+EUC
+EUR
+EVEN
+EXACT
+EXECUTE
+EXECUTED
+EXECUTE_FAILED
+EXECUTIVE
+EXIST
+EXISTS
+EXPANDCHARINDEX
+EXPECTED_MAX
+EXPONENT
+EXPONENT_SIGN
+EXPONENT_SYMBOL
+E_RESIZE_CURSOR
+Each
+Earth
+Ease
+East
+Eastern
+Easy
+Ecks
+Edh
+Edition
+Editor
+Ee
+Effective
+Effectively
+Eight
+Either
+Element
+Elements
+Eliminate
+Ellison
+Else
+Emits
+Empties
+Empty
+EmptyBorder
+EmptyBorderUIResource
+EmptyEnumerator
+EmptyEvent
+EmptyFieldPositionArray
+EmptyIterator
+EmptyList
+EmptyMap
+EmptySet
+EmptyStackException
+Enable
+Enables
+Enabling
+Encapsulates
+Enclosed
+Encloses
+Encoded
+Encoder
+Encodes
+Encoding
+EncryptedPrivateKeyInfo
+End
+Ends
+Enforces
+Eng
+Engineering
+English
+Enhancement
+Ensure
+Ensures
+Enter
+Entering
+Enters
+Entity
+Entries
+Entry
+EntryIterator
+EntryPair
+EntrySet
+EntrySetView
+Enum
+Enumerate
+Enumerates
+Enumeration
+Enumerations
+Enumerator
+Envelope
+Environment
+Equal
+Equality
+Equivalent
+Equivalently
+Era
+Eras
+Error
+Errors
+Escape
+Establish
+Establishes
+Estimate
+Etats
+EtchedBorder
+EtchedBorderUIResource
+Ethernet
+Ethiopic
+Euclid
+Euclidean
+Euler
+Euro
+Europe
+European
+Evaluates
+Even
+EvenOdd
+Event
+EventDispatchThread
+EventHandler
+EventHandlers
+EventListener
+EventListenerProxy
+EventListerProxy
+EventObject
+EventQueue
+EventQueueItem
+EventQueues
+EventSetDescriptor
+EventSetDescriptors
+EventTargetFilter
+Events
+Eventually
+Every
+Ex
+Exact
+Exactly
+Examine
+Examines
+Examining
+Example
+Examples
+Except
+Exception
+ExceptionInInitializerError
+ExceptionListener
+ExceptionResources
+ExceptionResources_de
+ExceptionResources_fr
+Exceptional
+Exceptions
+Excludes
+Execute
+Executes
+Executing
+Execution
+Executive
+Existing
+Exists
+Expand
+Expanding
+Expands
+Expected
+Expecting
+Expects
+Experience
+ExpiredKeyException
+Explicitly
+Explorer
+Exponential
+Expression
+Expressions
+Extended
+Extension
+Extensions
+Externalizable
+Extract
+Extracts
+Extreme
+F
+F1
+F10
+F11
+F12
+F2
+F3
+F4
+F5
+F6
+F7
+F8
+F9
+FACTOR
+FAHRVERGN
+FALL
+FALLTHROUGH
+FALSE
+FAMILY
+FAQ
+FCS
+FDBigInt
+FDBigInts
+FEBRUARY
+FEED
+FETCH_FORWARD
+FETCH_REVERSE
+FETCH_UNKNOWN
+FF
+FFFF
+FIELD_COUNT
+FIELD_NAME
+FIFIN
+FIFTY
+FIGURE_SPACE
+FILE
+FILES
+FILL_THRESHOLD
+FILTER
+FILTER_CONDITION
+FIM
+FINAL
+FINALIZERS
+FINALLY
+FINAL_QUOTE_PUNCTUATION
+FIPS
+FIRST
+FIRST_LINE_END
+FIRST_LINE_START
+FIVE
+FIX
+FIXED_PREC_SCALE
+FIXME
+FJFJI
+FKCOLUMN_NAME
+FKFLK
+FKP
+FKTABLE_CAT
+FKTABLE_NAME
+FKTABLE_SCHEM
+FK_NAME
+FLAG_DIR_DEFAULT_LTR
+FLAG_DIR_DEFAULT_RTL
+FLAG_DIR_LTR
+FLAG_DIR_RTL
+FLOAT
+FMFSM
+FOCUSABLE
+FOCUSED
+FOCUS_EVENT_MASK
+FOCUS_FIRST
+FOCUS_GAINED
+FOCUS_LAST
+FOCUS_LOST
+FOCUS_TRAVERSABLE_DEFAULT
+FOCUS_TRAVERSABLE_SET
+FOCUS_TRAVERSABLE_UNKNOWN
+FOFRO
+FOLIO
+FOLLOWING
+FONT
+FOR
+FOREVER
+FORM
+FORMAT
+FORTY
+FORWARD_TRAVERSAL_KEY
+FORWARD_TRAVERSAL_KEYS
+FQDN
+FR
+FRACTION
+FRACTION_FIELD
+FRAME
+FRAMEBITS
+FRANCE
+FRENCH
+FRF
+FRFRA
+FRIDAY
+FROM
+FSS_UTF
+FULL
+FULLWIDTH_COMMA
+FULLWIDTH_EXCLAMATION_MARK
+FULLWIDTH_FULL_STOP
+FULLWIDTH_QUESTION_MARK
+FULL_DECOMPOSITION
+FXFXX
+Facility
+Factory
+FactoryURLClassLoader
+Fahrvergn
+Failed
+Failure
+Fall
+False
+Far
+Fast
+FastPathProducer
+Fault
+Fd
+FeatureDescriptor
+FeatureDescriptors
+Feb
+February
+Fell
+Fetch
+Fetches
+Fetchs
+Fett
+Few
+Fewer
+Fialli
+Field
+FieldDelegate
+FieldInfo
+FieldPosition
+FieldPositions
+FieldReflector
+FieldReflectorKey
+Fields
+Figure
+File
+FileChannel
+FileChannelImpl
+FileDescriptor
+FileDesecriptor
+FileDialog
+FileDialogPeer
+FileFilter
+FileInputStream
+FileNameFilter
+FileNameMap
+FileNotFoundException
+FileOutputStream
+FilePermission
+FilePermissionCollection
+FilePermissions
+FileReader
+FileReaders
+FileSystem
+FileWriter
+FileWriters
+Filename
+FilenameFilter
+Filesystem
+Fill
+FillAdapter
+Filler
+Filling
+Fills
+Filter
+FilterInputStream
+FilterOutputStream
+FilterReader
+FilterWriter
+FilteredImageSource
+Filtering
+Finalizer
+Finally
+Find
+Finds
+Finish
+Finishes
+Fire
+Fires
+First
+Fish
+Fist
+Fix
+Fixed
+Fixes
+Fixup
+Flag
+Flags
+FlashPix
+FlatteningPathIterator
+FlipBufferStrategy
+FlipContents
+Flipping
+Flips
+Float
+FloatBuffer
+FloatEditor
+FloatValue
+FloatingDecimal
+FloatingPointLiteral
+FloorWax
+Flow
+FlowLayout
+Flush
+Flushes
+Focus
+FocusEvent
+FocusEvents
+FocusListener
+FocusManager
+FocusTraversalPolicy
+Focuses
+Folio
+Following
+Font
+FontFormatException
+FontLineMetrics
+FontMetrics
+FontNameAliases
+FontPeer
+FontRenderContext
+FontSupport
+FontUIResource
+Foo
+FooBah
+FooBeanInfo
+FooServerSocket
+FooSocket
+Foote
+For
+Forbidden
+Force
+Forces
+Forcibly
+Form
+Format
+FormatElement
+FormatStyle
+FormatType
+Formats
+Formatted
+Formatter
+Formatters
+Forms
+Formulate
+Fortunately
+Forward
+Forwards
+Found
+Four
+Fowler
+FozEditor
+Fpx
+FpxClsidOffset
+Fraction
+Fragment
+Frame
+FramePeer
+Frames
+France
+Frank
+Fred
+FredEditor
+FredEvent
+FredListener
+Freely
+French
+Freytag
+Fri
+Friday
+Fries
+From
+Fs
+Full
+Fulltype
+Fullwidth
+Function
+Functions
+Fundamentally
+Funnel
+Further
+Furthermore
+Future
+G
+GAGAB
+GB
+GBGBR
+GBP
+GC
+GCD
+GDGRD
+GEGEO
+GEN
+GENERAL_FAILURE
+GENERAL_PUNCTUATION
+GENERATED
+GENERATION
+GEOMETRIC_SHAPES
+GEORGIAN
+GERMAN
+GERMANY
+GET
+GFGUF
+GGG
+GHGHA
+GIF
+GIFs
+GIGIB
+GLGRL
+GLOBAL
+GMGMB
+GMT
+GMT_ID
+GMT_ID_LENGTH
+GMT_MINUS
+GMT_PLUS
+GNGIN
+GOT_FOCUS
+GPGLP
+GPS
+GQGNQ
+GRANTEE
+GRANTOR
+GRAY
+GRD
+GREATER
+GREEK
+GREEK_EXTENDED
+GREEN
+GRGRC
+GROUP
+GROUPING_SEPARATOR
+GSSAPI
+GSSGS
+GTGTM
+GUGUM
+GUI
+GUIs
+GUJARATI
+GURMUKHI
+GV
+GWGNB
+GYGUY
+Gary
+Gateway
+GatheringByteChannel
+Gaussian
+General
+GeneralPath
+GeneralSecurityException
+Generally
+Generate
+GenerateCharacter
+GenerateCurrencyData
+Generates
+Generating
+Generator
+Generic
+GenericBeanInfo
+Geometric
+Georgian
+German
+Get
+GetBooleanAction
+GetField
+GetFieldImpl
+GetHeaderField
+GetLayoutInfo
+GetMinSize
+GetPropertyAction
+GetReflectionFactoryAction
+GetUnsafeAction
+Gets
+Getter
+Getters
+Gigantic
+Gillam
+Give
+Given
+Gives
+GlobalCursorManager
+GlobalCursormanager
+Glyph
+GlyphVector
+Go
+Goldsmith
+Gone
+Gong
+Gosling
+Gotcha
+GradientPaint
+GradientPaintContext
+Graham
+Gralund
+Granting
+Graphic
+Graphical
+Graphics
+Graphics2D
+GraphicsCallback
+GraphicsConfigTemplate
+GraphicsConfiguration
+GraphicsDevice
+GraphicsEnvironment
+Graphs
+Great
+Greater
+Greatest
+Greek
+Green
+Greenwich
+Gregorian
+GregorianCalendar
+GridBag
+GridBagConstraint
+GridBagConstraints
+GridBagEx1
+GridBagLayout
+GridBagLayoutInfo
+GridLayout
+Group
+Grouping
+Grow
+Guaranteed
+Guard
+GuardedObject
+Gui
+Guide
+Gujarati
+Gurmukhi
+Guy
+GyMdkHmsSEDFwWahKz
+H
+HACK
+HALFWIDTH_AND_FULLWIDTH_FORMS
+HAND_CURSOR
+HANGING_BASELINE
+HANGUL_BASE
+HANGUL_CHOSEONG_HIGH
+HANGUL_CHOSEONG_LOW
+HANGUL_COMPATIBILITY_JAMO
+HANGUL_JAMO
+HANGUL_JONGSEONG_HIGH
+HANGUL_JONGSEONG_LOW
+HANGUL_JUNGSEONG_HIGH
+HANGUL_JUNGSEONG_LOW
+HANGUL_LIMIT
+HANGUL_SYLLABLES
+HANGUL_SYL_HIGH
+HANGUL_SYL_LOW
+HEAD
+HEADER_BLOCKED
+HEAVYWEIGHTS
+HEBREW
+HERE
+HH
+HIERARCHY_BOUNDS_EVENT_MASK
+HIERARCHY_CHANGED
+HIERARCHY_EVENT_MASK
+HIGH
+HIGH_PRIORITY
+HIRAGANA
+HIRAGANA_ITERATION_MARK
+HIRAGANA_LETTER_A
+HIRAGANA_LETTER_DI
+HIRAGANA_LETTER_E
+HIRAGANA_LETTER_I
+HIRAGANA_LETTER_MO
+HIRAGANA_LETTER_O
+HIRAGANA_LETTER_RO
+HIRAGANA_LETTER_SMALL_A
+HIRAGANA_LETTER_SMALL_E
+HIRAGANA_LETTER_SMALL_I
+HIRAGANA_LETTER_SMALL_O
+HIRAGANA_LETTER_SMALL_TU
+HIRAGANA_LETTER_SMALL_U
+HIRAGANA_LETTER_SMALL_WA
+HIRAGANA_LETTER_SMALL_YA
+HIRAGANA_LETTER_SMALL_YO
+HIRAGANA_LETTER_SMALL_YU
+HIRAGANA_LETTER_TU
+HIRAGANA_LETTER_U
+HIRAGANA_LETTER_VU
+HIRAGANA_LETTER_WA
+HIRAGANA_LETTER_YA
+HIRAGANA_LETTER_YO
+HIRAGANA_LETTER_YU
+HIRAGANA_SEMIVOICED_SOUND_MARK
+HIRAGANA_VOICED_ITERATION_MARK
+HKHKG
+HMHMD
+HNHND
+HOLD_CURSORS_OVER_COMMIT
+HOME
+HOOKS
+HORIZONTAL
+HORIZ_BIT
+HOST_UNREACHABLE
+HOUR
+HOUR0
+HOUR0_FIELD
+HOUR1
+HOUR1_FIELD
+HOUR_OF_DAY
+HOUR_OF_DAY0
+HOUR_OF_DAY0_FIELD
+HOUR_OF_DAY1
+HOUR_OF_DAY1_FIELD
+HREF
+HRHRV
+HSB
+HSBtoRGB
+HSPACE
+HShih
+HTHTI
+HTML
+HTTP
+HTTP_ACCEPTED
+HTTP_BAD_GATEWAY
+HTTP_BAD_METHOD
+HTTP_BAD_REQUEST
+HTTP_CLIENT_TIMEOUT
+HTTP_CONFLICT
+HTTP_CREATED
+HTTP_ENTITY_TOO_LARGE
+HTTP_FORBIDDEN
+HTTP_GATEWAY_TIMEOUT
+HTTP_GONE
+HTTP_INTERNAL_ERROR
+HTTP_LENGTH_REQUIRED
+HTTP_MOVED_PERM
+HTTP_MOVED_TEMP
+HTTP_MULT_CHOICE
+HTTP_NOT_ACCEPTABLE
+HTTP_NOT_AUTHORITATIVE
+HTTP_NOT_FOUND
+HTTP_NOT_IMPLEMENTED
+HTTP_NOT_MODIFIED
+HTTP_NO_CONTENT
+HTTP_OK
+HTTP_PARTIAL
+HTTP_PAYMENT_REQUIRED
+HTTP_PRECON_FAILED
+HTTP_PROXY_AUTH
+HTTP_REQ_TOO_LONG
+HTTP_RESET
+HTTP_SEE_OTHER
+HTTP_SERVER_ERROR
+HTTP_UNAUTHORIZED
+HTTP_UNAVAILABLE
+HTTP_UNSUPPORTED_TYPE
+HTTP_USE_PROXY
+HTTP_VERSION
+HUHUN
+HUMBUG
+HUNDRED
+HUP
+HW
+HYPHEN
+H_ALPHA
+H_ALPHANUM
+H_DASH
+H_DIGIT
+H_DOT
+H_ESCAPED
+H_HEX
+H_LOWALPHA
+H_MARK
+H_PATH
+H_PCHAR
+H_REG_NAME
+H_RESERVED
+H_SCHEME
+H_SERVER
+H_UNRESERVED
+H_UPALPHA
+H_URIC
+H_URIC_NO_SLASH
+H_USERINFO
+Half
+Halfwidth
+Hall
+Halt
+Halting
+Han
+Hand
+HandCursor
+Handle
+HandleList
+HandleTable
+Handler
+HandlerBase
+Handles
+Handling
+Hangul
+Hanpeter
+Hans
+Harbison
+Harder
+Harry
+Has
+HasNext
+Hash
+HashIterator
+HashMap
+HashSet
+HashSortedMap
+HashSortedSet
+Hashcode
+Hashtable
+Hastable
+Have
+Having
+Hazelnut
+HeadlessException
+HeadlessGraphicsEnvironment
+HeadlessToolkit
+Heap
+HeapByteBuffer
+HeapByteBufferR
+HeapCharBuffer
+HeapCharBufferR
+HeapDoubleBuffer
+HeapDoubleBufferR
+HeapFloatBuffer
+HeapFloatBufferR
+HeapIntBuffer
+HeapIntBufferR
+HeapLongBuffer
+HeapLongBufferR
+HeapShortBuffer
+HeapShortBufferR
+Heavyweight
+HeavyweightFocusRequest
+Hebrew
+Height
+Held
+Helena
+Hellman
+Hello
+Helper
+Helvetica
+Hence
+Herb
+Here
+HexDigits
+Hi
+Hide
+Hides
+Hierarchical
+Hierarchy
+HierarchyBoundsListener
+HierarchyEvent
+HierarchyEvents
+HierarchyListener
+High
+HighLevelException
+Higher
+Hindi
+Hinrichs
+Hint
+Hiragana
+Historically
+HistoricallyNamedCharset
+Hoff
+Holds
+Home
+Honolulu
+Hook
+Hope
+Hopefully
+Horizontal
+HorizontalLines
+Host
+HotSpot
+Hours
+How
+However
+HttpURLConnection
+Huang
+Hybrid
+HyperText
+I
+I18N
+IANA
+IBM
+IBME
+ICMP
+ICONIFIED
+ICON_COLOR_16x16
+ICON_COLOR_32x32
+ICON_MONO_16x16
+ICON_MONO_32x32
+ID
+IDENTICAL
+IDENT_TX_ATTRIBUTE
+IDEOGRAPHIC_DESCRIPTION_CHARACTERS
+IDEOGRAPHIC_ITERATION_MARK
+IDIDN
+IDs
+IEC
+IEEE
+IEEEremainder
+IEIRL
+IEP
+IETF
+IGNORABLEMASK
+IGNORABLES
+IGNORE
+IGNORE_ALL_BEANINFO
+IGNORE_HANGUL
+IGNORE_IMMEDIATE_BEANINFO
+IIOP
+ILISR
+ILS
+IMAGE_INCOMPATIBLE
+IMAGE_RESTORED
+IMF
+IMG
+IMPLEMENTATION
+IMPLEMENTATION_TITLE
+IMPLEMENTATION_VENDOR
+IMPLEMENTATION_VERSION
+IMPORTANT
+IN
+INACTIVE_CAPTION
+INACTIVE_CAPTION_BORDER
+INACTIVE_CAPTION_TEXT
+INADDRSZ
+INADDR_ANY
+INCLUDE_SELF
+INDEXOFSUBLIST_THRESHOLD
+INDEX_MASK
+INDEX_NAME
+INDEX_QUALIFIER
+INDICATE
+INF
+INFINITY
+INFO
+INFO_TEXT
+ININD
+INITIAL
+INITIALTABLESIZE
+INITIAL_CACHE_SIZE
+INITIAL_FORMATS
+INITIAL_QUOTE_PUNCTUATION
+INITIAL_STATE
+INOUT
+INPUT_METHODS_ENABLED_MASK
+INPUT_METHOD_EVENT_MASK
+INPUT_METHOD_FIRST
+INPUT_METHOD_LAST
+INPUT_METHOD_SEGMENT
+INPUT_METHOD_TEXT_CHANGED
+INSERT
+INSTALLED
+INSTANCE
+INT
+INT16SZ
+INTEGER
+INTEGERSTYLE
+INTEGER_FIELD
+INTERFACE
+INTERNAL
+INTERNALLY_SET
+INTERPOLATION_BICUBIC
+INTERPOLATION_BILINEAR
+INTERPOLATION_NEAREST_NEIGHBOR
+INVALIDATED
+INVALID_COUNTRY_ENTRY
+INVALID_FIELD_OFFSET
+INVARIANT
+INVITE
+INVITE_ENVELOPE
+INVOCATION_EVENT_MASK
+INVOCATION_FIRST
+INVOCATION_LAST
+INVOICE
+INVOKE
+IN_PROGRESS
+IO
+IOException
+IOExceptions
+IOIOT
+IP
+IPA
+IPA_EXTENSIONS
+IPP
+IPTOS_LOWCOST
+IPTOS_LOWDELAY
+IPTOS_RELIABILITY
+IPTOS_THROUGHPUT
+IPV4
+IPV6
+IP_MULTICAST_IF
+IP_MULTICAST_IF2
+IP_MULTICAST_LOOP
+IP_TOS
+IPaddress
+IPs
+IPv4
+IPv4address
+IPv6
+IPv6address
+IQIRQ
+IRIRN
+ISISL
+ISO
+ISO646
+ISO_2A0
+ISO_3166
+ISO_4A0
+ISO_A0
+ISO_A1
+ISO_A10
+ISO_A2
+ISO_A3
+ISO_A4
+ISO_A5
+ISO_A6
+ISO_A7
+ISO_A8
+ISO_A9
+ISO_B0
+ISO_B1
+ISO_B10
+ISO_B2
+ISO_B3
+ISO_B4
+ISO_B4_ENVELOPE
+ISO_B5
+ISO_B5_ENVELOPE
+ISO_B6
+ISO_B7
+ISO_B8
+ISO_B9
+ISO_C0
+ISO_C0_ENVELOPE
+ISO_C1
+ISO_C10
+ISO_C10_ENVELOPE
+ISO_C1_ENVELOPE
+ISO_C2
+ISO_C2_ENVELOPE
+ISO_C3
+ISO_C3_ENVELOPE
+ISO_C4
+ISO_C4_ENVELOPE
+ISO_C5
+ISO_C5_ENVELOPE
+ISO_C6
+ISO_C6_ENVELOPE
+ISO_C7
+ISO_C7_ENVELOPE
+ISO_C8
+ISO_C8_ENVELOPE
+ISO_C9
+ISO_C9_ENVELOPE
+ISO_DESIGNATED_LONG
+ISO_DESIGNATED_LONG_ENVELOPE
+IS_GRANTABLE
+IS_NULLABLE
+IT
+ITALIAN
+ITALIC
+ITALY
+ITALY_ENVELOPE
+ITEM_EVENT_MASK
+ITEM_FIRST
+ITEM_LAST
+ITEM_STATE_CHANGED
+ITITA
+ITL
+I_A
+I_ALL
+I_B
+I_BACKGROUND
+I_C
+I_COLOR
+I_COMMON
+I_COPIED
+I_D
+I_DRAFT
+I_E
+I_EXECUTIVE
+I_FILE
+I_FOLIO
+I_HIGH
+I_INVITE_ENVELOPE
+I_INVOICE
+I_ISO_2A0
+I_ISO_4A0
+I_ISO_A0
+I_ISO_A1
+I_ISO_A10
+I_ISO_A2
+I_ISO_A3
+I_ISO_A4
+I_ISO_A5
+I_ISO_A6
+I_ISO_A7
+I_ISO_A8
+I_ISO_A9
+I_ISO_B0
+I_ISO_B1
+I_ISO_B10
+I_ISO_B2
+I_ISO_B3
+I_ISO_B4
+I_ISO_B5
+I_ISO_B6
+I_ISO_B7
+I_ISO_B8
+I_ISO_B9
+I_ISO_C0
+I_ISO_C1
+I_ISO_C10
+I_ISO_C2
+I_ISO_C3
+I_ISO_C4
+I_ISO_C5
+I_ISO_C6
+I_ISO_C7
+I_ISO_C8
+I_ISO_C9
+I_ISO_DESIGNATED_LONG
+I_ITALY_ENVELOPE
+I_JIS_B0
+I_JIS_B1
+I_JIS_B10
+I_JIS_B2
+I_JIS_B3
+I_JIS_B4
+I_JIS_B5
+I_JIS_B6
+I_JIS_B7
+I_JIS_B8
+I_JIS_B9
+I_LANDSCAPE
+I_LEDGER
+I_MONARCH_ENVELOPE
+I_MONOCHROME
+I_NATIVE
+I_NA_10X13_ENVELOPE
+I_NA_10X14_ENVELOPE
+I_NA_10X15_ENVELOPE
+I_NA_6X9_ENVELOPE
+I_NA_7X9_ENVELOPE
+I_NA_9X11_ENVELOPE
+I_NA_9X12_ENVELOPE
+I_NA_LEGAL
+I_NA_LETTER
+I_NA_NUMBER_10_ENVELOPE
+I_NA_NUMBER_11_ENVELOPE
+I_NA_NUMBER_12_ENVELOPE
+I_NA_NUMBER_14_ENVELOPE
+I_NA_NUMBER_9_ENVELOPE
+I_NONE
+I_NORMAL
+I_ONE_SIDED
+I_PERSONAL_ENVELOPE
+I_PHYSICAL
+I_PORTRAIT
+I_PRINTABLE
+I_PRINTER
+I_PRIOR
+I_QUARTO
+I_RANGE
+I_SELECTION
+I_SEPARATE_DOCUMENTS_COLLATED_COPIES
+I_SEPARATE_DOCUMENTS_UNCOLLATED_COPIES
+I_TWO_SIDED_LONG_EDGE
+I_TWO_SIDED_SHORT_EDGE
+I_UNDEFINED
+Icon
+Id
+Ideally
+Identical
+Identically
+Identifier
+Identifiers
+Identifies
+Identify
+Identities
+Identity
+IdentityHashMap
+IdentityHashMapEntry
+IdentityHashMapIterator
+IdentityHashtable
+IdentityScope
+Ideographic
+Ideographs
+If
+Ignorable
+Ignore
+Ignored
+Ignores
+Illegal
+IllegalAccessError
+IllegalAccessException
+IllegalArgumentException
+IllegalBlockingModeException
+IllegalCharsetNameException
+IllegalComponentStateException
+IllegalMonitorStateException
+IllegalStateException
+IllegalThreadStateException
+Image
+ImageBlaster
+ImageCapabilities
+ImageFilter
+ImageIcon
+ImageMediaEntry
+ImageObserver
+ImageProducer
+Images
+Immutable
+ImmutableEntry
+Impl
+Implement
+Implementation
+Implementations
+Implemented
+ImplementedIn
+Implementing
+Implementors
+Implements
+Important
+Imports
+In
+InaccessibleBufferIndexException
+Inc
+Includes
+IncompatibleClassChangeError
+Incomplete
+Inconsistent
+Incorrect
+Increase
+Increases
+Increasing
+Increment
+Increments
+Independent
+Index
+IndexColorModel
+IndexOutOfBoundsException
+IndexedPropertyDescriptor
+Indexes
+Indic
+Indicate
+Indicates
+Individual
+Inet4Address
+Inet4AddressImpl
+Inet6Address
+Inet6AddressImpl
+InetAddress
+InetAddressCachePolicy
+InetAddressContainer
+InetAddressImpl
+InetAddressImplFactory
+InetAddresses
+InetAdress
+InetSocketAddress
+Inetaddress
+Inf
+Infinite
+Infinity
+Informally
+Information
+Informational
+Informative
+Inheritable
+InheritableThreadLocal
+Initial
+Initialization
+Initialize
+Initialized
+Initializes
+Initializing
+Initially
+Initiate
+Initiation
+Inner
+Input
+InputContext
+InputEvent
+InputListener
+InputMethodEvent
+InputMethodEvents
+InputMethodHighlight
+InputMethodListener
+InputMethodRequests
+InputMethodSupport
+InputStream
+InputStreamReader
+InputStreamReaders
+Inputstream
+Insert
+Insertion
+Inserts
+Insets
+Inside
+Installs
+Instance
+InstanceWrapper
+Instances
+Instantiate
+Instantiates
+Instantiating
+InstantiationError
+InstantiationException
+Instead
+Insufficient
+Int
+IntBuffer
+IntEditor
+IntHashtable
+Integer
+IntegerComponentRaster
+IntegerInterleavedRaster
+IntegerOnly
+Integers
+Integrity
+Intel
+Intended
+Intenet
+Interact
+Interestingly
+Interface
+Interfaces
+Internal
+InternalError
+Internally
+International
+Internet
+Interpolation
+Interpretation
+InterruptedException
+InterruptedIOException
+Interruptible
+Interrupts
+Intersects
+Introduction
+Intropector
+Introspect
+Introspected
+Introspection
+IntrospectionException
+Introspector
+Invalid
+InvalidAlgorithmParameterException
+InvalidClassException
+InvalidDnDOperationException
+InvalidDndOperationException
+InvalidKeyException
+InvalidKeySpecException
+InvalidMarkException
+InvalidObjectException
+InvalidParameterException
+InvalidParameterSpecException
+Invalidate
+Invalidates
+Invariant
+Invariants
+Inverse
+Invitation
+Invocation
+InvocationEvent
+InvocationHandler
+InvocationTargetException
+Invocations
+Invoice
+Invoke
+Invoked
+Invoker
+Invokes
+Invoking
+Is
+Isn
+Issues
+It
+Italic
+Italy
+Item
+ItemEvent
+ItemListener
+ItemListeners
+ItemSelectable
+Items
+Iterate
+Iterating
+Iteration
+Iterations
+Iterator
+Iterators
+Itr
+Its
+Itype
+ItypesPerOtype
+J
+J2SE
+JAMO_LBASE
+JAMO_LCOUNT
+JAMO_NCOUNT
+JAMO_TBASE
+JAMO_TCOUNT
+JAMO_VBASE
+JAMO_VCOUNT
+JANUARY
+JAN_1_1_JULIAN_DAY
+JAPAN
+JAPANESE
+JAR
+JAVA_HOME
+JAVA_OBJECT
+JButton
+JCA
+JCE
+JCheckBox
+JComboBox
+JComponent
+JComponents
+JDBC
+JDK
+JDK1
+JDKClassLoader
+JDialog
+JFrame
+JIS
+JIS_B0
+JIS_B1
+JIS_B10
+JIS_B2
+JIS_B3
+JIS_B4
+JIS_B5
+JIS_B6
+JIS_B7
+JIS_B8
+JIS_B9
+JIT
+JITing
+JITs
+JKS
+JLS
+JLabel
+JLayeredPane
+JList
+JMJAM
+JMenu
+JMenuBar
+JMenuItem
+JMenuItems
+JNI
+JNI_Load
+JNI_OnLoad
+JNI_Unload
+JO
+JOIN_BEVEL
+JOIN_MITER
+JOIN_ROUND
+JOJOR
+JP
+JPEG
+JPJPN
+JRE
+JRootPane
+JSR
+JSSE
+JScrollPane
+JSplitPane
+JTabbedPane
+JTable
+JTableHeader
+JTextComponent
+JTextField
+JULY
+JUNE
+JVM
+JVMs
+JViewport
+Jacobi
+James
+Jamo
+Jan
+January
+Japan
+Japanese
+Jar
+JarEntry
+JarException
+JarFile
+JarInputStream
+JarURLConnection
+Jaunary
+Java
+JavaBean
+JavaBeans
+JavaSoft
+Jean
+Jellinek
+Jim
+JobAttribute
+JobAttributes
+Joe
+John
+Join
+Joins
+Jon
+JonL
+Jonathan
+Jones
+Jonni
+Josh
+Joy
+Jsafe
+Jul
+Julian
+July
+Jun
+June
+Junk
+Jupiter
+Jurg
+Just
+K
+KANBUN
+KANGXI_RADICALS
+KANNADA
+KATAKANA
+KATAKANA_HIRAGANA_PROLONGED_SOUND_MARK
+KATAKANA_ITERATION_MARK
+KATAKANA_LETTER_A
+KATAKANA_LETTER_DI
+KATAKANA_LETTER_E
+KATAKANA_LETTER_I
+KATAKANA_LETTER_MO
+KATAKANA_LETTER_O
+KATAKANA_LETTER_RO
+KATAKANA_LETTER_SMALL_A
+KATAKANA_LETTER_SMALL_E
+KATAKANA_LETTER_SMALL_I
+KATAKANA_LETTER_SMALL_KA
+KATAKANA_LETTER_SMALL_KE
+KATAKANA_LETTER_SMALL_O
+KATAKANA_LETTER_SMALL_TU
+KATAKANA_LETTER_SMALL_U
+KATAKANA_LETTER_SMALL_WA
+KATAKANA_LETTER_SMALL_YA
+KATAKANA_LETTER_SMALL_YO
+KATAKANA_LETTER_SMALL_YU
+KATAKANA_LETTER_TU
+KATAKANA_LETTER_U
+KATAKANA_LETTER_VA
+KATAKANA_LETTER_VO
+KATAKANA_LETTER_VU
+KATAKANA_LETTER_WA
+KATAKANA_LETTER_YA
+KATAKANA_LETTER_YO
+KATAKANA_LETTER_YU
+KATAKANA_VOICED_ITERATION_MARK
+KEEP_CURRENT_RESULT
+KEKEN
+KEYS
+KEYSTORE_TYPE
+KEY_ACTION
+KEY_ACTION_RELEASE
+KEY_ALPHA_INTERPOLATION
+KEY_ANTIALIASING
+KEY_COLOR_RENDERING
+KEY_DITHERING
+KEY_EVENT
+KEY_EVENT_MASK
+KEY_FIRST
+KEY_FRACTIONALMETRICS
+KEY_INTERPOLATION
+KEY_LAST
+KEY_PRESS
+KEY_PRESSED
+KEY_RELEASE
+KEY_RELEASED
+KEY_RENDERING
+KEY_SEQ
+KEY_STROKE_CONTROL
+KEY_TEXT_ANTIALIASING
+KEY_TYPED
+KGKGZ
+KHKHM
+KHMER
+KIKIR
+KMCOM
+KNKNA
+KOREA
+KOREAN
+KPPRK
+KR
+KRKOR
+KWKWT
+KYCYM
+KZKAZ
+Kana
+Kanbun
+Kanerva
+Kangxi
+Kanji
+Kannada
+Katakana
+Keep
+Kejriwal
+Ken
+Kestrel
+Key
+KeyAdapter
+KeyAuthorizationFailureException
+KeyEvent
+KeyEventDispatcher
+KeyEventDispatchers
+KeyEventPostProcessor
+KeyEventPostProcessors
+KeyEvents
+KeyException
+KeyFactory
+KeyFactorySpi
+KeyIDConflictException
+KeyIterator
+KeyListener
+KeyManagementException
+KeyPair
+KeyPairGenerator
+KeyPairGeneratorSpi
+KeyPressed
+KeyReleased
+KeySet
+KeySize
+KeySpec
+KeyStore
+KeyStoreException
+KeyStoreSpi
+KeyStroke
+KeyTyped
+KeyUsage
+Keyboard
+KeyboardFocusManager
+KeyboardFocusManagers
+Keyed
+Keymap
+Keys
+Khan
+Khmer
+Kills
+Klaus
+Knippel
+Knowledgeable
+Known
+Knuth
+Kona
+Korean
+L
+LABEL
+LALAO
+LANDSCAPE
+LANGUAGE
+LAO
+LAST_LINE_END
+LAST_LINE_START
+LATIN
+LATIN1_DEGREE_SIGN
+LATIN1_SOFTHYPHEN
+LATIN_1_SUPPLEMENT
+LATIN_EXTENDED_A
+LATIN_EXTENDED_ADDITIONAL
+LATIN_EXTENDED_B
+LAYOUT_LEFT_TO_RIGHT
+LAYOUT_NO_LIMIT_CONTEXT
+LAYOUT_NO_START_CONTEXT
+LAYOUT_RIGHT_TO_LEFT
+LBLBN
+LC
+LCID
+LCLCA
+LD
+LEADING
+LEAP_MONTH_LENGTH
+LEAP_NUM_DAYS
+LEAST_MAX_VALUES
+LEDGER
+LEFT
+LEFT_ALIGNMENT
+LEFT_TO_RIGHT
+LEGAL
+LEGAL_BUTTON_MASK
+LENGTH
+LESS
+LETTER
+LETTERLIKE_SYMBOLS
+LETTER_NUMBER
+LF
+LFs
+LG_BYTES_PER_VALUE
+LI
+LIFO
+LIGHTWEIGHTS
+LIGHT_GRAY
+LIKE
+LILIE
+LINE
+LINENO
+LINES
+LINE_END
+LINE_INDEX
+LINE_SEPARATOR
+LINE_START
+LIST
+LISTEN
+LIST_DESELECT
+LIST_EVENT
+LIST_ITEM
+LIST_SELECT
+LITERAL_PREFIX
+LITERAL_SUFFIX
+LITTLE_ENDIAN
+LIU
+LJ
+LKLKA
+LOAD
+LOADING
+LOADSTARTED
+LOAD_FILE
+LOCAL
+LOCALIZE
+LOCALIZED
+LOCAL_TYPE_NAME
+LOCATOR
+LOCK
+LOG10
+LONG
+LONGEST
+LONGVARBINARY
+LONGVARCHAR
+LONG_BITS
+LONG_MASK
+LONG_MIN
+LONG_MIN_REP
+LOOKAHEAD_STATE_FLAG
+LOST_FOCUS
+LOW
+LOWERCASE_LETTER
+LOW_PRIORITY
+LRE
+LRLBR
+LRO
+LRU
+LSD
+LSLSO
+LT
+LTLTU
+LTR
+LTR_BIT
+LUF
+LULUX
+LVLVA
+LWD_MOUSE_DRAGGED_OVER
+LWS
+LYLBY
+L_ALPHA
+L_ALPHANUM
+L_DASH
+L_DIGIT
+L_DOT
+L_ESCAPED
+L_HEX
+L_LOWALPHA
+L_MARK
+L_PATH
+L_PCHAR
+L_REG_NAME
+L_RESERVED
+L_SCHEME
+L_SERVER
+L_UNRESERVED
+L_UPALPHA
+L_URIC
+L_URIC_NO_SLASH
+L_USERINFO
+Label
+LabelPeer
+Labels
+Lacking
+Langley
+Language
+Languages
+Lao
+Large
+Larger
+Last
+Later
+Latin
+Latin1
+Launcher
+Laura
+Laurence
+Lay
+Layout
+LayoutManager
+LayoutManager2
+LayoutManagers
+Lays
+Le
+Lea
+Leading
+Leap
+Least
+Leave
+Ledger
+Lee
+Left
+Legacy
+Legal
+Lehmer
+Leiserson
+Len
+LenSquared
+Length
+Less
+Let
+Lets
+Letter
+Letterlike
+Letters
+Level
+Li
+LibFile
+Library
+License
+Lieh
+Lightweight
+LightweightDispatcher
+LightweightFocusRequest
+LightweightPeer
+Like
+Likewise
+Limit
+Line
+LineBorder
+LineBorderUIResource
+LineBreak
+LineBreakData
+LineBreakDictionary
+LineBreakRules
+LineExceptionFlags
+LineMetrics
+LineNumberInputStream
+LineNumberReader
+LineNumberTable
+Linear
+Lines
+Linger
+Link
+LinkageError
+Linked
+LinkedHashIterator
+LinkedHashMap
+LinkedHashSet
+LinkedList
+Links
+List
+ListIterator
+ListItr
+ListPeer
+ListResourceBundle
+Listen
+Listener
+Listeners
+Listens
+Lists
+Literal
+Liu
+Lj
+Ljava
+Ll
+Lm
+Lo
+Load
+LoadLibraryAction
+Loader
+Loads
+Locale
+LocaleData
+LocaleElements
+LocaleElements_
+LocaleElements_fr_BE
+LocaleID
+LocaleNamePatterns
+LocaleString
+Locales
+Localization
+Localized
+Locate
+LocateRegistry
+Locates
+Location
+Locator
+Lock
+Locking
+Long
+LongBuffer
+LongEditor
+Look
+Looking
+Looks
+Lookup
+Loop
+Looping
+Loops
+Loosely
+Los_Angeles
+LowLevelException
+Lower
+Lt
+Ltd
+Lu
+Lucas
+Luehe
+M
+M2
+M5
+MAC
+MAD
+MAGENTA
+MAKE
+MALAYALAM
+MAMAR
+MAP_COW
+MAP_RO
+MAP_RW
+MARCH
+MARK
+MARK_MASK
+MATERIAL
+MATHEMATICAL_OPERATORS
+MATH_SYMBOL
+MAX
+MAXGRIDSIZE
+MAXIMIZED_BOTH
+MAXIMIZED_HORIZ
+MAXIMIZED_VERT
+MAXIMUM_CAPACITY
+MAXIMUM_SCALE
+MAXKEYSIZE
+MAX_BLOCK_SIZE
+MAX_BUNDLES_SEARCHED
+MAX_CONSTANT
+MAX_COUNT
+MAX_DELAY
+MAX_HEADER_SIZE
+MAX_PRIORITY
+MAX_RADIX
+MAX_RULE
+MAX_TARDINESS
+MAX_VALUE
+MAX_VALUES
+MAY
+MBZ
+MCMCO
+MD2
+MD2withRSA
+MD5
+MD5withRSA
+MDMDA
+MDT
+ME
+MEDIUM
+MENU
+MENU_BAR
+MENU_ITEM
+MENU_TEXT
+MESSAGE_ARGUMENT
+META_DOWN_MASK
+META_MASK
+METHOD
+MGMDG
+MHMHL
+MILLISECOND
+MILLISECOND_FIELD
+MIME
+MINIMUM_CAPACITY
+MINIMUM_SCALE
+MINIMUM_USER_SET
+MINIMUM_USER_STAMP
+MINSIZE
+MINUS
+MINUTE
+MINUTE_FIELD
+MIN_PRIORITY
+MIN_RADIX
+MIN_RULE
+MIN_VALUE
+MIN_VALUES
+MISCELLANEOUS_SYMBOLS
+MISCELLANEOUS_TECHNICAL
+MISC_EVENT
+MITER
+MKMKD
+MLMLI
+MM
+MMM
+MMMM
+MMMMM
+MMMMMx10
+MMMMR
+MNMNG
+MODAL
+MODE
+MODIFIER
+MODIFIER_LETTER
+MODIFIER_SYMBOL
+MOMAC
+MONARCH
+MONARCH_ENVELOPE
+MONDAY
+MONGOLIAN
+MONOCHROME
+MONTH
+MONTH_FIELD
+MONTH_LENGTH
+MORE
+MOUSE_CLICKED
+MOUSE_DOWN
+MOUSE_DRAG
+MOUSE_DRAGGED
+MOUSE_ENTER
+MOUSE_ENTERED
+MOUSE_EVENT
+MOUSE_EVENT_MASK
+MOUSE_EXIT
+MOUSE_EXITED
+MOUSE_FIRST
+MOUSE_LAST
+MOUSE_MASK
+MOUSE_MOTION_EVENT_MASK
+MOUSE_MOVE
+MOUSE_MOVED
+MOUSE_PRESSED
+MOUSE_RELEASED
+MOUSE_UP
+MOUSE_WHEEL
+MOUSE_WHEEL_EVENT_MASK
+MOVE
+MOVE_CURSOR
+MPMNP
+MQMTQ
+MRMRT
+MSB
+MSD
+MSMSR
+MST
+MTMLT
+MToolkit
+MULTISELECTABLE
+MULTI_LINE
+MUMUS
+MUST
+MVMDV
+MWMWI
+MXMEX
+MXV
+MYANMAR
+MYMYS
+MZMOZ
+Ma
+Mac
+Machine
+Machines
+Macintosh
+Magic
+Magnitude
+Main
+MainName
+Maintained
+Make
+Makes
+Making
+Malayalam
+Malformed
+MalformedInputException
+MalformedURLException
+Malicious
+Management
+Manifest
+Manipulate
+Mantissa
+Many
+Map
+Mapped
+MappedByteBuffer
+Mapping
+Mappings
+Maps
+Mar
+March
+Marianne
+Mario
+Mark
+Marked
+Marker
+Marking
+Marks
+Mars
+Marsaglia
+MarshalException
+MarshalInputStream
+MarshalOutputStream
+MarshalledObject
+MarshalledObjectInputStream
+MarshalledObjectOutputStream
+Martak
+Mask
+Massachusetts
+Master
+Matched
+Matcher
+Matches
+Materials
+Math
+Mathematical
+MatteBorder
+MatteBorderUIResource
+Max
+Maximized
+Maximum
+May
+Mc
+McCloskey
+McIlroy
+Me
+Mean
+Meaning
+Measuring
+Media
+MediaEntry
+MediaTracker
+MediaType
+Meine
+Member
+MemberSignature
+Memory
+Mendenhall
+Menu
+MenuBar
+MenuBarPeer
+MenuComponent
+MenuComponentPeer
+MenuComponents
+MenuContainer
+MenuItem
+MenuItemPeer
+MenuPeer
+MenuShortcut
+MenuShortcuts
+Menubar
+Menus
+Mercury
+Merge
+MergeCollation
+Message
+MessageDigest
+MessageDigestSpi
+MessageFormat
+MessageFormatPattern
+Meta
+MetaData
+Method
+MethodDescriptor
+MethodDescriptors
+MethodInfo
+Methods
+Metrics
+Michael
+Microsoft
+Microsystems
+Mid
+MidLevelException
+Middle
+Midnight
+Might
+Mike
+Miller
+Millis
+Milne
+MimeTable
+Min
+MinimalDaysInFirstWeek
+Minimum
+Minus
+Mirrored
+Misc
+Miscellaneous
+Misplaced
+MissingResourceException
+Mixing
+Mn
+Mode
+Models
+Modes
+Modification
+Modifications
+Modified
+Modifier
+Modifiers
+Modifies
+Modify
+Modular
+Module
+Modulus
+Mon
+Monarch
+Monday
+Monetary
+Mongolian
+Monitor
+MonochromeExample
+Monospaced
+Montgomery
+Month
+MonthAbbreviations
+MonthNames
+Months
+More
+Moreover
+Most
+Mostly
+Motif
+Motion
+Mouse
+MouseAdapter
+MouseEvent
+MouseEventTargetFilter
+MouseEvents
+MouseListener
+MouseMotionEvent
+MouseMotionListener
+MouseWheel
+MouseWheelEvent
+MouseWheelEvents
+MouseWheelListener
+Move
+MoveCursor
+Moved
+Moves
+Moving
+Mr
+Mueller
+MulitcastSocket
+Muller
+Multi
+MultiScreen
+Multicast
+MulticastSocket
+MulticastSockets
+Multiple
+MultipleDocumentHandlingType
+Multiplication
+Multiplies
+Multiply
+Must
+MutableBigInteger
+MutableBigIntegers
+MutableBoolean
+MutableExpression
+Mval
+My
+MyActionListener
+MyApp
+MyClass
+MyDisk
+MyResources
+MyResources_de
+MyResources_de_CH
+MyResources_en
+MyResources_es_ES
+MyResources_fr
+MyResources_fr_CH
+Myanmar
+N
+NAME
+NAMES
+NAN
+NANAM
+NATIVE
+NA_10X13_ENVELOPE
+NA_10X14_ENVELOPE
+NA_10X15_ENVELOPE
+NA_6X9_ENVELOPE
+NA_7X9_ENVELOPE
+NA_9X11_ENVELOPE
+NA_9X12_ENVELOPE
+NA_LEGAL
+NA_LETTER
+NA_NUMBER_10_ENVELOPE
+NA_NUMBER_11_ENVELOPE
+NA_NUMBER_12_ENVELOPE
+NA_NUMBER_14_ENVELOPE
+NA_NUMBER_9_ENVELOPE
+NCNCL
+NEED_CHAR
+NEGATIVE
+NEGATIVE_INFINITY
+NEG_ZERO_BITS
+NENER
+NEResizeCursor
+NET_UNREACHABLE
+NEVER
+NEW
+NEXT
+NE_RESIZE_CURSOR
+NFNFK
+NFS
+NGNGA
+NINETY
+NINIC
+NIO
+NIST
+NLG
+NLNLD
+NO
+NOK
+NON
+NONBREAKING_HYPHEN
+NONE
+NONOR
+NON_SPACING_MARK
+NON_UNIQUE
+NOOP
+NOP
+NORMAL
+NORM_PRIORITY
+NORTH
+NORTHEAST
+NORTHWEST
+NOT
+NOTE
+NOTES
+NOTFOUND
+NOTHING
+NOT_ALLOWED
+NOV
+NOVEMBER
+NO_AUTH
+NO_DECOMPOSITION
+NO_FIELDS
+NO_GENERATED_KEYS
+NO_HANDLER
+NO_METHODS
+NO_ORIENTATION
+NPE
+NPNPL
+NRNRU
+NResizeCursor
+NSM
+NT
+NULL
+NULLABLE
+NULLORDER
+NULL_HANDLE
+NUMBER
+NUMBERSTYLE
+NUMBER_FORMS
+NUMERAL
+NUMERATOR
+NUMERIC
+NUMERICS
+NUMERIC_SHAPING
+NUMLEVELS
+NUM_COLORS
+NUM_DAYS
+NUM_LOCK
+NUM_PREC_RADIX
+NUM_PRIORITIES
+NUNIU
+NWResizeCursor
+NW_RESIZE_CURSOR
+NYI
+NZD
+NZNZL
+N_RESIZE_CURSOR
+NaN
+Nagle
+Naively
+Nakul
+Name
+NameGenerator
+NameService
+NameServiceDescriptor
+Names
+Naming
+Nan
+Native
+NativeFontWrapper
+NativeInLightFixer
+NativeLibrary
+Naval
+Nd
+Nearly
+Need
+Needn
+Needs
+Negative
+NegativeArraySizeException
+Neither
+Neptune
+Nested
+Net
+NetPerm
+NetPermission
+Netscape
+Network
+NetworkClassLoader
+NetworkInterface
+NetworkInterfaces
+Neutral
+Never
+Nevertheless
+New
+NewDirectByteBuffer
+Newly
+Newton
+Next
+Nievergelt
+Nl
+No
+NoClassDefFoundError
+NoRouteToHostException
+NoSuchAlgorithmException
+NoSuchElementException
+NoSuchFieldError
+NoSuchFieldException
+NoSuchMethodError
+NoSuchMethodException
+NoSuchObjectException
+NoSuchProviderException
+Nobody
+Node
+Non
+NonReadableChannelException
+NonSerializable
+NonWritableChannelException
+None
+Nonetheless
+NoninvertibleTransformException
+Nope
+Normal
+Normalization
+Normalize
+Normalizer
+NormalizerUtilities
+Normalizes
+Normally
+Normative
+North
+Northeast
+Northwest
+Norwegian
+Not
+NotActiveException
+NotBoundException
+NotSerializableException
+NotYetConnectedException
+Notation
+Note
+Noted
+Notes
+Nothing
+Notice
+Notifications
+Notified
+Notifies
+Notify
+Nov
+November
+Now
+Null
+NullComponentPeer
+NullPersistenceDelegate
+NullPointerException
+NullReferenceException
+Nullary
+Nullify
+Num
+Number
+NumberElements
+NumberFormat
+NumberFormatException
+NumberFormats
+NumberPattern
+NumberPatterns
+Numbers
+NumericShaper
+O
+OCO
+OCTOBER
+ODBC
+OE
+OF
+OFF
+OGHAM
+OID
+OK
+OL
+OLD
+OMOMN
+ON
+ONE
+ONEDAY
+ONE_DAY
+ONE_HOUR
+ONE_MINUTE
+ONE_SECOND
+ONE_SIDED
+ONE_WEEK
+ONLY
+ONSET
+OOBINLINE
+OOS
+OPAQUE
+OPEN
+OPENED
+OPERATION
+OPTICAL_CHARACTER_RECOGNITION
+OPTIONAL
+OPTIONS
+OP_ACCEPT
+OP_CONNECT
+OP_READ
+OP_WRITE
+OR
+ORANGE
+ORDER
+ORDINAL_POSITION
+ORIYA
+ORed
+OS
+OTHER
+OTHER_LETTER
+OTHER_NUMBER
+OTHER_PUNCTUATION
+OTHER_SYMBOL
+OUT
+OUT_BOTTOM
+OUT_LEFT
+OUT_RIGHT
+OUT_TOP
+ObejctStreamClass
+Obeys
+Object
+ObjectHandler
+ObjectInput
+ObjectInputStream
+ObjectInputStreamWithLoader
+ObjectInputStreams
+ObjectInputValidation
+ObjectInputstream
+ObjectOutput
+ObjectOutputStream
+ObjectStream
+ObjectStreamClass
+ObjectStreamConstants
+ObjectStreamException
+ObjectStreamExceptions
+ObjectStreamField
+ObjectStreamFields
+Objects
+Observable
+Observatory
+Observer
+Observerable
+Observers
+Obsolete
+Obtains
+Obvious
+Occasionally
+Occurs
+Oct
+Octal
+OctalDigits
+October
+Odd
+Of
+Offset
+Often
+Ogham
+Ok
+OkKey
+Okay
+Old
+On
+Once
+One
+Only
+Oops
+Opaque
+Open
+Opening
+Opens
+Operating
+Operation
+Operations
+Operators
+Ops
+Optical
+Optimization
+Optional
+OptionalDataException
+Optionally
+Or
+Oracle
+Order
+Ordering
+Ordinarily
+Orientation
+OrientationRequestedType
+Origin
+OriginType
+Originally
+Oriya
+Other
+OtherCoder
+Others
+Otherwise
+Otype
+Our
+OurButton
+OurButtonBeanInfo
+OurButtonCustomizer
+Out
+OutOfMemoryError
+Output
+OutputSteam
+OutputStream
+OutputStreamWriter
+OutputStreamWriters
+OutputStreams
+Over
+Overall
+Overflow
+OverlayLayout
+Overridden
+Override
+Overrides
+Overriding
+Overwrites
+Owing
+P
+P1
+P2
+P316
+PAGES
+PAGE_END
+PAGE_START
+PAINT
+PAINT_EVENT_MASK
+PAINT_FIRST
+PAINT_LAST
+PANEL
+PAPAN
+PARAGRAPH_SEPARATOR
+PARAMS0
+PARAMS1
+PARAMS2
+PARENTHESIS
+PARENT_CHANGED
+PATTERN_DECIMAL_SEPARATOR
+PATTERN_DIGIT
+PATTERN_EXPONENT
+PATTERN_GROUPING_SEPARATOR
+PATTERN_INDEX_TO_CALENDAR_FIELD
+PATTERN_INDEX_TO_DATE_FORMAT_FIELD
+PATTERN_INDEX_TO_DATE_FORMAT_FIELD_ID
+PATTERN_MINUS
+PATTERN_PERCENT
+PATTERN_PER_MILLE
+PATTERN_SEPARATOR
+PATTERN_ZERO_DIGIT
+PAUSE
+PB
+PD
+PDF
+PDT
+PDs
+PENDING
+PEPER
+PERCENT
+PERCENTSTYLE
+PERMILLE
+PERSONAL
+PERSONAL_ENVELOPE
+PER_MILLE_SIGN
+PER_TEN_THOUSAND_SIGN
+PFPYF
+PGDN
+PGP
+PGPNG
+PGUP
+PHPHL
+PHYSICAL
+PI
+PINK
+PIPE_SIZE
+PKCOLUMN_NAME
+PKCS
+PKPAK
+PKTABLE_CAT
+PKTABLE_NAME
+PKTABLE_SCHEM
+PK_NAME
+PLAIN
+PLDI
+PLPOL
+PM
+PMSPM
+PNG
+PNPCN
+POPUP_MENU
+PORTRAIT
+PORT_MAX
+PORT_MIN
+POSITIVEINFINITY
+POSITIVE_INFINITY
+POSIX
+POSSIBLY
+POST
+POSTURE
+POSTURE_OBLIQUE
+POSTURE_REGULAR
+PRC
+PRE
+PRECISION
+PREFERRED
+PREFERREDSIZE
+PRESENT
+PRIMALITY
+PRIMARY
+PRIMARYDIFFERENCEONLY
+PRIMARYORDERINCREMENT
+PRIMARYORDERMASK
+PRIMARYORDERSHIFT
+PRIME
+PRINTABLE
+PRINTER
+PRINT_SCREEN
+PRIOR
+PRIORITY_EVENT
+PRIVATE
+PRIVATES
+PRIVATE_USE
+PRIVATE_USE_AREA
+PRIVILEGE
+PRIV_PORT_MAX
+PRNG
+PROCEDURE_CAT
+PROCEDURE_NAME
+PROCEDURE_SCHEM
+PROCEDURE_TYPE
+PROPERTYNAME
+PROTECTED
+PROTOCOL_VERSION_1
+PROTOCOL_VERSION_2
+PROTO_VERS
+PROTO_VERS4
+PROXY_EVENT_MASK
+PRPRI
+PSEUDO_COLUMN
+PST
+PTE
+PTPRT
+PUBLIC
+PUNCTUATION_HYPHENATION_POINT
+PUNCTUATION_IDEOGRAPHIC_COMMA
+PUNCTUATION_IDEOGRAPHIC_FULL_STOP
+PUNCTUATION_LINE_SEPARATOR
+PUNCTUATION_PARAGRAPH_SEPARATOR
+PUSH_BUTTON
+PUT
+PWPLW
+PYPRY
+Pacific
+Pack
+Package
+Packages
+Packet
+Pad
+Page
+PageAttribute
+PageAttributes
+Paint
+PaintAllCallback
+PaintCallback
+PaintContext
+PaintEvent
+PaintHeavyweightComponentsCallback
+Paints
+Palo
+Panel
+PanelPeer
+Panels
+Parameter
+ParameterDescriptor
+ParameterMetaData
+Parameters
+Parens
+Parentheses
+Paris
+Parry
+Parse
+ParseException
+ParseInfo
+ParseIntegerOnly
+ParsePosition
+ParseUtil
+ParsedNamingURL
+Parser
+ParserConfigurationException
+Parses
+Parsing
+Part
+Partial
+Pass
+Passes
+Passing
+PasswordAuthentication
+Past
+Path
+PathConsumer
+PathDasher
+PathException
+PathIterator
+PathStroker
+Pathname
+Pathnames
+Pattern
+PatternEntries
+PatternEntry
+PatternSyntaxException
+Patterns
+Pause
+Pavani
+Payment
+Payne
+Pc
+Pd
+Pe
+Pearls
+Peek
+PeekInputStream
+Peeks
+Peer
+PeerEvent
+PeerFixer
+PeerPaintCallback
+PeerPrintCallback
+Pending
+Per
+Perform
+Performance
+Performing
+Performs
+Perhaps
+Period
+Permanently
+Permission
+PermissionCollection
+PermissionCollections
+Permissions
+PermissionsEnumerator
+PermissionsHash
+PermissionsImpl
+PersistenceDelegate
+Persistent
+Peter
+Pf
+Phase
+Philip
+Phoenix
+Pi
+Pictures
+Pipe
+Piped
+PipedInputStream
+PipedOutputStream
+PipedReader
+PipedWriter
+PixelFormats
+PixelOf
+Pixels
+Place
+Placeholder
+Places
+Plain
+PlainDatagramSocketImpl
+PlainSocketImpl
+Platform
+PlatformFont
+Platte
+Plays
+Please
+Plumb
+Pluto
+Po
+Point
+Point2D
+Points
+Policy
+PolicyFile
+PolicyTool
+Polygon
+PolygonPathIterator
+Pop
+Populate
+Populates
+PopupMenu
+PopupMenuPeer
+PopupMenus
+Port
+PortUnreachableException
+Portable
+Porter
+Portions
+Pos
+Positional
+Positioning
+Positive
+Possible
+Post
+PostEventQueue
+Postal
+Postconditions
+Posting
+Postprocessing
+Posts
+Potential
+Potentially
+Practice
+Pre
+Precompute
+Precondition
+Preconditions
+Prefix
+Preliminary
+Prentice
+PreparedStatement
+PreparedStatements
+Prepares
+Prepend
+Preprocess
+Preprocessing
+Presentation
+Preserve
+Presses
+Presumably
+Prevent
+Prevents
+Previous
+Primality
+PrimeRun
+PrimeThread
+Primitive
+PrimitivePersistenceDelegate
+Principal
+Principals
+Principles
+Print
+PrintAllCallback
+PrintCallback
+PrintGraphics
+PrintHeavyweightComponentsCallback
+PrintJob
+PrintJobs
+PrintQualityType
+PrintStackTrace
+PrintStream
+PrintWriter
+Printer
+PrinterIOException
+Printing
+Prints
+Prinzing
+Prior
+Prioritized
+Priority
+Private
+PrivateKey
+PrivateKeyInfo
+Privates
+Privileged
+PrivilegedAction
+PrivilegedActionException
+PrivilegedExceptionAction
+PrivilgedActionException
+Probably
+Procedures
+Process
+Processes
+Processor
+Proclaim
+Produce
+Produces
+Programmatically
+Programming
+Programs
+Prohibited
+Prompts
+Propagation
+Proper
+Properly
+Properties
+Property
+PropertyChange
+PropertyChangeEvent
+PropertyChangeEvents
+PropertyChangeListener
+PropertyChangeListenerProxy
+PropertyChangeListenerProxys
+PropertyChangeListeners
+PropertyChangeSupport
+PropertyDescriptor
+PropertyDescriptors
+PropertyEditor
+PropertyEditorManager
+PropertyEditorSupport
+PropertyEditors
+PropertyExpander
+PropertyPermission
+PropertyPermissionCollection
+PropertyPermissions
+PropertyResourceBundle
+PropertyVetoException
+Proposed
+Protected
+ProtectionDomain
+ProtectionDomains
+Protocol
+ProtocolException
+ProtocolVersion
+Protocols
+Provide
+Provided
+Provider
+ProviderException
+ProviderProperty
+Providers
+Provides
+Proxy
+ProxyPersistenceDelegate
+Ps
+Pseudo
+Public
+PublicKey
+Punctuation
+PureJavaPrintDialogExample
+Purpose
+Push
+Pushback
+PushbackInputStream
+PushbackReader
+Pushes
+Pushing
+Put
+PutField
+PutFieldImpl
+Putfield
+Puts
+Putting
+Q
+QAQAT
+QCQCJ
+QUARTO
+QUOTE
+Quadratic
+Qualifier
+Quarto
+Queries
+Query
+Question
+Queue
+Queues
+Quinn
+Quit
+Quote
+QuotedPattern
+QuotedString
+Quux
+R
+RADIX
+RANGE
+RBCollationTables
+RBTableBuilder
+RCSFile
+RDBMSs
+RE
+READ
+READING
+REAL
+RECORD
+RECURSIVE
+RED
+REF
+REFERENCE_GENERATION
+REFRENCES
+REFRESH_RATE_UNKNOWN
+REF_GENERATION
+REGISTRY_PORT
+RELATIVE
+REMAINDER
+REMARKS
+REMIND
+REMOVE
+REPLACEALL_THRESHOLD
+REPRESENTATION
+REQUEST_OK
+REQUIRED
+REREU
+RESERVED_ID_MAX
+RESET
+RESIZABLE
+RESOLVE
+RETURN
+RETURN_GENERATED_KEYS
+REVERSE_ORDER
+REVERSE_THRESHOLD
+RFC
+RFC1323
+RFC2373
+RFC2396
+RFC2732
+RGB
+RGBA
+RGBtoHSB
+RIFF
+RIGHT
+RIGHT_ALIGNMENT
+RIGHT_TO_LEFT
+RLE
+RLEStringToByteArray
+RLEStringToShortArray
+RLO
+RMASK
+RMI
+RMISecurityException
+RMISecurityManager
+ROMAN
+ROMAN_BASELINE
+ROROM
+ROTATE_THRESHOLD
+ROUND
+ROUNDING
+ROUND_CEILING
+ROUND_DOWN
+ROUND_FLOOR
+ROUND_HALF_DOWN
+ROUND_HALF_EVEN
+ROUND_HALF_UP
+ROUND_UNNECESSARY
+ROUND_UP
+ROWID
+RSA
+RSAPrivateCrtKey
+RSAPrivateKey
+RSAPublicKey
+RST
+RT
+RTL
+RUB
+RUN
+RUNIC
+RUNNING
+RUN_DIRECTION
+RUN_DIRECTION_LTR
+RURUS
+RWRWA
+Rabin
+Radicals
+Radix
+Random
+RandomAccess
+RandomAccessFile
+RandomAccessSubList
+Randomly
+RangeCheck
+Ranges
+Raster
+RasterOutputManager
+Rasterizer
+RasterizerCaps
+RasterizerCorners
+Rasters
+Rather
+Raw
+Re
+Read
+ReadMethod
+ReadOnlyBufferException
+ReadableByteChannel
+Readback
+Reader
+Reading
+Reads
+Reallocate
+Reason
+Reassigns
+Rebinds
+Rebuild
+Recalculate
+Recall
+Receive
+Received
+Receives
+Reciprocals
+Recognition
+Recombine
+Recommendation
+Recomputation
+Recompute
+Reconstitute
+Reconstitutes
+Record
+Recover
+Rect
+Rectangle
+Rectangle2D
+RectangularShape
+Recurse
+Recursive
+Recursively
+Red
+Redirect
+Redirection
+Redispatches
+Reduction
+Ref
+Refer
+Reference
+ReferenceQueue
+References
+Refills
+Reflect
+ReflectPermission
+Reflection
+ReflectionFactory
+Refreshes
+Regardless
+Regex
+Register
+Registers
+Registration
+Registry
+Regular
+Rehash
+Rehashes
+Reilly
+Reinhold
+Rejections
+Relation
+Relative
+Relativization
+Relativizes
+Release
+Releases
+Reload
+Remainder
+Remaining
+Remember
+Remote
+RemoteException
+RemoteObject
+Removal
+Remove
+Removed
+Removes
+Removing
+Rename
+Renames
+Renaud
+Render
+RenderableImage
+RenderedImage
+Renderers
+RenderinHints
+Rendering
+RenderingHints
+Renders
+Reorder
+Rep
+RepaintArea
+Repaints
+Reparent
+Repeat
+Repeating
+ReplaceTable
+Replaced
+Replaces
+Replacing
+Replay
+ReplicateScaleFilter
+Reply
+Report
+Reports
+Repositions
+Representation
+Represents
+Reprocess
+Request
+Requests
+Required
+Requires
+Rescale
+Reseeds
+Reserved
+Reset
+Resets
+Resetting
+Resizable
+Resize
+Resizes
+Resolution
+Resolve
+Resolved
+Resolves
+Resolving
+Resource
+ResourceBundle
+ResourceBundles
+ResourceCacheKey
+Resources
+Respect
+Restore
+Restores
+Restrict
+ResulSetMetaData
+Result
+ResultSet
+ResultSetMetaData
+Resulting
+Results
+Resumes
+Retain
+Retains
+Retargets
+Retreives
+Retrieval
+Retrieve
+Retrieves
+Retrive
+Return
+Returned
+Returns
+Reuse
+ReuseAddr
+Reverse
+ReverseComparator
+Reverses
+Revision
+Rewinds
+Rewritten
+Richard
+Riggs
+Right
+Rights
+Risks
+Rivest
+Road
+Robi
+Robot
+RobotPeer
+Roger
+Roland
+Roll
+Rolling
+Roman
+Rose
+Ross
+Rotates
+Rotating
+Round
+Rounded
+Rounding
+Route
+Row
+Rows
+Rule
+RuleBasedBreakIterator
+RuleBasedCollator
+RuleBasedCollators
+Rules
+Run
+Runic
+Runnable
+Running
+Runs
+Runtime
+RuntimeException
+RuntimePermission
+S
+S2
+S5
+SALARY
+SAME
+SASAU
+SATURDAY
+SAVE
+SAVE_FILE
+SAXException
+SAXParser
+SAXParserFactory
+SBSLB
+SCALE
+SCALE_AREA_AVERAGING
+SCALE_DEFAULT
+SCALE_FAST
+SCALE_REPLICATE
+SCALE_SMOOTH
+SCHEDULED
+SCIENTIFICSTYLE
+SCOPE
+SCOPE_CATALOG
+SCOPE_CATLOG
+SCOPE_SCHEMA
+SCOPE_TABLE
+SCROLLBAR
+SCROLLBARS_ALWAYS
+SCROLLBARS_AS_NEEDED
+SCROLLBARS_BOTH
+SCROLLBARS_HORIZONTAL_ONLY
+SCROLLBARS_NEVER
+SCROLLBARS_NONE
+SCROLLBARS_VERTICAL_ONLY
+SCROLLPANE_ONLY
+SCROLL_ABSOLUTE
+SCROLL_BAR
+SCROLL_BEGIN
+SCROLL_END
+SCROLL_EVENT
+SCROLL_LINE_DOWN
+SCROLL_LINE_UP
+SCROLL_LOCK
+SCROLL_PAGE_DOWN
+SCROLL_PAGE_UP
+SCROLL_PANE
+SCSYC
+SC_BLOCK_DATA
+SC_EXTERNALIZABLE
+SC_SERIALIZABLE
+SC_WRITE_METHOD
+SDK
+SDSDN
+SDSI
+SE
+SEALED
+SEARCHABLE
+SEARCH_HEAVYWEIGHTS
+SECOND
+SECONDARY
+SECONDARYDIFFERENCEONLY
+SECONDARYORDERINCREMENT
+SECONDARYORDERMASK
+SECONDARYORDERSHIFT
+SECOND_FIELD
+SEG_CLOSE
+SEG_CUBICTO
+SEG_LINETO
+SEG_MOVETO
+SEG_QUADTO
+SELECT
+SELECTABLE
+SELECTED
+SELECTION
+SELF_REFERENCING_COLUMN
+SELF_REFERENCING_COL_NAME
+SENTENCE
+SENTENCE_INDEX
+SEPARATE_DOCUMENTS_COLLATED_COPIES
+SEPARATE_DOCUMENTS_UNCOLLATED_COPIES
+SEPARATOR
+SEPTEMBER
+SEP_RECURSIVE
+SEP_WILD
+SEResizeCursor
+SESWE
+SET
+SET_LOG_PERMISSION
+SEVENTY
+SE_RESIZE_CURSOR
+SGSGP
+SH
+SHA
+SHA1PRNG
+SHA1withDSA
+SHA1withRSA
+SHIFT
+SHIFT_DOWN_MASK
+SHIFT_MASK
+SHORT
+SHORTEN
+SHORTEST
+SHORT_MAX_VALUE
+SHOULD
+SHOWING
+SHOWING_CHANGED
+SHSHN
+SHUFFLE_THRESHOLD
+SHUT_RD
+SHUT_WR
+SI
+SIDE
+SIGGRAPH
+SIGINT
+SIGKILL
+SIGN
+SIGNED
+SIGNIFICAND
+SIGTERM
+SIMPLE_CASE_COUNTRY_DEFAULT_DIGITS_MASK
+SIMPLE_CASE_COUNTRY_DEFAULT_DIGITS_SHIFT
+SIMPLE_CASE_COUNTRY_FINAL_CHAR_MASK
+SIMPLE_CASE_COUNTRY_MASK
+SIMPLIFIED_CHINESE
+SINGLE
+SINGLE_LINE
+SINHALA
+SISVN
+SIXTY
+SIZE
+SI_STOP
+SJSJM
+SKIP_BUFFER_SIZE
+SKIP_LF
+SKSVK
+SLSLE
+SMALL
+SMALLINT
+SMALL_FORM_VARIANTS
+SMALL_PRIME_PRODUCT
+SMALL_PRIME_THRESHOLD
+SMB
+SMSMR
+SNFH_FAILURE
+SNFH_SUCCESS_HANDLED
+SNFH_SUCCESS_PROCEED
+SNSEN
+SOCKS
+SOCKS5
+SOMEBITS
+SOSOM
+SOURCE_DATA_TYPE
+SOUTH
+SOUTHEAST
+SOUTHWEST
+SO_BINDADDR
+SO_BROADCAST
+SO_KEEPALIVE
+SO_LINGER
+SO_OOBINLINE
+SO_RCVBUF
+SO_REUSEADDR
+SO_SNDBUF
+SO_TIMEOUT
+SPACE
+SPACE_SEPARATOR
+SPACING_MODIFIER_LETTERS
+SPECIALS
+SPECIAL_CASE_COUNTRY_INDEX_DELTA
+SPECIAL_CASE_COUNTRY_INDEX_MASK
+SPECIAL_CASE_COUNTRY_MASK
+SPECIFICATION_TITLE
+SPECIFICATION_VENDOR
+SPECIFICATION_VERSION
+SPI
+SQL
+SQL92
+SQL99
+SQLData
+SQLException
+SQLExceptions
+SQLInput
+SQLOutput
+SQLPermission
+SQLSTATE
+SQLSTATEs
+SQLState
+SQLWarning
+SQL_DATA_TYPE
+SQL_DATETIME_SUB
+SQLstate
+SQUARE
+SRC
+SRC_ATOP
+SRC_IN
+SRC_OUT
+SRC_OVER
+SRSUR
+SResizeCursor
+SS
+STANDARD_TIME
+START
+START_PUNCTUATION
+START_STATE
+STATEMENT
+STATIC
+STATUS_EXCEPTION
+STATUS_INFINITE
+STATUS_LENGTH
+STATUS_OK
+STATUS_POSITIVE
+STATUS_UNKNOWN
+STERMINATOR
+STOP
+STOPPED
+STOP_STATE
+STREAMED
+STREAM_MAGIC
+STREAM_VERSION
+STROKE_DEFAULT
+STROKE_NORMALIZE
+STROKE_PURE
+STRONG
+STRUCT
+STSTP
+SUBCLASS_IMPLEMENTATION_PERMISSION
+SUBSTITUTION_PERMISSION
+SUCCESS_NO_INFO
+SUID
+SUN
+SUNDAY
+SUPERSCRIPTS_AND_SUBSCRIPTS
+SUPERTABLE_NAME
+SUPERTYPE_CAT
+SUPERTYPE_NAME
+SUPERTYPE_SCHEM
+SURROGATE
+SURROGATES_AREA
+SVSLV
+SWResizeCursor
+SW_RESIZE_CURSOR
+SYNCHRONIZATION
+SYNONYM
+SYRIAC
+SYSTEM
+SYSYR
+SZSWZ
+S_RESIZE_CURSOR
+Safe
+SafeCharIterator
+SafeKeyper
+Same
+Sami
+Sample
+San
+Sanity
+SansSerif
+Saraiya
+Sat
+Saturday
+Saturn
+Save
+Savepoint
+Savepoints
+Saves
+Saving
+Savings
+Sc
+Scale
+Scaling
+Scan
+Scanning
+Scattering
+ScatteringByteChannel
+Schedule
+Schedules
+Schema
+Scheme
+Schemers
+Schroeppel
+Scientific
+Screen
+Scroll
+ScrollBar
+ScrollPane
+ScrollPaneAdjustable
+ScrollPanePeer
+ScrollPaneWheelScroller
+ScrollPanes
+ScrollPosition
+Scrollbar
+ScrollbarDisplayPolicy
+ScrollbarPeer
+Scrollbars
+Scrolling
+Scrolls
+Search
+Searches
+Searching
+Second
+Secondly
+Section
+Sections
+Secure
+SecureClassLoader
+SecureRandom
+SecureRandomSpi
+Security
+SecurityException
+SecurityExceptions
+SecurityManager
+SecurityPermission
+Sedgewick
+See
+Seed
+Seek
+Segment
+Select
+Selectable
+SelectableChannel
+Selecting
+Selection
+SelectionKey
+SelectiveAWTEventListener
+Selector
+SelectorProvider
+Selectors
+Selects
+Self
+Semantic
+Semantics
+Seminumerical
+Send
+SendMessage
+Sends
+SentEvent
+Sentence
+SentenceBreak
+SentenceBreakBoundary
+SentenceBreakData
+SentenceBreakDictionary
+SentenceBreakRules
+SentenceExceptionFlags
+Sentinel
+Sep
+Separate
+Separates
+Separating
+Sept
+September
+SequenceInputStream
+SequencedEvent
+SequencedEvents
+Sequences
+Sequentially
+Serial
+SerialNum
+SerialVersionUID
+Serializability
+Serializable
+SerializablePermission
+Serialization
+Serialized
+SerializedDataVersion
+Serializes
+Serif
+Server
+ServerError
+ServerException
+ServerRuntimeException
+ServerSocket
+ServerSocketChannel
+ServerSockets
+Service
+Set
+SetScale
+Sets
+Setters
+Setting
+Setup
+Seven
+Several
+Shaio
+Shape
+Shapes
+Shared
+Shift
+Shifts
+Shih
+Shimmer
+Short
+ShortBuffer
+ShortCountry
+ShortEditor
+ShortLanguage
+Shorten
+Shorter
+Should
+Shouldn
+Show
+Shows
+Shuffle
+Shutdown
+Shuts
+Shutting
+Sides
+SidesType
+Sieve
+Sign
+Signal
+SignalHandler
+Signals
+Signature
+SignatureException
+SignatureIterator
+SignatureSpi
+Signed
+SignedMutableBigInteger
+SignedMutableBigIntegers
+SignedObject
+SignedObjects
+Signer
+Signers
+Signifies
+Signing
+Signs
+Signum
+Silently
+Similar
+Similarly
+Simple
+SimpleBeanInfo
+SimpleDateFormat
+SimpleTextBoundary
+SimpleTimeZone
+Simulate
+Simulates
+Since
+Single
+SingleBufferStrategy
+Singleton
+SingletonList
+SingletonMap
+SingletonSet
+Sinhala
+SinkChannel
+Sixteen
+Size
+Sk
+Skip
+Skips
+Sleeps
+Slurp
+Sm
+Small
+Smart
+Smith
+Snapshot
+Snarf
+So
+Socket
+SocketAddress
+SocketChannel
+SocketException
+SocketImpl
+SocketImplFactory
+SocketInputStream
+SocketOptions
+SocketOutputStream
+SocketPermission
+SocketPermissionCollection
+SocketPermissions
+SocketTimeoutException
+Sockets
+Socks
+SocksConsts
+SocksSocketImpl
+SocksSocketImplFactory
+SoftBevelBorder
+SoftBevelBorderUIResource
+SoftCache
+SoftReference
+Software
+Solaris
+Sole
+Some
+Someday
+Something
+Sometimes
+Somewhat
+Somone
+Sort
+Sorted
+SortedMap
+SortedSet
+Sorting
+Sorts
+Source
+SourceChannel
+SourceFile
+South
+Southeast
+Southwest
+Space
+Spaces
+Spacing
+Spanish
+Spec
+Special
+SpecialCasing
+SpecialMapping
+Specialization
+Specials
+Specific
+Specifically
+Specification
+Specified
+Specifies
+Specify
+Specifying
+Spi
+Split
+Splits
+Square
+Squares
+Src
+SrcAtop
+SrcIn
+SrcOut
+SrcOver
+Stack
+StackOverflowError
+StackTraceElement
+Stall
+Standard
+StandardCharsets
+StandardGlyphVector
+Start
+Starting
+Starts
+Stash
+State
+Statement
+Statements
+States
+Static
+StaticFieldsPersistenceDelegate
+Statment
+Status
+Std
+Steele
+Stein
+Step
+Steve
+Steven
+Still
+Stop
+Stopping
+Stops
+Storage
+Store
+Stored
+Stores
+Storing
+Strategy
+Stream
+StreamCorruptedException
+StreamTokenizer
+StrictMath
+String
+StringBuffer
+StringBufferInputStream
+StringCharBuffer
+StringCharacterIterator
+StringCoding
+StringDecoder
+StringEncoder
+StringIndexOutOfBoundsException
+StringPart
+StringReader
+StringSelection
+StringTokenizer
+StringWriter
+Strings
+Strip
+Stroke
+Strokes
+Stroking
+Strong
+Struct
+Structural
+Structurally
+Structured
+StubNotFoundException
+Stuff
+Style
+SubFormatPatternPart
+SubList
+SubMap
+Subclass
+Subclasses
+Subclassing
+Subformat
+SubformatPattern
+SubformatPatternPart
+SubjectPublicKeyInfo
+Submits
+Subpattern
+Subscripts
+Subsequent
+Subset
+Substitution
+Substitutions
+Subtract
+Subtracts
+Success
+Successive
+Such
+Sun
+SunCompositeContext
+SunDropTargetEvent
+SunDropTargetEvents
+SunGraphicsCallback
+SunGraphicsEnvironment
+SunHints
+SunToolkit
+Sunday
+Superclass
+Superscripts
+Supertables
+Supplement
+Support
+Supported
+Suppose
+Suppress
+Suppresses
+Surrogates
+Suspends
+Sval
+Swap
+Swapping
+Swaps
+Swing
+SwingSet2
+Switzerland
+Syllabics
+Syllables
+Symbol
+Symbols
+SyncFailedException
+Synch
+Synchronization
+Synchronize
+Synchronized
+SynchronizedCollection
+SynchronizedList
+SynchronizedMap
+SynchronizedRandomAccessList
+SynchronizedSet
+SynchronizedSortedMap
+SynchronizedSortedSet
+Synchronizes
+Synchronizing
+Synchronously
+Synonym
+Syntax
+Synthesizes
+Syriac
+System
+SystemColor
+Systems
+T
+TAB
+TABLE
+TABLE2
+TABLE_CAT
+TABLE_CATALOG
+TABLE_NAME
+TABLE_SCHEM
+TABLE_TYPE
+TABLOID
+TABULATION
+TAIWAN
+TAMIL
+TCP
+TCP_NODELAY
+TCTCA
+TC_ARRAY
+TC_BASE
+TC_BLOCKDATA
+TC_BLOCKDATALONG
+TC_CLASS
+TC_CLASSDESC
+TC_ENDBLOCKDATA
+TC_EXCEPTION
+TC_LONGSTRING
+TC_MAX
+TC_NULL
+TC_OBJECT
+TC_PROXYCLASSDESC
+TC_REFERENCE
+TC_RESET
+TC_RESETs
+TC_STRING
+TDTCD
+TELUGU
+TEMPORARY
+TEN
+TERM
+TERTIARY
+TERTIARYORDERINCREMENT
+TERTIARYORDERMASK
+TESTING
+TEXT
+TEXT_CURSOR
+TEXT_EVENT_MASK
+TEXT_FIRST
+TEXT_HIGHLIGHT
+TEXT_HIGHLIGHT_TEXT
+TEXT_INACTIVE_TEXT
+TEXT_LAST
+TEXT_TEXT
+TEXT_VALUE_CHANGED
+TFATF
+TGTGO
+TH
+THAANA
+THAI
+THE
+THEN
+THEORY
+THESE
+THIS
+THOUSAND
+THREAD
+THROUGH
+THTHA
+THURSDAY
+TIBETAN
+TIME
+TIMESTAMP
+TIMEZONE
+TIMEZONE_FIELD
+TIME_ZONE
+TINYINT
+TITLECASE_LETTER
+TJTJK
+TKTKL
+TL
+TM
+TMTKM
+TNTUN
+TO
+TODO
+TOP_ALIGNMENT
+TOS
+TOTON
+TPTMP
+TR
+TRACE
+TRACK
+TRADITIONAL_CHINESE
+TRAILING
+TRANSACTION_NONE
+TRANSACTION_READ_COMMITTED
+TRANSACTION_READ_UNCOMMITTED
+TRANSACTION_REPEATABLE_READ
+TRANSACTION_SERIALIZABLE
+TRANSFORM
+TRANSIENT
+TRANSLUCENT
+TRAVERSAL_KEY_LENGTH
+TRIPLE_PRIME
+TRTUR
+TRUE
+TRUETYPE
+TRUETYPE_FONT
+TT
+TTL
+TTL_EXPIRED
+TTTTO
+TT_EOF
+TT_EOL
+TT_NOTHING
+TT_NUMBER
+TT_WORD
+TUE
+TUESDAY
+TVTUV
+TW
+TWO
+TWO_PASSES
+TWO_SIDED_LONG_EDGE
+TWO_SIDED_SHORT_EDGE
+TWTWN
+TYPE
+TYPE_CAT
+TYPE_FORWARD_ONLY
+TYPE_IMAGE_BUFFER
+TYPE_NAME
+TYPE_PRINTER
+TYPE_RASTER_SCREEN
+TYPE_SCHEM
+TYPE_SCROLL_INSENSITIVE
+TYPE_SCROLL_SENSITIVE
+TZTZA
+Tab
+Table
+Tags
+Take
+Taken
+Takes
+Taking
+Taligent
+Tamil
+Tanaka
+Target
+Task
+TaskQueue
+Tasks
+Tear
+Technical
+Technique
+Technology
+Tell
+Tells
+Telugu
+Temporary
+Terminate
+TerminateProcess
+Terminates
+Termination
+Terminator
+Terminology
+Test
+Testing
+Tests
+Text
+TextArea
+TextAreaPeer
+TextAttribute
+TextBoundaryData
+TextComponent
+TextComponentPeer
+TextComponents
+TextCursor
+TextEvent
+TextField
+TextFieldPeer
+TextLayout
+TextListener
+Texture
+TexturePaint
+TexturePaintContext
+Thaana
+Thai
+That
+The
+Their
+Then
+Theorem
+There
+Therefore
+These
+They
+Think
+This
+Thomas
+Thorn
+Those
+Though
+Thread
+ThreadDeath
+ThreadDeathError
+ThreadGroup
+ThreadLocal
+Threads
+Three
+Throw
+Throwable
+Throwing
+Thrown
+Throws
+Ths
+Thu
+Thur
+Thurs
+Thursday
+Thus
+Tibetan
+Tim
+Time
+TimeZone
+Timeout
+TimeoutException
+Timer
+TimerTask
+TimerTasks
+TimerThread
+TimesRoman
+Timestamp
+Timestamps
+Timothy
+Tiny
+Titlebar
+TitledBorder
+TitledBorderUIResource
+To
+ToDefault
+ToIndex
+Today
+Together
+Token
+Tom
+Too
+TooManyListenersException
+Took
+Tool
+ToolTipManager
+Toolkit
+ToolkitEventMulticaster
+Top
+Tous
+Towards
+Track
+Tracks
+Traditional
+Traditional_WIN
+Trailing
+Transaction
+Transfer
+Transferable
+Transferring
+Transfers
+Transform
+TransformAttribute
+Transformation
+Transforming
+Transforms
+Transient
+Transition
+Translate
+Translates
+Transparency
+Transparent
+Traversal
+Traverse
+Treat
+Tree
+TreeMap
+TreePath
+TreeSet
+Tries
+Trim
+Trims
+Trivial
+True
+TrueType
+Truetype
+Truncates
+Trusted
+Truth
+Try
+Trying
+Tue
+Tuesday
+Tuning
+Turkey
+Turkish
+Turns
+Twice
+Two
+Tx
+Type
+TypeAheadMarker
+TypeMap
+TypeName
+Types
+Typical
+Typically
+U
+U0E01
+U0E2E
+U0E40
+U0E44
+U0E81
+U0EAE
+U0EC0
+U0EC4
+UAUKR
+UCS
+UDP
+UDP_ASSOC
+UDT
+UDTs
+UGUGA
+UI
+UID
+UK
+UL
+ULP
+UMUMI
+UNASSIGNED
+UNC
+UNDECIMBER
+UNDEFINED
+UNICODE
+UNICODE_HIGH_BOUND_HAN
+UNICODE_LOW_BOUND_HAN
+UNICODE_ZERO_WIDTH_NON_BREAKING_SPACE
+UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS
+UNINITIALIZED
+UNION
+UNIT
+UNIT_DECREMENT
+UNIT_INCREMENT
+UNIX
+UNIXProcess
+UNKNOWN
+UNK_BIT
+UNMAPPED
+UNMAPPEDCHARVALUE
+UNMARKED
+UNNECESSARY
+UNSET
+UNSIGNED
+UNSIGNED_ATTRIBUTE
+UP
+UPDATE
+UPDATE_RULE
+UPPERCASE_LETTER
+UP_CYCLE_TRAVERSAL_KEY
+UP_CYCLE_TRAVERSAL_KEYS
+URI
+URISyntaxException
+URIs
+URL
+URLClassLoader
+URLClassPath
+URLConnection
+URLConnections
+URLDecoder
+URLEncoder
+URLStreamHandler
+URLStreamHandlerFactory
+URLStreamHandlers
+URLs
+URNs
+US
+USD
+USER
+USER_DEFINED
+USER_PASSW
+USE_ALL_BEANINFO
+USN
+USS
+USUSA
+UT
+UT1
+UTC
+UTC_TIME
+UTF
+UTFDataFormatError
+UTFDataFormatException
+UYURY
+UZUZB
+U_ARABIC_NUMBER
+U_RIGHT_TO_LEFT
+U_RIGHT_TO_LEFT_ARABIC
+U_RIGHT_TO_LEFT_EMBEDDING
+U_RIGHT_TO_LEFT_OVERRIDE
+Ullman
+Ulp2
+Unable
+Unauthorized
+Unavailable
+Unbalanced
+Unbound
+Uncaught
+Unchecked
+UnconnectedChannelException
+UnconnectedSocketException
+UndeclaredThrowableException
+Undefined
+UndefinedProperty
+Under
+Underlying
+Undo
+Undoes
+Unexpected
+UnexpectedException
+Unfinished
+Unfortunately
+Unicast
+UnicastRemoteObject
+Unicode
+UnicodeBlock
+UnicodeClassMapping
+UnicodeData
+UnicodeLittle
+Unified
+Uniform
+Uninitialized
+Union
+Unique
+UniqueMethodInfo
+Unis
+Unit
+United
+Unix
+UnixFileSystem
+Unknown
+UnknownContentHandler
+UnknownContentHandlerP
+UnknownError
+UnknownHostException
+UnknownServiceException
+Unkonwn
+Unless
+Unlike
+Unlikely
+Unlocalized
+UnmappableCharacterException
+UnmarshalException
+Unmatched
+Unmodifiable
+UnmodifiableCollection
+UnmodifiableEntry
+UnmodifiableEntrySet
+UnmodifiableList
+UnmodifiableMap
+UnmodifiableRandomAccessList
+UnmodifiableSet
+UnmodifiableSortedMap
+UnmodifiableSortedSet
+Unnamed
+Unnecessary
+Unnormalize
+Unpack
+Unparseable
+Unquoted
+UnquotedPattern
+UnquotedString
+Unreachable
+Unrecognized
+UnrecoverableKeyException
+Unreserved
+Unresolved
+UnresolvedPermission
+UnresolvedPermissionCollection
+UnresolvedPermissions
+Unroll
+Unsafe
+UnsatisfiedLinkError
+Unsupported
+UnsupportedCharsetException
+UnsupportedClassVersionError
+UnsupportedEncodingException
+UnsupportedOperationException
+Unsynchronized
+Until
+Untitled
+Unused
+Up
+Update
+UpdaterInputStream
+Updates
+Updating
+Upon
+Upper
+Uranus
+Urgent
+Usage
+Use
+UseCaches
+Used
+Useful
+User
+UserVec
+Users
+Uses
+Using
+Usually
+Utilities
+Utility
+Uuml
+V
+V4
+V5
+VALUES
+VALUE_ALPHA_INTERPOLATION_DEFAULT
+VALUE_ALPHA_INTERPOLATION_QUALITY
+VALUE_ALPHA_INTERPOLATION_SPEED
+VALUE_ANTIALIAS_DEFAULT
+VALUE_ANTIALIAS_OFF
+VALUE_ANTIALIAS_ON
+VALUE_COLOR_RENDER_DEFAULT
+VALUE_COLOR_RENDER_QUALITY
+VALUE_COLOR_RENDER_SPEED
+VALUE_DITHER_DEFAULT
+VALUE_DITHER_DISABLE
+VALUE_DITHER_ENABLE
+VALUE_FRACTIONALMETRICS_DEFAULT
+VALUE_FRACTIONALMETRICS_OFF
+VALUE_FRACTIONALMETRICS_ON
+VALUE_INTERPOLATION_BICUBIC
+VALUE_INTERPOLATION_BILINEAR
+VALUE_INTERPOLATION_NEAREST_NEIGHBOR
+VALUE_RENDER_DEFAULT
+VALUE_RENDER_QUALITY
+VALUE_RENDER_SPEED
+VALUE_STROKE_DEFAULT
+VALUE_STROKE_NORMALIZE
+VALUE_STROKE_PURE
+VALUE_TEXT_ANTIALIAS_DEFAULT
+VALUE_TEXT_ANTIALIAS_OFF
+VALUE_TEXT_ANTIALIAS_ON
+VARBINARY
+VARCHAR
+VARIABLES
+VARIANT
+VAVAT
+VCVCT
+VERIFY
+VERTICAL
+VEVEN
+VGVGB
+VIEW
+VIRGIN
+VISIBLE
+VIVIR
+VK
+VK_
+VK_A
+VK_ALT
+VK_CAPS_LOCK
+VK_CONTROL
+VK_DELETE
+VK_DOWN
+VK_END
+VK_ENTER
+VK_F1
+VK_F10
+VK_F11
+VK_F12
+VK_F2
+VK_F3
+VK_F4
+VK_F5
+VK_F6
+VK_F7
+VK_F8
+VK_F9
+VK_HOME
+VK_INSERT
+VK_KANA_LOCK
+VK_LEFT
+VK_NUM_LOCK
+VK_PAGE_DOWN
+VK_PAGE_UP
+VK_PAUSE
+VK_PRINTSCREEN
+VK_RIGHT
+VK_SCROLL_LOCK
+VK_SHIFT
+VK_SPACE
+VK_TAB
+VK_UNDEFINED
+VK_UP
+VK_X
+VK_XXX
+VM
+VMs
+VNVNM
+VRAM
+VSPACE
+VUVUT
+Valid
+Validate
+Validates
+ValidationList
+Value
+ValueCollection
+ValueData
+ValueIterator
+Values
+Variables
+Variants
+Various
+Vector
+Venus
+Verifies
+Verify
+VerifyError
+Verifying
+Verisign
+Version
+Versions
+Vertical
+Very
+VetoableChange
+VetoableChangeListener
+VetoableChangeListenerProxy
+VetoableChangeListenerProxys
+VetoableChangeListeners
+VetoableChangeSupport
+VetoableListener
+View
+Viewer
+Viewing
+Views
+Violation
+Virtual
+VirtualMachineError
+Virtually
+Visibility
+Vliet
+Void
+Vol
+VolatileImage
+Volume
+W
+WAIT_CURSOR
+WALL_TIME
+WARNING
+WAS
+WDW
+WEDNESDAY
+WEEK_OF_MONTH
+WEEK_OF_MONTH_FIELD
+WEEK_OF_YEAR
+WEEK_OF_YEAR_FIELD
+WEIGHT
+WEIGHT_BOLD
+WEIGHT_REGULAR
+WEST
+WFWLF
+WHERE
+WHITE
+WIDTH
+WILD
+WILL
+WIN
+WINDOW
+WINDOW_ACTIVATED
+WINDOW_BORDER
+WINDOW_CLOSED
+WINDOW_CLOSING
+WINDOW_DEACTIVATED
+WINDOW_DEICONIFIED
+WINDOW_DEICONIFY
+WINDOW_DESTROY
+WINDOW_EVENT
+WINDOW_EVENT_MASK
+WINDOW_EXPOSE
+WINDOW_FIRST
+WINDOW_FOCUS_EVENT_MASK
+WINDOW_GAINED_FOCUS
+WINDOW_ICONIFIED
+WINDOW_ICONIFY
+WINDOW_LAST
+WINDOW_LOST_FOCUS
+WINDOW_MOVED
+WINDOW_OPENED
+WINDOW_STATE_CHANGED
+WINDOW_STATE_EVENT_MASK
+WINDOW_TEXT
+WIND_EVEN_ODD
+WIND_NON_ZERO
+WITH
+WM
+WORD
+WORD_INDEX
+WORD_MASK
+WRITE
+WRONG
+WResizeCursor
+WS
+WSWSM
+WWW
+W_RESIZE_CURSOR
+Wait
+WaitCursor
+Waits
+Wake
+Wakes
+Walk
+Wall
+Wang
+Want
+Warning
+Warnings
+Warres
+Warth
+Was
+Wasn
+Watch
+We
+Weak
+WeakHasMap
+WeakHashMap
+WeakKey
+WeakKeys
+WeakReference
+WeakReferences
+Web
+Weber
+Wed
+Wednesday
+Weed
+Week
+Weekday
+Weeks
+Weights
+Well
+Werner
+Wesley
+West
+Western
+What
+Whatever
+Wheel
+When
+Whenever
+Where
+Whether
+Which
+While
+White
+Why
+Wide
+WidgetResource
+WidgetResources_de
+WidgetResources_fr
+Width
+Will
+Win16
+Win32
+Window
+WindowActivated
+WindowAdapter
+WindowClosed
+WindowClosing
+WindowClosingListener
+WindowClosingSupport
+WindowDeactivated
+WindowEvent
+WindowEvents
+WindowFocusListener
+WindowGainedFocus
+WindowListener
+WindowLostFocus
+WindowOpened
+WindowPeer
+WindowStateListener
+Windows
+With
+Within
+Without
+Wolczko
+Wollrath
+Won
+Word
+WordBreak
+WordBreakData
+WordBreakDictionary
+WordBreakRules
+WordBreakTable
+WordExceptionFlags
+Workaround
+Worker
+World
+Wormhole
+Wraparound
+WrappedHook
+Wrapper
+Wrappers
+Wrapping
+Wraps
+WritableByteChannel
+WritableRaster
+Write
+WriteAbortedException
+WriteObject
+Writer
+Writers
+Writes
+Writing
+Written
+Wrong
+X
+X11
+X509Certificate
+X509EncodedKeySpec
+X9
+XAF
+XAG
+XAU
+XB5
+XBA
+XBB
+XBC
+XCD
+XDR
+XFO
+XFU
+XML
+XMLDecoder
+XMLEncoder
+XOF
+XOPEN
+XOR
+XPD
+XPF
+XPT
+XTEST
+XTS
+XXX
+X_DATA
+Xerces
+Xor
+XyZDescriptor
+Xz
+Y
+YEAR
+YEAR_FIELD
+YELLOW
+YES
+YET
+YEYEM
+YI_RADICALS
+YI_SYLLABLES
+YTMYT
+YUYUG
+Y_DATA
+Year
+Years
+Yellin
+Yen
+Yi
+Yingxian
+You
+Your
+YoyoDyne
+Z
+ZAZAF
+ZERO
+ZMZMB
+ZONE
+ZONE_OFFSET
+ZRZAR
+ZWZWE
+Zap
+ZapfDingbats
+Zero
+ZipEntry
+Zl
+ZoneInfo
+Zp
+Zs
+_
+_DOWN_
+_FIELD
+_GB
+_PersistenceDelegate
+__
+___
+____
+________
+____________
+_________________________
+_and_
+_any_
+_beginning_
+_blank
+_g
+_get
+_last_
+_parent
+_put
+_self
+_shortest_
+_that_
+_top
+_variant
+a
+a0
+a1
+a10
+a2
+a3
+a4
+a5
+a6
+a7
+a8
+a9
+aB
+aButton
+aChar
+aClassCastException
+aComponent
+aContainer
+aCopy
+aKey
+aKeyFormat
+aLocale
+aPattern
+aRef
+aStart
+aStrength
+aWindow
+aZeros
+a_nanos
+aa
+aaa
+aaaabc
+aaaar
+ab
+ababk
+abandon
+abbreviated
+abbreviation
+abbreviations
+abc
+abcd
+abcde
+abcdefghijklmnopqrstuvwxyz
+ability
+able
+abnormal
+abnormally
+abort
+aborted
+aborting
+aborts
+about
+above
+abs
+abscissa
+absence
+absent
+absolute
+absolutely
+absolved
+absorb
+abstract
+abstractRecognizerClass
+abstraction
+abstractly
+abuse
+abuts
+ac
+acc
+accelKey
+accelerate
+accelerated
+acceleration
+accelerator
+accelerators
+accent
+accent_diacritic
+accented
+accents
+accept
+acceptDuplicates
+acceptable
+accepted
+accepting
+accepts
+acceptsURL
+access
+accessClassInPackage
+accessClipboard
+accessClipboardPermission
+accessDeclaredMembers
+accessEventQueue
+accessOrder
+accessable
+accessed
+accesses
+accessibility
+accessible
+accessibleAWTComponentHandler
+accessibleAWTFocusHandler
+accessibleContainerHandler
+accessibleContext
+accessibleDescription
+accessibleName
+accessibleParent
+accessing
+accessor
+accessors
+accidental
+accommodate
+accomodate
+accompanied
+accompany
+accompanying
+accomplish
+accomplished
+accordance
+according
+accordingly
+account
+accounted
+accounting
+acct
+accum
+accumA
+accumB
+accumG
+accumR
+accumlated
+accumulate
+accumulateLine
+accumulated
+accumulating
+accuracy
+accurate
+accurately
+achieve
+achieved
+achieves
+ackbarfaccept
+acknowledged
+acknowledgement
+acl
+acmp
+acos
+acquireFD
+acquired
+acquiring
+acronym
+across
+act
+action
+actionCommand
+actionKeyCodes
+actionL
+actionListener
+actionListenerK
+actionPerformed
+actions
+activatable
+activate
+activated
+activates
+activating
+activation
+active
+activeCaption
+activeCaptionBorder
+activeCaptionText
+activeCount
+activeGroupCount
+activeWindow
+actively
+activities
+activity
+acts
+actual
+actualGetExp
+actually
+acute
+acyclic
+ad
+adaptations
+adapted
+adapters
+adaptors
+add
+addAWTEventListener
+addAccessibleSelection
+addActionListener
+addAdjustmentListener
+addAll
+addAllForTreeSet
+addArg
+addAttribute
+addAttributeImpl
+addAttributeRunData
+addAttributes
+addBatch
+addBefore
+addCertificate
+addChildren
+addClass
+addComponentListener
+addComposedChars
+addContainerListener
+addContractFlags
+addContractOrder
+addElement
+addEvent
+addExpandOrder
+addExpansion
+addFirst
+addFocusListener
+addFooListener
+addFredListener
+addHelpMenu
+addHierarchyBoundsListener
+addHierarchyListener
+addIdentity
+addIdentityCertificate
+addImage
+addImpl
+addInputMethodListener
+addInternal
+addItem
+addItemListener
+addItemNoInvalidate
+addKeyEventDispatcher
+addKeyEventPostProcessor
+addKeyListener
+addLast
+addLayoutComponent
+addLightweightRequest
+addListenerMethod
+addListenerMethodName
+addMenu
+addMethod
+addMethodName
+addMouseListener
+addMouseMotionListener
+addMouseWheelListener
+addNotify
+addObserver
+addOn
+addOne
+addOrder
+addOwnedWindow
+addPattern
+addPoint
+addProperty
+addPropertyChangeListener
+addProvider
+addProviders
+addRenderingHints
+addRequestProperty
+addRules
+addSeparator
+addShutdownHook
+addTab
+addTable
+addTextListener
+addToBuffer
+addToCache
+addToFrameList
+addURL
+addVetoableChangeListener
+addWindowFocusListener
+addWindowListener
+addWindowStateListener
+addXyzEventListener
+added
+addedDecimalSeparator
+addedSerial
+addend
+adder
+adding
+addition
+additional
+additionalBeanInfo
+additionally
+additions
+addnotify
+addr
+addr1
+addr_array
+address
+addressCache
+addressed
+addresses
+addressing
+addrs
+adds
+adequate
+adequately
+adhere
+adhered
+adherence
+adj
+adjacent
+adjust
+adjustDST
+adjustDecendantsOnParent
+adjustDescendants
+adjustForCurrencyDefaultFractionDigits
+adjustForGravity
+adjustListeningChildren
+adjustListeningChildrenOnParent
+adjustStamp
+adjustable
+adjustables
+adjusted
+adjusting
+adjustment
+adjustmentL
+adjustmentListener
+adjustmentListenerK
+adjustmentValueChanged
+adjustments
+adjusts
+administrative
+administrators
+admits
+adopted
+adoption
+adopts
+advance
+advanced
+advances
+advancing
+advantage
+advantages
+advertized
+advice
+advisable
+advise
+advised
+advises
+ae
+aeiou
+afafr
+affect
+affected
+affecting
+affects
+affix
+affixPattern
+affords
+aforementioned
+afresh
+after
+afterEvent
+afterLast
+afternoon
+afterwards
+again
+against
+age
+agency
+aggregate
+aggregateStamp
+aggressively
+agrave
+agree
+agreement
+aground
+ahead
+aid
+aim
+aimed
+aje
+ajust
+al
+algIndex
+algName
+algOID
+algorithm
+algorithm_or_provider
+algorithm_or_type
+algorithms
+algorythm
+alias
+aliasSet
+aliased
+aliases
+aliasing
+align
+aligned
+aligning
+alignment
+aligns
+alive
+all
+allChars
+allMethods
+allPermDomain
+allPermission
+allProceduresAreCallable
+allProviders
+allTablesAreSelectable
+allThere
+all_allowed
+allocate
+allocateDirect
+allocateMemory
+allocateNewInstance
+allocated
+allocates
+allocating
+allocation
+allocations
+allotted
+allow
+allowThreadSuspension
+allowUserInteraction
+allowable
+allowed
+allowing
+allows
+allowsMultipleSelections
+allowuserinteraction
+alluded
+allzero
+almost
+alone
+along
+alpha
+alphabet
+alphabetic
+alphabetical
+alphabets
+alphanum
+alphanumeric
+already
+alreadySelected
+als
+also
+alt
+alter
+altered
+altering
+alternate
+alternately
+alternates
+alternating
+alternation
+alternative
+alternatives
+alters
+although
+always
+am
+amamh
+ambTerm
+ambiguities
+ambiguity
+ambiguosTerm
+ambiguous
+ambiguousTwoDigitYear
+ambiguousYear
+amenable
+amended
+amiss
+ammended
+among
+amongst
+amortized
+amoung
+amount
+amounts
+amp
+ampersand
+ampm
+ampms
+an
+anArray
+anEvent
+anObject
+anOrder
+analog
+analogous
+analogue
+analogues
+analysis
+analyze
+analyzed
+analyzing
+anc
+ancestor
+ancestorMoved
+ancestorResized
+ancestors
+anchor
+anchorSelectionIndex
+anchored
+anchors
+and
+andNot
+angdeg
+anglais
+angle
+angles
+angrad
+angular
+anim
+animation
+animations
+animator
+annotate
+annotateClass
+annotateProxyClass
+annotated
+annotation
+annotations
+anomalous
+anonymous
+another
+anotherBits
+anotherByte
+anotherCharacter
+anotherDate
+anotherDouble
+anotherFloat
+anotherInteger
+anotherKey
+anotherKeyFormat
+anotherLong
+anotherShort
+anotherString
+anotherTime
+anotherVal
+answer
+antaliased
+ante
+anti
+antialiased
+antialiasing
+anticount
+any
+anyLocalAddress
+anymore
+anyone
+anything
+anyway
+anyways
+anywhere
+ap
+apart
+apostrophe
+apostrophes
+app
+appContext
+appRandom
+apparently
+appcontext
+appear
+appearance
+appearances
+appeared
+appearing
+appears
+append
+appendAffix
+appendAuthority
+appendContents
+appendCubic
+appendFragment
+appendLine
+appendQuadratic
+appendQuoted
+appendQuotedChars
+appendQuotedExtension
+appendSchemeSpecificPart
+appendText
+appended
+appending
+appendix
+appends
+apple
+applet
+appletResize
+appletWarning
+applets
+appletviewer
+applicable
+application
+applications
+applied
+applies
+apply
+applyComponentOrientation
+applyGetters
+applyLocalizedPattern
+applyPattern
+applyResourceBundle
+applySize
+applyStyle
+applyTransform
+applying
+appreciate
+approach
+approaches
+appropriate
+appropriately
+approval
+approved
+approx
+approximate
+approximately
+approximates
+approximating
+approximation
+approximations
+april
+ar
+arabic
+arara
+arary
+arbitrarily
+arbitrary
+arc
+arcAngle
+arcHeight
+arcWidth
+arcane
+arch
+architecture
+archive
+archived
+archives
+archiving
+are
+areAllFieldsSet
+areFieldsSet
+areFocusTraversalKeysSet
+areInputMethodsEnabled
+area
+areas
+aren
+arg
+arg1
+arg2
+argClasses
+argCount
+argRecursion
+argType
+argTypes
+argV
+argbRasRef
+argbmodel
+args
+arguably
+argumens
+argument
+argumentIndex
+argumentNumber
+argumentNumbers
+arguments
+argumnnt
+arise
+arises
+arithmetic
+arnold
+around
+arr
+arrLocal
+arrange
+arrangeGrid
+arranges
+arranging
+arrary
+array
+arrayClass
+arrayContentsEq
+arrayEquals
+arrayHandle
+arrayLen
+arrayLength
+arrayNameDiff
+arrayPersistenceDelegate
+arraycopy
+arrays
+arrive
+arrived
+arrives
+arrow
+arrows
+artifact
+as
+asCharBuffer
+asDoubleBuffer
+asFloatBuffer
+asIndex
+asIntBuffer
+asList
+asLongBuffer
+asReadOnlyBuffer
+asShortBuffer
+asasm
+ascending
+ascends
+ascent
+ascii
+ascii2ebcdic
+asciiValues
+asin
+ask
+asked
+asking
+asks
+aspect
+aspects
+assembled
+assert
+assertion
+assertionStatus
+assertions
+asserts
+assign
+assignable
+assigned
+assignedDomains
+assigning
+assignment
+assignments
+assigns
+assist
+assistive
+assistive_technologies
+associate
+associated
+associates
+associating
+association
+assume
+assumed
+assumes
+assuming
+assumption
+assumptions
+assurance
+assuring
+assymetry
+asterisk
+astronomical
+asymmetric
+asymptotically
+asynchronous
+asynchronously
+at
+atEnd
+atName
+atNames
+atan
+atan2
+atomic
+atomicity
+atop
+attach
+attached
+attaching
+attachment
+attachments
+attack
+attacker
+attackers
+attacks
+attempt
+attempted
+attempting
+attempts
+attended
+attention
+attr
+attrIndex
+attrName
+attribure
+attribute
+attributeCount
+attributeIndex
+attributeKey
+attributeName
+attributeNamePattern
+attributeNames
+attributeNoNulls
+attributeNullable
+attributeNullableUnknown
+attributeValuesMatch
+attribute_name
+attribute_value
+attributed
+attributedStrings
+attributes
+attribution
+attrinute
+attrs
+attrsToString
+atttribute
+au
+audience
+audio
+audit
+auditSubclass
+aug
+augment
+august
+auml
+auromatically
+authentic
+authenticate
+authenticated
+authentication
+authenticator
+authenticity
+author
+authorities
+authority
+authorization
+auto
+autoCommit
+autoDelay
+autoFlush
+autoGeneratedKeys
+autoProcessMouseWheel
+autoTransferFocus
+autoWaitForIdle
+automagically
+automated
+automatic
+automatically
+automation
+autonumbering
+aux
+auxiliary
+avail
+available
+availableCharsets
+availableProcessors
+avaliable
+average
+averageBytesPerChar
+averageCharsPerByte
+avh
+avoid
+avoided
+avoiding
+avoidingGui
+avoids
+aw
+awakened
+aware
+away
+awriter
+awry
+awt
+axes
+axis
+ayaym
+az
+azaze
+b
+b0
+b1
+b10
+b2
+b3
+b4
+b5
+b5p
+b6
+b7
+b8
+b9
+bCtxt
+bHeight
+bWidth
+bZeros
+ba
+babak
+back
+backBuffers
+backCaps
+backTableOffset
+backed
+backfill
+backfillLoopingStates
+backfilled
+backfilling
+backfills
+background
+backgroundSetByClientCode
+backing
+backlog
+backrefs
+backs
+backslash
+backtrace
+backup
+backward
+backwardDefaultFocusTraversalKeys
+backwardFocusTraversalKeys
+backwardStateTable
+backwardTextAreaFocusTraversalKey
+backwardTraversalKeys
+backwards
+backwardsStateTable
+bad
+badComponentString
+baddr
+badly
+bag
+baggage
+bah
+baht
+bail
+bais
+balanced
+banana
+bandmasks
+banner
+baos
+bar
+baronets
+bars
+base
+base2
+baseCR
+baseForm
+baseIsLTR
+baseLF
+baseLevel
+baseName
+baseState
+baseToPow2
+baseWireHandle
+baseclass
+baseclasses
+based
+baselevel
+baseline
+baselineIndex
+baselineOffsets
+baselines
+bases
+basic
+basing
+basis
+batch
+bathroom
+bayonets
+baz
+bb
+bc
+bcd
+bd
+bdata
+bdl
+be
+bean
+beanClass
+beanClassName
+beanContext
+beanDescriptor
+beanInfoCache
+beanName
+beanbox
+beancontext
+beaninfo
+beans
+bebel
+because
+become
+becomes
+becoming
+been
+beep
+befoer
+before
+beforeFirst
+began
+begin
+beginIndex
+beginLayout
+beginOffset
+beginPath
+beginRunIndex
+beginSubpath
+beginValidate
+begining
+beginning
+begins
+begun
+behalf
+behave
+behaved
+behaves
+behavior
+behavioral
+behaviors
+behaviour
+behind
+bein
+being
+beingBuilt
+believes
+believing
+bell
+belong
+belonged
+belonging
+belongs
+below
+bend
+beneath
+benefit
+bequeath
+berlin
+bert
+besides
+best
+bestBreakPositions
+bestMatch
+bestMatchLength
+bestNumber
+bestRowNotPseudo
+bestRowPseudo
+bestRowSession
+bestRowTemporary
+bestRowTransaction
+bestRowUnknown
+bestStamp
+beta
+better
+between
+bevelType
+beveled
+beyond
+bg
+bgbul
+bgcolor
+bhbih
+bi
+biRas
+bias
+bibis
+bidi
+bidirectional
+big
+big10pow
+big5pow
+bigB
+bigD
+bigD0
+bigDecimalExponent
+bigEndian
+bigIndex
+bigIntExp
+bigIntNBits
+bigOne
+bigger
+bigint
+bigq
+bigr
+billion
+bin
+binExp
+binary
+binaryGCD
+binaryGcd
+binarySearch
+bind
+bindAddr
+bindV4
+bindaddr
+binding
+bindings
+bindpoint
+binds
+binexp
+bir
+birds
+bis
+bison
+bit
+bitClump
+bitCnt
+bitCount
+bitDepth
+bitIndex
+bitLen
+bitLength
+bitMask
+bitSieve
+bitcount
+bitlen
+bitlength
+bitlengths
+bitmap
+bitmask
+bitmasks
+bitpos
+bits
+bitsInHighWord
+bitsLeftOf
+bitsPerDigit
+bitsRightOf
+bitset
+bitwise
+bl
+black
+blah
+blank
+blen
+blend
+blending
+bless
+blessing
+blindly
+blinking
+blitted
+blitting
+blk
+blkmode
+block
+blockIncrement
+blockStarts
+blocked
+blockedOn
+blocker
+blocking
+blockingLock
+blockquote
+blocks
+blt
+blue
+bluec
+bm
+bnExpModThreshTable
+bnben
+bnf
+bo
+bobEncodedPubKey
+bobPubKey
+bobPubKeySpec
+bobod
+body
+bogus
+boilerplate
+bold
+bolditalic
+bonus
+boo
+book
+bookkeeping
+books
+bool
+boolean
+booleanValue
+booleans
+boot
+bootclasspath
+bootstrap
+bootstrapClassPath
+border
+borders
+boring
+borrow
+borrowed
+botch
+both
+bother
+bothered
+bottom
+bottommost
+bound
+boundFields
+boundaries
+boundary
+bounded
+bounding
+bounds
+boundsCheck
+boundsMaxX
+boundsMaxY
+boundsMinX
+boundsMinY
+bout
+box
+boxes
+bp
+br
+brace
+braceStack
+braces
+bracket
+bracketLevel
+bracketed
+brackets
+brain
+branch
+branches
+brbre
+break
+breaker
+breaking
+breaks
+breve
+brevity
+brhavior
+bridge
+brief
+briefly
+briefs
+brighter
+brightness
+bring
+bringing
+brings
+brk
+broadcast
+broadcasts
+broke
+broken
+brown
+browser
+browsers
+brute
+bs
+bsi
+btc
+bubble
+bucket
+buckets
+buf
+bufImg
+bufLength
+bufSize
+buffer
+bufferCaps
+bufferFlushed
+bufferFull
+bufferLoop
+bufferStrategy
+bufferUnderflowException
+buffered
+bufferedStream
+buffering
+buffers
+buflen
+bug
+bugfix
+buggy
+bugs
+build
+buildBackwardsStateTable
+buildBreakIterator
+buildCharCategories
+buildFromSorted
+buildRuleList
+buildStateTable
+buildTree
+builder
+builders
+building
+builds
+built
+bulk
+bullet
+bummer
+bump
+bunch
+bunching
+bundle
+bundleClass
+bundleName
+bundles
+bundlesFound
+bursts
+busy
+but
+button
+button1
+button2
+button3
+buttonDir
+buttonSerializedDataVersion
+buttons
+bw
+bwd
+by
+bypass
+bypasses
+bypassing
+byte
+byteAddr
+byteArray
+byteLen
+byteLength
+byteOrder
+byteOutputter
+byteVal
+byteValue
+byte_array
+bytearr
+bytes
+bytesCopied
+bytesRead
+bytesRemaining
+bytesToDoubles
+bytesToFloats
+bytesToTransfer
+bytesTransferred
+bytesWidth
+bytewise
+c
+c0
+c1
+c10
+c2
+c3
+c4
+c5
+c6
+c7
+c8
+c9
+cFlgs
+cH
+cPeer
+cSize
+cTbl
+ca
+cacat
+cache
+cacheAddress
+cacheInitIfNeeded
+cacheKey
+cacheList
+cacheLookup
+cached
+cachedBreakPositions
+cachedConstructor
+cachedLocaleData
+cachedMat
+cachedModel
+cachedNumberFormatData
+cachedZoneData
+caches
+caching
+cal
+calc
+calculate
+calculateBounds
+calculateBundleNames
+calculateChildSize
+calculated
+calculates
+calculating
+calculation
+calculations
+calendar
+calendarField
+calendarToFieldMapping
+calendars
+call
+callable
+callback
+callbacks
+called
+caller
+callerC
+callerCL
+callerClassLoader
+callers
+calling
+calls
+came
+can
+canAccessClipboard
+canBlock
+canDisplay
+canDisplayUpTo
+canEncode
+canRead
+canRotate
+canWrite
+canbezero
+cancel
+cancelKey
+cancelRowUpdates
+canceling
+cancellation
+cancelled
+cancels
+cand
+candidate
+candidates
+candidatesArray
+cannot
+cannotHappen
+canonical
+canonicalHostName
+canonicalName
+canonical_path
+canonicalization
+canonicalize
+canonicalize_md
+canonicalized
+canonically
+canonicals
+cansIte
+cantaloupe
+canvas
+canvases
+cap
+capabilites
+capabilities
+capability
+capable
+capacity
+capacityIncrement
+capchi
+capiota
+capital
+capitalization
+capitalize
+capitalized
+capitals
+caps
+capsigma
+captheta
+capture
+captured
+capupsil
+card
+cardComponent
+cardName
+cardinality
+cards
+care
+careful
+cares
+caress
+caret
+caretPosition
+caretPositionChanged
+carol
+caron
+carriage
+carried
+carries
+carry
+carryout
+cascade
+case
+caseDiff
+cased
+cases
+cash
+casing
+cast
+casting
+casts
+catalog
+cataloging
+catalogs
+catch
+catches
+catching
+catchs
+categories
+category
+categoryFlags
+categoryMap
+cats
+caught
+causation
+causative
+cause
+caused
+causedTrace
+causes
+causing
+caution
+caveat
+caveats
+cb
+cbg
+cbuf
+cc
+ccl
+cd
+cdate
+cde
+cdt
+ce
+cease
+ceased
+ceases
+cector
+cedilla
+cee
+ceil
+cell
+cellIsPopulated
+cellRenderer
+cellValue
+cellar
+cellpadding
+cells
+cellspacing
+cent
+center
+centered
+centering
+centers
+centimeter
+central
+centralized
+centralizes
+cents
+century
+cert
+certType
+certain
+certainly
+certainty
+certificate
+certificates
+certifies
+certifying
+certs
+cf
+cfilorux
+cfs
+cg
+ch
+ch1
+ch2
+ch3
+ch4
+cha
+chacters
+chain
+chained
+chaining
+chains
+chance
+chandrabindu
+change
+changeFlags
+changeLastEntry
+changeSupport
+changed
+changedParent
+changeover
+changes
+changing
+channel
+channels
+channelsAvailable
+chaotic
+chapter
+chapter1
+char
+char0
+char1
+char2
+char3
+charAt
+charCategoryTable
+charLength
+charLoop
+charMap
+charOut
+charPos
+charSetForCategory
+charSetFromCategory
+charType
+charValue
+charWidth
+characers
+character
+characterIterators
+characteristics
+characterists
+characterize
+characterized
+characters
+charactre
+charaters
+charenc
+charr
+chars
+charsInEntry
+charsThatCantPrecedeAsterisk
+charsWidth
+charset
+charsetForName
+charsetName
+charsets
+chartacters
+chase
+cheap
+check
+checkAccept
+checkAccess
+checkAll
+checkAndCreate
+checkAwtEventQueueAccess
+checkAwtEventQueuePermission
+checkBounds
+checkButtonsArgument
+checkCerts
+checkChar
+checkChars
+checkConnect
+checkCreateClassLoader
+checkDefaultSerialize
+checkDelayArgument
+checkDelete
+checkDeserialize
+checkError
+checkExec
+checkExit
+checkForComodification
+checkForEnableIM
+checkGD
+checkGuard
+checkHeadless
+checkID
+checkIO
+checkImage
+checkIndex
+checkInitted
+checkIsScreenDevice
+checkKeycodeArgument
+checkLayout
+checkLink
+checkListen
+checkLookupTable
+checkMapped
+checkMember
+checkMemberAccess
+checkMemberAccessPermission
+checkMemeberAccess
+checkMulticast
+checkName
+checkNotDispatchThread
+checkOffset
+checkPackageAccess
+checkPackageAcesss
+checkPackageDefinition
+checkPath
+checkPermission
+checkPrintJobAccess
+checkPropertiesAccess
+checkPropertyAccess
+checkRead
+checkResolve
+checkRobotAllowed
+checkScreenCaptureAllowed
+checkSecTer
+checkSecurityAccess
+checkSetFactory
+checkSpecifyHandler
+checkSuperclass
+checkSystemClipboardAccess
+checkTertiary
+checkTopLevelWindow
+checkURL
+checkValidRect
+checkWindowClosingException
+checkWrite
+checkbox
+checkboxMenuItemSerializedDataVersion
+checkboxSerializedDataVersion
+checkboxes
+checked
+checkedAddresses
+checkedExceptions
+checkedWithFactory
+checkfpx
+checking
+checks
+cheeses
+chemie
+chi
+child
+childListeners
+childMap
+childResized
+childSize
+childValue
+children
+childs
+chime
+chkmenuitem
+cho
+choice
+choiceFormats
+choiceLimits
+choiceSerializedDataVersion
+choices
+choose
+choosen
+chooses
+choosing
+chopping
+chose
+chosen
+choseong
+choses
+chugs
+chunk
+chunklen
+chunks
+chval
+ci
+circle
+circuit
+circuiting
+circuits
+circular
+circularities
+circularity
+circumference
+circumflex
+circumstances
+circumvent
+cited
+cities
+civil
+cjk
+cl
+cl1
+cl2
+clFields
+clHandle
+claim
+claimed
+claiming
+claims
+clarity
+clashes
+class
+classAssertionStatus
+classDepth
+classDesc
+classEnabled
+classForName
+classLoader
+classLoaderDepth
+classLoaderDepth0
+classMods
+className
+classNames
+classNamesEqual
+classObjs
+classPath
+classToBeanInfo
+classdesc
+classdescriptor
+classes
+classic
+classified
+classloader
+classloaders
+classname
+classpath
+classses
+clause
+clauses
+clazz
+clean
+cleanUpConstructionList
+cleaner
+cleanly
+cleanup
+clear
+clearAccessibleSelection
+clearAssertionStatus
+clearBatch
+clearBit
+clearChanged
+clearFocusRequestList
+clearGlobalFocusOwner
+clearLoopingStates
+clearOnFailure
+clearParameters
+clearProviderProperties
+clearRect
+clearWarnings
+clearable
+cleared
+clearing
+clearingCurrentLightweightRequests
+clearly
+clears
+clen
+clever
+click
+clickCount
+clicked
+clicking
+clicks
+client
+clients
+clinit
+clip
+clipFillRaster
+clipRect
+clipboard
+clipped
+clipping
+clips
+cloader
+clock
+clocks
+clockwise
+clonable
+clone
+cloneStatement
+cloneability
+cloneable
+cloned
+cloning
+close
+close0
+closeBracket
+closePath
+closePending
+closeable
+closed
+closedByReader
+closedByWriter
+closedSubpath
+closely
+closer
+closes
+closest
+closing
+closure
+cls
+clsName
+clsidOffset
+clump
+clustered
+clz
+cm
+cmap
+cmax
+cmd
+cmdIn
+cmdOut
+cmdSocket
+cmdarray
+cmdsock
+cmin
+cmp
+cmpFracHalf
+cmpResult
+cn
+cname
+cnse
+cnt
+coalesce
+coalesceEvents
+coalescePaintEvent
+coalesced
+coalescedEvent
+coalesces
+coalescing
+coce
+cocos
+code
+codeBase
+codebase
+coded
+coder
+coders
+codes
+codesource
+codify
+coding
+coincidence
+col
+colFirst
+colLastValue
+colName
+colString
+colincx
+colincxerr
+colincy
+colincyerr
+colinear
+coll
+collapse
+collapsed
+collapsing
+collar
+collated
+collation
+collator
+collators
+collect
+collectInterfaces
+collected
+collection
+collections
+collector
+collects
+collide
+collision
+collisions
+collusion
+colon
+colonp
+colons
+color
+color1
+color2
+colorModel
+colorOf
+colored
+colors
+colrel
+cols
+colspan
+column
+columnHeader
+columnIndex
+columnIndexes
+columnMap
+columnName
+columnNamePattern
+columnNames
+columnNoNulls
+columnNullable
+columnNullableUnknown
+columnWeights
+columnWidth
+columnWidths
+columns
+com
+comapare
+comarison
+combination
+combinations
+combine
+combined
+combinedPds
+combinedRowNum
+combiner
+combines
+combining
+comboboxes
+comceptual
+come
+comes
+coming
+comma
+command
+commands
+commas
+commence
+comment
+commentChar
+commented
+comments
+commercial
+commit
+commits
+committed
+commmands
+common
+common2
+common2factor
+commonly
+communicate
+communicates
+communication
+communications
+community
+comonent
+comp
+comp1
+comp2
+compArray
+compParent
+compact
+compacting
+compactness
+companies
+company
+comparable
+comparator
+comparators
+compare
+compareArraysToCount
+compareCerts
+compareIgnoringCase
+compareMethods
+compareSec
+compareTer
+compareTo
+compareToIgnoreCase
+compareToRule
+compared
+comparing
+comparision
+comparison
+comparisons
+compatability
+compatibility
+compatibilty
+compatible
+compatiblity
+compatilibility
+compelling
+compensate
+compensates
+compete
+competes
+competing
+compilation
+compile
+compileClass
+compileClasses
+compiled
+compiler
+compilers
+compindex
+complement
+complementary
+complemented
+complete
+completed
+completely
+completeness
+completes
+completion
+completly
+complex
+compliance
+compliant
+complicated
+complicating
+complication
+complies
+comply
+complying
+componen
+componenets
+component
+componentAdded
+componentHidden
+componentL
+componentListener
+componentListenerK
+componentMoved
+componentOrientation
+componentRemoved
+componentResized
+componentSerializedDataVersion
+componentShown
+components
+compose
+composeList
+composeMapping
+composed
+composing
+composite
+composited
+composites
+compositing
+composition
+compound
+comprehensively
+compress
+compressed
+compressedIsoCountries
+compressedIsoLanguages
+comprise
+comprised
+comprises
+comprising
+compromise
+compromised
+comptable
+computatinally
+computation
+computations
+compute
+computeDefaultSUID
+computeFieldOffsets
+computeFields
+computeJulianDay
+computeRedLevel
+computeTime
+computed
+computer
+computerized
+computes
+computing
+con
+concat
+concatenate
+concatenated
+concatenating
+concatenation
+concatenations
+concatentation
+concept
+concepts
+conceptual
+conceptually
+concern
+concerned
+concerning
+concerns
+concise
+concisely
+concrete
+concurrency
+concurrent
+concurrently
+cond
+condition
+conditionalShow
+conditions
+confidential
+config
+configs
+configuration
+configurations
+configure
+configureBlocking
+configured
+conflict
+conflicting
+conflicts
+conform
+conformant
+conforming
+conforms
+confuse
+confused
+confusing
+confusion
+congruential
+conjoining
+conjuction
+conjunction
+connect
+connect0
+connectInternal
+connectOwnedWindow
+connectToAddress
+connectV4
+connectable
+connected
+connectedAddress
+connectedPort
+connecting
+connection
+connectionless
+connections
+connects
+cons
+consSigs
+consecutive
+consecutively
+consed
+consequence
+consequences
+conservation
+conservative
+conservatively
+consider
+considerably
+consideration
+considerations
+considered
+considering
+considers
+consist
+consistency
+consistent
+consistently
+consisting
+consists
+console
+consonant
+consonants
+constant
+constantce
+constants
+constists
+constituent
+constituents
+constitute
+constitutes
+constituting
+constrain
+constrained
+constraining
+constraint
+constraints
+construcion
+construct
+constructComponentName
+constructPow52
+constructed
+constructing
+construction
+constructionCache
+constructor
+constructorArgs
+constructorPropertyNames
+constructors
+constructs
+consult
+consulted
+consume
+consumeNextKeyTyped
+consumed
+consumer
+consumes
+consuming
+cont
+contacted
+contain
+contained
+container
+containerL
+containerListener
+containerListenerK
+containerSerializedDataVersion
+containers
+containg
+containing
+containment
+contains
+containsAlias
+containsAll
+containsAllPDs
+containsKey
+containsMapping
+containsOpp
+containsValue
+contemporary
+content
+contentClassPrefix
+contentEquals
+contentHandlerClassName
+contentHandlerPkgPrefixes
+contentPane
+contentPathProp
+contentType
+contention
+contents
+contentsLost
+contentsRestored
+context
+contextClassLoader
+contexts
+contient
+contiguous
+continent
+continental
+continuation
+continue
+continueLine
+continues
+continuing
+continuous
+continuously
+contract
+contractChars
+contractFlags
+contractOrder
+contractTable
+contracting
+contractions
+contracts
+contractual
+contraints
+contrast
+contributes
+contributing
+control
+controlDkShadow
+controlDown
+controlHighlight
+controlLtHighlight
+controlShadow
+controlText
+controllable
+controlled
+controller
+controlling
+controls
+contructor
+contructors
+convenience
+convenient
+conveniently
+convention
+conventional
+conventionally
+conventions
+convered
+conversely
+conversion
+conversions
+converstion
+convert
+convertAny
+convertFromIPv4MappedAddress
+convertInto
+convertOldISOCodes
+convertToOld
+converted
+convertedStep
+converter
+converting
+converts
+convey
+cooperates
+cooperative
+coordinate
+coordinated
+coordinates
+coords
+copes
+copied
+copies
+copy
+copyAndFixQuotes
+copyArea
+copyAttrs
+copyInto
+copyMembers
+copyMemory
+copyOfBase
+copyPrivateDataInto
+copyValue
+copyValueOf
+copying
+copyright
+copyrighted
+copyw
+corba
+core
+corner
+cornered
+corners
+corporation
+correct
+correctEntry
+correction
+correctionLoop
+corrections
+correctly
+correctness
+corrects
+correlated
+correlation
+correponding
+corresonding
+correspond
+correspondence
+corresponding
+correspondingly
+corresponds
+corrupt
+corrupting
+corruption
+cos
+cosine
+cost
+costly
+costs
+could
+couldNotInstantiate
+couldn
+count
+countAWTEventListeners
+countBits
+countComponents
+countHierarchyMembers
+countItems
+countItemsImpl
+countMenus
+countObservers
+countProviders
+countStackFrames
+countTokens
+countdown
+counted
+counter
+counterpart
+counterparts
+counting
+countries
+country
+country1
+country2
+countryLength
+countryName
+country_variant
+counts
+couple
+course
+cousin
+cover
+covered
+covering
+covers
+cp
+cpath
+cpos
+cr
+crap
+cras
+crash
+crashed
+crashes
+create
+createAccessControlContext
+createAttributedCharacterIterator
+createBackBuffers
+createBreakInstance
+createBufferStrategy
+createBuffers
+createButton
+createCalendar
+createCanvas
+createCheckbox
+createCheckboxMenuItem
+createChildHierarchyEvents
+createChoice
+createClassLoader
+createClassLoaderPermission
+createCompatibleImage
+createCompatibleVolatileImage
+createCompatibleWritableRaster
+createComponent
+createContentHandler
+createContext
+createCustomCursor
+createDatagramSocketImpl
+createDialog
+createDirectory
+createDragGestureRecognizer
+createDragSourceContextPeer
+createFileDialog
+createFileExclusively
+createFont
+createFrame
+createGlyphVector
+createGraphics
+createHierarchyEvents
+createImage
+createImpl
+createIntersection
+createInverse
+createLabel
+createLineBidi
+createList
+createMenu
+createMenuBar
+createMenuItem
+createName
+createNameService
+createNewAppContext
+createNewFile
+createPackedRaster
+createPanel
+createPopupMenu
+createRegistry
+createRobot
+createRobotPermission
+createRunAttributeDataVectors
+createScreenCapture
+createScrollPane
+createScrollbar
+createSecurityManager
+createSocketImpl
+createStatement
+createStrokedShape
+createTempFile
+createTextArea
+createTextField
+createURLStreamHandler
+createUnion
+createVolatileImage
+createWindow
+created
+creates
+creating
+creation
+creator
+credit
+crispness
+critSet
+criteria
+criterion
+critical
+cross
+crosshair
+crucial
+crudely
+crummy
+crunch
+cruzeiro
+cryptically
+crypto
+crypto_service
+cryptographic
+cryptographically
+cryptography
+cs
+csName
+csces
+csize
+csn
+csname
+cspace
+cst
+ct
+ctb
+ctrl
+ctryCode
+ctxt
+ctype
+cultural
+culture
+cumbersome
+cumulative
+cur
+curCol
+curDesc
+curGet
+curHeight
+curObj
+curPut
+curRow
+curWidth
+curX
+curY
+curly
+curr
+currIndex
+currencies
+currency
+currencyCode
+currencySymbol
+current
+currentActiveWindow
+currentBlockRemaining
+currentBreakPositions
+currentCard
+currentChar
+currentClass
+currentClassLoader
+currentClassLoader0
+currentDomains
+currentFocusCycleRoot
+currentFocusOwner
+currentFocusOwnerEvent
+currentFocusedWindow
+currentIndex
+currentKey
+currentLightweightRequests
+currentLoadedClass
+currentLoadedClass0
+currentLoader
+currentLocale
+currentNativeFocusOwner
+currentPosition
+currentRunAttributeValues
+currentRunAttributes
+currentRunIndex
+currentRunLimit
+currentRunStart
+currentRuntime
+currentSegment
+currentSerialVersion
+currentState
+currentThread
+currentTime
+currentTimeMillis
+currentTime_1
+currentTime_2
+currentType
+currently
+currpos
+cursor
+cursorProperties
+cursorType
+cursors
+curtok
+curve
+curveTo
+curved
+curves
+curx
+cury
+custom
+customization
+customizations
+customize
+customized
+customizer
+customizerClass
+customizing
+customs
+cut
+cutoff
+cutover
+cutoverDay
+cw
+cws
+cwsl
+cwspos
+cwss
+cyan
+cycle
+cycleFillRaster
+cycleStart
+cycles
+cyclic
+cycym
+cyle
+d
+d1
+d2
+dBits
+dLong
+dValue
+da
+da_DK
+da_DKCollator
+da_DKRules
+dadan
+daemon
+damage
+damaged
+damn
+danger
+dangerous
+dangling
+dark
+darkGray
+darkened
+darker
+dash
+dash_phase
+dasher
+dashes
+dashing
+data
+dataDefinitionCausesTransactionCommit
+dataDefinitionIgnoredInTransactions
+dataLayout
+dataSize
+database
+databases
+datagram
+datagramSocketClose
+datagramSocketCreate
+datagrams
+datanase
+datastream
+datastructure
+datatabase
+datatransfer
+datatypes
+date
+dateModifierList
+dateString
+dateStyle
+dateTimeArgs
+dateTimePatterns
+date_s
+dated
+dates
+datum
+day
+dayOfMonth
+dayOfPeriod
+dayOfWeek
+dayOfYear
+day_of_month
+daylight
+days
+db
+dbg
+dc
+dc1
+dc2
+dc3
+dc4
+dcm
+dcount
+dd
+de
+deProxyAWTEventListener
+de_DE
+de__POSIX
+deactive
+dead
+deadlock
+deadlocks
+deal
+dealing
+deallocating
+deallocation
+deals
+dealt
+deamon
+death
+debug
+debugInit
+debugged
+debugging
+dec
+decExp
+decExponent
+decPt
+decSeen
+decapitalize
+decapitalized
+decapitalizing
+december
+decent
+decexp
+decide
+decided
+decides
+decimal
+decimalAt
+decimalPos
+decimalSeparator
+decimalSeparatorAlwaysShown
+decimals
+decipher
+decision
+decisionPointList
+decisionPointStack
+decisions
+declaration
+declarations
+declare
+declared
+declaredConstructors
+declaredFields
+declaredMethodCache
+declaredMethods
+declares
+declaring
+declaringClass
+decmp
+decmpLimit
+decmpMode
+decode
+decodeEndRule
+decodeRules
+decodeStartRule
+decodeStep
+decoded
+decoder
+decoders
+decodes
+decoding
+decomp
+decompose
+decomposed
+decomposing
+decomposition
+decompositionMode
+decompositions
+decorated
+decoration
+decorations
+decoupling
+decrease
+decreased
+decreases
+decreasing
+decrement
+decrementSize
+decremented
+decrementing
+decription
+dedeu
+dedicated
+deemed
+deems
+deep
+deepCopy
+deeper
+deepest
+deeply
+def
+defCl
+default
+defaultAllowUserInteraction
+defaultAssertionStatus
+defaultBufferCaps
+defaultBufferSize
+defaultByteBufferSize
+defaultCenturyStart
+defaultCenturyStartYear
+defaultCharBufferSize
+defaultConstraints
+defaultCountry
+defaultDataEnd
+defaultDomain
+defaultEvent
+defaultEventIndex
+defaultEventName
+defaultExceptionListener
+defaultExpectedLineLength
+defaultFocusTraversalKeyPropertyNames
+defaultFocusTraversalKeyStrings
+defaultFocusTraversalKeys
+defaultFocusTraversalPolicy
+defaultFractionDigits
+defaultImageCaps
+defaultLineMetrics
+defaultLocale
+defaultManager
+defaultPersistenceDelegate
+defaultPolicy
+defaultProperty
+defaultPropertyIndex
+defaultPropertyName
+defaultReadFields
+defaultReadObject
+defaultRenderer
+defaultSelection
+defaultSerializeEx
+defaultSubst
+defaultSubstName
+defaultUseCaches
+defaultVal
+defaultValue
+defaultWheelScroll
+defaultWriteFields
+defaultWriteObject
+defaultZone
+defaultallowuserinteraction
+defaulted
+defaulting
+defaults
+defaultusecaches
+defeats
+defensively
+defer
+deferrability
+deferred
+defers
+define
+defineClass
+defineClass0
+defineClassInPackage
+definePackage
+defineSchemeSpecificPart
+defineString
+defineSystemPackage
+defineable
+defined
+defines
+definesEquals
+defining
+definitely
+definition
+definitions
+definitive
+deflt
+defocused
+deftransform
+degenerate
+degrade
+degrades
+degree
+degrees
+deisgn
+del
+delItem
+delItems
+delMenu
+delagatee
+delay
+delayed
+delays
+delegatation
+delegate
+delegated
+delegates
+delegating
+delegation
+delete
+deleteCharAt
+deleteEntry
+deleteObserver
+deleteObservers
+deleteOnExit
+deleteRow
+deleteShortcut
+deleted
+deletes
+deletesAreDetected
+deletion
+deletions
+delicate
+delim
+delimit
+delimited
+delimiter
+delimiters
+delimiting
+delimsChanged
+delineate
+deliver
+deliverEvent
+deliverMouseWheelToAncestor
+delivered
+delivers
+delivery
+delta
+deltaTransform
+deltaX
+deltaY
+demand
+demo
+demonstrates
+demos
+demoting
+demoweb
+den
+denial
+denied
+denies
+denom
+denominator
+denorm
+denormalized
+denotation
+denote
+denoted
+denotes
+denoting
+deny
+depend
+dependant
+dependencies
+dependency
+dependent
+dependents
+depending
+depends
+depicts
+deployed
+deployment
+deposited
+deprecate
+deprecated
+deprectated
+deprives
+deps
+depth
+depths
+deque
+dequeueKeyEvents
+dequeueResult
+deref
+deregister
+deregisterDriver
+deregistered
+deregistering
+deregistration
+derivation
+derive
+deriveFont
+derived
+derives
+desc
+descHandle
+descendant
+descendants
+descendantsCount
+descenders
+descending
+descends
+descent
+describe
+described
+describes
+describing
+description
+descriptions
+descriptive
+descriptor
+descriptors
+deselect
+deselected
+deselects
+deserializaiton
+deserialization
+deserialize
+deserializeEx
+deserialized
+deserializes
+deserializing
+desicion
+design
+designTime
+designate
+designated
+designates
+designating
+designator
+designed
+designfaq
+desirable
+desire
+desired
+desiredAssertionStatus
+desiredAssertionStatus0
+desiredHeight
+desiredLanguage
+desiredLocale
+desiredPixelWidth
+desiredSpaceCount
+desiredWidth
+desires
+desirible
+desktop
+desktopProperties
+desktopPropsSupport
+despite
+dest
+destination
+destinations
+destined
+destroy
+destroyBuffers
+destroyProcess
+destroyed
+destroying
+destructiveMulAdd
+destructively
+detachDispatchThread
+detaches
+detail
+detailMessage
+detailed
+details
+detect
+detected
+detection
+detector
+detects
+determination
+determinations
+determine
+determined
+determines
+determining
+deterministic
+devBounds
+develop
+developLongDigits
+developer
+developers
+development
+deviate
+deviation
+deviations
+device
+deviceBounds
+devices
+devpress
+df
+dfd
+dg
+dge
+dgl
+dgt
+dh
+dhLong
+di
+dia
+diacrit
+diacritic
+diacritical
+diacriticals
+diacritics
+diaeresis
+diagnostic
+diagonal
+diagram
+dialog
+dialogs
+diameter
+diaresis
+dictionary
+dictionaryCharCount
+dictionaryChars
+dictionaryExpression
+dictionaryFilename
+dictionaryName
+dictionaryStream
+did
+didn
+die
+died
+dies
+diff
+differ
+difference
+differences
+differencing
+different
+differentiate
+differently
+differing
+differs
+diffh
+difficult
+diffw
+diffx
+diffy
+dig
+digest
+digestLen
+digestSpi
+digestSpiClone
+digesta
+digestb
+digests
+digit
+digitCount
+digitGroup
+digitIndex
+digitLeftCount
+digitList
+digitLoop
+digitPerLong
+digitRightCount
+digitTotalCount
+digital
+digitalSignature
+digitally
+digitno
+digits
+digitsPerInt
+digitsPerLong
+dim
+dimension
+dimensional
+dimensions
+din
+dinstint
+diode
+dir
+direct
+directed
+direction
+directional
+directionality
+directions
+directive
+directives
+directly
+directories
+directory
+dirs
+dirty
+disable
+disableEvents
+disableassertions
+disabled
+disabledIcon
+disables
+disabling
+disadvantage
+disallow
+disallowed
+disambiguate
+disambiguation
+disappear
+disappeared
+disc
+discard
+discardKeyEvents
+discarded
+discarding
+discards
+discerned
+disclose
+discloses
+disconnect
+disconnect0
+disconnected
+disconnecting
+discontinuities
+discontinuity
+discouraged
+discover
+discovered
+discovers
+discrepancies
+discrete
+discretion
+discriminating
+discritics
+discuss
+discussing
+discussion
+disguise
+disguises
+disjoined
+disjoint
+disk
+dislay
+disparate
+dispatch
+dispatchEvent
+dispatchEventImpl
+dispatchEventToSelf
+dispatchKeyEvent
+dispatchMouseWheelToAncestor
+dispatchThread
+dispatched
+dispatcher
+dispatchers
+dispatches
+dispatching
+dispatchingEventTime
+disperses
+displaced
+display
+displayLocale
+displayName
+displayNames
+displayable
+displayed
+displaying
+displays
+disposal
+dispose
+disposeImpl
+disposed
+disposes
+disposing
+disque
+disregard
+disrupt
+distance
+distances
+distict
+distinct
+distinction
+distinctly
+distinguish
+distinguishable
+distinguishing
+distribute
+distributed
+distributes
+distribution
+disturbance
+dither
+dithered
+dithering
+div
+divLong
+divWord
+divadd
+divergent
+diverse
+divested
+divide
+divideAndRemainder
+divideOneWord
+divideUpDictionaryRange
+divided
+dividend
+dividendEstimate
+divides
+dividing
+dividingSpace
+divisible
+division
+divisor
+divisors
+divulge
+dk
+dkuug
+dl
+dle
+dlen
+dlist
+dlong
+dm
+dn
+dnd
+dnumber
+do
+doAccessibleAction
+doAutoTransfer
+doCallbacks
+doComplement
+doConnect
+doDispatch
+doGetImpl
+doInput
+doIntersection
+doLayout
+doLoad
+doMenuEvent
+doOutput
+doParseString
+doPrivileged
+doProperty
+doUnion
+doVerify
+doc
+doc4
+docBase
+docRoot
+docbase
+docs
+document
+documentation
+documented
+documents
+does
+doesMaxRowSizeIncludeBlobs
+doesn
+doing
+doinput
+dollar
+dollars
+dom
+domStamp
+domain
+domainlabel
+domains
+dominated
+don
+done
+dong
+dont
+dontNeedEncoding
+dontUseGui
+doomed
+door
+dooutput
+dormant
+dot
+dotIndex
+dotless
+dots
+dotted
+double
+doubleArraySize
+doubleResult
+doubleToBigInt
+doubleToLongBits
+doubleToRawLongBits
+doubleValue
+doubled
+doubles
+doublesToBytes
+doubly
+dout
+dow
+dowStamp
+dowimStamp
+down
+downCycleDefaultFocusTraversalKeys
+downCycleFocusTraversalKeys
+downFocusCycle
+download
+downloaded
+downloading
+downstream
+downward
+downwards
+doyStamp
+dp1
+dpi
+dpl
+dr
+drPepper
+draft
+drag
+dragged
+drags
+drain
+dramatic
+drastic
+draw
+draw3DRect
+drawArc
+drawBuffer
+drawBytes
+drawChars
+drawGlyphVector
+drawImage
+drawLine
+drawOval
+drawPolygon
+drawPolyline
+drawRect
+drawRenderableImage
+drawRenderedImage
+drawRoundRect
+drawString
+drawVBuffer
+drawable
+drawing
+drawn
+draws
+drift
+drive
+driven
+driver
+driverClass
+driverClassName
+drivers
+drives
+droits
+drop
+dropRaster
+dropTarget
+dropped
+drops
+ds
+dst
+dstArray
+dstBegin
+dstColorModel
+dstIn
+dstOffset
+dstOut
+dstSavings
+dst_position
+dstbegin
+dstoffset
+dstpixel
+dstpos
+dsts
+dsyOfWeek
+dt
+dtoa
+dtok
+dttl
+dude
+due
+duke
+dummy
+dump
+dumpConstraints
+dumpLayoutInfo
+dumpStack
+dumped
+dumps
+dup
+duplex
+duplicate
+duplicated
+duplicates
+duplicating
+duration
+during
+duty
+dval
+dver
+dx
+dx1
+dx2
+dy
+dy1
+dy2
+dynamic
+dynamicLayoutSupported
+dynamically
+dzdzo
+e
+e1
+e123
+e2
+e3
+eFieldStart
+eIndex
+eMask
+ePos
+eTbl
+ea
+each
+eagerly
+earlier
+earliest
+early
+earth
+easier
+easily
+easing
+east
+easts
+easy
+eat
+eating
+eats
+ebits
+echo
+echoChar
+echoCharIsSet
+echoed
+echoes
+echoing
+economical
+ed
+edge
+edges
+edh
+edit
+editable
+edited
+editing
+editor
+editorClass
+editorName
+editors
+edits
+edt
+edu
+education
+ee
+eetop
+ef
+effect
+effecting
+effective
+effectiveDecimalPos
+effectively
+effects
+efficiency
+efficient
+efficiently
+effort
+efforts
+eg
+eh
+ei
+eight
+eighth
+eine
+either
+ejection
+el
+elapsed
+elect
+elell
+elem
+element
+elementAt
+elementCount
+elementData
+elementary
+elements
+elen
+eleven
+eleventh
+eliminate
+eliminateBackfillStates
+eliminated
+eliminates
+eliminating
+elimination
+ellipse
+elliptical
+else
+elsewhere
+em
+email
+embLimit
+embStart
+embed
+embedded
+embedding
+embeddingLevel
+embeddingStart
+embeddings
+embodied
+embodies
+embraced
+emit
+emitPattern
+emits
+emitted
+emitting
+empirically
+employed
+employs
+emptiness
+empty
+emptyArray
+emptyEnumerator
+emptyIterator
+en
+en_US
+en_USCollator
+en_USRules
+en_US_WIN
+enable
+enableEvents
+enableExpertCommands
+enableInputMethods
+enableInputMethodsForTextComponent
+enableInputMethodsIfNecessary
+enableOverride
+enableReplace
+enableReplaceObject
+enableResolve
+enableResolveObject
+enableSubclassImplementation
+enableSubstitution
+enableTest
+enableassertions
+enabled
+enabledOnToolkit
+enables
+enabling
+enc
+encapsualtes
+encapsulate
+encapsulated
+encapsulates
+encapsulating
+enclose
+enclosed
+encloses
+enclosing
+encode
+encodeStep
+encoded
+encoder
+encoders
+encodes
+encoding
+encodingName
+encodings
+encompasses
+encounter
+encountered
+encounteredField
+encounters
+encourage
+encouraged
+encrypted
+encryption
+end
+endBitIndex
+endChar
+endCompare
+endComposition
+endDay
+endDayOfMonth
+endDayOfWeek
+endElement
+endIndex
+endLayout
+endMode
+endMonth
+endOfInput
+endPath
+endPos
+endPosition
+endRunIndex
+endState
+endStates
+endTime
+endTimeMode
+endUnitIndex
+endValidate
+endValue
+ended
+endian
+ending
+endoff
+endpoint
+endpoints
+ends
+endsWith
+eneng
+enforce
+enforced
+enforces
+enforcing
+eng
+engine
+engineAliases
+engineCache
+engineContainsAlias
+engineDeleteEntry
+engineDigest
+engineGenerateParameters
+engineGeneratePrivate
+engineGeneratePublic
+engineGenerateSeed
+engineGetCertificate
+engineGetCertificateAlias
+engineGetCertificateChain
+engineGetCreationDate
+engineGetDigestLength
+engineGetEncoded
+engineGetKey
+engineGetKeySpec
+engineGetParameter
+engineGetParameterSpec
+engineGetParameters
+engineInit
+engineInitSign
+engineInitVerify
+engineIsCertificateEntry
+engineIsKeyEntry
+engineLoad
+engineNextBytes
+engineReset
+engineSetCertificateEntry
+engineSetKeyEntry
+engineSetParameter
+engineSetSeed
+engineSign
+engineSize
+engineStore
+engineToString
+engineTranslateKey
+engineType
+engineUpdate
+engineVerify
+engineering
+engines
+enhancements
+enhancing
+enjoy
+enjoys
+enlarged
+enough
+enq
+enqueue
+enqueueKeyEvents
+enqueued
+enqueuedKeyEvents
+ensue
+ensure
+ensureCapacity
+ensureCapacityHelper
+ensureMemberAccess
+ensureOpen
+ensureRunBreak
+ensured
+ensures
+ensuring
+ent
+entail
+enter
+entered
+entering
+enters
+enth
+entire
+entirely
+entities
+entitled
+entity
+entries
+entry
+entryName
+entrySet
+entrySetCallCount
+entryTable
+enum
+enumerate
+enumerated
+enumerates
+enumerating
+enumeration
+enumerationValues
+enumerations
+enumerator
+env
+envelope
+environment
+environments
+envp
+eoepo
+eof
+eol
+eolIsSignificant
+eolIsSignificantP
+eot
+ephemeral
+epoch
+epochs
+epoint
+eq
+eqi
+equaivalent
+equal
+equalIgnoringCase
+equalPos
+equality
+equally
+equals
+equalsIgnoreCase
+equate
+equates
+equations
+equidistant
+equipped
+equiv
+equivalence
+equivalent
+equivalentTo
+equivalently
+equivalents
+er
+era
+eras
+erase
+err
+erratic
+errmsg
+erroneous
+erroneously
+error
+errorIndex
+errorOffset
+errors
+es
+esc
+escape
+escapeSpace
+escaped
+escapes
+escaping
+esd
+esds
+especially
+ess
+essential
+essentially
+esspa
+est
+estProduct
+establish
+established
+establishing
+estate
+estimate
+estimated
+et
+etb
+etc
+etchType
+etched
+etest
+eth
+etx
+euclidModInverse
+eueus
+euro
+ev
+eval
+evaluate
+evaluated
+evaluating
+evaluation
+even
+evenMod
+evenPart
+event
+eventBit
+eventDispatched
+eventEnabled
+eventException
+eventListener
+eventListenerType
+eventMask
+eventName
+eventPropertyName
+eventSetDescriptors
+eventSetName
+eventTypeEnabled
+eventlistener
+events
+eventsToDisable
+eventsToEnable
+eventually
+eventx
+eventy
+ever
+every
+everybody
+everyone
+everything
+everywhere
+evidence
+evident
+evolve
+evolved
+evt
+ex
+ex1
+ex2
+exact
+exactly
+exam
+examinations
+examine
+examined
+examines
+examining
+example
+examples
+exc
+excecute
+exceed
+exceeded
+exceeds
+except
+exception
+exceptionChars
+exceptionListener
+exceptionThrown
+exceptional
+exceptions
+excess
+excessBits
+excessChars
+excessive
+excessively
+excessivly
+exchange
+exchanged
+exchanges
+exclamation
+exclude
+excluded
+excludes
+excluding
+exclusive
+exclusively
+exec
+execInternal
+exeception
+execption
+executable
+execute
+executeBatch
+executeQuery
+executeStatements
+executeUpdate
+executed
+executes
+executing
+execution
+executionTime
+executions
+executive
+exemptions
+exercise
+exercised
+exhaust
+exhausted
+exhibit
+exist
+existed
+existence
+existing
+existingEntry
+existingEvent
+existingPaintEvent
+existingRect
+exists
+exit
+exitPoints
+exitStatus
+exitVM
+exitValue
+exitcode
+exited
+exiting
+exits
+exp
+expAffix
+expAt
+expBias
+expChars
+expIndex
+expLimit
+expLoop
+expMask
+expOffset
+expOne
+expOverflow
+expShift
+expSign
+expStack
+expVal
+expand
+expandAffix
+expandAffixes
+expandCapacity
+expandChars
+expandTable
+expanded
+expanding
+expandsion
+expansion
+expansions
+expect
+expectation
+expected
+expectedClose
+expectedMaxSize
+expectedModCount
+expecting
+expects
+expedite
+expeditiousness
+expend
+expense
+expensive
+exper
+experiment
+experimental
+experimentally
+expert
+experts
+expiration
+expire
+expired
+expires
+expiry
+explained
+explaing
+explaining
+explanation
+explanatory
+explicit
+explicitBeanInfo
+explicitEvents
+explicitMethods
+explicitProperties
+explicitly
+exponenet
+exponent
+exponentChar
+exponentDigits
+exponential
+exponentiate
+exponentiation
+exponents
+exported
+exports
+expose
+exposed
+exposes
+exposing
+expresison
+express
+expressed
+expressible
+expressing
+expression
+expressionCache
+expressions
+expressive
+exs
+ext
+extList
+extend
+extended
+extendidng
+extending
+extends
+extensible
+extension
+extensions
+extensively
+extent
+extentSize
+extents
+exterior
+external
+external_address
+externalizable
+externally
+extra
+extraAlpha
+extraByte
+extraInt
+extraPropFile
+extract
+extracted
+extracting
+extracts
+extraneous
+extraordinary
+extrapolating
+extreme
+extremely
+f
+f1
+f2
+f2ary
+fBits
+fDigits
+fExponent
+fFieldStart
+fRequestedAttributes
+fValue
+fa
+fabricate
+fac
+face
+faces
+facilitate
+facilitates
+facilities
+facility
+fact
+factor
+factored
+factories
+factors
+factory
+fafas
+fail
+failExpecting
+failed
+failing
+fails
+failure
+fair
+fairly
+fake
+faking
+fall
+fallback
+fallbackLanguage
+fallbackNames
+falls
+falpha
+false
+familiar
+families
+family
+fancy
+far
+farther
+farthest
+farthestEndPoint
+fashion
+fast
+fastTime
+faster
+fastest
+fatal
+faults
+faulty
+favor
+favorite
+fc
+fclz
+fd
+fdErr
+fdIn
+fdLock
+fdObj
+fdOut
+fdUseCount
+fdlibm
+fdm
+fdy
+fe
+fear
+feasible
+feature
+features
+feb28
+feb29
+feb31
+february
+feed
+feeding
+feeds
+feel
+feels
+fequency
+fetch
+fetched
+fetching
+few
+fewer
+ff
+ffApply
+ffff
+fffffffff
+fi
+fichier
+fichiers
+field
+fieldID
+fieldInfo
+fieldName
+fieldNames
+fieldOffset
+fieldPosition
+fieldRefl
+fieldSigs
+fieldStart
+fieldType
+fieldValue
+fields
+fifin
+fifth
+fifty
+figits
+figure
+figures
+file
+fileName
+fileNameMap
+fileNameMapLoaded
+fileToEncodedURL
+filedlg
+fileform
+filelimits
+filename
+filenames
+filepart
+files
+filesystem
+fill
+fill3DRect
+fillArc
+fillBytes
+fillInStackTrace
+fillInTables
+fillOval
+fillPolygon
+fillRect
+fillRoundRect
+filled
+filler
+filling
+fills
+filter
+filterComponents
+filterKey
+filterValue
+filtered
+filtering
+filters
+final
+finalChar
+finalizable
+finalization
+finalizations
+finalize
+finalizeImpl
+finalized
+finalizer
+finalizers
+finally
+find
+findBootstrapClass
+findBootstrapClass0
+findBundle
+findBundleInCache
+findClass
+findColumn
+findComponentAt
+findEditor
+findExplicitBeanInfo
+findInCharMap
+findIndexedPropertyType
+findKeyword
+findLastEntry
+findLastWithNoExtension
+findLibrary
+findLoadedClass
+findMethod
+findNative
+findPropertyType
+findPublicMethod
+findResource
+findResources
+findStringMatch
+findSystemClass
+findTraversalRoot
+finding
+finds
+fine
+finer
+fingerprint
+finish
+finishBuildingStateTable
+finishConnect
+finished
+finishing
+finite
+fins
+fire
+firePropertyChange
+fireVetoableChange
+fired
+fires
+firewall
+firing
+first
+firstChar
+firstColon
+firstDash
+firstDayOfWeek
+firstDot
+firstElement
+firstEntry
+firstExcluded
+firstExpansion
+firstGroupLen
+firstItem
+firstKey
+firstLength
+firstLine
+firstLower
+firstNonzeroByteNum
+firstNonzeroIntNum
+firstSearch
+firstSun
+firstTime
+firstUpper
+firstValue
+firstVisibleComponent
+fis
+fish
+fist
+fit
+fitness
+fits
+fitsIntoLong
+five
+fix
+fixAfterDeletion
+fixAfterInsertion
+fixCanonical
+fixDown
+fixEntry
+fixUp
+fixed
+fixedPoint
+fixup
+fjfij
+fl
+flag
+flagged
+flags
+flanked
+flat
+flatness
+flatten
+flattened
+flattening
+flattens
+flavor
+flavorMapFileURL
+flavormap
+flavors
+flexibility
+flexible
+flexiblity
+flip
+flipAction
+flipBit
+flipContents
+flipped
+flipping
+flips
+flm
+float
+floatToIntBits
+floatToRawIntBits
+floatValue
+floating
+floats
+floatsToBytes
+flocalized
+floor
+floorDivide
+flow
+flush
+flushAny
+flushBuffer
+flushCaches
+flushConvBuffer
+flushFromCaches
+flushInto
+flushPendingEvents
+flushed
+flushes
+flushing
+fly
+fmt
+fn
+fname
+focus
+focusCycleRoot
+focusGained
+focusGainedEvent
+focusL
+focusListener
+focusListenerK
+focusLost
+focusManagerIsDispatching
+focusMgr
+focusNextComponent
+focusOwner
+focusPreviousComponent
+focusRoot
+focusTraversalKeyPropertyNames
+focusTraversalKeys
+focusTraversalKeysEnabled
+focusTraversalPolicy
+focusability
+focusable
+focusableWindowState
+focused
+focusedComponent
+focusedWindow
+focusedWindowChangeAllowed
+focusedWindowChanged
+fofao
+folio
+follow
+followRedirects
+followed
+following
+follows
+font
+fontFile
+fontFormat
+fontName
+fontSerializedDataVersion
+fontSize
+fontSizeStr
+fontStream
+fontStyle
+fontType
+fontmanager
+fontname
+fonts
+foo
+fooBah
+fooBeanInfo
+fooEditor
+fooPattern
+foobah
+fool
+footprint
+for
+forCache
+forClass
+forDigit
+forName
+forName0
+forParsing
+force
+force0
+forceLower
+forced
+forceful
+forcefully
+forces
+forcibly
+forcing
+foregoing
+foreground
+foreign
+foreignCatalog
+foreignSchema
+foreignTable
+forever
+forgets
+forgetting
+forgotten
+forkAndExec
+forked
+form
+formal
+formally
+format
+formatData
+formatElementIndex
+formatError
+formatList
+formatNumber
+formatToCharacterIterator
+formats
+formatted
+formatter
+formatters
+formatting
+formed
+former
+formerly
+forms
+formula
+formulae
+forom
+forth
+forward
+forwardDefaultFocusTraversalKeys
+forwardFocusTraversalKeys
+forwardStateTable
+forwardTextAreaFocusTraversalKey
+forwardTraversalKeys
+forwarded
+forwarding
+forwards
+fos
+found
+foundInMainBranch
+four
+fourth
+fp
+fps
+fpx
+fr
+fr_FR
+fr__MAC
+fractAsInt
+fractBits
+fractHOB
+fractMask
+fraction
+fractionPresent
+fractional
+fractions
+fragment
+fragments
+frame
+frame1
+frameList
+frameSerializedDataVersion
+frames
+framesInCommon
+framework
+franc
+fraught
+frc
+fred
+fredx
+fredxFIXME
+free
+freeMemory
+freed
+freeing
+french
+frenchSec
+frequency
+frequent
+frequently
+fresh
+freshly
+frfra
+frgbvalue
+friday
+friend
+friends
+fries
+from
+fromCIEXYZ
+fromClass
+fromElement
+fromIndex
+fromKey
+fromPage
+fromStart
+fromState
+fromType
+front
+frontCaps
+frozen
+frrom
+fruits
+fs
+ftp
+ftype
+fu
+fuction
+fudge
+fulfilling
+full
+fullClassName
+fullCopy
+fullName
+fullScreenExclusive
+fullScreenWindow
+fullSize
+fulltype
+fully
+fullyQualifiedClassName
+fum
+fun
+function
+functional
+functionality
+functionally
+functions
+fundamental
+fundamentally
+further
+furthest
+future
+fuzzy
+fvalue
+fwd
+fx
+fy
+fyfry
+g
+g1
+g2
+g2d
+gStart
+gagai
+gain
+gained
+gaining
+gains
+gap
+gap2
+gaps
+garbage
+gathered
+gathering
+gc
+gcBounds
+gcd
+gct
+gd
+gdgdh
+ge
+geByAddr
+gen
+genKeyPair
+genParamSpec
+general
+generality
+generally
+generate
+generateCertificate
+generateFile
+generateKeyPair
+generateParameters
+generatePrivate
+generatePublic
+generateSeed
+generated
+generates
+generating
+generation
+generator
+generators
+generic
+generically
+genuine
+geographical
+geom
+geometric
+geometry
+gesture
+gestures
+get
+get2DigitYearStart
+getAWTEventListeners
+getAWTKeyStroke
+getAWTKeyStrokeForEvent
+getAbsoluteFile
+getAbsolutePath
+getAccessibleAction
+getAccessibleActionCount
+getAccessibleActionDescription
+getAccessibleAt
+getAccessibleChild
+getAccessibleChildrenCount
+getAccessibleComponent
+getAccessibleContext
+getAccessibleDescription
+getAccessibleIndexInParent
+getAccessibleName
+getAccessibleParent
+getAccessibleRole
+getAccessibleSelection
+getAccessibleSelectionCount
+getAccessibleStateSet
+getAccessibleText
+getAccessibleValue
+getAction
+getActionCommand
+getActionListeners
+getActions
+getActiveWindow
+getActualMaximum
+getActualMinimum
+getAddListenerMethod
+getAdditionalBeanInfo
+getAddress
+getAddressFromNameService
+getAdjustable
+getAdjustmentListeners
+getAdjustmentType
+getAdvance
+getAfterIndex
+getAlgorithm
+getAlgorithmProperty
+getAlgorithms
+getAlignment
+getAlignmentX
+getAlignmentY
+getAll
+getAllAttributeKeys
+getAllByName
+getAllByName0
+getAllFonts
+getAllQualifyingCandidates
+getAllowUserInteraction
+getAlpha
+getAlphaMask
+getAmPmStrings
+getAnchorRect
+getAppContext
+getApplet
+getAppletContext
+getAppletInfo
+getApplets
+getArguments
+getArray
+getAsText
+getAscent
+getAsciiStream
+getAtIndex
+getAttribute
+getAttributeCheckRange
+getAttributes
+getAudioClip
+getAuthority
+getAutoCommit
+getAutoDelay
+getAvailableAttributes
+getAvailableFontFamilyNames
+getAvailableIDs
+getAvailableLocales
+getB
+getBackBuffer
+getBackBufferCapabilities
+getBackground
+getBaseLevel
+getBaseType
+getBaseTypeName
+getBaselineFor
+getBaselineIndex
+getBaselineOffsets
+getBeanClass
+getBeanDescriptor
+getBeanInfo
+getBeanInfoSearchPath
+getBeforeIndex
+getBeginIndex
+getBestConfiguration
+getBestCursorSize
+getBestRowIdentifier
+getBigDecimal
+getBinaryStream
+getBitDepth
+getBits
+getBlob
+getBlockDataMode
+getBlockIncrement
+getBlue
+getBlueMask
+getBoolean
+getBooleanAttributes
+getBooleanAttributes0
+getBootstrapClassPath
+getBootstrapResource
+getBootstrapResources
+getBoundingBox
+getBounds
+getBounds2D
+getBreakInstance
+getBroadcast
+getBuffer
+getBufferCapabilities
+getBufferStrategy
+getBundle
+getBundleImpl
+getByAddr
+getByIndex
+getByName
+getByte
+getBytes
+getC
+getCPathConsumer
+getCachedAddress
+getCachedRaster
+getCachedStroke
+getCalendar
+getCalendarDate
+getCalendarField
+getCallerClass
+getCallerClassLoader
+getCalls
+getCanonName
+getCanonicalFile
+getCanonicalHostName
+getCanonicalPath
+getCapabilities
+getCaretPosition
+getCatalog
+getCatalogName
+getCatalogSeparator
+getCatalogTerm
+getCatalogs
+getCause
+getCeilEntry
+getCertificate
+getCertificateAlias
+getCertificateChain
+getCertificates
+getChannel
+getChar
+getCharB
+getCharCount
+getCharL
+getCharOrder
+getCharacterAttribute
+getCharacterBounds
+getCharacterEncoding
+getCharacterInstance
+getCharacterIterator
+getCharacterStream
+getChars
+getCharsetName
+getCheckBoxGroup
+getCheckboxGroup
+getChild
+getChildren
+getClass
+getClassContext
+getClassDataLayout
+getClassDataLayout0
+getClassLoader
+getClassLoader0
+getClassLoaderPerm
+getClassName
+getClassSignature
+getClasses
+getClickCount
+getClip
+getClipBounds
+getClipRect
+getClob
+getCodeBase
+getCodeSource
+getCodeSourceURL
+getCollationElementIterator
+getCollationKey
+getColor
+getColor1
+getColor2
+getColorComponents
+getColorModel
+getColorSpace
+getColumnClassName
+getColumnCount
+getColumnDisplaySize
+getColumnLabel
+getColumnName
+getColumnPrivileges
+getColumnType
+getColumnTypeName
+getColumns
+getComponent
+getComponentAfter
+getComponentAt
+getComponentBefore
+getComponentCount
+getComponentListeners
+getComponentOrientation
+getComponentType
+getComponents
+getComponents_NoClientCode
+getComposite
+getConcurrency
+getConfigurations
+getConnection
+getConstraints
+getConstructor
+getConstructor0
+getConstructors
+getConstructors0
+getConstructors1
+getContainerListeners
+getContainingWindow
+getContent
+getContentEncoding
+getContentHandler
+getContentHandlerPkgPrefixes
+getContentLength
+getContentPane
+getContentType
+getContentTypeFor
+getContents
+getContext
+getContextClassLoader
+getContractOrder
+getContractValues
+getConverter
+getCopies
+getCount
+getCountry
+getCreationDate
+getCriticalExtensionOIDs
+getCrossReference
+getCrossings
+getCurrency
+getCurrencyCode
+getCurrencyInstance
+getCurrencySymbol
+getCurrent
+getCurrentAccessibleValue
+getCurrentFocusCycleRoot
+getCurrentKeyboardFocusManager
+getCursor
+getCursorName
+getCursorType
+getCustomEditor
+getCustomizerClass
+getD
+getDSTSavings
+getDashArray
+getDashPhase
+getData
+getDataElements
+getDataOffset
+getDataSize
+getDataStorage
+getDatabaseMajorVersion
+getDatabaseMinorVersion
+getDatabaseProductName
+getDatabaseProductVersion
+getDate
+getDateFormatSymbols
+getDateFormatZoneData
+getDateInstance
+getDateTimeInstance
+getDay
+getDayOfWeek
+getDebug
+getDecimalFormatSymbols
+getDecimalSeparator
+getDeclaredClasses
+getDeclaredClasses0
+getDeclaredConstructor
+getDeclaredConstructors
+getDeclaredField
+getDeclaredFields
+getDeclaredMethod
+getDeclaredMethods
+getDeclaredSUID
+getDeclaredSerialFields
+getDeclaringClass
+getDecomposition
+getDecompositions
+getDefault
+getDefaultAllowUserInteraction
+getDefaultComponent
+getDefaultConfiguration
+getDefaultCursor
+getDefaultDomain
+getDefaultEncodingName
+getDefaultEventIndex
+getDefaultFocusTraversalKeys
+getDefaultFocusTraversalPolicy
+getDefaultFractionDigits
+getDefaultParent
+getDefaultPort
+getDefaultPropertyIndex
+getDefaultRequestProperty
+getDefaultScreenDevice
+getDefaultSelection
+getDefaultSerialFields
+getDefaultToolkit
+getDefaultTransactionIsolation
+getDefaultTransform
+getDefaultType
+getDefaultUseCaches
+getDescent
+getDesktopProperty
+getDestination
+getDevice
+getDeviceConfiguration
+getDialog
+getDigestLength
+getDigit
+getDirectionality
+getDirectory
+getDispatchThread
+getDispatcher
+getDispatchingEventTime
+getDisplayCountry
+getDisplayLanguage
+getDisplayMode
+getDisplayModes
+getDisplayName
+getDisplayVariant
+getDisplayVariantArray
+getDisplayXXX
+getDoInput
+getDoOutput
+getDocumentBase
+getDomainCombiner
+getDouble
+getDoubleB
+getDoubleL
+getDrawGraphics
+getDriver
+getDriverMajorVersion
+getDriverMinorVersion
+getDriverName
+getDriverProperties
+getDriverVersion
+getDrivers
+getDropTarget
+getDropTargetEventTarget
+getEchoChar
+getEditorSearchPath
+getElementAt
+getEncoded
+getEncoding
+getEndCap
+getEndIndex
+getEngineClassName
+getEntry
+getEntryName
+getEnumeration
+getEpochDay
+getEras
+getErrorCode
+getErrorIndex
+getErrorOffset
+getErrorStream
+getErrorsAny
+getErrorsID
+getEventMask
+getEventPropertyName
+getEventQueue
+getEventSetDescriptors
+getException
+getExceptionListener
+getExceptionTypes
+getExpandValueList
+getExpiration
+getExponentialSymbol
+getExportedKeys
+getExtendedState
+getExtension
+getExternalizableConstructor
+getExtraNameCharacters
+getFD
+getFamily
+getFamilyName
+getFamily_NoClientCode
+getFetchDirection
+getFetchSize
+getField
+getField0
+getFieldAttribute
+getFieldDelegate
+getFieldInfo
+getFieldInfo0
+getFieldOffset
+getFieldValue
+getFields
+getFields0
+getFields1
+getFile
+getFileDescriptor
+getFileName
+getFileNameMap
+getFilePointer
+getFileSystem
+getFilenameFIlter
+getFilenameFilter
+getFilterComponents
+getFirst
+getFirstComponent
+getFirstDayOfWeek
+getFlags
+getFlipContents
+getFloat
+getFloatB
+getFloatL
+getFocusCycleRootAncestor
+getFocusListeners
+getFocusOwner
+getFocusTraversalKey
+getFocusTraversalKeys
+getFocusTraversalKeysEnabled
+getFocusTraversalKeys_NoIDCheck
+getFocusTraversalPolicy
+getFocusableWindowState
+getFocusedWindow
+getFollowRedirects
+getFont
+getFontList
+getFontMetrics
+getFontName
+getFontPeer
+getFontRenderContext
+getFont_NoClientCode
+getFoo
+getFooListeners
+getForeground
+getFormat
+getFormats
+getFormatsByArgumentIndex
+getFragment
+getFrames
+getFred
+getFromCache
+getFromClass
+getFromPage
+getFrontBufferCapabilities
+getFullName
+getFullScreenWindow
+getGeneratedKeys
+getGetClassLoaderPerm
+getGetListenerMethod
+getGlobalActiveWindow
+getGlobalCurrentFocusCycleRoot
+getGlobalFocusOwner
+getGlobalFocusedWindow
+getGlobalPermanentFocusOwner
+getGraphics
+getGraphicsConfiguration
+getGreatestMinimum
+getGreen
+getGreenMask
+getGregorianChange
+getGroupingSeparator
+getGroupingSize
+getGuarantor
+getHAdjustable
+getHSBColor
+getHScrollbarHeight
+getHeaderField
+getHeaderFieldDate
+getHeaderFieldInt
+getHeaderFieldKey
+getHeaderFields
+getHeadlessProperty
+getHeight
+getHelpMenu
+getHgap
+getHierarchyBoundsListeners
+getHierarchyListeners
+getHoldability
+getHost
+getHostAddress
+getHostByAddr
+getHostFromNameService
+getHostName
+getHours
+getID
+getIDstring
+getIP
+getISO3Country
+getISO3Language
+getISOCountries
+getISOLanguages
+getISOYear
+getIcon
+getIconAt
+getIconImage
+getIdentifierQuoteString
+getIdentity
+getIfModifiedSince
+getIgnoreRepaint
+getImage
+getImageCapabilities
+getImpl
+getImplementationTitle
+getImplementationVendor
+getImplementationVersion
+getImplicitDownCycleTraversal
+getImportedKeys
+getInCheck
+getIndex
+getIndexAtPoint
+getIndexInfo
+getIndexedPropertyType
+getIndexedReadMethod
+getIndexedWriteMethod
+getInetAddress
+getInetAddresses
+getInfinity
+getInfo
+getInheritableMethod
+getInheritedAccessControlContext
+getInitialComponent
+getInput
+getInputContext
+getInputLength
+getInputMethodListeners
+getInputMethodRequests
+getInputStream
+getInsets
+getInstance
+getInstanceFollowRedirects
+getInstanceOf
+getInstanceof
+getInt
+getIntB
+getIntL
+getInteger
+getIntegerInstance
+getInterface
+getInterfaces
+getInternalPersistenceDelegate
+getInternationalCurrencySymbol
+getInternedColorModel
+getInvocationHandler
+getIssuerDN
+getItalicAngle
+getItem
+getItemAt
+getItemCount
+getItemImpl
+getItemListeners
+getItems
+getIterator
+getJDBCMajorVersion
+getJDBCMinorVersion
+getJarEntry
+getJarFile
+getJarFileURL
+getJavaInitializationString
+getKeepAlive
+getKey
+getKeyChar
+getKeyCode
+getKeyEventChar
+getKeyEventDispatchers
+getKeyEventPostProcessors
+getKeyEventType
+getKeyListeners
+getKeyModifiersText
+getKeySpec
+getKeyText
+getKeyUsage
+getKeymap
+getKeys
+getLabel
+getLanguage
+getLast
+getLastComponent
+getLastModifed
+getLastModified
+getLastModifiedTime
+getLauncher
+getLayout
+getLayoutAlignment
+getLayoutAlignmentX
+getLayoutAlignmentY
+getLayoutDimensions
+getLayoutInfo
+getLayoutOrigin
+getLayoutWeights
+getLcidFromLocale
+getLeading
+getLeastMaximum
+getLength
+getLevelAt
+getLimits
+getLineIncrement
+getLineInstance
+getLineIterator
+getLineJoin
+getLineMetrics
+getLineNumber
+getLineWidth
+getListener
+getListenerCount
+getListenerMethod
+getListenerMethodDescriptors
+getListenerMethodName
+getListenerMethods
+getListenerType
+getListeners
+getLoader
+getLocalAddress
+getLocalDesc
+getLocalGraphicsEnvironment
+getLocalHost
+getLocalHostName
+getLocalPatternChars
+getLocalPort
+getLocale
+getLocaleElements
+getLocalizedInputStream
+getLocalizedMessage
+getLocalizedOutputStream
+getLocation
+getLocationOnScreen
+getLocationOnScreen_NoTreeLock
+getLockingKeyState
+getLogStream
+getLogWriter
+getLogicalBounds
+getLoginTimeout
+getLong
+getLongB
+getLongL
+getLoopbackMode
+getLowestSetBit
+getMainAttributes
+getMainTableEntry
+getMajorVersion
+getManifest
+getMapSize
+getMask
+getMatrix
+getMaxAdvance
+getMaxAscent
+getMaxBinaryLiteralLength
+getMaxBytesPerChar
+getMaxCatalogNameLength
+getMaxCharBounds
+getMaxCharLiteralLength
+getMaxCharsPerByte
+getMaxColumnNameLength
+getMaxColumnsInGroupBy
+getMaxColumnsInIndex
+getMaxColumnsInOrderBy
+getMaxColumnsInSelect
+getMaxColumnsInTable
+getMaxConnections
+getMaxCursorNameLength
+getMaxDecent
+getMaxDescent
+getMaxExpansion
+getMaxFieldSize
+getMaxIndexLength
+getMaxPage
+getMaxPriority
+getMaxProcedureNameLength
+getMaxRowSize
+getMaxRows
+getMaxSchemaNameLength
+getMaxSecOrder
+getMaxStatementLength
+getMaxStatements
+getMaxTableNameLength
+getMaxTablesInSelect
+getMaxTerOrder
+getMaxUserNameLength
+getMaximizedBounds
+getMaximum
+getMaximumAccessibleValue
+getMaximumCursorColors
+getMaximumDecomposition
+getMaximumFractionDigits
+getMaximumIntegerDigits
+getMaximumSize
+getMedia
+getMenu
+getMenuBar
+getMenuComponents
+getMenuCount
+getMenuCountImpl
+getMenuImpl
+getMenuShortcutKeyMask
+getMesage
+getMessage
+getMessageDigest
+getMetaData
+getMethod
+getMethod0
+getMethodDescriptors
+getMethodInfo
+getMethodInfo0
+getMethodName
+getMethodSignature
+getMethods
+getMethods0
+getMethods1
+getMin
+getMinPage
+getMinSize
+getMinimalDaysInFirstWeek
+getMinimum
+getMinimumAccessibleValue
+getMinimumFractionDigits
+getMinimumIntegerDigits
+getMinimumSize
+getMinorVersion
+getMinusSign
+getMinutes
+getMissingGlyphCode
+getMiterLimit
+getMode
+getModifiers
+getMonetaryDecimalSeparator
+getMonth
+getMonths
+getMoreResults
+getMostRecentFocusOwner
+getMouseEventTarget
+getMouseEventTargetImpl
+getMouseListeners
+getMouseMotionListeners
+getMouseWheelListeners
+getMultipleDocumentHandling
+getMultiplier
+getNaN
+getName
+getNanos
+getNativeContainer
+getNativeFocusOwner
+getNativeFocusedWindow
+getNegative
+getNegativePrefix
+getNegativePrefixFieldPositions
+getNegativeSuffix
+getNegativeSuffixFieldPositions
+getNetworkInterface
+getNetworkInterfaces
+getNewValue
+getNextEnumWithMore
+getNextEvent
+getNextException
+getNextWarning
+getNormalizingTransform
+getNumChars
+getNumComponents
+getNumDataElements
+getNumGlyphs
+getNumObjFields
+getNumber
+getNumberFormat
+getNumberInstance
+getNumericFunctions
+getNumericValue
+getOOBInline
+getObjFieldValues
+getObject
+getObjectStreamClass
+getOffset
+getOffsets
+getOffsetsByWall
+getOldEventKey
+getOldValue
+getOppositeComponent
+getOppositeWindow
+getOption
+getOrientation
+getOrientationRequested
+getOrigin
+getOutputStream
+getOwnedWindows
+getOwner
+getOwningFrameDialog
+getPDperm
+getPSName
+getPackage
+getPackages
+getPageDimension
+getPageIncrement
+getPageRanges
+getPageResolution
+getPaint
+getParameter
+getParameterClassName
+getParameterCount
+getParameterDescriptors
+getParameterInfo
+getParameterMetaData
+getParameterMode
+getParameterSpec
+getParameterType
+getParameterTypeName
+getParameterTypes
+getParameters
+getParent
+getParentFile
+getParent_NoClientCode
+getPassword
+getPasswordAuthentication
+getPath
+getPathIterator
+getPathSeparator
+getPattern
+getPatternSeparator
+getPeer
+getPeer_NoClientCode
+getPerMill
+getPercent
+getPercentInstance
+getPermanentFocusOwner
+getPermission
+getPermissionCollection
+getPermissions
+getPersistenceDelegate
+getPixelColor
+getPixelSize
+getPixelStride
+getPoint
+getPoint1
+getPoint2
+getPolicy
+getPolicyNoCheck
+getPort
+getPositivePrefix
+getPositivePrefixFieldPositions
+getPositiveSuffix
+getPositiveSuffixFieldPositions
+getPrecedingEntry
+getPrecision
+getPredefinedCursor
+getPreferredSize
+getPrefixLength
+getPrimDataSize
+getPrimFieldValues
+getPrimaryKeys
+getPrimitiveClass
+getPrincipal
+getPrincipals
+getPrintJob
+getPrintQuality
+getPrinter
+getPrinterResolution
+getPriority
+getPrivate
+getPrivateField
+getPrivateKey
+getPrivateMethod
+getPrngAlgorithm
+getProcedureColumns
+getProcedureTerm
+getProcedures
+getPropagationId
+getProperties
+getProperty
+getPropertyChangeEvent
+getPropertyChangeListeners
+getPropertyDescriptor
+getPropertyDescriptors
+getPropertyEditorClass
+getPropertyInfo
+getPropertyName
+getPropertyType
+getProtectionDomain
+getProtectionDomain0
+getProtocol
+getProtocolVersion
+getProvider
+getProviderName
+getProviderProperty
+getProviders
+getProvidersNotUsingCache
+getProxyClass
+getPublic
+getPublicDeclaredMethods
+getPublicKey
+getQuery
+getQueryTimeout
+getRGB
+getRGBColorComponents
+getRGBComponents
+getRGBPixel
+getRGBPixels
+getRGBdefault
+getRGBs
+getRanges
+getRaster
+getRawOffset
+getRead
+getReadMethod
+getReason
+getReceiveBufferSize
+getRed
+getRedMask
+getRef
+getReflectionFactory
+getReflector
+getRefreshRate
+getRegistry
+getRemoveListenerMethod
+getRenderingHint
+getRenderingHints
+getRequestMethod
+getRequestProperties
+getRequestProperty
+getRequestingHost
+getRequestingPort
+getRequestingPrompt
+getRequestingProtocol
+getRequestingScheme
+getRequestingSite
+getRequestingXXX
+getResolveParent
+getResource
+getResourceAsStream
+getResources
+getResponseCode
+getResponseMessage
+getResultSet
+getResultSetConcurrency
+getResultSetHoldability
+getResultSetType
+getReturnType
+getReuseAddress
+getRootGroup
+getRow
+getRows
+getRule
+getRules
+getRunCount
+getRunLevel
+getRunLimit
+getRunStart
+getRuntime
+getSQLKeywords
+getSQLState
+getSQLStateType
+getSQLType
+getSQLTypeName
+getSavepointId
+getSavepointName
+getScale
+getScaleX
+getScaleY
+getScaledInstance
+getScanlineStride
+getSchemaName
+getSchemaTerm
+getSchemas
+getScheme
+getSchemeSpecificPart
+getScientificInstance
+getScope
+getScreenDevices
+getScreenInsets
+getScreenResolution
+getScreenSize
+getScrollAmount
+getScrollPosition
+getScrollType
+getScrollbarDisplayPolicy
+getScrollbarVisibility
+getSearchStringEscape
+getSeconds
+getSecureRandomSpi
+getSecurityContext
+getSecurityManager
+getSeed
+getSelectedCheckbox
+getSelectedIndex
+getSelectedIndexes
+getSelectedItem
+getSelectedItems
+getSelectedObjects
+getSelectedText
+getSelectionEnd
+getSelectionStart
+getSendBufferSize
+getSentenceInstance
+getSentenceIterator
+getSeparator
+getSerialFields
+getSerialVersionUID
+getSerializableConstructor
+getShape
+getShearX
+getShearY
+getShort
+getShortB
+getShortDescription
+getShortL
+getShortMonths
+getShortWeekdays
+getShortcut
+getShortcutMenuItem
+getSides
+getSignature
+getSignerPrivateKey
+getSigners
+getSize
+getSize2D
+getSoLinger
+getSoTimeout
+getSocket
+getSocketAddress
+getSource
+getSourceString
+getSpecificationTitle
+getSpecificationVendor
+getSpecificationVersion
+getStackAccessControlContext
+getStackTrace
+getStackTraceDepth
+getStackTraceElement
+getStandardName
+getState
+getStateChange
+getStatement
+getStatus
+getStream
+getStreamKeys
+getStrength
+getStrikethroughOffset
+getStrikethroughThickness
+getString
+getStringArray
+getStringBounds
+getStringFunctions
+getStroke
+getStyle
+getSubElements
+getSubString
+getSubjectDN
+getSuperDesc
+getSuperTables
+getSuperTypes
+getSuperclass
+getSurfaceData
+getSymbol
+getSystemClassLoader
+getSystemClipboard
+getSystemCustomCursor
+getSystemEventQueue
+getSystemEventQueueImpl
+getSystemFunctions
+getSystemPackage
+getSystemPackage0
+getSystemPackages
+getSystemPackages0
+getSystemResource
+getSystemResourceAsStream
+getSystemResources
+getSystemScope
+getSystemSelection
+getSystemTimeZoneID
+getTTL
+getTabCount
+getTableName
+getTablePrivileges
+getTableTypes
+getTables
+getTags
+getTarget
+getTargetBeanDescriptor
+getTargetDefaultEventIndex
+getTargetDefaultPropertyIndex
+getTargetEventInfo
+getTargetException
+getTargetMethodInfo
+getTargetPropertyInfo
+getTcpNoDelay
+getTempDir
+getText
+getTextListeners
+getThreadGroup
+getTime
+getTimeDateFunctions
+getTimeImpl
+getTimeInMillis
+getTimeInstance
+getTimeOfDay
+getTimeToLive
+getTimeZone
+getTimeout
+getTimestamp
+getTimezoneOffset
+getTitle
+getTitleAt
+getToPage
+getToolkit
+getToolkitImpl
+getTrafficClass
+getTransactionIsolation
+getTransferData
+getTransferSize
+getTransform
+getTranslateX
+getTranslateY
+getTransparency
+getTreeLock
+getType
+getTypeCode
+getTypeInfo
+getTypeMap
+getTypeString
+getUDTs
+getURL
+getURLStreamHandler
+getURLs
+getUTFLength
+getUnderlineOffset
+getUnderlineThickness
+getUnderlyingToolkit
+getUnicodeOrder
+getUnicodeStream
+getUnitIncrement
+getUnresolvedPermissions
+getUpdateCount
+getUpdateCounts
+getUpdateRect
+getUseCaches
+getUserInfo
+getUserName
+getVAdjustable
+getVKValue
+getVScrollbarWidth
+getValue
+getValueData
+getValueIsAdjusting
+getValueString
+getVariant
+getVariantFor
+getVersion
+getVersionColumns
+getVetoableChangeListeners
+getVgap
+getViewportSize
+getVisible
+getVisibleAmount
+getVisibleIndex
+getWarningString
+getWarnings
+getWeekdays
+getWheelRotation
+getWhen
+getWidth
+getWidths
+getWindingRule
+getWindow
+getWindowFocusListeners
+getWindowListeners
+getWindowStateListeners
+getWordInstance
+getWordIterator
+getWriteMethod
+getX
+getXXX
+getXxxxInstance
+getY
+getYear
+getZeroDigit
+getZoneIndex
+getZoneStrings
+getenv
+getfield
+gets
+gett
+getter
+getterExc
+getterName
+getters
+getting
+gfx
+gif
+give
+given
+gives
+giving
+glglg
+global
+glue
+glyph
+glyphCode
+glyphCodes
+glyphs
+gmt
+gmtFormatter
+gname
+gngrn
+go
+goCombiner
+goal
+goals
+gods
+goes
+going
+gone
+good
+goodIterator
+gopher
+got
+gotDouble
+gotFocus
+gotNegative
+gotPositive
+gothic
+gotten
+govern
+governed
+governing
+governs
+grab
+grabbing
+grabs
+gracefully
+grade
+gradient
+grammar
+grammatical
+grant
+granted
+grantee
+granting
+grantor
+grants
+graph
+grapheme
+graphical
+graphics
+graphicsConfig
+graphicsenv
+graphs
+grave
+gray
+great
+greater
+greatest
+greatly
+greedy
+green
+greenc
+gregorianCutover
+gregorianCutoverYear
+gregorianEpochDay
+grey
+grid
+gridHeight
+gridWidth
+gridX
+gridY
+gridbag
+gridheight
+grids
+gridwidth
+gridx
+gridy
+groan
+group
+groupAddr
+groupChars
+groupList
+groupVal
+grouped
+grouping
+groupingCount
+groupingSeparator
+groupingSize
+groupingUsed
+groups
+groupsSnapshot
+grow
+growEntries
+growSpine
+growable
+growing
+grown
+grows
+growth
+gs
+gt
+guantlet
+guarantee
+guaranteed
+guaranteeing
+guarantees
+guarantor
+guard
+guarded
+guarding
+guards
+guess
+guessContentTypeFromName
+guessContentTypeFromStream
+guessVersion
+guessing
+guguj
+gui
+guiAvailable
+guide
+gv
+h
+h2
+h3
+h4
+hAdjustable
+hAdjustableValue
+hacek
+hack
+had
+hadAnnotations
+hadn
+hahau
+hair
+half
+halfULP
+halfUlp
+halt
+halted
+halts
+halves
+hamburger
+hand
+handed
+handle
+handleError
+handleEvent
+handleException
+handleGetObject
+handleNext
+handlePrevious
+handleReset
+handleShortcut
+handleSpecialSubstitution
+handleWheel
+handleWheelScrolling
+handled
+handler
+handler2
+handlerClassName
+handlerPropName
+handlers
+handles
+handlesWheelScrolling
+handling
+hands
+handy
+hang
+hanging
+hangs
+hangulToJamo
+happen
+happened
+happens
+happily
+happy
+hard
+hardValueOf
+hardcoded
+hardware
+harmless
+harmlessly
+has
+hasAllPermission
+hasBlockExternalData
+hasChanged
+hasData
+hasDesc
+hasException
+hasExited
+hasFocus
+hasJamo
+hasListeners
+hasMore
+hasMoreElements
+hasMoreTokens
+hasNext
+hasNonPublicInterface
+hasPrevious
+hasReadObjectMethod
+hasReadObjectNoDataMethod
+hasReadResolveMethod
+hasRemaining
+hasSameRules
+hasStaticInitializer
+hasUniformLineMetrics
+hasWriteObjectData
+hasWriteObjectMethod
+hasWriteReplaceMethod
+hasalpha
+hash
+hashBytes
+hashCode
+hashCodeCache
+hashCodes
+hashEntrySet
+hashIgnoringCase
+hashIterator
+hashcode
+hashcodes
+hashed
+hashes
+hashing
+hashmap
+hashtable
+hashtableFilter
+hashtableNull
+hashtables
+hasn
+hastable
+hat
+have
+haveDash
+haveEquals
+haveLeftoverChar
+haveNextNextGaussian
+havePipe
+haveTilde
+haven
+having
+havoc
+hb
+hbarHeight
+hbarOn
+hbuf
+he
+head
+headMap
+headSet
+header
+headerSize
+headers
+headless
+heap
+heavily
+heavy
+heavyweight
+heavyweightButtonDown
+heavyweightRequests
+hedge
+heheb
+height
+heights
+heirarchy
+held
+hello
+help
+helpMenu
+helper
+helps
+hemisphere
+hence
+henceforth
+her
+here
+hereinafter
+hertz
+heterogeneous
+heterogenous
+heuristic
+heuristics
+hex
+hex4
+hexDigit
+hexadecimal
+hexidecimal
+hexpart
+hexpost
+hexseq
+hgap
+hh
+hhmm
+hi
+hibyte
+hid
+hidden
+hide
+hideAndDisposeHandler
+hides
+hiding
+hierarchical
+hierarchically
+hierarchies
+hierarchy
+hierarchyBounds
+hierarchyBoundsL
+hierarchyBoundsListener
+hierarchyBoundsListenerK
+hierarchyChanged
+hierarchyL
+hierarchyListener
+hierarchyListenerK
+high
+highBad
+highBit
+highBits
+highEndpoint
+highMask
+highPart
+highWord
+highbit
+highbyte
+higher
+highest
+highestLevel
+highestUnit
+highlight
+highlightInner
+highlightOuter
+highlighted
+highlighting
+highly
+hihin
+hinders
+hint
+hintKey
+hintValue
+hintmap
+hints
+hir
+hira
+hiragana
+his
+historial
+historical
+historicalName
+historically
+hit
+hitClip
+hits
+hjb
+hn
+hode
+hogs
+hoisted
+hold
+holdability
+holder
+holding
+holds
+holdsLock
+hole
+holes
+home
+homed
+homogeneous
+honor
+honored
+hoo
+hook
+hooks
+hope
+hopefully
+horizontal
+horizontalScrollBar
+horizontally
+horn
+horz
+host
+hostAddress
+hostName
+hosted
+hostile
+hosting
+hostname
+hostnames
+hostport
+hosts
+hostsEqual
+hot
+hotSpot
+hotjava
+hotspot
+hour
+hourOfDayStamp
+hourStamp
+hourString
+hours
+how
+howev
+however
+howto
+hr
+href
+hrhrv
+hrs
+hs
+hs122
+hsbvals
+hsdev
+ht
+htab
+html
+html40
+http
+hue
+huge
+huhun
+hulpbias
+human
+humans
+hung
+hurt
+hv
+hvvliet
+hw
+hwAncestor
+hwAncestorPeer
+hwFocusRequest
+hybridGCD
+hyhye
+hypen
+hyph
+hyphen
+hyphenated
+hyphens
+hypothetical
+i
+i1
+i18n
+i2
+i386
+iCount
+iDigits
+iFieldEnd
+iFieldStart
+iValue
+ia
+iaContainerObj
+iaddr
+iae
+iae1
+iaina
+iana
+ibm
+icm
+icmpContext
+icolrel
+icon
+iconKind
+iconic
+iconification
+iconified
+iconify
+icons
+icr
+ics
+id
+idName
+idString
+idea
+identical
+identically
+identifers
+identification
+identified
+identifier
+identifiers
+identifies
+identify
+identifying
+identities
+identity
+identityEquals
+identityHashCode
+identityName
+identitydb
+identitymap
+ideograph
+ideographic
+ideographs
+idind
+idiom
+idioms
+idle
+idref
+idrefName
+idrefs
+ids
+idx
+idy
+ie
+ieile
+ietf
+if
+ifModifiedSince
+ifaceNames
+ifaces
+ifcs
+iff
+ifmodifiedsince
+ignorable
+ignorables
+ignore
+ignoreCase
+ignoreChars
+ignoreEnabled
+ignoreLF
+ignoreNegativeZero
+ignoreRepaint
+ignored
+ignores
+ignoring
+ih
+ii
+iiRas
+iir
+ikipk
+ilim
+ill
+illegal
+illegally
+illustrates
+illustrating
+ilog10
+ils
+im
+image
+imageCache
+imageCaps
+imageObserver
+imageUpdate
+imagedata
+imagelength
+imageoffset
+images
+imagine
+imaging
+img
+img1
+imgs
+immediate
+immediately
+immediatly
+immune
+immunity
+immutable
+immutables
+impact
+imperative
+impl
+implAccept
+implClass
+implName
+implTitle
+implVendor
+implVersion
+implcitly
+implement
+implementable
+implementation
+implementations
+implemented
+implementer
+implementers
+implementing
+implementor
+implementors
+implements
+implication
+implications
+implicit
+implicitDownCycleTraversal
+implicitly
+implied
+implies
+impliesIgnoreMask
+impltitle
+implvendor
+implversion
+imply
+implying
+import
+importance
+important
+importantly
+imported
+importedKeyCascade
+importedKeyInitiallyDeferred
+importedKeyInitiallyImmediate
+importedKeyNoAction
+importedKeyNotDeferrable
+importedKeyRestrict
+importedKeySetDefault
+importedKeySetNull
+importedNoAction
+imports
+impose
+imposed
+imposes
+imposing
+imposition
+impositions
+impossible
+impractical
+improper
+improperly
+improve
+improved
+improving
+in
+inChars
+inCheck
+inClass
+inClassLoader
+inData
+inDaylightTime
+inDefaultEventSet
+inLimit
+inLocale
+inMark
+inOff
+inPalette
+inProxyWeTrust
+inQuote
+inRange
+inRange2
+inReady
+inSendMessage
+inSpan
+inStream
+inaccessible
+inaccuracies
+inaccuracy
+inaccurate
+inactive
+inactiveCaption
+inactiveCaptionBorder
+inactiveCaptionText
+inactivity
+inadvertent
+inadvisable
+iname
+inapplicable
+inappropriate
+incCount
+incRate
+incXAcross
+incXDown
+incYAcross
+incYDown
+inch
+inclined
+include
+includeSelf
+included
+includes
+including
+inclusive
+incoming
+incompatibilites
+incompatibilities
+incompatibilities1
+incompatible
+incompatibly
+incomplete
+inconceivable
+inconsistencies
+inconsistency
+inconsistent
+incorporate
+incorporated
+incorrect
+incorrectly
+increase
+increased
+increases
+increasing
+increment
+incrementSize
+incremental
+incrementalDraw
+incrementaldraw
+incrementally
+incremented
+incrementing
+increments
+incurred
+incurring
+ind
+indecated
+indeed
+indefinite
+indefinitely
+indent
+indentation
+indention
+independent
+independently
+indeterminate
+index
+indexBound
+indexInParent
+indexOf
+indexOfSubList
+indexStaticProviders
+indexed
+indexedBinarySearch
+indexedGetter
+indexedGetterName
+indexedPropertyType
+indexedReadMethod
+indexedSetter
+indexedSetterName
+indexedWriteMethod
+indexes
+indexing
+indicate
+indicated
+indicates
+indicating
+indication
+indications
+indicator
+indices
+indicies
+indirect
+indirectly
+indistinguishable
+individual
+individually
+induced
+ine
+inefficiency
+inefficient
+inet
+inetAddr
+inet_ntop
+inet_pton
+inet_pton4
+inetaddr
+inexact
+inf
+infAddress
+infLock
+inferior
+infinite
+infinitely
+infinity
+influence
+info
+infoText
+infoflags
+inform
+information
+informationi
+informative
+informed
+infos
+infrastrcure
+infrastructure
+ing
+inherent
+inherently
+inherit
+inheritable
+inheritableThreadLocals
+inheritance
+inherited
+inheritedAccessControlContext
+inheritedContext
+inheriting
+inherits
+inind
+init
+initBean
+initCapacity
+initCause
+initCl
+initCursorDir
+initDispatchThread
+initIDs
+initNonProxy
+initPolicy
+initProperties
+initProto
+initProxy
+initRNG
+initSign
+initState
+initValue
+initVerify
+init_with_ip
+initial
+initialCapacity
+initialCheckSecTer
+initialSize
+initialState
+initialValue
+initialiser
+initialization
+initializations
+initialize
+initializeData
+initializeDefaultCentury
+initializeDesktopProperties
+initializeFocusTraversalKeys
+initializeFont
+initializeJavaAssertionMaps
+initializePath
+initializeStatic
+initializeSystemClass
+initializeSystemScope
+initialized
+initializer
+initializers
+initializes
+initializing
+initially
+initiate
+initiated
+initiates
+initiating
+initiation
+initted
+ink
+inline
+inlined
+inlines
+innards
+inner
+innerURL
+innocuous
+inplemented
+input
+inputContext
+inputContextLock
+inputLength
+inputListenerK
+inputMethodL
+inputMethodListener
+inputMethodListenerK
+inputMethodTextChanged
+inputMethodsEnabled
+input_method_segment
+inputs
+inquire
+ins
+insecure
+insenitive
+insensitive
+insert
+insertElementAt
+insertProvider
+insertProviderAt
+insertRow
+insertSeparator
+insertTargetMapping
+insertText
+inserted
+inserting
+insertion
+insertionIndex
+insertionPoint
+insertions
+inserts
+insertsAreDetected
+inset
+insets
+inside
+insideBorder
+insideness
+insignificant
+insist
+insisting
+insofar
+inspection
+install
+installFields
+installation
+installed
+installing
+instance
+instanceCountsByClassName
+instanceFollowRedirects
+instanceMap
+instanceName
+instanceNumber
+instanceOf
+instanceof
+instances
+instaniate
+instant
+instantiability
+instantiate
+instantiated
+instantiates
+instantiating
+instantiation
+instead
+insterface
+instituted
+institution
+instructed
+instruction
+instructions
+instructs
+insufficient
+insure
+int
+int0
+int1
+int2
+int3
+intArrayCmp
+intArrayCmpToLen
+intBitsToFloat
+intDecimalDigits
+intIndex
+intKey
+intLen
+intLength
+intLevel
+intList
+intNum
+intRadix
+intString
+intToRawIntBits
+intVal
+intVals
+intValue
+intact
+intances
+integer
+integerDigits
+integers
+integral
+integrated
+integrates
+integrity
+intel
+intend
+intended
+intends
+intent
+intentionally
+intents
+inter
+interQuoteCount
+interact
+interaction
+interactions
+interactive
+interafce
+interdependent
+interest
+interestMask
+interested
+interesting
+interests
+interface
+interfaces
+interfere
+interferes
+interior
+interleaved
+interline
+intermediate
+intermixed
+intern
+internal
+internalAt
+internalComplement
+internalDifference
+internalFindMethod
+internalGet
+internalGetEra
+internalIntersection
+internalPersistenceDelegates
+internalSet
+internalSetIndex
+internalUnion
+internally
+internals
+international
+internationalization
+internationalized
+interned
+internet
+interoperability
+interoperatbility
+interoperation
+interp
+interpolation
+interposed
+interpret
+interpretation
+interpretations
+interpreted
+interpreter
+interpreting
+interprets
+interprocess
+interrupt
+interrupt0
+interruptBlocking
+interrupted
+interruptedException
+interruptible
+interrupting
+interruption
+interrupts
+intersect
+intersected
+intersection
+intersects
+interval
+intervals
+intervene
+intervening
+inteter
+intially
+intlCurrencySymbol
+into
+intricacies
+introduce
+introduced
+introduces
+introducing
+introduction
+introspection
+introspector
+ints
+intuitive
+intuitively
+intval
+inv
+invalid
+invalidate
+invalidateLayout
+invalidateSMCache
+invalidateTree
+invalidated
+invalidates
+invariant
+invariants
+invention
+inverse
+inverseIndex
+inverseMod32
+inverses
+invert
+invertResult
+inverted
+invertible
+investigates
+invisible
+invisibly
+invite
+invocation
+invocations
+invoice
+invoke
+invokeAndWait
+invokeLater
+invokeReadObject
+invokeReadObjectNoData
+invokeReadResolve
+invokeStatement
+invokeWriteObject
+invokeWriteReplace
+invoked
+invoker
+invokerScreenLocation
+invokerSize
+invokes
+invoking
+involve
+involved
+involves
+involving
+io
+ioe
+ioffset
+iota
+ip
+ipaddress
+ipadx
+ipady
+iport
+ipv6
+ipv6byteCount
+irast
+irowrel
+irregular
+irregularly
+irrelevant
+irrespective
+irrevocably
+is
+isAMappedBuffer
+isAbsolute
+isAccelerated
+isAcceptable
+isAccessible
+isAccessibleChildSelected
+isActionKey
+isActive
+isAdjusting
+isAfterLast
+isAlive
+isAncestor
+isAncestorOf
+isAntiAliased
+isAnyLocalAddress
+isArg
+isArgument
+isArray
+isAssignableFrom
+isAutoIncrement
+isAutoWaitForIdle
+isBackgroundSet
+isBeforeFirst
+isBlocking
+isBold
+isBound
+isBoundary
+isCaching
+isCaseSensitive
+isCatalogAtStart
+isCertificateEntry
+isClickOrphaned
+isClosed
+isClosedOrPending
+isCompatibleValue
+isCompatibleWith
+isConnectable
+isConnected
+isConstrained
+isConstraintSatisfied
+isConsumed
+isControlDown
+isCriterionSatisfied
+isCurrency
+isCurrencyFormat
+isCursorSet
+isCyclic
+isDaemon
+isDecimalSeparatorAlwaysShown
+isDefined
+isDefinitelyWritable
+isDesignTime
+isDestroyed
+isDigit
+isDirect
+isDirectory
+isDispatchThread
+isDispatching
+isDisplayChangeSupported
+isDisplayable
+isDone
+isDoubleBuffered
+isDynamicLayoutActive
+isDynamicLayoutSet
+isEditable
+isEmpty
+isEnabled
+isEnabledImpl
+isEndState
+isEqual
+isErrorAny
+isErrorID
+isEven
+isEventHandler
+isExceptional
+isExpert
+isExponent
+isExternalizable
+isFile
+isFilterableDCM
+isFilterableICM
+isFirst
+isFirstCallToNext
+isFocusCycleRoot
+isFocusOwner
+isFocusTraversable
+isFocusTraversableOverridden
+isFocusTraversalPolicySet
+isFocusable
+isFocusableWindow
+isFocused
+isFontSet
+isForegroundSet
+isForeignDrag
+isFrameStateSupported
+isFred
+isFrenchSec
+isFullScreenRequired
+isFullScreenSupported
+isGraphicsConfigSupported
+isGregorian
+isGroupingUsed
+isGuiAvailable
+isHeadless
+isHeadlessInstance
+isHelpMenu
+isHidden
+isHorizontal
+isIPv4CompatibleAddress
+isIPv4MappedAddress
+isIPv6Supported
+isISOControl
+isIdentifierIgnorable
+isIdentity
+isIgnorable
+isInDefaultEventSet
+isInc
+isIndexSelected
+isInfinite
+isInputOpen
+isInputShutdown
+isInstance
+isInstanceOf
+isInstantiable
+isInteger
+isInterface
+isInterrupted
+isItalic
+isJavaIdentifierPart
+isJavaIdentifierStart
+isJavaLetter
+isJavaLetterOrDigit
+isKeyEntry
+isLTR
+isLaoBaseConsonant
+isLaoPreVowel
+isLast
+isLeap
+isLeapYear
+isLeftToRight
+isLenient
+isLetter
+isLetterOrDigit
+isLightweight
+isLinkLocalAddress
+isLoaded
+isLoaded0
+isLongMIN_VALUE
+isLoopbackAddress
+isLoopingState
+isLowerCase
+isMCGlobal
+isMCLinkLocal
+isMCNodeLocal
+isMCOrgLocal
+isMCSiteLocal
+isMarkState
+isMaskOK
+isMirrored
+isMixed
+isModal
+isMouseButtonPressed
+isMouseInNativeContainer
+isMouseOverMe
+isMultiBufferAvailable
+isMulticastAddress
+isMultipleMode
+isNaN
+isNativeMethod
+isNegative
+isNormal
+isNullable
+isOdd
+isOn
+isOnKeyRelease
+isOne
+isOpaque
+isOpen
+isOutputOpen
+isOutputShutdown
+isOverIgnore
+isPacked
+isPageFlipping
+isPaintPending
+isPaintable
+isParseIntegerOnly
+isPeerEvent
+isPeerOK
+isPlain
+isPopupTrigger
+isPositive
+isPreferred
+isPreferredSizeSet
+isPrim
+isPrimitive
+isPrivileged
+isProbablePrime
+isProxy
+isProxyClass
+isPublic
+isRTL
+isReadOnly
+isReadable
+isRecursivelyVisible
+isRegistered
+isRelPath
+isRelative
+isResizable
+isSEAsianSwapping
+isSealed
+isSearchable
+isSelected
+isSerializable
+isServer
+isSet
+isShiftDown
+isShowing
+isShutdown
+isSigned
+isSiteLocalAddress
+isSource
+isSpace
+isSpaceChar
+isSpecialChar
+isStandardAttr
+isStatic
+isSubclass
+isSuper
+isSupported
+isTearOff
+isTemporary
+isThaiBaseConsonant
+isThaiPreVowel
+isTimeSet
+isTitleCase
+isTransformed
+isTransient
+isTrueVolatile
+isUndecorated
+isUnicast
+isUnicodeIdentifierPart
+isUnicodeIdentifierStart
+isUnresolved
+isUnshared
+isUpperCase
+isValid
+isValidProtocol
+isVertical
+isVisible
+isWheelScrollingEnabled
+isWhitespace
+isWritable
+isZero
+isbn
+ish
+isi
+isisl
+isn
+iso
+iso4217currency
+iso639
+isoCountries
+isoDoy
+isoLanguages
+isoYear
+isolate
+isolated
+isolating
+isolation
+isone
+issue
+issued
+issues
+istream
+isused
+it
+italic
+italicized
+italy
+ite
+item
+itemCopies
+itemL
+itemListener
+itemListenerK
+itemStateChanged
+itemized
+items
+itemsRead
+iter
+iterCache
+iterate
+iterated
+iterates
+iterating
+iteration
+iterations
+iterative
+iterator
+iteratorBinarySearch
+iterators
+ith
+itita
+itl
+itr
+its
+itself
+itype
+itypesPhrase
+iuiku
+iv
+ivalue
+iw
+iwheb
+ix
+iy
+j
+j2se
+ja
+jaString
+jacobiSymbol
+jajpn
+jamoToHangul
+jamos
+jan
+jan31
+january
+january1
+janx20
+jar
+jarConnection
+jarFileURL
+jarFileURLConnection
+java
+java2d
+javaHome
+javaIncrement
+java_awt_BorderLayout_PersistenceDelegate
+java_awt_CardLayout_PersistenceDelegate
+java_awt_Choice_PersistenceDelegate
+java_awt_Component_PersistenceDelegate
+java_awt_Container_PersistenceDelegate
+java_awt_GridBagLayout_PersistenceDelegate
+java_awt_MenuShortcut_PersistenceDelegate
+java_awt_Menu_PersistenceDelegate
+java_awt_SystemColor_PersistenceDelegate
+java_g
+java_lang_Class_PersistenceDelegate
+java_lang_Compiler_start
+java_lang_String_PersistenceDelegate
+java_lang_reflect_Field_PersistenceDelegate
+java_lang_reflect_Method_PersistenceDelegate
+java_util_AbstractList_PersistenceDelegate
+java_util_AbstractMap_PersistenceDelegate
+java_util_Hashtable_PersistenceDelegate
+java_util_List_PersistenceDelegate
+java_util_Map_PersistenceDelegate
+javabeans
+javac
+javadoc
+javax
+javax_swing_DefaultComboBoxModel_PersistenceDelegate
+javax_swing_DefaultListModel_PersistenceDelegate
+javax_swing_JComponent_PersistenceDelegate
+javax_swing_JFrame_PersistenceDelegate
+javax_swing_JMenu_PersistenceDelegate
+javax_swing_JTabbedPane_PersistenceDelegate
+javax_swing_ToolTipManager_PersistenceDelegate
+jdbc
+jdbcCompliant
+jdk
+jfc
+jhome
+ji
+jis
+jit
+jiyid
+jks
+jls
+jniVersion
+job
+jobAttributes
+jobs
+jobtitle
+join
+joinGroup
+joined
+joining
+joins
+jong
+jongseong
+jpeg
+jpg
+jsafe
+julian
+julianDate
+julianDay
+julianDayToDayOfWeek
+julianDayToMillis
+julianEpochDay
+july
+jump
+jumps
+june
+jung
+jungseong
+just
+justified
+jwjaw
+jwrd
+k
+k1
+k2
+kAsciiValues
+kCanonicalIndex
+kCanonicalValues
+kCharacterAsciiValues
+kCharacterBackwardData
+kCharacterBackwardTable
+kCharacterForwardData
+kCharacterForwardTable
+kCharacterMap
+kClosePunctuation
+kCombiningSpacingMark
+kConnectorPunctuation
+kControlCharacter
+kCurrencySymbol
+kDashPunctuation
+kDecimalNumber
+kDigits
+kEnclosingMark
+kExceptionChar
+kExceptionFlags
+kFormatCharacter
+kLetterNumber
+kLineAsciiValues
+kLineBackward
+kLineBackwardData
+kLineForward
+kLineForwardData
+kLineMap
+kLineSeparator
+kLong
+kLowercaseLetter
+kMathSymbol
+kModifierLetter
+kModifierSymbol
+kNonCharacter
+kNonSpacingMark
+kOffsetIndex
+kOffsetValues
+kOpenPunctuation
+kOtherLetter
+kOtherNumber
+kOtherPunctuation
+kOtherSymbol
+kParagraphSeparator
+kPrivateUseCharacter
+kRawMapping
+kSTerminator
+kSentenceAsciiValues
+kSentenceBackward
+kSentenceBackwardData
+kSentenceForward
+kSentenceForwardData
+kSentenceMap
+kSpaceSeparator
+kSurrogate
+kTitlecaseLetter
+kUppercaseLetter
+kWordAsciiValues
+kWordBackward
+kWordBackwardData
+kWordForward
+kWordForwardData
+kWordMap
+kakat
+kan
+kanji
+kat
+kata
+katakana
+ke
+keep
+keepBlocking
+keepalive
+keeping
+keeps
+keine
+kept
+kernel
+key
+keyBits
+keyChar
+keyCode
+keyCodeName
+keyDown
+keyEquals
+keyEventDispatchers
+keyEventPostProcessors
+keyFacSpi
+keyFactory
+keyHash
+keyL
+keyListener
+keyListenerK
+keyOrNull
+keyPairGen
+keyPress
+keyPressed
+keyRelease
+keyReleased
+keySet
+keySpec
+keyStart
+keyStoreSpi
+keyTyped
+keyUp
+keyUsageInfo
+keyValueIndex
+keyValueSeparators
+keyboard
+keycode
+keycodes
+keydown
+keyed
+keypair
+keys
+keysize
+keystore
+keystores
+keystroke
+keystrokes
+keyword
+keywords
+kick
+kid
+kill
+killed
+killing
+kind
+kinds
+kiwi
+kkkaz
+klkal
+km
+kmkhm
+knkan
+know
+knowing
+knowledge
+known
+knows
+ko
+kokor
+kpairGenSpi
+ks
+ksc
+kskas
+kstype
+kukur
+kykir
+l
+lValue
+lWeekdays
+la
+label
+labeled
+labelled
+labels
+labor
+lack
+laddr
+laid
+lalat
+landscape
+lang
+langCode
+language
+language1
+language2
+languageLength
+languageName
+languages
+large
+largePrime
+largely
+larger
+largest
+last
+lastBase
+lastBaseIndex
+lastC
+lastCategory
+lastClass
+lastDescendant
+lastDoy
+lastElement
+lastEntry
+lastExp
+lastExpansion
+lastIndex
+lastIndexOf
+lastIndexOfSubList
+lastItem
+lastKey
+lastLength
+lastLine
+lastModified
+lastMon
+lastOffset
+lastOpen
+lastPageFirst
+lastPos
+lastProductLowWord
+lastRelDow
+lastResult
+lastRet
+lastReturned
+lastReturnedIndex
+lastState
+lastSum
+lastSun
+lastType
+lastValue
+lastWoy
+lasting
+lastly
+lastx
+lasty
+late
+later
+latest
+latestLoader
+latestUserDefinedLoader
+latter
+launcher
+lay
+layed
+layer
+layered
+laying
+layout
+layoutContainer
+layoutGlyphVector
+layoutInfo
+layoutMgr
+layouts
+lays
+lazily
+lazilyLoadDesktopProperty
+lazy
+lb
+lbits
+lceil
+lcid
+lcidAsString
+ldlen
+ldm
+ldpath
+le
+le0
+lead
+leadDays
+leadSelectionIndex
+leading
+leadingZerosAfterDecimal
+leads
+leaf
+leak
+leap
+learn
+least
+leave
+leaveGroup
+leaves
+leaving
+ledger
+leeway
+left
+leftOf
+leftShift
+leftmost
+leftover
+leftoverChar
+leftovers
+leftx
+legacy
+legal
+legally
+legit
+legitimate
+legitimately
+leland
+len
+len1
+len2
+length
+lengthened
+lengthening
+lengths
+lenient
+less
+lessening
+lesser
+let
+lets
+letter
+letters
+letting
+level
+levelLimit
+levelStart
+levels
+lexical
+lexicographic
+lexicographically
+lf
+lfloor
+lg
+lhs
+li
+lib
+libX11
+libawt
+libfile
+libfilename
+libname
+libraries
+library
+libs
+license
+licensing
+lie
+lies
+life
+lifetime
+ligature
+ligatures
+light
+lightGray
+lightParents
+lightweight
+lightweightMarker
+lightweightPaint
+lightweightPrint
+lightweightRequests
+lightweights
+like
+likelihood
+likely
+likes
+likewise
+lim
+limit
+limitation
+limitations
+limited
+limiting
+limits
+lin
+line
+lineBuffer
+lineColor
+lineIncrement
+lineLength
+lineLimit
+lineNum
+lineNumber
+lineSeparator
+lineStart
+lineTo
+linear
+linefeed
+lineno
+lines
+linewidth
+linger
+link
+linkage
+linked
+linking
+links
+lira
+list
+list1
+list2
+listFiles
+listItems
+listIterator
+listRoots
+listSerializedDataVersion
+listed
+listen
+listenToAllAWTEvents
+listenToAllAWTEventsPermission
+listene
+listened
+listener
+listener2SelectiveListener
+listenerCalls
+listenerClassName
+listenerInterface
+listenerMethodDescriptors
+listenerMethodName
+listenerMethodNames
+listenerMethods
+listenerName
+listenerOrNull
+listenerType
+listenerless
+listeners
+listening
+listeningBoundsChildren
+listeningChildren
+listens
+listing
+listings
+lists
+lit
+literal
+literally
+literals
+liternal
+litle
+little
+littleIndex
+liu
+live
+lived
+lj
+ll
+lm
+ln
+lnlin
+lo
+load
+load0
+loadAssistiveTechnologies
+loadBundle
+loadClass
+loadClassData
+loadClassInternal
+loadConvert
+loadFactor
+loadFocusTraversalKeys
+loadImage
+loadImpl
+loadInitialDrivers
+loadLibraries
+loadLibrary
+loadLibrary0
+loadLookup
+loadManifest
+loadOneMoreProvider
+loadProvider
+loadProviderProperties
+loadSystemColors
+loadSystemCustomCursorProperties
+loadTable
+loadZoneStrings
+loaded
+loadedLibraryNames
+loadedProps
+loader
+loaderRef
+loaders
+loadfactor
+loading
+loads
+loc
+locBytes
+locIn
+locOut
+local
+localAddr
+localDesc
+localDescs
+localEnv
+localFields
+localHost
+localL
+localListenPermission
+localMillis
+localName
+localParent
+localPatternChars
+localPort
+localSkipBuffer
+localTableEntry
+local_addrs
+locale
+localeSuffix
+locales
+localhost
+locality
+localizable
+localization
+localize
+localized
+localizers
+locally
+localport
+locals
+localy
+locate
+located
+locates
+locating
+location
+locationCorrect
+locations
+locator
+lock
+locked
+locking
+locks
+log
+log10
+log2
+logStream
+logSync
+logWriter
+logarithm
+logarithms
+logging
+logic
+logical
+logically
+login
+loginTimeout
+logoff
+logos
+logs
+lolao
+long
+long0
+long1
+long2
+long3
+long4
+long5
+long5pow
+long6
+long7
+longBitsToDouble
+longKey
+longRadix
+longRep
+longResult
+longToByteArray
+longValue
+longer
+longest
+longs
+look
+lookahead
+lookaheadResult
+lookaheadStates
+looked
+looking
+looks
+lookup
+lookupAllHostAddr
+lookupBackwardState
+lookupCategory
+lookupCharset
+lookupClass
+lookupConstraints
+lookupContentHandlerClassFor
+lookupException
+lookupObject
+lookupState
+lookupTable
+lookups
+lookuptable
+loooping
+loop
+loopback
+loopbackAddress
+looped
+looping
+loopingState
+loopingStateRowNum
+loopingStates
+loops
+loopup
+loosely
+loppedLine
+lose
+loses
+losing
+losingFocusWindow
+loss
+lost
+lostFocus
+lot
+lots
+lout
+low
+lowDep
+lowDigitDifference
+lowEndpoint
+lowGood
+lowLevelOp
+lowMask
+lowOrderZeros
+lowalpha
+lowbytes
+lower
+lowerCase
+lowerCaseMode
+lowercase
+lowercased
+lowest
+lowestOddLevel
+lowestSetBit
+lowmem
+lport
+lshift
+lshiftMe
+lst
+lt
+ltlit
+ltr
+lucasLehmerSequence
+luck
+luehe
+lunar
+luser
+lvalue
+lvlav
+lw
+lwFocusRequest
+lwIter
+lying
+m
+m1
+m2
+mLN
+mLe
+mNu
+mPattern
+machine
+machinery
+machines
+macron
+maddr
+made
+madeChange
+mag
+magBitCount
+magBitLength
+magInt
+magLen
+magPresent
+magSerializedForm
+magTrailingZeroCount
+magenta
+magic
+magically
+magnitude
+mail
+mailto
+main
+mainLoop
+mainName
+mainTable
+mainly
+maintain
+maintainability
+maintained
+maintainers
+maintaining
+maintains
+maintenance
+major
+majority
+make
+makeBuilder
+makeCacheKey
+makeChar
+makeFormat
+makeInt
+makeLong
+makePositive
+makeQualifiedMethodName
+makeRaster
+makeReorderedBuffer
+makeRulesCompatible
+makeShort
+makeStaticCalendars
+makeVisible
+makebutton
+makes
+making
+malevolent
+malfeasant
+malformed
+malfunction
+malicious
+maliciously
+malignant
+man
+manage
+managed
+management
+manager
+managers
+manages
+managing
+mandate
+mandated
+mandates
+mangles
+mango
+manifest
+manifests
+manipulate
+manipulated
+manipulates
+manipulating
+manipulation
+manner
+mans
+mant
+mantissa
+manual
+manually
+manufactured
+manufacturing
+manuscript
+many
+map
+mapChar
+mapFamilyName
+mapInputMethodHighlight
+mapLen
+mapLibraryName
+mapNewModifiers
+mapOldModifiers
+mapSize
+mapValue
+mapped
+mappedChar
+mappedValue
+mapping
+mappingTable
+mappings
+maps
+mapsDiffer
+mar3
+march
+march1
+marged
+mark
+markAsDeleted
+markClearGlobalFocusOwner
+markDependency
+markException
+markLineNumber
+markPushBack
+markSupported
+markValue
+marked
+markedChar
+markedLineNumber
+markedPos
+markedSkipLF
+marker
+markers
+marking
+marklimit
+markpos
+marks
+mars
+marshal
+marshaling
+marshalled
+marshalledobject
+marshalling
+marshals
+mash
+mask
+masking
+masks
+massaging
+masse
+master
+match
+matchArguments
+matchCerts
+matchFields
+matchKey
+matchLocation
+matchScale
+matchString
+matchZoneString
+matched
+matches
+matchesField
+matching
+matchlen
+material
+materialize
+materializing
+materials
+math
+mathematical
+mathematically
+mathetmatical
+matic
+matrix
+matter
+matters
+max
+maxBytesPerChar
+maxCandidate
+maxCharsPerByte
+maxDecimalCount
+maxDecimalDigits
+maxDecimalExponent
+maxDelimChar
+maxDigits
+maxFractionDigits
+maxIndex
+maxIntCount
+maxIntegerDigits
+maxLength
+maxMemory
+maxMinusMin
+maxNumDigitGroups
+maxOffset
+maxPage
+maxPosition
+maxPriority
+maxSecOrder
+maxSize
+maxSkipBufferSize
+maxSmallBinExp
+maxSmallTen
+maxTerOrder
+maxWidth
+maxima
+maximal
+maximization
+maximized
+maximizedBounds
+maximized_horiz
+maximized_vert
+maximum
+maximumArgumentNumber
+maximumCanonical
+maximumDecomposition
+maximumDigits
+maximumFractionDigits
+maximumIntegerDigits
+maximumLayoutSize
+maximumSize
+maxposition
+maxpri
+maxttl
+maxw
+maxwidth
+may
+maybe
+maybeAddLeadingDot
+mb
+mbManagement
+mbexample
+mc
+mcastSocket
+mcastaddr
+md
+mday
+mds
+mdt
+me
+mean
+meaning
+meaningful
+meanings
+means
+meant
+meantime
+measure
+measured
+measurement
+measurements
+measuring
+mechanically
+mechanism
+mechanisms
+med
+med3
+media
+median
+medium
+meet
+meets
+member
+members
+membership
+memebership
+memory
+mentioned
+menu
+menuBar
+menuBarSerializedDataVersion
+menuItem
+menuItemSerializedDataVersion
+menuSerializedDataVersion
+menuText
+menubar
+menuitem
+menus
+merely
+merge
+mergeList
+mergePermissions
+mergeSort
+mergeStates
+merged
+mergedPerms
+merges
+mergesort
+merging
+meridian
+mesquite
+mess
+message
+messages
+messaging
+messiness
+messing
+met
+meta
+metaData
+metaDown
+metadata
+metafile
+metalab
+meth
+methSigs
+method
+methodCache
+methodInfo
+methodList
+methodName
+methods
+metric
+metrics
+mf
+mgmlg
+mgr
+mi
+mice
+micro
+microprocessor
+mid
+midBits
+midLetNum
+midLetter
+midNum
+midVal
+middle
+middlemost
+middot
+midnight
+midst
+might
+mil
+mile
+mill
+mille
+millis
+millisDelta
+millisInDay
+millisPerDay
+millisPerHour
+millisPerMinute
+millisSavedDuringDST
+millisToJulianDay
+millisec
+millisecond
+milliseconds
+milne
+mimetable
+mimetype
+mimic
+mimics
+mimri
+min
+min2
+minBufferCap
+minCapacity
+minDecimalExponent
+minDigits
+minExponentDigits
+minFractionDigits
+minHeight
+minIntegerDigits
+minPage
+minPrime
+minSize
+minSmallBinExp
+minUnitsInUse
+minWidth
+min_int
+mind
+minima
+minimal
+minimalDaysInFirstWeek
+minimize
+minimized
+minimizes
+minimizing
+minimum
+minimumCapacity
+minimumCombining
+minimumDigits
+minimumFractionDigits
+minimumIntegerDigits
+minimumLayoutSize
+minimumSize
+minimun
+mininimum
+minor
+minsizes
+minumum
+minus
+minusSign
+minute
+minuteString
+minutes
+mirrored
+misbehave
+misc
+miscellaneous
+misconfiguration
+misleadingly
+mismatch
+mismatches
+misplaced
+miss
+missing
+missingGlyph
+mistake
+mistakenly
+miter
+miterlimit
+mitigate
+mix
+mixed
+mixes
+mixing
+mixture
+mkdir
+mkdirs
+mkmkd
+mlen
+mlmal
+mls
+mm
+mmmm
+mnmon
+mo
+mod
+mod2
+modCount
+modInverse
+modInverseBP2
+modInverseMP2
+modLen
+modPow
+modPow2
+modVal
+modal
+modality
+mode
+model
+modeled
+modeless
+models
+modern
+modes
+modifcations
+modifiable
+modification
+modifications
+modified
+modifier
+modifierKeywords
+modifierList
+modifiers
+modifies
+modify
+modifyThread
+modifyThreadGroup
+modifying
+mods
+modular
+module
+modules
+modulo
+modulus
+moment
+momol
+mon
+monadic
+monarch
+monday
+monetary
+monetarySeparator
+money
+monitor
+monitored
+monitors
+monkey
+mono
+monochrome
+monospaced
+monotonic
+monotonicity
+montReduce
+month
+monthLen
+monthLength
+monthNames
+monthStamp
+months
+more
+morning
+mosquito
+most
+mostRecent
+mostRecentFocusOwners
+mostly
+motif
+motion
+motivate
+mount
+mouse
+mouseClicked
+mouseDown
+mouseDrag
+mouseDragged
+mouseEnter
+mouseEntered
+mouseEvent
+mouseEventTarget
+mouseExit
+mouseExited
+mouseL
+mouseListener
+mouseListenerK
+mouseMotionL
+mouseMotionListener
+mouseMotionListenerK
+mouseMove
+mouseMoved
+mouseOver
+mousePress
+mousePressed
+mouseRelease
+mouseReleased
+mouseUp
+mouseWheel
+mouseWheelL
+mouseWheelListener
+mouseWheelListenerK
+mouseWheelMoved
+move
+moveComponents
+movePointLeft
+movePointRight
+moveTo
+moveToCurrentRow
+moveToInsertRow
+moved
+movement
+moves
+moveto
+moving
+mrmar
+ms
+ms1
+ms2
+msd
+msg
+msmsa
+mso
+mst
+mt
+mtmlt
+mto
+much
+mul
+mulAdd
+mulitplying
+mulsub
+mult
+multPow52
+multaddMe
+multi
+multibyte
+multicast
+multicaster
+multicasting
+multicasts
+multihomed
+multilingual
+multiple
+multipleDocumentHandling
+multipleMode
+multiples
+multiplexed
+multiplexing
+multiplexor
+multiplication
+multiplications
+multiplicative
+multiplied
+multiplier
+multiplies
+multiply
+multiplyToLen
+multiplying
+multiprecision
+multipy
+multiscreen
+multisets
+multistep
+multithreaded
+multmin
+multpos
+mumble
+mungeExpressionList
+munged
+must
+mustSetRoundDir
+mutable
+mutableModInverse
+mutated
+mutatesTo
+mutation
+mutations
+mutator
+mutex
+mutually
+mx
+my
+myAppContext
+myBundle
+myButton
+myButtons
+myCollator
+myCollection
+myComponent
+myDate
+myDigitList
+myFRC
+myIntegers
+myInterfaces
+myJapaneseCollator
+myKeys
+myLocale
+myNorwegian
+myNumber
+myResources
+mySchemaName
+mySimple
+myString
+myapp
+mymya
+myobj
+myobject
+myself
+n
+n1
+n100
+n2
+n4
+n400
+n5bits
+nArgs
+nBits
+nBits2
+nBl
+nByte
+nBytes
+nChars
+nChunk
+nCopies
+nDigits
+nEnd
+nFractBits
+nInts
+nLeadZero
+nMoved
+nPoint
+nPoints
+nSignificantBits
+nTinyBits
+nTrailZero
+nWords
+na
+naddr
+naira
+naive
+naively
+nak
+name
+name1
+name2
+nameCounter
+nameExplicitlySet
+nameService
+named
+namely
+names
+nameservice
+naming
+nanau
+nano
+nanos
+nanos_s
+nanosecond
+nanoseconds
+narrow
+narrowing
+nary
+nasty
+national
+native
+native2ascii
+nativeBidiChars
+nativeByteOrder
+nativeContainer
+nativeCursor
+nativeGetDirectionCode
+nativeHost
+nativeLibraries
+nativeLibraryContext
+nativeSQL
+nativeSetSource
+nativeX
+nativeY
+natives
+natural
+naturally
+nature
+natures
+navigating
+navigation
+navy
+nb
+nbits
+nbsp
+nbuf
+nbytes
+nbytesButOne
+nc
+ncb
+ncheck
+nchildren
+nci
+ncols
+ncomponents
+ncsa
+ncws
+ncwslen
+nd
+nd0
+ndeps
+ndigit
+ndigits
+ndir
+ndoubles
+ne
+ne1
+near
+nearest
+nearly
+neccessarily
+neccessary
+necessarily
+necessary
+necessity
+need
+needCacheUpdate
+needDummies
+needQuote
+needRepaint
+needToChange
+needed
+needing
+needn
+needs
+needsGui
+needsNormalization
+nefarious
+neg
+negConst
+negPrefixPattern
+negSign
+negSuffixPattern
+neg_pattern
+negate
+negated
+negates
+negating
+negation
+negative
+negativeExponent
+negativePrefix
+negativePrefixFieldPositions
+negativeSuffix
+negativeSuffixFieldPositions
+negativeZeroDoubleBits
+negativeZeroFloatBits
+negatively
+negatives
+negotiate
+neighbor
+neighbors
+neither
+nenep
+nest
+nested
+nesting
+net
+netIF
+netIf
+netif
+netifs
+netlib
+nets
+network
+networking
+networks
+neutral
+never
+nevertheless
+new
+newActiveWindow
+newAddr
+newAddrs
+newAlign
+newAmount
+newAmpms
+newApplet
+newAppletBean
+newArgs
+newArgumentNumbers
+newArray
+newArraySize
+newAttributes
+newAttrs
+newAudioClip
+newBits
+newC
+newCalendar
+newCandidate
+newCandidates
+newCapacity
+newChannel
+newChar
+newChars
+newChildren
+newChoiceFormats
+newChoiceLimits
+newClass
+newCollator
+newConstructor
+newConstructorForSerialization
+newCount
+newDecoder
+newDeps
+newDigits
+newElementCount
+newEncoder
+newEntry
+newEntryIterator
+newEras
+newEvent
+newEventQueue
+newEventsOnly
+newExtension
+newField
+newFlags
+newFocusCycleRoot
+newFocusOwner
+newFocusOwnerEvent
+newFocusedWindow
+newFont
+newFormat
+newFormatData
+newFormatSymbols
+newFormats
+newGetExp
+newHour
+newIndex
+newInputStream
+newInstance
+newInstance0
+newInstanceCallerCache
+newItem
+newKey
+newKeyIterator
+newKeys
+newL
+newLen
+newLength
+newLimit
+newLine
+newList
+newLocalPatternChars
+newLocale
+newLoopingStates
+newMWE
+newMag
+newMagLen
+newManager
+newMap
+newMask
+newMaximum
+newMethod
+newMinimum
+newMonths
+newNext
+newNumberFormat
+newO
+newObjs
+newOffset
+newOffsets
+newOutputStream
+newPaintEvent
+newPattern
+newPermissionCollection
+newPosition
+newPriority
+newProtocol
+newProxyInstance
+newQueue
+newReader
+newRect
+newReps
+newRow
+newRowNum
+newRunAttributeValues
+newRunAttributes
+newRunStarts
+newSAXParser
+newSet
+newShortMonths
+newShortWeekdays
+newSign
+newSize
+newSource
+newStamp
+newStart
+newStartingSpot
+newState
+newStates
+newStatus
+newStm
+newStrength
+newSubstitution
+newSymbols
+newTable
+newTarget
+newTasksMayBeScheduled
+newText
+newTime
+newUnitsInUse
+newV
+newVal
+newValue
+newValueIterator
+newValues
+newWeekdays
+newWriter
+newX
+newXcps
+newY
+newZoneStrings
+newbuf
+newcomponents
+newcount
+newdst
+newer
+newfont
+newgroups
+newid
+newing
+newline
+newlines
+newly
+newmode
+newpos
+news
+newsel
+newthreads
+newttl
+newx
+newy
+next
+nextBoolean
+nextBoundaryAt
+nextByte
+nextByteIndex
+nextBytes
+nextCand
+nextChar
+nextCharIndex
+nextClass
+nextClearBit
+nextColumn
+nextContractChar
+nextDouble
+nextElement
+nextEntry
+nextExecutionTime
+nextFloat
+nextFocus
+nextFocusHelper
+nextFocusableComponent
+nextGaussian
+nextGetIndex
+nextIndex
+nextInt
+nextLine
+nextLong
+nextNextGaussian
+nextPosition
+nextPrime
+nextPutIndex
+nextQueue
+nextRow
+nextSerialNum
+nextSetBit
+nextSize
+nextStamp
+nextStream
+nextThreadNum
+nextToken
+nextVal
+nextWordStartAfter
+nextseed
+nextx
+nexty
+nexus
+nf
+nfe
+nfields
+nfloats
+ng
+ngroups
+ngroupsSnapshot
+nh
+nh2
+nhost
+ni
+nibble
+nice
+nilly
+nilnodes
+nine
+ninth
+nio
+nis
+nitems
+nl
+nlen
+nlevel
+nlnld
+nm
+nmembers
+nmenus
+nn
+nntp
+no
+noCaches
+noDelay
+noEvents
+nobody
+nocerts
+node
+nodes
+noise
+noisily
+noisy
+nojit
+nomenclature
+non
+nonBlank
+nonIdentityTx
+nonPublicLoader
+nonSerializable
+nonZeroDigitSeen
+none
+nonempty
+nonetheless
+nonexistent
+noninvertible
+nonmenu
+nonnegative
+nonor
+nonpositive
+nonprimality
+nonreachable
+nonsense
+nonstandard
+nonterminating
+nonuniformity
+nonwithstanding
+nonzero
+noon
+noop
+nor
+normal
+normalization
+normalize
+normalizeMe
+normalized
+normalizedDayOfWeek
+normalizedGregorianCutover
+normalizer
+normalizes
+normalizing
+normally
+normalx
+norminal
+north
+northern
+not
+notANumber
+notBoundary
+notLegal
+notPrivileged
+notation
+notches
+note
+noted
+notes
+noteworthy
+nothing
+notice
+noticeably
+notification
+notifications
+notified
+notifies
+notify
+notifyAWTEventListeners
+notifyAll
+notifyAncestors
+notifyID
+notifyObservers
+notifyThreadBusy
+notifyThreadFree
+notifying
+noting
+notion
+november
+now
+nowhere
+np
+npd
+npoints
+npopups
+nport
+nps
+nr
+nread
+nrows
+nruns
+ns
+nsae
+nsd
+nsfe
+nsm
+nsme
+nspe
+nsz
+nt
+nth
+nthreads
+null
+nullInputStream
+nullPeer
+nullPersistenceDelegate
+nullPlusNonNullIsNull
+nullPrintStream
+nullability
+nullable
+nullary
+nulled
+nullness
+nulls
+nullsAreSortedAtEnd
+nullsAreSortedAtStart
+nullsAreSortedHigh
+nullsAreSortedLow
+num
+numBits
+numBuckets
+numBuffers
+numBytes
+numBytesToTransfer
+numCategories
+numChars
+numColGroups
+numCols
+numDigits
+numFields
+numGlyphs
+numGot
+numGroups
+numIfaces
+numInts
+numLeadingZeros
+numListening
+numMoved
+numNegZeros
+numNew
+numObjFields
+numOfStaticProviders
+numPrimFields
+numPunct
+numRequested
+numRows
+numWords
+numZeros
+number
+numberElements
+numberFormat
+numberOfColumns
+numberPatterns
+numbered
+numbering
+numbers
+numbytes
+numchars
+numeral
+numerator
+numerators
+numeric
+numericToTextFormat
+numerical
+numerically
+numerous
+numerrors
+nval
+nzeros
+o
+o1
+o2
+oa
+ob
+obejct
+obey
+obeyCount
+obeying
+obeys
+obj
+objBytes
+objHandle
+objHandles
+objIn
+objOut
+objVals
+objcopy
+object
+objectEquals
+objectLocale
+objectStart
+objectURL
+objectUrl
+objects
+objectst
+objs
+oblique
+obs
+obscure
+obscured
+obscures
+observable
+observations
+observe
+observed
+observer
+observers
+observes
+obsolete
+obsoleted
+obtain
+obtainable
+obtained
+obtaining
+obtains
+obvious
+obviously
+occasionally
+occupied
+occupies
+occupy
+occupying
+occur
+occurances
+occured
+occurence
+occurences
+occuring
+occurred
+occurrence
+occurrences
+occurring
+occurs
+ococi
+octal
+octet
+octets
+october
+odd
+oddMod
+oddModPow
+oddPart
+odds
+oe
+of
+ofCalendarField
+off
+offending
+offer
+offered
+offers
+office
+official
+officially
+offscreen
+offset
+offset1
+offset2
+offsetMillis
+offsetNumber
+offsets
+offsetting
+often
+ogonek
+oins
+ois
+ok
+okKey
+okToUseGui
+okay
+ol
+old
+oldActiveWindow
+oldArgs
+oldC
+oldCapacity
+oldChar
+oldChildren
+oldChoice
+oldClass
+oldColor
+oldData
+oldDesc
+oldExp
+oldFocusCycleRoot
+oldFocusOwner
+oldFocusTraversalKeysEnabled
+oldFocusable
+oldFocusableWindowState
+oldFocusedWindow
+oldFont
+oldGet
+oldGetExp
+oldHandle
+oldHeight
+oldHour
+oldI
+oldIndex
+oldInstance
+oldJ
+oldKey
+oldKeys
+oldL
+oldMap
+oldMask
+oldMaxOffset
+oldMinDigits
+oldMode
+oldO
+oldObj
+oldPermanentFocusOwner
+oldPolicy
+oldPut
+oldResizable
+oldRow
+oldRowNum
+oldRules
+oldRunAttributeValues
+oldRunAttributes
+oldSize
+oldStart
+oldStartValue
+oldState
+oldStm
+oldTable
+oldTableSize
+oldTarget
+oldTitle
+oldUnitsInUse
+oldV
+oldVal
+oldValue
+oldValues
+oldWidth
+oldX
+oldY
+olde
+older
+oldest
+oldfont
+oldjavac
+oldl
+oldp
+omit
+omitLF
+omits
+omitted
+omorm
+on
+onKeyRelease
+onStroke
+once
+one
+oneDown
+oneFieldInfo
+oneMethodInfo
+ones
+onesLost
+ongoing
+only
+onset
+onto
+onward
+onwards
+ooffset
+oome
+oonnection
+oops
+oos
+op
+opaque
+opaquePart
+opcode
+opd
+open
+openAppend
+openBracket
+openConnection
+openDatagramChannel
+openPipe
+openSelector
+openServerSocketChannel
+openSocketChannel
+openStream
+opened
+opening
+operand
+operands
+operate
+operated
+operating
+operation
+operations
+operator
+operators
+opgretion
+opinion
+opmasks
+oppStroke
+opportunity
+opposed
+opposite
+oppositeComp
+oppositeWindow
+ops
+opt
+optID
+optimal
+optimally
+optimisation
+optimization
+optimizations
+optimize
+optimized
+optimizing
+option
+optional
+optionally
+options
+or
+orEventMasks
+orange
+order
+ordered
+ordering
+orderings
+orderly
+orders
+ordinal
+ordinary
+ordinaryChar
+ordinaryChars
+ordinate
+ore
+ored
+org
+organization
+organizations
+organize
+organized
+orginal
+orient
+orientation
+orientationRequested
+orientations
+oriented
+orig
+origin
+original
+originally
+originate
+originated
+originating
+origins
+origlength
+orori
+orphaned
+os
+ostream
+osw
+other
+otherBundle
+otherCurrencies
+otherCurrenciesDFD
+otherEntry
+otherIndexedReadMethod
+otherIndexedWriteMethod
+otherLen
+otherReadMethod
+otherWriteMethod
+otherkey
+otherref
+others
+othersDeletesAreVisible
+othersInsertsAreVisible
+othersUpdatesAreVisible
+otherwise
+otype
+otypes
+otypesPhrase
+oultine
+ouput
+our
+ourCause
+ourDriver
+ourThread
+ourself
+ourselves
+out
+outBuffer
+outCast
+outData
+outMark
+outOfBounds
+outOff
+outRas
+outSequence
+outSpan
+outStart
+outbuf
+outcode
+outcome
+outdated
+outer
+outerHandle
+outermost
+outgoing
+outline
+outlined
+outlines
+output
+outputFile
+outputIndex
+outputStatement
+outputValue
+outputs
+outputter
+outrageous
+outright
+outside
+outsideBorder
+outstanding
+outward
+oval
+over
+overall
+overallocated
+overdot
+overflow
+overflowed
+overflows
+overhead
+overidden
+overkill
+overlap
+overlapped
+overlaps
+overlay
+overline
+overload
+overloaded
+overloading
+overly
+overridable
+overridden
+override
+overrideAll
+overridePropertiesFile
+overriden
+overrides
+overriding
+overscore
+overshoot
+overstruck
+overvalue
+overwrite
+overwritten
+own
+ownDeletesAreVisible
+ownInsertsAreVisible
+ownIterator
+ownUpdatesAreVisible
+owned
+ownedInit
+ownedL
+ownedWindowK
+ownedWindowList
+ownedWindows
+owner
+ownerMode
+owners
+ownership
+owning
+owns
+p
+p1
+p2
+p5
+pData
+pDispose
+pIndex
+pItems
+pLimit
+pLong
+pMN
+pName
+pNativeFont
+pSOrder
+pTOrder
+pa
+pac
+pack
+packRules
+packTimes
+package
+package2certs
+packageAccess
+packageAccessValid
+packageAssertionStatus
+packageDefinition
+packageDefinitionValid
+packageEnabled
+packageEquals
+packageName
+packagePrefix
+packagePrefixIter
+packagePrefixList
+packages
+packed
+packet
+packetAddress
+packets
+packing
+pad
+padded
+padding
+pads
+pae
+page
+pageAttributes
+pageIncrement
+pageRanges
+pageSize
+paged
+pages
+painValue
+paint
+paintAll
+paintComponents
+paintHeavyweightComponents
+paintValue
+paintable
+painted
+painting
+paints
+pair
+pairing
+pairs
+palBuf
+palatalized
+palette
+pals
+pane
+paneSize
+panel
+panels
+panes
+panic
+papan
+paper
+paradigm
+paragraph
+paragraphBreak
+paragraphLength
+parallel
+parallelism
+param
+paramGenSpi
+paramIndex
+paramSpec
+paramSpi
+paramString
+paramTypes
+parameter
+parameterDescriptors
+parameterIndex
+parameterModeIn
+parameterModeInOut
+parameterModeOut
+parameterModeUnknown
+parameterName
+parameterNoNulls
+parameterNullable
+parameterNullableUnknown
+parameterTypes
+parameterize
+parameterized
+parameters
+parametric
+params
+paramter
+paramters
+pararm
+parenStack
+parenheses
+parent
+parentKeys
+parentMap
+parentOf
+parentValue
+parentheses
+parenthesis
+parents
+parsable
+parse
+parseAmbiguousDatesAsAfter
+parseAuthority
+parseByte
+parseCustomTimeZone
+parseDouble
+parseFloat
+parseHierarchical
+parseHostname
+parseIPv4Address
+parseIPv6Reference
+parseInfo
+parseInt
+parseIntegerOnly
+parseLong
+parseNumber
+parseNumbers
+parseObject
+parsePort
+parsePosition
+parseRule
+parseServer
+parseServerAuthority
+parseShort
+parseSignature
+parseSpecs
+parseString
+parseURL
+parsed
+parsedDate
+parsedStr
+parseflags
+parser
+parsers
+parses
+parsing
+part
+partial
+partialWord
+partially
+participate
+participating
+particular
+particularly
+parties
+partition
+partly
+parts
+party
+pas
+pass
+passHandle
+passed
+passes
+passesLucasLehmer
+passesMillerRabin
+passing
+passwd
+password
+passwords
+past
+patch
+patents
+path
+pathClosed
+pathSeparator
+pathSeparatorChar
+pathname
+pathnames
+pathological
+paths
+pattern
+patternCharIndex
+patternChars
+patternOffset
+patternSeparator
+patterns
+pattform
+pause
+paused
+pay
+pays
+pc
+pcerts
+pchar
+pcl
+pd
+pd2
+pdMapping
+pdVector
+pdcache
+pdp
+pds
+pdt
+pear
+peek
+peekByte
+peekData
+peekEvent
+peekPacket
+peekPort
+peekable
+peekb
+peekc
+peeked
+peer
+peerFont
+peers
+pen
+penalty
+pending
+pendingChars
+people
+per
+perMill
+percent
+percentage
+percentages
+perfect
+perfection
+perfectly
+perform
+performance
+performed
+performing
+performs
+perhaps
+period
+periodStartDayOfWeek
+periods
+perm
+perm1
+perm2
+permClass
+permanent
+permanentFocusOwner
+permanently
+permill
+permille
+permissible
+permission
+permissionimpl
+permissions
+permissive
+permit
+permits
+permitted
+perms
+permset
+permssible
+permutations
+permute
+permutes
+perpendicular
+perpendicularly
+persist
+persistence
+persistenceDelegate
+persistent
+person
+personal
+perspective
+pertaining
+pertains
+pertinent
+perturb
+peseta
+pg
+phantom
+phase
+phaseOneLength
+phaseOneStart
+phaseTwo
+phases
+pheight
+phrase
+physical
+physically
+pi
+pick
+picked
+picking
+picture
+pid
+piece
+pieces
+pin
+pinDayOfMonth
+pinfo
+pink
+pinning
+pins
+pipe
+piped
+pipelines
+pipes
+pixel
+pixelization
+pixels
+pixels_diff
+pixmap
+pixmaps
+pkg
+pkg1
+pkg2
+pkgName
+pkgname
+pkgs
+plVector
+place
+placed
+placeholder
+placeholders
+placement
+places
+placing
+plaf
+plain
+plain01
+plainTextFlavor
+plan
+plane
+planes
+planet
+planning
+plans
+plant
+platform
+platforms
+play
+playback
+playing
+please
+plpol
+pluggable
+plugged
+plurals
+plus
+pm
+pmenu
+pname
+png
+po
+poJ
+poN
+point
+pointPos
+pointSize
+pointed
+pointer
+pointers
+pointing
+points
+pointsize
+pointwise
+polar
+policies
+policy
+policyDomain
+policyPerms
+policy_class
+political
+poll
+pollfd
+poly
+polygon
+polygons
+polymorphic
+polymorphism
+pool
+poor
+pop
+popped
+popping
+popular
+populate
+populateListenerArray
+populated
+populating
+popup
+popups
+porpoise
+port
+port1
+port2
+portability
+portable
+porting
+portion
+portions
+portnumber
+portrait
+portrange
+ports
+pos
+posConst
+posPrefixPattern
+posSuffixPattern
+pos_pattern
+poses
+position
+positionInCache
+positional
+positioned
+positioning
+positions
+positive
+positivePrefix
+positivePrefixFieldPositions
+positiveSuffix
+positiveSuffixFieldPositions
+positon
+posn
+possessed
+possesses
+possessing
+possibilities
+possibility
+possible
+possibleBreakPositions
+possiblity
+possibly
+post
+postAccept
+postEvent
+postEventPrivate
+postJwrd
+postNum
+postProcessKeyEvent
+postWeeks
+postWindowEvent
+postal
+postamble
+posted
+posting
+postion
+postprocessing
+posts
+postsOldMouseEvents
+postscript
+posture
+potential
+potentialNaN
+potentially
+pound
+pounds
+pow
+pow10
+pow2
+power
+powers
+powersOf2
+pp
+pr
+prFirst
+prJ
+prLast
+prN
+prStr
+practical
+practically
+practice
+practise
+pre
+preDispatchKeyEvent
+preJwrd
+preMidNum
+preNum
+preProcessKeyEvent
+preSecIgnore
+preWeeks
+preamble
+preambleWritten
+precautions
+precede
+preceded
+precedence
+precedent
+precedes
+preceding
+preceeded
+precipitated
+precise
+precisely
+precision
+precisions
+precompilation
+precompiled
+precompiling
+precomposed
+precompute
+precomputed
+preconditions
+predates
+predecessor
+predefined
+predicate
+predictable
+predicted
+preexisting
+prefSize
+prefer
+preferIPv6Address
+preferIPv6Addresses
+preferable
+preference
+preferences
+preferentially
+preferrable
+preferred
+preferredHeight
+preferredLayoutSize
+preferredSize
+preferredWidth
+prefers
+prefetching
+prefix
+prefixLength
+prefixed
+prefixes
+prefixing
+prematurely
+premultiplied
+premunge
+preparation
+prepare
+prepareCall
+prepareImage
+prepareStatement
+prepared
+prepares
+prepend
+prepended
+preprocessed
+prescan
+prescribed
+presence
+present
+presentation
+presented
+presenting
+presents
+preserve
+preserved
+preserves
+preserving
+press
+pressed
+pressedReleasedID
+presses
+pressing
+presumably
+presume
+presumed
+pretty
+prev
+prevCh
+prevChar
+prevContractChar
+prevDoy
+prevMonthLen
+prevMonthLength
+prevc
+prevent
+prevented
+preventing
+prevents
+previous
+previousDouble
+previousIndex
+previousQueue
+previousSafePosition
+previously
+pri
+priamry
+primClasses
+primDataSize
+primResult
+primVals
+primality
+primarily
+primary
+primaryCatalog
+primaryOrder
+primarySchema
+primaryTable
+prime
+primeToCertainty
+primer
+primes
+primitive
+primitiveLeftShift
+primitivePersistenceDelegate
+primitiveRightShift
+primitiveType
+primitiveTypeFor
+primitiveTypeName
+primitives
+primordial
+primtitive
+principal
+principals
+principle
+print
+printAll
+printAt
+printCertificates
+printClassName
+printComponents
+printEachBackward
+printEachForward
+printFirst
+printHeavyweightComponents
+printIdentity
+printKeys
+printLast
+printQuality
+printStackTrace
+printStackTraceAsCause
+printWordList
+printable
+printed
+printer
+printerResolution
+printers
+printing
+printingThreads
+println
+printout
+printouts
+prints
+prio
+prior
+priori
+priorities
+priority
+pristine
+priv
+privacy
+private
+privateKey
+privatekey
+privately
+privates
+privilege
+privileged
+privilegedConnect
+privilegedContext
+privileges
+privilige
+privs
+prng
+probability
+probable
+probablePrime
+probably
+probe
+probes
+probing
+problem
+problematic
+problems
+proccess
+procedure
+procedureColumnIn
+procedureColumnInOut
+procedureColumnOut
+procedureColumnResult
+procedureColumnReturn
+procedureColumnUnknown
+procedureNamePattern
+procedureNoNulls
+procedureNoResult
+procedureNullable
+procedureNullableUnknown
+procedureResultUnknown
+procedureReturnsResult
+procedures
+proceed
+proceeds
+process
+processActionEvent
+processAdjustmentEvent
+processChar
+processComponentEvent
+processContainerEvent
+processDropTargetEvent
+processEvent
+processFocusEvent
+processHierarchyBoundsEvent
+processHierarchyEvent
+processInputMethodEvent
+processItemEvent
+processKeyEvent
+processMouseEvent
+processMouseMotionEvent
+processMouseWheelEvent
+processQueue
+processSection
+processSubstitution
+processTextEvent
+processWindowEvent
+processWindowFocusEvent
+processWindowStateEvent
+processed
+processes
+processing
+processor
+processors
+prod
+produce
+produced
+producer
+produces
+producing
+product
+productiive
+production
+products
+program
+programatic
+programmable
+programmatic
+programmatically
+programmer
+programmers
+programming
+programs
+progress
+progression
+progressively
+prohibited
+prohibition
+prohibitions
+prohibitively
+prohibits
+projection
+proleptic
+prolong
+promised
+promote
+promoting
+prompt
+prompting
+promptly
+prone
+pronunciation
+prop
+propFile
+propName
+propPrefix
+propURL
+propValue
+propagate
+propagated
+propagates
+propagating
+propagation
+propagationId
+proper
+properly
+properties
+property
+propertyChange
+propertyChangeSource
+propertyChangeSupportSerializedDataVersion
+propertyDescriptors
+propertyEditor
+propertyEditorClass
+propertyName
+propertyNames
+propertyType
+propname
+proportion
+proportional
+proportionally
+proposed
+proprietary
+props
+propsFile
+protcol
+protect
+protected
+protecting
+protection
+protectionDomain
+protects
+protocol
+protocolPathProp
+protocolname
+protocols
+prototype
+prototypical
+prov
+provClass
+prove
+provide
+provided
+provider
+providerMasterClassNames
+providerName
+providerPropertiesCache
+providers
+provides
+providing
+provoked
+provs
+proxied
+proxies
+proxy
+proxyEnableEvents
+proxyPersistenceDelegate
+prune
+ps
+pseudo
+pseudocode
+pseudomedian
+pseudorandom
+pseudorandomly
+pskip
+pspus
+pst
+pstmt
+pt
+pt1
+pt2
+ptDstOrigin
+ptSize
+ptSrcOrigin
+ptpor
+pub
+public
+publicConstructors
+publicFields
+publicKey
+publicMethods
+publickey
+publicly
+published
+publisher
+puff
+puffin
+pull
+pulled
+pump
+pumpApprovedKeyEvents
+pumpEvents
+pumpOneEvent
+pumped
+pumping
+pumps
+punct
+punctuation
+punt
+pure
+purely
+purge
+purgeStampedEvents
+purged
+purple
+purported
+purpose
+purposefully
+purposes
+push
+pushBack
+pushback
+pushbuttons
+pushed
+pushedBack
+pushes
+put
+putAll
+putAllProviderProperties
+putBoolean
+putBundleInCache
+putByte
+putCachedRaster
+putChar
+putCharB
+putCharL
+putCharsets
+putDouble
+putDoubleB
+putDoubleL
+putFields
+putFloat
+putFloatB
+putFloatL
+putInt
+putIntB
+putIntL
+putLong
+putLongB
+putLongL
+putObject
+putProviderProperty
+putShort
+putShortB
+putShortL
+puts
+putting
+pwidth
+px
+py
+q
+q2
+qWord
+qhat
+qm
+qrem
+quad
+quadTo
+quadratic
+qualified
+qualifier
+qualifierNames
+qualifiers
+qualify
+qualifying
+qualitatively
+qualities
+quality
+quantified
+quantities
+quantity
+quarto
+queried
+queries
+query
+queryOnly
+queryStart
+querying
+question
+questionable
+questions
+queue
+queueJob
+queuePrintJob
+queues
+quick
+quickCheckMemberAccess
+quickly
+quicksort
+quicksorts
+quietly
+quite
+quo
+quoRemIteration
+quot
+quotation
+quote
+quoteChar
+quoteCharacters
+quoted
+quotes
+quotient
+quoting
+quque
+r
+r1
+r2
+r2d
+rValue
+race
+radians
+radiation
+radic
+radius
+radix
+radixes
+raise
+raised
+raises
+raising
+random
+randomBits
+randomBytes
+randomBytesUsed
+randomNumberGenerator
+randomenss
+randomize
+randomly
+randomness
+range
+rangeCheck
+rangeError
+rangeLimit
+rangeStart
+ranger
+ranges
+ranging
+rapid
+rapidly
+rare
+rarely
+ras
+rast
+raster
+rate
+rather
+ratio
+rational
+rats
+raw
+rawOffset
+rawYear
+rawoffset
+rb
+rbName
+rbs
+rceil
+re
+reach
+reachable
+reached
+reaches
+reaching
+reacts
+read
+read0
+read1
+readAheadLimit
+readArray
+readAsciiStream
+readBigDecimal
+readBinaryStream
+readBlob
+readBlockHeader
+readBoolean
+readBooleans
+readByte
+readBytes
+readChar
+readCharacterStream
+readChars
+readClass
+readClassDesc
+readClassDescriptor
+readClob
+readDate
+readDesc
+readDictionaryFile
+readDisplayPixels
+readDisplayPixelsPermission
+readDouble
+readDoubles
+readExternal
+readExternalData
+readFatalException
+readFields
+readFileDescriptor
+readFloat
+readFloats
+readFully
+readHandle
+readInt
+readInts
+readJavaFormatString
+readLine
+readLocation
+readLong
+readLongUTF
+readLongs
+readMethod
+readNonProxy
+readNonProxyDesc
+readNull
+readObject
+readObject0
+readObjectMethod
+readObjectNoData
+readObjectNoDataMethod
+readObjectOverride
+readOnly
+readOrdinaryObject
+readProxyDesc
+readRef
+readResolve
+readResolveMethod
+readSQL
+readSerialData
+readShort
+readShorts
+readSide
+readSocksReply
+readSql
+readStreamHeader
+readString
+readTime
+readTimestamp
+readTreeSet
+readTypeString
+readURL
+readUTF
+readUTFBody
+readUTFChar
+readUTFSpan
+readUnshared
+readUnsignedByte
+readUnsignedShort
+readability
+readable
+reader
+readers
+readiness
+reading
+readjust
+readjusted
+readlimit
+readlong
+readonly
+reads
+ready
+readyMask
+real
+realCopy
+realOppositeComponent
+realOppositeWindow
+realSize
+realValue
+real_end
+realized
+realizes
+reallocate
+reallocated
+reallocation
+really
+reallyBig
+realm
+reaper
+reaping
+reason
+reasonable
+reasonably
+reasons
+reassign
+reassigning
+rebalance
+rebalancings
+rebind
+rebooted
+rebound
+rebuilding
+recalculate
+recalculateUnitsInUse
+recall
+recap
+recast
+receipt
+receive
+received
+receivedLast
+receiver
+receives
+receiving
+recent
+recently
+recipient
+recipients
+reciprocal
+reciprocity
+reclaim
+reclaimed
+recognition
+recognizable
+recognize
+recognized
+recognizer
+recognizes
+recognizing
+recommend
+recommendation
+recommendations
+recommended
+recommends
+recompile
+recomputation
+recompute
+recomputed
+recomputes
+reconcile
+reconciled
+reconciliation
+reconciling
+reconfigured
+reconnected
+reconsituted
+reconstitute
+reconstituted
+reconstruct
+reconstructed
+reconstructing
+recopy
+record
+recordAccess
+recordIdentity
+recorded
+records
+recouped
+recourse
+recover
+recoverable
+recovered
+recovering
+recovers
+recreatable
+recreate
+recreated
+rect
+rectanglar
+rectangle
+rectangles
+rectangular
+rects
+recur
+recurring
+recurse
+recurses
+recursion
+recursionProtection
+recursive
+recursively
+recv
+recycle
+recycling
+red
+redLevel
+redSlider
+redc
+redefined
+redirect
+redirected
+redirects
+redispatchEvent
+redo
+redraw
+redrawn
+redrawrate
+reduce
+reduced
+reduces
+reducing
+reduction
+redundancy
+redundant
+redundantly
+ref
+ref1
+ref2
+refer
+refered
+reference
+referenceable
+referenced
+references
+referencing
+referent
+referred
+referring
+refers
+refetch
+refetched
+refill
+refilled
+refine
+refined
+reflFactory
+reflect
+reflected
+reflecting
+reflection
+reflectionFactory
+reflective
+reflectively
+reflector
+reflectors
+reflects
+reflexive
+refresh
+refreshRate
+refreshRow
+refreshed
+refs
+refuse
+refused
+refuses
+regChars
+regLock
+reg_name
+regain
+regains
+regard
+regarded
+regarding
+regardless
+regenerate
+regenerated
+regex
+regexp
+regexps
+region
+regionMatches
+regions
+register
+registerConstructor
+registerConstructorWithBadEqual
+registerDriver
+registerEditor
+registerNatives
+registerOutParameter
+registerSubclass
+registerValidation
+registered
+registering
+registers
+registration
+registrations
+registry
+regular
+regularly
+rehash
+rehashed
+rehashing
+reimplemented
+reimplementing
+reinitialize
+reinitialized
+reinserted
+reinstate
+reject
+rejected
+rejects
+rejoin
+rel
+relDow
+relDowJan1
+relate
+related
+relates
+relating
+relation
+relational
+relations
+relationship
+relative
+relatively
+relativization
+relativize
+relativized
+relativizing
+relaxation
+relaxing
+release
+releaseExpressionCache
+releaseFD
+releaseSavepoint
+released
+releases
+releasing
+relevant
+relevantAttributes
+reliable
+reliably
+relies
+relinquish
+relinquishes
+reload
+reloadProviders
+reloaded
+reloads
+relocation
+rely
+relying
+rem
+remLong
+remValue
+remain
+remainder
+remaining
+remains
+remap
+remember
+remembered
+remembering
+remembers
+remind
+remote
+remotely
+removable
+removal
+removals
+remove
+removeAWTEventListener
+removeAccessibleSelection
+removeActionListener
+removeAdjustmentListener
+removeAll
+removeAllElements
+removeCertificate
+removeComponentListener
+removeConstraints
+removeContainerListener
+removeDots
+removeElement
+removeElementAt
+removeEntry
+removeEntryForKey
+removeFirst
+removeFocusListener
+removeFocusRequest
+removeFooListener
+removeFredListener
+removeFromCache
+removeFromFrameList
+removeHierarchyBoundsListener
+removeHierarchyListener
+removeIdentity
+removeIdentityCertificate
+removeImage
+removeInputMethodListener
+removeInternal
+removeItemListener
+removeKeyEventDispatcher
+removeKeyEventPostProcessor
+removeKeyListener
+removeLast
+removeLayoutComponent
+removeListenerMethod
+removeListenerMethodName
+removeMapping
+removeMethod
+removeMethodName
+removeMin
+removeMouseListener
+removeMouseMotionListener
+removeMouseWheelListener
+removeNoInvalidate
+removeNotify
+removeOwnedWindow
+removeProperty
+removePropertyChangeListener
+removeProvider
+removeProviderProperty
+removeRange
+removeReferences
+removeShutdownHook
+removeSourceEvents
+removeTextListener
+removeVetoableChangeListener
+removeWindowFocusListener
+removeWindowListener
+removeWindowStateListener
+removed
+removes
+removing
+rename
+renameTo
+renaming
+render
+renderable
+rendered
+renderer
+renderers
+rendering
+renderingimage
+renderings
+renders
+rendershape
+rendertext
+renormalized
+renumber
+reopened
+reorder
+reorderVisually
+reordered
+reordering
+reorganizes
+rep
+repCl
+repaint
+repaints
+repair
+repeat
+repeatable
+repeated
+repeatedly
+repeating
+repeats
+repectively
+repetitive
+replace
+replaceAll
+replaceItem
+replaceKeyboardFocusManager
+replaceKeyboardFocusManagerPermission
+replaceObject
+replaceRange
+replaceText
+replaceWith
+replaceable
+replaced
+replacement
+replaces
+replacing
+replacment
+replicate
+replicated
+replicating
+reply
+repopulation
+report
+reported
+reporting
+reports
+reposition
+repositioning
+repositions
+repository
+represent
+representable
+representaion
+representation
+representations
+representative
+representatives
+represented
+representing
+represention
+represents
+reprocess
+reproduce
+reproducibility
+reps
+reqires
+request
+requestFocus
+requestFocusHelper
+requestFocusInWindow
+requestPasswordAuthentication
+requestPermission
+requested
+requestedSize
+requester
+requesting
+requestingHost
+requestingPort
+requestingPrompt
+requestingProtocol
+requestingScheme
+requestingSite
+requestor
+requests
+require
+requireServerAuthority
+required
+requirement
+requirements
+requires
+requiresBidi
+requiring
+reraise
+reread
+rereads
+res
+resName
+resampling
+rescale
+rescaling
+reschedule
+rescheduleMin
+reschedules
+resemble
+resembling
+reserve
+reserved
+reset
+resetGC
+resetProviderIndex
+resetSyntax
+resets
+resetting
+reshape
+reshaped
+reshapes
+reshaping
+reside
+resident
+resides
+residing
+residue
+residues
+resilient
+resizable
+resize
+resized
+resizes
+resizing
+resolution
+resolutions
+resolutuion
+resolve
+resolveClass
+resolveClass0
+resolveName
+resolveObject
+resolveParent
+resolvePath
+resolveProxyClass
+resolved
+resolves
+resolving
+resort
+resource
+resourceName
+resources
+resp
+respect
+respected
+respective
+respectively
+respects
+respond
+responds
+response
+responseCode
+responseMessage
+responses
+responsibility
+responsible
+responsiblity
+rest
+restart
+restarted
+resting
+restore
+restoreFocus
+restored
+restores
+restoring
+restrict
+restricted
+restriction
+restrictions
+restrictive
+result
+result2
+resultArray
+resultLen
+resultMag
+resultOffset
+resultSetConcurrency
+resultSetHoldability
+resultSetType
+resultType
+resultant
+resulted
+resulting
+results
+resume
+resume0
+resumed
+resumes
+resupplied
+resurrection
+ret
+retDelims
+retType
+retVal
+retain
+retainAll
+retained
+retarget
+retargetFocusEvent
+retargetMouseEvent
+retargeted
+retargeting
+rethrow
+rethrown
+retransmitted
+retrieval
+retrieve
+retrieveDirectives
+retrieved
+retrieves
+retrieving
+retrofitted
+retroflex
+retry
+return
+returnDelims
+returnList
+returnType
+returnVal
+returned
+returning
+returns
+retval
+reuqires
+reuse
+reused
+reusing
+rev
+revalidate
+revealing
+reveals
+reverse
+reverseColumnMap
+reverseOrder
+reversed
+reverses
+reversible
+reversions
+revert
+reverting
+review
+revised
+revisited
+rewind
+rewinding
+rewinds
+rewritten
+rf
+rfc
+rfc2068
+rfc2278
+rfc2279
+rfc2373
+rfc2396
+rfc2732
+rfc2781
+rfloor
+rfoe
+rgb
+rgb1
+rgb2
+rgba
+rgbs
+rh
+rhs
+rid
+right
+rightIndex
+rightNow
+rightOf
+rightShift
+rightToLeft
+rightmost
+rights
+rigorously
+rigth
+ring
+ringing
+rint
+risking
+risks
+risky
+rl
+rlen
+rlm
+rmi
+rmiTOC
+rmiregistry
+rmroh
+rnd
+rnrun
+rogue
+role
+roll
+rollback
+rollbacks
+rolled
+rolling
+rolls
+roman
+room
+root
+rootAncestor
+rootAncestorRootAncestor
+rootEntry
+rootEntryDirectory
+rootEntryOffset
+rootGroup
+rooted
+roots
+roron
+rotate
+rotate1
+rotate2
+rotateLeft
+rotateRight
+rotated
+rotates
+rotating
+rotation
+roughly
+round
+roundDir
+rounded
+rounding
+roundingMode
+roundoff
+rounds
+roundup
+route
+routed
+router
+routine
+routines
+row
+rowDeleted
+rowEnd
+rowHeader
+rowHeights
+rowIndex
+rowIndexFlags
+rowIndexFlagsIndex
+rowIndexShifts
+rowInserted
+rowNum
+rowNumMap
+rowStart
+rowUpdated
+rowWeights
+rowa
+rowh
+rowincx
+rowincxerr
+rowincy
+rowincyerr
+rowrel
+rows
+rowsBeingUpdated
+rowsToFollow
+rowspan
+rowx
+rowxerr
+rowy
+rowyerr
+rs
+rsa
+rsmd
+rsrc
+rstart
+rtg
+ru
+rule
+ruleDay
+ruleDayOfMonth
+ruleDayOfWeek
+ruleMillis
+ruleMode
+ruleMonth
+ruleStart
+rules
+rulesName
+ruleset
+run
+runAllFinalizers
+runArraySize
+runAttributeValues
+runAttributes
+runAttrs
+runComponents
+runCount
+runDirection
+runFinalization
+runFinalization0
+runFinalizersOnExit
+runHooks
+runIndex
+runIndex1
+runIndex2
+runLimit
+runMoreFinalizers
+runOneComponent
+runStart
+runStarts
+runValues
+runnable
+running
+runs
+runsToCopy
+runtime
+rupee
+rurus
+rv
+rw
+rwkin
+rx
+rx1
+rx2
+ry
+ry1
+ry2
+rz
+s
+s1
+s2
+s3
+s4
+s5
+s6
+s7
+s8
+sFr
+sFr123
+sIndex
+sIter
+sOrder
+sRGB
+sStart
+sTemp
+sWeekdays
+sa
+sael
+safe
+safely
+safest
+safety
+said
+sake
+salutations
+same
+sameFile
+sample
+sampled
+samples
+sanity
+sasan
+sat
+satellite
+satisfactory
+satisfied
+satisfies
+satisfy
+saturation
+saturday
+save
+saveAT
+saveConvert
+saveEntry
+saveInternal
+saved
+savedCalendar
+savedTile
+savepoint
+savepoints
+saves
+saving
+savings
+saw
+sawDecimal
+sawDigit
+sawEarlyBreak
+sawExponent
+sawVarName
+saw_digit
+saw_xdigit
+sax
+saxParser
+say
+saying
+says
+sb
+sbVisStr
+sbuf
+sc
+scCutOverTimes
+scNewCurrencies
+scNewCurrenciesDFD
+scOldCurrencies
+scOldCurrenciesDFD
+scale
+scaled
+scales
+scaling
+scan
+scanByte
+scanEscape
+scanHexPost
+scanHexSeq
+scanIPv4Address
+scanToken
+scanline
+scanned
+scanning
+scans
+scattering
+scavenge
+scenario
+scenes
+sched
+schedule
+scheduleAtFixedRate
+scheduled
+scheduledExecutionTime
+schedules
+scheduling
+schema
+schemaPattern
+scheme
+schemeSpecificPart
+schemes
+school
+scientific
+scl
+sclSet
+scope
+scopeName
+scoped
+scopes
+scoping
+scratch
+screen
+screenBounds
+screenCapCM
+screenInsets
+screenRect
+screenSize
+screen_magnifier_present
+screens
+script
+scripts
+scroll
+scrollBars
+scrollPosition
+scrollabar
+scrollable
+scrollbar
+scrollbarDisplayPolicy
+scrollbarSerializedDataVersion
+scrollbarVisibility
+scrollbars
+scrollbarsAlwaysVisible
+scrolled
+scroller
+scrolling
+scrollpane
+sd
+sdde
+sdebug
+sdpStr
+sdsnd
+se
+seAsianSwapping
+seagull
+seal
+sealBase
+sealbase
+sealed
+sealing
+search
+searchHeavyweightChildren
+searchHeavyweightDescendants
+searchHeavyweights
+searchLen
+searchMergeList
+searchName
+searchPath
+searchResultsCache
+searchSieve
+searched
+searches
+searching
+searchstr
+sec
+secOrder
+secResult
+secSOrder
+secTOrder
+second
+secondColon
+secondDash
+secondString
+second_edition
+secondary
+secondaryOrder
+seconds
+secret
+secrets
+sect
+sectDirStart
+section
+sections
+sectorSize
+secure
+secureRandomSpi
+security
+securityPropFile
+see
+seeAllp
+seed
+seedGenerator
+seeded
+seeding
+seeing
+seek
+seeked
+seeking
+seeks
+seem
+seemed
+seemingly
+seems
+seen
+seencomma
+seendot
+sees
+segment
+segments
+segs
+sel
+select
+selectAll
+selectAllAccessibleSelection
+selectNow
+selectable
+selected
+selectedCheckbox
+selectedComponent
+selectedIndex
+selectedIndexes
+selectedIndices
+selectedKeys
+selecting
+selection
+selectionEnd
+selectionStart
+selections
+selectiveListener
+selectively
+selector
+selectors
+selects
+self
+selop
+semantic
+semantically
+semantics
+semi
+semicolon
+semicolons
+send
+sendMessage
+sendTo
+sendUrgentData
+sender
+sending
+sends
+sense
+senses
+sensible
+sensitive
+sensitivity
+sent
+sentence
+sentences
+sentinel
+sep
+separate
+separated
+separately
+separates
+separating
+separation
+separator
+separatorChar
+separatorIndex
+separators
+seperated
+seperation
+seperator
+seperators
+september
+sequence
+sequences
+sequential
+sequentially
+ser
+serName
+serex
+serial
+serialData
+serialField
+serialNum
+serialPersistendFields
+serialPersistentFields
+serialVersionOnStream
+serialVersionUID
+serializable
+serialization
+serialize
+serialized
+serializes
+serializing
+serially
+serialzied
+series
+serious
+serv
+serv_addr
+serve
+server
+serverChars
+servers
+serves
+service
+serviceName
+services
+serving
+session
+set
+set2DigitYearStart
+setA
+setAccessible
+setAccessibleDescription
+setAccessibleName
+setAccessibleParent
+setActionCommand
+setAddress
+setAlignment
+setAllowUserInteraction
+setAmPmStrings
+setArray
+setAsText
+setAsciiStream
+setAttributes
+setAutoCommit
+setAutoDelay
+setAutoWaitForIdle
+setBackground
+setBeanInfoSearchPath
+setBeginIndex
+setBigDecimal
+setBinaryStream
+setBit
+setBlob
+setBlockDataMode
+setBlockIncrement
+setBoolean
+setBound
+setBounds
+setBroadcast
+setByte
+setBytes
+setCaching
+setCalendar
+setCaps
+setCaretPosition
+setCatalog
+setCertificateEntry
+setChanged
+setChar
+setCharAt
+setCharacterStream
+setCheckBoxGroup
+setCheckboxGroup
+setChoices
+setClassAssertionStatus
+setClip
+setClob
+setColor
+setColumns
+setComponent
+setComponentOrientation
+setComposite
+setConstrained
+setConstraints
+setContentHandler
+setContentHandlerFactory
+setContextClassLoader
+setCopies
+setCopiesToDefault
+setCorners
+setCurrency
+setCurrencySymbol
+setCurrent
+setCurrentAccessibleValue
+setCurrentKeyboardFocusManager
+setCursor
+setCursorName
+setDSTSavings
+setDaemon
+setDash
+setDashT4
+setData
+setDataElements
+setDatagramSocketImplFactory
+setDate
+setDateFormatSymbols
+setDecimalFormatSymbols
+setDecimalSeparator
+setDecimalSeparatorAlwaysShown
+setDecomposition
+setDefault
+setDefaultAllowUserInteraction
+setDefaultAssertionStatus
+setDefaultAuthenticator
+setDefaultFocusTraversalKeys
+setDefaultFocusTraversalPolicy
+setDefaultPermission
+setDefaultRequestProperty
+setDefaultSelection
+setDefaultUseCaches
+setDesignTime
+setDesktopProperty
+setDestination
+setDialog
+setDigit
+setDirectory
+setDispatchingEventTime
+setDisplayMode
+setDisplayName
+setDoInput
+setDoOutput
+setDone
+setDouble
+setDropTarget
+setDynamicLayout
+setEOF
+setEchoChar
+setEchoCharacter
+setEditable
+setEditorSearchPath
+setElementAt
+setEnabled
+setEndIndex
+setEndRule
+setEras
+setErr
+setErr0
+setError
+setErrorIndex
+setEscapeProcessing
+setExceptionListener
+setExpert
+setExponentialSymbol
+setExtendedState
+setFactory
+setFetchDirection
+setFetchSize
+setField
+setFile
+setFileName
+setFileNameMap
+setFilenameFilter
+setFirstDayOfWeek
+setFloat
+setFocusCycleRoot
+setFocusTraversalKey
+setFocusTraversalKeys
+setFocusTraversalKeysEnabled
+setFocusTraversalKeys_NoIDCheck
+setFocusTraversalPolicy
+setFocusable
+setFocusableWindowState
+setFollowRedirects
+setFont
+setFoo
+setForeground
+setFormat
+setFormatByArgumentIndex
+setFormats
+setFormatsByArgumentIndex
+setFred
+setFromPage
+setFullScreenWindow
+setGlobalActiveWindow
+setGlobalCurrentFocusCycleRoot
+setGlobalFocusOwner
+setGlobalFocusedWindow
+setGlobalPermanentFocusOwner
+setGregorianChange
+setGroupingSeparator
+setGroupingSize
+setGroupingUsed
+setGuiAvailable
+setHelpMenu
+setHgap
+setHidden
+setHoldability
+setHours
+setID
+setIO
+setIconImage
+setIdentityInfo
+setIdentityPublicKey
+setIfModifiedSince
+setIfNotSet
+setIgnoreRepaint
+setImpl
+setImplicitDownCycleTraversal
+setIn
+setIn0
+setInDefaultEventSet
+setIndex
+setIndexedReadMethod
+setIndexedWriteMethod
+setInfinity
+setInfo
+setInputStream
+setInstanceFollowRedirects
+setInt
+setInterface
+setInternalPersistenceDelegate
+setInternationalCurrencySymbol
+setKeepAlive
+setKeyChar
+setKeyEntry
+setKeyPair
+setKeyValues
+setLabel
+setLastModified
+setLastModifiedTime
+setLayout
+setLength
+setLenient
+setLineIncrement
+setLineNumber
+setLocalPatternChars
+setLocale
+setLocation
+setLocationRelativeTo
+setLockingKeyState
+setLog
+setLogStream
+setLogWriter
+setLoginTimeout
+setLong
+setLoopbackMode
+setLoopingStates
+setMaxDelimChar
+setMaxFieldSize
+setMaxPage
+setMaxPriority
+setMaxRows
+setMaximizedBounds
+setMaximum
+setMaximumFractionDigits
+setMaximumInteger
+setMaximumIntegerDigits
+setMedia
+setMediaToDefault
+setMenuBar
+setMessageDigest
+setMethodName
+setMinPage
+setMinimalDaysInFirstWeek
+setMinimum
+setMinimumFractionDigits
+setMinimumIntegerDigits
+setMinusSign
+setMinutes
+setModal
+setMode
+setModifiers
+setMonetaryDecimalSeparator
+setMonochrome
+setMonth
+setMonths
+setMostRecentFocusOwner
+setMultipleDocumentHandling
+setMultipleDocumentHandlingToDefault
+setMultipleMode
+setMultipleSelections
+setMultiplier
+setNaN
+setName
+setNanos
+setNegativePrefix
+setNegativeSuffix
+setNetworkInterface
+setNextException
+setNextFocusableComponent
+setNextWarning
+setNull
+setNumberFormat
+setOOBInline
+setObjFieldValues
+setObject
+setOffset
+setOption
+setOrientation
+setOrientationRequested
+setOrientationRequestedToDefault
+setOrigin
+setOut
+setOut0
+setOwner
+setPackageAssertionStatus
+setPageIncrement
+setPageRanges
+setPaint
+setPaintMode
+setParameter
+setParent
+setParseIntegerOnly
+setPattern
+setPatternSeparator
+setPenDiameter
+setPenT4
+setPerMill
+setPercent
+setPersistenceDelegate
+setPolicy
+setPort
+setPositivePrefix
+setPositiveSuffix
+setPreferred
+setPrimFieldValues
+setPrintQuality
+setPrintQualityToDefault
+setPrinter
+setPrinterResolution
+setPrinterResolutionToDefault
+setPriority
+setPriority0
+setPropagationId
+setProperties
+setProperty
+setPropertyAttribute
+setPropertyEditorClass
+setProtectionDomain0
+setPublicKey
+setPureJavaPrintDialog
+setQueryTimeout
+setRaster
+setRawOffset
+setReadMethod
+setReadOnly
+setReceiveBufferSize
+setRect
+setRef
+setRenderingHint
+setRenderingHints
+setRequestMethod
+setRequestProperty
+setResizable
+setReuseAddress
+setRows
+setRunFinalizersOnExit
+setSavepoint
+setScale
+setScrollPosition
+setSeconds
+setSecurityManager
+setSecurityManager0
+setSeed
+setSelectedCheckbox
+setSelectionEnd
+setSelectionStart
+setSendBufferSize
+setShared
+setShort
+setShortDescription
+setShortMonths
+setShortWeekdays
+setShortcut
+setSides
+setSidesToDefault
+setSignerKeyPair
+setSigners
+setSize
+setSoLinger
+setSoTimeout
+setSocket
+setSocketAddress
+setSocketFactory
+setSocketImplFactory
+setSource
+setSpan
+setStartRule
+setStartYear
+setState
+setStateInternal
+setStatus
+setStream
+setStrength
+setString
+setStroke
+setStub
+setSystemScope
+setTTL
+setTarget
+setTcpNoDelay
+setText
+setTime
+setTimeInMillis
+setTimeToLive
+setTimeZone
+setTimestamp
+setTitle
+setToPage
+setToScale
+setTrafficClass
+setTransactionIsolation
+setTransform
+setTypeMap
+setURL
+setURLStreamHandlerFactory
+setUndecorated
+setUnicast
+setUnicodeStream
+setUnitIncrement
+setUseCaches
+setV4
+setValue
+setValueIsAdjusting
+setValues
+setVgap
+setVisible
+setVisibleAmount
+setWarningString
+setWeekCountData
+setWeekdays
+setWheelScrollingEnabled
+setWriteMethod
+setXORMode
+setXXX
+setXxx
+setYear
+setZeroDigit
+setZoneStrings
+setlogStream
+sets
+settable
+setter
+setterArgs
+setterName
+setting
+settings
+setup
+seuences
+seven
+seventeen
+seventh
+sever
+several
+severe
+sez
+sgn
+sgsag
+sh
+shadow
+shadowInner
+shadowOuter
+shall
+shallow
+shape
+shaped
+shaper
+shapes
+shaping
+sharable
+share
+shared
+sharedInstance
+shares
+sharing
+sharp
+shear
+sheared
+shearing
+sheet
+sheets
+shekel
+shell
+shft
+shift
+shiftBias
+shiftDown
+shiftLeft
+shiftRight
+shifted
+shifting
+shifts
+shipped
+short
+short0
+short1
+shortDescription
+shortMonths
+shortValue
+shortWeekdays
+shortcomings
+shortcut
+shortcuts
+shorted
+shorten
+shortened
+shortening
+shortens
+shorter
+shortest
+shorthand
+shorthanding
+shorts
+should
+shouldBother
+shouldEnable
+shouldFire
+shouldNativelyFocusHeavyweight
+shouldNotify
+shouldRoundUp
+shouldinvalidate
+shouldn
+show
+showDocument
+showExtension
+showStatus
+showType
+showWhiteSpace
+showWindowWithoutWarningBanner
+showed
+showing
+shown
+shows
+shrink
+shsrp
+shuffle
+shuffled
+shuffling
+shut
+shutIn
+shutOut
+shut_rd
+shut_wr
+shutdown
+shutdownHooks
+shutdownInput
+shutdownOutput
+shutdowns
+shuts
+shutting
+shx
+shy
+si
+sib
+sibling
+sic
+side
+sided
+sides
+sieve
+sieveSearch
+sieveSingle
+sieves
+sift
+sig
+sig1
+sig2
+sigBytes
+sigBytesCopy
+sigDiff
+sigSpi
+sigSpiClone
+sigh
+sigma1
+sign
+signAttribute
+signBit
+signInt
+signMask
+signSeen
+signal
+signaling
+signals
+signature
+signatures
+signbit
+signed
+signedAdd
+signedSubtract
+signedness
+signer
+signerCerts
+signers
+significance
+significand
+significant
+significantly
+signifies
+signifing
+signify
+signifying
+signing
+signingEngine
+signingKey
+signs
+signum
+sigs
+silent
+silently
+silly
+similar
+similarity
+similarly
+simluate
+simple
+simpleFormatter
+simpler
+simplest
+simplex
+simplicity
+simplified
+simplifies
+simplify
+simplifying
+simply
+simulate
+simulateException
+simulated
+simulating
+simultaneously
+sin
+sin6_flowinfo
+since
+sine
+single
+singleExpBias
+singleExpMask
+singleExpShift
+singleFractHOB
+singleFractMask
+singleMaxDecimalDigits
+singleMaxDecimalExponent
+singleMaxSmallTen
+singleMinDecimalExponent
+singleSignMask
+singleSmall10pow
+single_step
+singleton
+singletonList
+singletonMap
+singular
+sink
+sisin
+sit
+site
+sites
+sitting
+situation
+situations
+six
+sixteen
+sixth
+size
+sizeBeforeIntegerPart
+sizeCorrect
+sizeInBits
+sizeModCount
+sizePts
+sized
+sizeflag
+sizes
+skeletal
+skeleton
+skeletons
+skewed
+skip
+skipAssigned
+skipBlockData
+skipBuffer
+skipBytes
+skipCorrection
+skipCustomData
+skipDelimiters
+skipLF
+skipStack
+skipped
+skipping
+skips
+skslk
+slack
+slash
+slashCount
+slashSlashComments
+slashSlashCommentsP
+slashStarComments
+slashStarCommentsP
+slashes
+slate
+slave
+slaves
+sleep
+sleeping
+sleeps
+slen
+slice
+slicing
+slider
+slides
+sliding
+slight
+slightly
+slop
+slope
+slot
+slotDesc
+slots
+slow
+slower
+slowest
+slowing
+slows
+slslv
+slurp
+sm
+small
+small10pow
+small5pow
+smallPrime
+smallSieve
+smaller
+smallest
+smallestPositiveDouble
+smart
+smiles
+smooth
+smoothness
+smsmo
+smt
+sn
+snapshot
+snk
+snoop
+snsna
+so
+soc
+socket
+socketAccept
+socketAvailable
+socketBind
+socketClose0
+socketConnect
+socketCreate
+socketGetOption
+socketImpls
+socketInputStream
+socketListen
+socketRead0
+socketSendUrgentData
+socketSetOption
+socketShutdown
+socketWrite
+socketWrite0
+sockets
+socksPort
+socksProxyHost
+socksProxyPort
+soft
+software
+soh
+solar
+solaris
+sole
+solely
+solid
+some
+someCaller
+someFile
+someReflectionAPI
+somebody
+somehow
+somemethod
+someone
+someplace
+something
+sometimes
+somewhat
+somewhere
+somtimes
+son
+soon
+sophisticated
+sort
+sort1
+sort2
+sorted
+sorting
+sorts
+sosom
+sound
+sounds
+source
+sourceBean
+sourceClass
+sourceCount
+sourceCursor
+sourceDecomposition
+sourceIndex
+sourceOffset
+sourcePeer
+sourceSize
+sourceText
+sourceWords
+sources
+south
+southern
+sov
+sp
+space
+spaced
+spaces
+spacing
+span
+spanned
+spanning
+spans
+sparc
+spare
+spares
+sparring
+sparse
+spawn
+spb
+speaking
+spec
+specTitle
+specVendor
+specVersion
+specfied
+special
+specialSaveChars
+special_characters
+specialcasing
+specialization
+specializations
+specialize
+specialized
+specializes
+specially
+specifed
+specific
+specifically
+specification
+specifications
+specificed
+specifics
+specified
+specifier
+specifiers
+specifies
+specify
+specifyHandlerPerm
+specifyStreamHandler
+specifying
+specs
+spectitle
+specvendor
+specversion
+speed
+speeds
+spelled
+spent
+spf
+spi
+spill
+spine
+split
+splits
+splitting
+spoof
+spoofing
+spot
+spots
+sql
+sqlStateSQL99
+sqlStateXOpen
+sqlType
+sqrt
+sqsqi
+square
+squareToLen
+squares
+squaring
+squarings
+squirreled
+sr
+src
+srcActions
+srcArray
+srcBegin
+srcColorModel
+srcComponent
+srcEnd
+srcEvent
+srcName
+srcOffset
+srcRas
+srcSize
+src_position
+srcb
+srccolor
+srcpos
+srcs
+srsrp
+ss
+ssl
+ssp
+ssssw
+st
+stable
+stack
+stackSize
+stackTrace
+stacking
+stacks
+stage
+stages
+staging
+stale
+stall
+stamp
+stamp_a
+stamp_b
+stamps
+stand
+standalone
+standard
+standardEditorsPackage
+standardName
+standardProvider
+standardized
+standards
+standpoint
+stands
+stanford
+starlet
+starring
+start
+startAngle
+startBitIndex
+startBoundary
+startChar
+startClass
+startCompare
+startDate
+startDay
+startDayOfMonth
+startDayOfWeek
+startElement
+startIndex
+startLength
+startListeningForOtherDrags
+startLoad
+startMode
+startMonth
+startOffset
+startOffsets
+startPos
+startPosition
+startSearchForFirstChar
+startSearchForLastChar
+startTime
+startTimeMode
+startUnitIndex
+startValue
+startYear
+started
+starting
+startle
+starts
+startsWith
+startup
+startx
+starty
+stash
+stashed
+stat
+state
+state1
+state2
+stateClasses
+stateTable
+stated
+stateless
+statement
+statementCount
+statementList
+statements
+states
+statesToBackfill
+static
+staticCal
+staticLeapMonthLength
+staticMonthLength
+staticPermissions
+statically
+statics
+statistics
+statment
+status
+statusAll
+statusArray
+statusID
+statusIndex
+stay
+stays
+stdName
+stderr
+stderr_fd
+stderr_stream
+stdin
+stdin_fd
+stdin_stream
+stdout
+stdout_fd
+stdout_stream
+steal
+steals
+step
+steps
+sterling
+sthe
+stick
+sticky
+stickyRound
+still
+stillborn
+stipulation
+stipulations
+stitched
+stitches
+stm
+stmt
+stok
+stokes
+stolen
+stomp
+stop
+stop0
+stopClass
+stopDispatching
+stopDispatchingImpl
+stopDispatchingLater
+stopListeningForOtherDrags
+stopOrSuspend
+stopPostProcessing
+stopThread
+stopThreadPermission
+stopped
+stopping
+stops
+storage
+store
+stored
+stores
+storesLowerCaseIdentifiers
+storesLowerCaseQuotedIdentifiers
+storesMixedCaseIdentifiers
+storesMixedCaseQuotedIdentifiers
+storesUpperCaseIdentifiers
+storesUpperCaseQuotedIdentifiers
+storing
+str
+strLastChar
+strLastIndex
+strStyle
+strValue
+straddle
+straddling
+straight
+straightforward
+strange
+strangely
+strategies
+strategy
+stream
+streamHandlerLock
+streamed
+streaming
+streams
+strength
+strengthOrder
+strengthResult
+strengths
+stretch
+stretched
+stretches
+strftime
+strict
+strictKeyValueSeparators
+stricter
+strictfp
+strictly
+strikethroughOffset
+strikethroughThickness
+string
+stringFlavor
+stringID
+stringIndex
+stringList
+stringToExamine
+stringWidth
+stringbuffer
+strings
+strip
+stripLeadingZeroBytes
+stripLeadingZeroInts
+stripOffParameters
+stripped
+strive
+strlen
+stroes
+stroke
+stroked
+stroker
+stroking
+strong
+stronger
+strongly
+structural
+structurally
+structure
+structurec
+structured
+structures
+stsot
+stub
+study
+stuff
+stx
+style
+styles
+stylistic
+su
+sub
+subFormat
+subFormatter
+subIterator
+subList
+subLists
+subMap
+subN
+subParse
+subParseZoneString
+subSequence
+subSet
+subString
+subarray
+subcase
+subcategory
+subcl
+subclass
+subclassAudits
+subclassed
+subclassers
+subclasses
+subclassing
+subcomponent
+subcomponents
+subdirectories
+subdirectory
+subdivide
+subdivided
+subdivision
+subexpressions
+subformat
+subformatPattern
+subformats
+subgroup
+subgroups
+subimage
+subinterface
+subinterfaces
+subitems
+subject
+sublist
+sublists
+submap
+submenu
+submit
+subname
+subpackage
+subpackages
+subparse
+subpaths
+subpattern
+subpatterns
+subpixel
+subprocess
+subprotocol
+subqueries
+subquery
+subrange
+subranges
+subregion
+subs
+subscribe
+subscribes
+subscribing
+subsection
+subsequence
+subsequent
+subsequently
+subset
+subsets
+subsidiary
+subspace
+subst
+substFQType
+substType
+substTypeName
+substantially
+substitued
+substitute
+substituted
+substitution
+substitutionRule
+substitutions
+substr
+substract
+substream
+substring
+substrings
+subsystems
+subtle
+subtract
+subtracted
+subtracting
+subtraction
+subtracts
+subtree
+subtrees
+subtype
+subtypeName
+subtypes
+succeed
+succeeded
+succeeding
+succeeds
+succesfuly
+success
+successful
+successfully
+succession
+successive
+successively
+successor
+such
+suddenly
+suffer
+suffice
+suffices
+sufficient
+sufficiently
+suffix
+suffixes
+suggested
+suggestion
+suggestions
+suggests
+suicide
+suid
+suit
+suitable
+suited
+sum
+sum1
+sum2
+sum3
+summarizing
+summary
+sums
+sun
+sunday
+sunk
+sup
+super
+superBeanInfo
+superCl
+superClass
+superConnectServer
+superDesc
+superListening
+superRadix
+superType
+supercede
+superceded
+superclass
+superclasses
+superinterface
+superinterfaces
+supers
+supertable
+supertype
+supertypes
+supplemental
+supplementary
+supplemented
+supplements
+supplied
+supplies
+supply
+support
+supported
+supportedVersion
+supporting
+supports
+supportsANSI92EntryLevelSQL
+supportsANSI92FullSQL
+supportsANSI92IntermediateSQL
+supportsAlterTableWithAddColumn
+supportsAlterTableWithDropColumn
+supportsBatchUpdates
+supportsCatalogsInDataManipulation
+supportsCatalogsInIndexDefinitions
+supportsCatalogsInPrivilegeDefinitions
+supportsCatalogsInProcedureCalls
+supportsCatalogsInTableDefinitions
+supportsColumnAliasing
+supportsConvert
+supportsCoreSQLGrammar
+supportsCorrelatedSubqueries
+supportsCustomEditor
+supportsDataDefinitionAndDataManipulationTransactions
+supportsDataManipulationTransactionsOnly
+supportsDifferentTableCorrelationNames
+supportsExpressionsInOrderBy
+supportsExtendedSQLGrammar
+supportsFullOuterJoins
+supportsGetGeneratedKeys
+supportsGroupBy
+supportsGroupByBeyondSelect
+supportsGroupByUnrelated
+supportsIntegrityEnhancementFacility
+supportsLikeEscapeClause
+supportsLimitedOuterJoins
+supportsMinimumSQLGrammar
+supportsMixedCaseIdentifiers
+supportsMixedCaseQuotedIdentifiers
+supportsMultipleOpenResults
+supportsMultipleResultSets
+supportsMultipleTransactions
+supportsNamedParameters
+supportsNonNullableColumns
+supportsOpenCursorsAcrossCommit
+supportsOpenCursorsAcrossRollback
+supportsOpenStatementsAcrossCommit
+supportsOpenStatementsAcrossRollback
+supportsOrderByUnrelated
+supportsOuterJoins
+supportsPositionedDelete
+supportsPositionedUpdate
+supportsResultSetConcurrency
+supportsResultSetHoldability
+supportsResultSetType
+supportsSavepoints
+supportsSchemasInDataManipulation
+supportsSchemasInIndexDefinitions
+supportsSchemasInPrivilegeDefinitions
+supportsSchemasInProcedureCalls
+supportsSchemasInTableDefinitions
+supportsSelectForUpdate
+supportsStoredProcedures
+supportsSubqueriesInComparisons
+supportsSubqueriesInExists
+supportsSubqueriesInIns
+supportsSubqueriesInQuantifieds
+supportsTableCorrelationNames
+supportsTransactionIsolationLevel
+supportsTransactions
+supportsUnion
+supportsUnionAll
+supportsUrgentData
+suppose
+supposed
+suppress
+suppressed
+suppresses
+supradecimal
+supress
+sure
+surface
+surfaces
+surgery
+surprised
+surprises
+surprising
+surprisingly
+surrogate
+surrogates
+surrounded
+surrounding
+survive
+survived
+susceptible
+suspend
+suspend0
+suspended
+suspends
+suspension
+susun
+sval
+sver
+svswe
+swag
+swallow
+swallowing
+swap
+swapOrder
+swapped
+swapper
+swapping
+swing
+switch
+switched
+switches
+switching
+switchover
+swswa
+sx
+sx1
+sx2
+sy
+sy1
+sy2
+sychronization
+syllable
+syllables
+symbol
+symbolic
+symbols
+symmetric
+symmetry
+syn
+sync
+synch
+synched
+synchronization
+synchronize
+synchronized
+synchronizedCollection
+synchronizedList
+synchronizedMap
+synchronizedSet
+synchronizedSortedMap
+synchronizedSortedSet
+synchronizes
+synchronizing
+synchronous
+synchronously
+synonym
+syntactic
+syntactically
+syntax
+syntaxes
+synthesize
+synthesized
+synthetic
+sys_paths
+system
+systemClipboard
+systemColors
+systemCustomCursorDirPrefix
+systemCustomCursorProperties
+systemCustomCursorPropertiesFile
+systemCustomCursors
+systemNativeLibraries
+systems
+systime
+sytle
+sz
+t
+t0
+t1
+t2
+tExamining
+tFile
+tHeight
+tLong
+tOrder
+tT
+tValue
+tWeight
+tWidth
+ta
+tab
+table
+tableEntry
+tableIndex
+tableIndexClustered
+tableIndexHashed
+tableIndexOther
+tableIndexStatisic
+tableIndexStatistic
+tableNamePattern
+tables
+tabs
+tack
+tag
+tagged
+tagging
+tags
+tail
+tailMap
+tailSet
+tailor
+tailored
+take
+takeIPv4Address
+taken
+takes
+taking
+talk
+talking
+tall
+tampered
+tan
+tangent
+target
+targetBeanInfo
+targetChars
+targetClass
+targetCount
+targetCursor
+targetDecomposition
+targetEnter
+targetIndex
+targetLastEntered
+targetMethod
+targetOffset
+targetOver
+targetSet
+targetSize
+targetSqlType
+targetToAppContext
+targetToStatementList
+targetType
+targetWords
+targeted
+targeting
+targets
+tarray
+task
+taskFired
+tasks
+taste
+tat
+tatam
+taught
+tba
+tbe
+tblmask
+tc
+tc1
+tca
+tcertificate
+tcertificates
+tcl
+tcode
+td
+te
+tear
+tearOff
+teardown
+tearing
+tears
+technically
+technique
+techniques
+technology
+teh
+telephone
+tell
+telling
+tells
+temp
+temp1
+temp2
+tempBuffer
+tempComp
+tempHeight
+tempItems
+tempL
+tempLength
+tempNumber
+tempRuleList
+tempState
+tempStateNum
+tempStateTable
+tempStatus
+tempString
+tempText
+tempWidth
+tempX
+tempY
+template
+temporarily
+temporary
+ten
+tenSbits
+tenSval
+tend
+tends
+tens
+tentative
+tenth
+terOrder
+terResult
+terSOrder
+terTOrder
+term
+terminal
+terminate
+terminated
+terminates
+terminating
+termination
+terminator
+terminators
+terms
+terribly
+territories
+tertiary
+tertiaryOrder
+test
+test1
+test2
+testArgs
+testBit
+testColorValueRange
+testFile
+testFormats
+testIndex
+tested
+testing
+tests
+testvalid
+tetel
+text
+textArea
+textAreaSerializedDataVersion
+textBeginIndex
+textBuffer
+textComponent
+textComponentSerializedDataVersion
+textEndIndex
+textEvent
+textField
+textFieldSerializedDataVersion
+textHighlight
+textHighlightText
+textInactiveText
+textL
+textLength
+textListener
+textListenerK
+textMode
+textOut
+textStart
+textText
+textToNumericFormat
+textValueChanged
+textfield
+textfields
+textlayout
+texts
+textual
+textually
+texture
+textured
+tf1
+tf2
+tf3
+tf4
+tfor
+tfrom
+tgtgk
+th
+tha
+than
+thanks
+that
+thatHost
+thatPath
+that_
+thatmat
+the
+theAuthenticator
+theContext
+theEnd
+theEvent
+theOutputStream
+theQueue
+theString
+theTime
+thealgorithm
+their
+them
+themselves
+then
+theoretically
+theory
+there
+thereafter
+thereby
+therefore
+therein
+thereof
+these
+theta
+they
+thickness
+thin
+thing
+things
+think
+thinks
+third
+thirteenth
+thirty
+this
+thisAddr
+thisAddrs
+thisBits
+thisGC
+thisHost
+thisMinusOne
+thisName
+thisPath
+thisPlusOne
+thisThread
+thisTime
+thisVal
+this_
+thismat
+thorn
+those
+though
+thought
+thousands
+thow
+thread
+threadGroup
+threadGroupPermission
+threadInitNumber
+threadLocals
+threadPermission
+threadPrimitiveDeprecation
+threadQ
+threadReaper
+threaded
+threadgroup
+threads
+threadtest01
+threat
+three
+threshold
+threw
+thrice
+through
+throughout
+throw
+throwException
+throwMiscException
+throwMissingResourceException
+throwable
+throwables
+throwing
+thrown
+throws
+throwsException
+thru
+tht
+ththa
+thumb
+thursday
+thus
+thwarted
+ti
+tickles
+ticks
+tidy
+tie
+tiebreaker
+tied
+tight
+tighter
+tilde
+tileIcon
+till
+time
+timeFields
+timeStyle
+timeToFields
+time_s
+timely
+timeout
+timeouts
+timer
+times
+timesTenToThe
+timestamp
+timestamps
+timezone
+timezones
+timg
+tiny
+tiny10pow
+tis
+titir
+title
+titleColor
+titleFont
+titleJustification
+titlePosition
+titlecase
+tk
+tktuk
+tl
+tlim
+tls
+tltgl
+tm
+tmp
+tmpFileLock
+tmpPropertyStr
+tmpdir
+tmpout
+tn
+tno
+tntsn
+to
+toAddTo
+toAppendTo
+toArray
+toBack
+toBigInteger
+toBinaryString
+toBoolean
+toByteArray
+toCIEXYZ
+toChapter1
+toChapter1Digest
+toChapter2
+toCharArray
+toDegrees
+toElement
+toEnd
+toExternalForm
+toFocus
+toFront
+toGMTString
+toHex
+toHexString
+toIndex
+toIntArray
+toJavaFormatString
+toKey
+toLocaleString
+toLocalizedPattern
+toLower
+toLowerCase
+toNormalizerMode
+toNotify
+toOctalString
+toPage
+toPages
+toPattern
+toRGB
+toRadians
+toSkip
+toStart
+toString
+toStub
+toTest
+toTitleCase
+toType
+toURL
+toUnsignedString
+toUpperCase
+toUpperCaseCharArray
+toUpperCaseEx
+today
+toffset
+together
+toggle
+toggles
+tok
+token
+tokenMask
+tokenization
+tokenize
+tokenized
+tokenizer
+tokens
+told
+tolerable
+tolerant
+tolerate
+tone
+too
+took
+tool
+toolbar
+toolbars
+toolboxes
+tooldocs
+toolkit
+toolkits
+tools
+tooltip
+tooltips
+top
+topLevelWindow
+topLevelWindowPermission
+topics
+toplabel
+toplevel
+topmost
+topology
+torn
+tortoise
+tos
+toss
+tossed
+total
+totalDigits
+totalMemory
+totally
+totals
+toton
+touch
+touching
+toward
+towards
+tp
+tpublic
+tr
+tr15
+trace
+traceInstructions
+traceMethodCalls
+tracing
+track
+trackMouseEnterExit
+tracked
+tracker
+tracking
+tracks
+trade
+trademark
+tradeoff
+trading
+traditional
+traffic
+trafficClass
+trailing
+trailingZeroCnt
+trailingZeroTable
+trailingZeros
+trajectory
+trans
+transaction
+transactions
+transcoding
+transfer
+transferFocus
+transferFocusBackward
+transferFocusDownCycle
+transferFocusUpCycle
+transferFrom
+transferSize
+transferTo
+transferred
+transfers
+transform
+transformation
+transformations
+transformed
+transforming
+transforms
+transient
+transientProperties
+transition
+transitional
+transitioned
+transitioning
+transitions
+transitive
+transitively
+transitivity
+translate
+translateKey
+translatePattern
+translatePoint
+translated
+translates
+translating
+translation
+transmission
+transmitted
+transmitting
+transparency
+transparent
+transparently
+transport
+trap
+trated
+travels
+traversable
+traversal
+traversals
+traverse
+traverseBackward
+traverseForward
+traverseOut
+traversed
+traverses
+traversing
+travesability
+treat
+treated
+treates
+treating
+treatment
+treats
+tree
+treelock
+trees
+trial
+trialTime
+trials
+trick
+trickier
+trickiness
+tricks
+tricky
+trie
+tried
+tries
+trigger
+triggered
+triggering
+triggers
+trigonometric
+trim
+trimToSize
+trims
+trip
+triplets
+trivial
+trivially
+trouble
+troublesome
+trown
+trtur
+true
+truly
+truncate
+truncated
+truncates
+truncating
+truncation
+trust
+trustProxy
+trusted
+trustedStripLeadingZeroInts
+trusts
+trustworthy
+try
+tryLess
+tryLessOrEqual
+trying
+ts
+tsign
+tstso
+tt
+ttb
+ttf
+ttl
+ttlLock
+tttat
+ttype
+tuesday
+tumble
+tunable
+tuned
+tuning
+tunnel
+turn
+turned
+turning
+turns
+turtle
+tw
+twelfth
+twelve
+twice
+two
+twoDown
+twos
+twtwi
+tx
+tx1
+tx2
+txt
+txtr
+ty
+ty1
+ty2
+tycho
+tying
+typ
+type
+typeAheadAssertions
+typeAheadMarkers
+typeClass
+typeCodes
+typeList
+typeName
+typeNamePattern
+typeNameToClass
+typeNameToPrimitiveClass
+typeNoNulls
+typeNullable
+typeNullableUnknown
+typePredBasic
+typePredChar
+typePredNone
+typeSearchable
+typeToClass
+typeToField
+typeToPackageName
+typecode
+typecodes
+typed
+typedID
+typedKey
+types
+typesafe
+typical
+typically
+typing
+typographic
+typographical
+tz
+tzNumber
+tzoffset
+u
+u0000
+u0001
+u0001_
+u0002
+u0002_
+u0003
+u0004
+u0005
+u0005J
+u0006
+u0007
+u0008
+u0009
+u000A
+u000B
+u000C
+u000D
+u000E
+u000b
+u000e
+u000f
+u0010
+u0011
+u0011C
+u0012
+u0013
+u0014
+u0015
+u0016
+u0017
+u0018
+u0019
+u001B
+u001C
+u001D
+u001E
+u001F
+u001a
+u001b
+u001c
+u001d
+u001e
+u001f
+u0020
+u0021
+u0022
+u0023
+u0024
+u0025
+u0026
+u0027
+u0028
+u0029
+u002C
+u002D
+u002E
+u002F
+u002a
+u002b
+u002c
+u002d
+u002e
+u002f
+u0030
+u0031
+u0032
+u0033
+u0034
+u0035
+u0036
+u0037
+u0038
+u0039
+u003A
+u003B
+u003F
+u003a
+u003b
+u003c
+u003d
+u003e
+u003f
+u0040
+u0041
+u0042
+u0043
+u0044
+u0045
+u0046
+u0047
+u0048
+u0049
+u004A
+u004C
+u004E
+u004a
+u004b
+u004c
+u004d
+u004e
+u004f
+u0050
+u0051
+u0052
+u0053
+u0054
+u0055
+u0056
+u0057
+u0058
+u0059
+u005A
+u005B
+u005a
+u005b
+u005d
+u005e
+u005f
+u0060
+u0061
+u0062
+u0063
+u0064
+u0065
+u0066
+u0067
+u0068
+u0069
+u006B
+u006C
+u006a
+u006b
+u006c
+u006d
+u006e
+u006f
+u0070
+u0071
+u0072
+u0073
+u0074
+u0075
+u0076
+u0077
+u0078
+u0079
+u007A
+u007B
+u007E
+u007F
+u007a
+u007b
+u007c
+u007d
+u007e
+u007f
+u007fA
+u007fB
+u007fBO
+u007fC
+u007fCCA
+u007fCKK
+u007fCOS
+u007fCQJ
+u007fCS
+u007fF
+u007fFE
+u007fJ
+u007fJQ
+u007fK
+u007fKCF
+u007fKCM
+u007fL
+u007fLCO
+u007fM
+u007fN
+u007fO
+u007fOD
+u007fOK
+u007fQ
+u007fQM
+u007fR
+u007fRQ
+u007fS
+u007fTR
+u007fV
+u007fW
+u0080
+u0080R
+u0081
+u0081C
+u0081K
+u0081L
+u0081N
+u0082
+u0082K
+u0082KQQJMQL
+u0083
+u0084
+u0084C
+u0085
+u0086
+u0086A
+u0086JSO
+u0086MC
+u0086R
+u0087
+u0087JK
+u0087O
+u0088
+u0088C
+u0088E
+u0088K
+u0088M
+u0088OJ
+u0089
+u0089E
+u0089O
+u0089XO
+u008A
+u008D
+u008a
+u008b
+u008c
+u008d
+u008dA
+u008e
+u008eC
+u008f
+u008fC
+u0090
+u0091
+u0092
+u0092P
+u0093
+u0094
+u0095
+u0096
+u0096K
+u0097
+u0097JO
+u0098
+u0099
+u009C
+u009F
+u009a
+u009b
+u009c
+u009d
+u009e
+u009f
+u00A0
+u00A1
+u00A2
+u00A4
+u00A5
+u00A6
+u00A7
+u00A8
+u00A9
+u00AA
+u00AB
+u00AC
+u00AD
+u00AE
+u00B0
+u00B1
+u00B2
+u00B3
+u00B4
+u00B5
+u00B6
+u00B7
+u00B9
+u00BA
+u00BB
+u00BC
+u00BD
+u00BE
+u00BF
+u00C0
+u00C1
+u00C2
+u00C3
+u00C4
+u00C5
+u00C6
+u00C7
+u00C8
+u00C9
+u00CA
+u00CB
+u00CC
+u00CD
+u00CE
+u00CF
+u00D0
+u00D1
+u00D2
+u00D3
+u00D4
+u00D5
+u00D6
+u00D7
+u00D8
+u00D9
+u00DA
+u00DB
+u00DC
+u00DD
+u00DE
+u00DF
+u00E0
+u00E1
+u00E2
+u00E3
+u00E4
+u00E5
+u00E6
+u00E7
+u00E8
+u00E9
+u00EA
+u00EB
+u00EC
+u00ED
+u00EE
+u00EF
+u00F0
+u00F1
+u00F2
+u00F3
+u00F4
+u00F5
+u00F6
+u00F7
+u00F8
+u00F9
+u00FA
+u00FB
+u00FC
+u00FD
+u00FE
+u00FF
+u00a0
+u00a1
+u00a2
+u00a3
+u00a4
+u00a5
+u00a6
+u00a7
+u00a8
+u00a9
+u00ab
+u00ac
+u00ae
+u00af
+u00b0
+u00b1
+u00b4
+u00b5
+u00b6
+u00b7
+u00b8
+u00bb
+u00bc
+u00bd
+u00be
+u00bf
+u00c0E
+u00c1C
+u00c2
+u00c2C
+u00c3
+u00c3E
+u00c4
+u00c4E
+u00c5
+u00c5U
+u00c6
+u00c7
+u00c7D
+u00c8I
+u00c9G
+u00ca
+u00caG
+u00cbH
+u00ccO
+u00cdK
+u00ceJ
+u00cf
+u00cfO
+u00d1O
+u00d2
+u00d2U
+u00d3
+u00d3P
+u00d4
+u00d4S
+u00d5
+u00d5U
+u00d6U
+u00d7
+u00d8
+u00d9
+u00d9W
+u00da
+u00daW
+u00dbW
+u00dc
+u00dcW
+u00ddZ
+u00df
+u00e0e
+u00e0zy
+u00e1c
+u00e2
+u00e2c
+u00e3
+u00e3e
+u00e4
+u00e4b
+u00e4e
+u00e5
+u00e5u
+u00e6
+u00e7
+u00e7d
+u00e8i
+u00e9
+u00e9g
+u00ea
+u00eag
+u00ebh
+u00eco
+u00edk
+u00eej
+u00ef
+u00efo
+u00f1o
+u00f2
+u00f2u
+u00f3
+u00f3p
+u00f4
+u00f4s
+u00f5
+u00f5u
+u00f6t
+u00f7
+u00f8
+u00f9
+u00f9w
+u00fa
+u00faw
+u00fbw
+u00fc
+u00fdz
+u00ff
+u0100
+u0100E
+u0101
+u0101e
+u0102
+u0102E
+u0103
+u0103e
+u0104
+u0104E
+u0105
+u0105e
+u0106
+u0106E
+u0107
+u0107e
+u0108
+u0108E
+u0109
+u0109e
+u010A
+u010AD
+u010B
+u010Bd
+u010C
+u010CD
+u010D
+u010Dd
+u010E
+u010EE
+u010F
+u010Fe
+u0110
+u0111
+u0112
+u0112G
+u0113
+u0113g
+u0114
+u0114G
+u0115
+u0115g
+u0116
+u0116F
+u0117
+u0117f
+u0118
+u0118I
+u0119
+u0119i
+u011A
+u011AG
+u011B
+u011C
+u011CH
+u011D
+u011Dh
+u011E
+u011EI
+u011F
+u0120
+u0120H
+u0121
+u0121h
+u0122
+u0122H
+u0123
+u0123h
+u0124
+u0124I
+u0125
+u0125i
+u0126
+u0127
+u0128
+u0128N
+u0129
+u0129n
+u012A
+u012AO
+u012B
+u012Bo
+u012C
+u012CO
+u012D
+u012Do
+u012E
+u012EO
+u012F
+u012Fo
+u0130
+u0130M
+u0131
+u0132
+u0133
+u0134
+u0134O
+u0135
+u0135o
+u0136
+u0136L
+u0137
+u0137l
+u0138
+u0139
+u0139M
+u013A
+u013Am
+u013B
+u013BN
+u013C
+u013Cn
+u013D
+u013DN
+u013E
+u013En
+u013F
+u0140
+u0141
+u0142
+u0143
+u0143O
+u0144
+u0144o
+u0145
+u0145R
+u0146
+u0146r
+u0147
+u0148
+u0148o
+u0149
+u014A
+u014B
+u014C
+u014CU
+u014D
+u014Du
+u014E
+u014EU
+u014F
+u014Fu
+u0150
+u0150U
+u0151
+u0151u
+u0152
+u0153
+u0154
+u0155
+u0155s
+u0156
+u0156S
+u0157
+u0157s
+u0158
+u0158S
+u0159
+u0159s
+u015A
+u015AU
+u015B
+u015Bu
+u015C
+u015CU
+u015D
+u015Du
+u015E
+u015ET
+u015F
+u015Ft
+u0160
+u0160T
+u0161
+u0161t
+u0162
+u0163
+u0164
+u0164U
+u0165
+u0166
+u0167
+u0168
+u0168V
+u0169
+u0169v
+u016A
+u016Aa
+u016B
+u016C
+u016Ca
+u016D
+u016E
+u016Ea
+u016F
+u016Fw
+u0170
+u0170o
+u0171
+u0172
+u0172a
+u0173
+u0174
+u0174Y
+u0175
+u0175y
+u0176
+u0176Z
+u0177
+u0177z
+u0178
+u0178a
+u0179
+u0179a
+u017A
+u017B
+u017Bb
+u017C
+u017D
+u017Da
+u017E
+u017F
+u017f
+u0180
+u0181
+u0182
+u0183
+u0184
+u0185
+u0186
+u0187
+u0188
+u0189
+u018A
+u018B
+u018C
+u018D
+u018E
+u018F
+u018f
+u0190
+u0191
+u0192
+u0193
+u0194
+u0195
+u0196
+u0198
+u0199
+u019A
+u019B
+u019C
+u019D
+u019E
+u019F
+u019f
+u01A0
+u01A0U
+u01A1
+u01A1u
+u01A2
+u01A3
+u01A4
+u01A5
+u01A6
+u01A7
+u01A8
+u01A9
+u01AA
+u01AB
+u01AC
+u01AD
+u01AE
+u01AF
+u01AFo
+u01B0
+u01B1
+u01B2
+u01B3
+u01B4
+u01B5
+u01B6
+u01B7
+u01B8
+u01B9
+u01BA
+u01BB
+u01BC
+u01BD
+u01BE
+u01BF
+u01C0
+u01C2
+u01C3
+u01C4
+u01C5
+u01C6
+u01C7
+u01C8
+u01C9
+u01CA
+u01CB
+u01CC
+u01CD
+u01CDC
+u01CE
+u01CEc
+u01CF
+u01CFK
+u01D0
+u01D0j
+u01D1
+u01D1R
+u01D2
+u01D2r
+u01D3
+u01D3Z
+u01D4
+u01D4z
+u01D5
+u01D6
+u01D7
+u01D8
+u01D9
+u01DA
+u01DB
+u01DC
+u01DD
+u01DE
+u01DF
+u01E0
+u01E1
+u01E2
+u01E3
+u01E4
+u01E5
+u01E6
+u01E6I
+u01E7
+u01E7i
+u01E8
+u01E8L
+u01E9
+u01E9l
+u01EA
+u01EAU
+u01EB
+u01EC
+u01ED
+u01EE
+u01EF
+u01F0
+u01F0k
+u01F1
+u01F2
+u01F3
+u01F4
+u01F4I
+u01F5
+u01F5i
+u01F6
+u01F8
+u01FA
+u01FB
+u01FC
+u01FD
+u01FE
+u01FF
+u01b7
+u0200
+u0200E
+u0201
+u0201e
+u0202
+u0202E
+u0203
+u0203e
+u0204
+u0204I
+u0205
+u0205i
+u0206
+u0206I
+u0207
+u0207i
+u0208
+u0208O
+u0209
+u020A
+u020AO
+u020B
+u020C
+u020CR
+u020D
+u020Dr
+u020E
+u020ER
+u020F
+u020Fr
+u0210
+u0210U
+u0211
+u0211u
+u0212
+u0212U
+u0213
+u0213u
+u0214
+u0214a
+u0215
+u0216
+u0216a
+u0217
+u0218
+u021A
+u021B
+u021C
+u021E
+u021F
+u0220
+u0222
+u0223
+u0224
+u0226
+u0227
+u0228
+u022A
+u022B
+u022C
+u022E
+u022F
+u0230
+u0231
+u0232
+u0233
+u0234
+u0236
+u0237
+u0238
+u023A
+u023C
+u023D
+u023E
+u0240
+u0242
+u0243
+u0244
+u0246
+u0248
+u0249
+u024A
+u024C
+u024E
+u024F
+u0250
+u0252
+u0253
+u0254
+u0256
+u0257
+u0258
+u0259
+u025A
+u025C
+u025D
+u025E
+u0260
+u0262
+u0263
+u0264
+u0266
+u0268
+u026A
+u026C
+u026E
+u0270
+u0271
+u0272
+u0274
+u0275
+u0276
+u0277
+u0278
+u0279
+u027A
+u027C
+u027D
+u027E
+u027b
+u0280
+u0281
+u0282
+u0283
+u0284
+u0286
+u0288
+u0289
+u028A
+u028C
+u028E
+u028F
+u0290
+u0292
+u0294
+u0295
+u0296
+u0298
+u029A
+u029B
+u029C
+u029E
+u02A0
+u02A1
+u02A2
+u02A4
+u02A7
+u02A8
+u02AA
+u02AD
+u02B0
+u02B3
+u02B6
+u02B8
+u02B9
+u02BB
+u02BC
+u02BE
+u02BF
+u02C1
+u02C2
+u02C5
+u02C8
+u02CD
+u02D0
+u02D1
+u02D2
+u02D5
+u02D8
+u02DB
+u02DE
+u02E0
+u02E1
+u02E4
+u02E8
+u02EB
+u02EE
+u02F1
+u02F4
+u02F7
+u02FA
+u02FE
+u02b9
+u02bc
+u0300
+u0300A
+u0300zy
+u0301
+u0301A
+u0302
+u0302A
+u0303
+u0303A
+u0304
+u0304A
+u0305
+u0306
+u0306A
+u0307
+u0307B
+u0308
+u0308A
+u0309
+u0309A
+u030A
+u030AA
+u030B
+u030BO
+u030C
+u030CA
+u030D
+u030E
+u030F
+u030FA
+u030a
+u030b
+u030c
+u030d
+u030e
+u030f
+u0310
+u0311
+u0311A
+u0312
+u0313
+u0314
+u0315
+u0316
+u0317
+u0318
+u0319
+u031BO
+u031C
+u031D
+u031F
+u031a
+u031b
+u031c
+u031d
+u031e
+u031f
+u0320
+u0321
+u0322
+u0323
+u0323A
+u0324
+u0324U
+u0325
+u0325A
+u0326
+u0327
+u0327C
+u0328
+u0328A
+u0329
+u032A
+u032B
+u032D
+u032DD
+u032E
+u032EH
+u032a
+u032b
+u032c
+u032d
+u032e
+u032f
+u0330
+u0330E
+u0331
+u0331B
+u0332
+u0333
+u0334
+u0335
+u0336
+u0337
+u0338
+u0339
+u033A
+u033D
+u033E
+u033a
+u033b
+u033c
+u033d
+u033e
+u033f
+u0340
+u0341
+u0342
+u0343
+u0344
+u0345
+u0346
+u0349
+u034A
+u034C
+u034D
+u034E
+u034F
+u0351
+u0353
+u0355
+u0356
+u0359
+u035A
+u035B
+u035D
+u0360
+u0361
+u0363
+u0365
+u0366
+u0369
+u036A
+u036C
+u036D
+u036E
+u036F
+u0370
+u0371
+u0373
+u0374
+u0375
+u0376
+u0379
+u037A
+u037C
+u037E
+u037F
+u0382
+u0385
+u0386
+u0387
+u0388
+u0389
+u038A
+u038C
+u038E
+u038F
+u0390
+u0391
+u0392
+u0395
+u0397
+u0398
+u0399
+u039B
+u039C
+u039E
+u039F
+u039f
+u03A1
+u03A3
+u03A4
+u03A5
+u03A7
+u03A9
+u03AA
+u03AB
+u03AC
+u03AD
+u03AE
+u03AF
+u03B0
+u03B1
+u03B3
+u03B5
+u03B6
+u03B7
+u03B9
+u03BC
+u03BF
+u03C1
+u03C2
+u03C5
+u03C8
+u03C9
+u03CA
+u03CB
+u03CC
+u03CD
+u03CE
+u03D0
+u03D1
+u03D2
+u03D3
+u03D4
+u03D5
+u03D6
+u03D7
+u03DA
+u03DC
+u03DD
+u03DE
+u03E0
+u03E2
+u03E3
+u03E4
+u03E5
+u03E6
+u03E7
+u03E8
+u03E9
+u03EA
+u03EB
+u03EC
+u03ED
+u03EE
+u03EF
+u03F2
+u03F3
+u03F5
+u03F8
+u03FB
+u03FE
+u03a1
+u03a5
+u03a9
+u03b1
+u03b5
+u03b7
+u03b9
+u03bc
+u03bf
+u03c1
+u03c5
+u03c9
+u03d2
+u0400
+u0401
+u0403
+u0404
+u0406
+u0407
+u040A
+u040B
+u040C
+u040D
+u040E
+u0410
+u0413
+u0414
+u0415
+u0416
+u0417
+u0418
+u0419
+u041A
+u041C
+u041D
+u041E
+u041a
+u041e
+u0420
+u0423
+u0426
+u0427
+u0429
+u042B
+u042C
+u042F
+u042b
+u0430
+u0432
+u0433
+u0435
+u0436
+u0437
+u0438
+u0439
+u043A
+u043B
+u043E
+u043a
+u043e
+u0441
+u0443
+u0444
+u0447
+u044A
+u044B
+u044E
+u044F
+u044b
+u0451
+u0453
+u0455
+u0456
+u0457
+u0458
+u045B
+u045C
+u045E
+u045F
+u0460
+u0461
+u0462
+u0463
+u0464
+u0465
+u0466
+u0467
+u0468
+u0469
+u046A
+u046B
+u046C
+u046D
+u046E
+u046F
+u0470
+u0471
+u0472
+u0473
+u0474
+u0475
+u0476
+u0477
+u0478
+u0479
+u047A
+u047B
+u047C
+u047D
+u047E
+u047F
+u0480
+u0481
+u0482
+u0483
+u0484
+u0485
+u0486
+u048A
+u048D
+u048E
+u0490
+u0491
+u0492
+u0493
+u0494
+u0495
+u0496
+u0497
+u0498
+u0499
+u049A
+u049B
+u049C
+u049D
+u049E
+u049F
+u04A0
+u04A1
+u04A2
+u04A3
+u04A4
+u04A5
+u04A6
+u04A7
+u04A8
+u04A9
+u04AA
+u04AB
+u04AC
+u04AD
+u04AE
+u04AF
+u04B0
+u04B1
+u04B2
+u04B3
+u04B4
+u04B5
+u04B6
+u04B7
+u04B8
+u04B9
+u04BA
+u04BB
+u04BC
+u04BD
+u04BE
+u04BF
+u04C0
+u04C1
+u04C2
+u04C3
+u04C4
+u04C7
+u04C8
+u04CB
+u04CC
+u04CF
+u04D0
+u04D1
+u04D2
+u04D3
+u04D4
+u04D5
+u04D6
+u04D7
+u04D8
+u04D9
+u04DA
+u04DB
+u04DC
+u04DD
+u04DE
+u04DF
+u04E0
+u04E1
+u04E2
+u04E3
+u04E4
+u04E5
+u04E6
+u04E7
+u04E8
+u04E9
+u04EA
+u04EB
+u04ED
+u04EE
+u04EF
+u04F0
+u04F1
+u04F2
+u04F3
+u04F4
+u04F5
+u04F6
+u04F8
+u04F9
+u04FC
+u0500
+u0504
+u0506
+u0507
+u050A
+u050B
+u050D
+u0510
+u0513
+u0516
+u0519
+u051C
+u0520
+u0524
+u0527
+u052A
+u052D
+u0530
+u0531
+u0533
+u0535
+u0536
+u0539
+u053B
+u053C
+u053D
+u053F
+u0541
+u0542
+u0544
+u0545
+u0546
+u0548
+u054B
+u054E
+u0551
+u0552
+u0554
+u0556
+u0557
+u0559
+u055A
+u055C
+u055E
+u055F
+u0561
+u0562
+u0565
+u0566
+u056A
+u056B
+u056E
+u056b
+u056d
+u0572
+u0574
+u0576
+u057A
+u057D
+u057e
+u0580
+u0581
+u0582
+u0583
+u0586
+u0587
+u0589
+u058C
+u058F
+u0590
+u0591
+u0592
+u0596
+u0598
+u059A
+u059D
+u05A0
+u05A1
+u05A3
+u05A6
+u05A9
+u05AB
+u05AC
+u05B0
+u05B4
+u05B7
+u05B8
+u05B9
+u05BB
+u05BC
+u05BD
+u05BE
+u05BF
+u05C0
+u05C1
+u05C2
+u05C3
+u05C4
+u05C7
+u05CA
+u05CD
+u05D0
+u05D1
+u05D2
+u05D3
+u05D4
+u05D5
+u05D6
+u05D8
+u05D9
+u05DA
+u05DB
+u05DC
+u05DE
+u05DF
+u05E0
+u05E1
+u05E2
+u05E3
+u05E4
+u05E5
+u05E6
+u05E7
+u05E8
+u05E9
+u05EA
+u05EB
+u05EE
+u05F0
+u05F2
+u05F3
+u05F4
+u05F6
+u05FA
+u05FE
+u05b7
+u05b8
+u05b9
+u05bc
+u05bf
+u05c1
+u05c2
+u05d0
+u05d1
+u05d2
+u05d3
+u05d4
+u05d5
+u05d6
+u05d8
+u05d9
+u05da
+u05db
+u05dc
+u05dd
+u05de
+u05e0
+u05e1
+u05e2
+u05e3
+u05e4
+u05e6
+u05e7
+u05e8
+u05e9
+u05ea
+u05f2
+u0600
+u0601
+u0602
+u0604
+u0607
+u0609
+u060A
+u060B
+u060C
+u060D
+u0610
+u0613
+u0616
+u0619
+u061B
+u061C
+u061D
+u061E
+u061F
+u0621
+u0622
+u0623
+u0624
+u0625
+u0626
+u0627
+u0628
+u0629
+u062B
+u062E
+u062a
+u062b
+u062c
+u062d
+u062e
+u062f
+u0630
+u0631
+u0632
+u0633
+u0634
+u0635
+u0636
+u0637
+u0638
+u0639
+u063A
+u063D
+u063a
+u0640
+u0641
+u0642
+u0643
+u0644
+u0645
+u0646
+u0647
+u0648
+u0649
+u064A
+u064B
+u064C
+u064F
+u064a
+u064b
+u064c
+u064d
+u064e
+u064f
+u0650
+u0651
+u0652
+u0655
+u065B
+u065E
+u0660
+u0661
+u0664
+u0666
+u0667
+u0669
+u066A
+u066B
+u066D
+u066F
+u0670
+u0671
+u0672
+u0673
+u0677
+u0679
+u067B
+u067D
+u067E
+u067F
+u067a
+u067b
+u067e
+u067f
+u0680
+u0683
+u0684
+u0686
+u0687
+u0688
+u068B
+u068F
+u068c
+u068d
+u068e
+u0691
+u0693
+u0697
+u0698
+u069B
+u069F
+u06A3
+u06A7
+u06A9
+u06AA
+u06AB
+u06AF
+u06B3
+u06B7
+u06BA
+u06BD
+u06BE
+u06C0
+u06C3
+u06C6
+u06C9
+u06CB
+u06CD
+u06CE
+u06D0
+u06D1
+u06D3
+u06D4
+u06D5
+u06D6
+u06D9
+u06DA
+u06DC
+u06DD
+u06DE
+u06DF
+u06E1
+u06E4
+u06E5
+u06E6
+u06E7
+u06E8
+u06E9
+u06EA
+u06EB
+u06EC
+u06ED
+u06F0
+u06F1
+u06F4
+u06F7
+u06F9
+u06FA
+u06FD
+u06a4
+u06a6
+u06a9
+u06ad
+u06af
+u06b1
+u06b3
+u06ba
+u06bb
+u06be
+u06c0
+u06c1
+u06c5
+u06c6
+u06c7
+u06c8
+u06c9
+u06cb
+u06cc
+u06d0
+u06d2
+u06d3
+u0700
+u0703
+u0706
+u0708
+u0709
+u070B
+u070D
+u0711
+u0715
+u0719
+u071D
+u0721
+u0722
+u0725
+u0729
+u072B
+u072D
+u0731
+u0735
+u0736
+u0739
+u073D
+u0741
+u0745
+u0749
+u074B
+u074D
+u0750
+u0751
+u0755
+u0759
+u075C
+u075F
+u0762
+u0765
+u0766
+u0769
+u076C
+u076D
+u0771
+u0775
+u0779
+u077D
+u077F
+u0780
+u0781
+u0785
+u0786
+u0789
+u078D
+u0790
+u0793
+u0796
+u0799
+u079C
+u079F
+u07A2
+u07A5
+u07A6
+u07A8
+u07AB
+u07AF
+u07B3
+u07B7
+u07BB
+u07BF
+u07C0
+u07C3
+u07C6
+u07C9
+u07CB
+u07CD
+u07D1
+u07D5
+u07D9
+u07DD
+u07E1
+u07E2
+u07E4
+u07E5
+u07E6
+u07E7
+u07EB
+u07EF
+u07F3
+u07F7
+u07FA
+u07FD
+u07FE
+u07FF
+u07ff
+u0800
+u0801
+u0805
+u0808
+u0809
+u080B
+u080D
+u0810
+u0813
+u0817
+u0818
+u081B
+u081F
+u0820
+u0821
+u0823
+u0827
+u082B
+u082E
+u0831
+u0835
+u0839
+u083D
+u0841
+u0845
+u0849
+u084C
+u084F
+u0853
+u0857
+u085B
+u085F
+u0863
+u0865
+u0866
+u0867
+u086A
+u086D
+u086F
+u0871
+u0875
+u0879
+u087D
+u0881
+u0884
+u0885
+u0888
+u088B
+u088F
+u0893
+u0897
+u089B
+u089E
+u08A1
+u08A5
+u08A9
+u08AD
+u08B1
+u08B4
+u08B7
+u08BB
+u08BF
+u08C3
+u08C7
+u08CB
+u08CF
+u08D1
+u08D2
+u08D6
+u08DA
+u08DE
+u08E1
+u08E4
+u08E8
+u08EC
+u08F0
+u08F4
+u08F8
+u08FC
+u08FF
+u0900
+u0901
+u0902
+u0903
+u0905
+u0906
+u0908
+u090A
+u090E
+u0912
+u0915
+u0916
+u0917
+u091A
+u091C
+u091D
+u091c
+u0920
+u0921
+u0922
+u0923
+u0926
+u0928
+u0929
+u092B
+u092C
+u092F
+u092b
+u092f
+u0930
+u0931
+u0932
+u0933
+u0934
+u0935
+u0938
+u0939
+u093B
+u093C
+u093D
+u093E
+u093c
+u0940
+u0941
+u0942
+u0944
+u0948
+u0949
+u094C
+u094D
+u0950
+u0951
+u0954
+u0956
+u0958
+u0959
+u095A
+u095B
+u095C
+u095D
+u095E
+u095F
+u0960
+u0961
+u0962
+u0963
+u0964
+u0965
+u0966
+u096A
+u096E
+u096F
+u0970
+u0972
+u0977
+u097C
+u0980
+u0981
+u0982
+u0983
+u0985
+u0986
+u098B
+u098C
+u098F
+u0990
+u0993
+u0994
+u0998
+u099D
+u09A1
+u09A2
+u09A7
+u09A8
+u09AA
+u09AC
+u09AF
+u09B0
+u09B1
+u09B2
+u09B6
+u09B9
+u09BA
+u09BC
+u09BE
+u09C0
+u09C1
+u09C3
+u09C4
+u09C7
+u09C8
+u09CB
+u09CC
+u09CD
+u09D2
+u09D7
+u09DC
+u09DD
+u09DF
+u09E0
+u09E1
+u09E2
+u09E3
+u09E4
+u09E6
+u09E9
+u09EE
+u09EF
+u09F0
+u09F1
+u09F2
+u09F3
+u09F4
+u09F8
+u09F9
+u09FA
+u09FD
+u09a1
+u09a2
+u09ac
+u09af
+u09bc
+u09be
+u09c7
+u09d7
+u0A00
+u0A02
+u0A05
+u0A06
+u0A0A
+u0A0F
+u0A10
+u0A13
+u0A14
+u0A16
+u0A17
+u0A19
+u0A1C
+u0A1E
+u0A21
+u0A23
+u0A28
+u0A2A
+u0A2B
+u0A2E
+u0A30
+u0A32
+u0A33
+u0A35
+u0A36
+u0A38
+u0A39
+u0A3C
+u0A3E
+u0A40
+u0A41
+u0A42
+u0A43
+u0A46
+u0A47
+u0A48
+u0A49
+u0A4B
+u0A4C
+u0A4D
+u0A4F
+u0A54
+u0A58
+u0A59
+u0A5A
+u0A5B
+u0A5C
+u0A5E
+u0A5F
+u0A62
+u0A66
+u0A69
+u0A6C
+u0A6F
+u0A70
+u0A71
+u0A72
+u0A74
+u0A7E
+u0A80
+u0A81
+u0A82
+u0A83
+u0A84
+u0A85
+u0A88
+u0A8B
+u0A8C
+u0A8D
+u0A8F
+u0A91
+u0A93
+u0A96
+u0A99
+u0A9C
+u0AA8
+u0AAA
+u0AAB
+u0AAE
+u0AB0
+u0AB2
+u0AB3
+u0AB5
+u0AB6
+u0AB9
+u0ABC
+u0ABD
+u0ABE
+u0ABF
+u0AC0
+u0AC1
+u0AC3
+u0AC5
+u0AC6
+u0AC7
+u0AC8
+u0AC9
+u0ACB
+u0ACC
+u0ACD
+u0ACF
+u0AD0
+u0AD8
+u0ADC
+u0ADF
+u0AE0
+u0AE3
+u0AE6
+u0AEA
+u0AED
+u0AEF
+u0AF0
+u0AF3
+u0AF6
+u0AFF
+u0B00
+u0B01
+u0B02
+u0B03
+u0B05
+u0B06
+u0B09
+u0B0A
+u0B0C
+u0B0F
+u0B10
+u0B12
+u0B13
+u0B15
+u0B18
+u0B1B
+u0B1E
+u0B21
+u0B22
+u0B24
+u0B27
+u0B28
+u0B2A
+u0B2D
+u0B2F
+u0B30
+u0B32
+u0B33
+u0B36
+u0B39
+u0B3C
+u0B3D
+u0B3E
+u0B3F
+u0B40
+u0B41
+u0B42
+u0B43
+u0B45
+u0B47
+u0B48
+u0B4B
+u0B4C
+u0B4D
+u0B4E
+u0B51
+u0B54
+u0B56
+u0B57
+u0B5A
+u0B5C
+u0B5D
+u0B5F
+u0B60
+u0B61
+u0B63
+u0B66
+u0B69
+u0B6C
+u0B6E
+u0B6F
+u0B70
+u0B73
+u0B76
+u0B79
+u0B7C
+u0B7F
+u0B80
+u0B82
+u0B83
+u0B85
+u0B88
+u0B8A
+u0B8B
+u0B8E
+u0B90
+u0B91
+u0B92
+u0B94
+u0B95
+u0B97
+u0B99
+u0B9A
+u0B9C
+u0B9D
+u0B9E
+u0B9F
+u0BA0
+u0BA3
+u0BA4
+u0BA6
+u0BA8
+u0BA9
+u0BAA
+u0BAC
+u0BAE
+u0BAF
+u0BB2
+u0BB5
+u0BB7
+u0BB8
+u0BB9
+u0BBB
+u0BBE
+u0BBF
+u0BC0
+u0BC1
+u0BC2
+u0BC4
+u0BC6
+u0BC7
+u0BC8
+u0BCA
+u0BCB
+u0BCC
+u0BCD
+u0BD0
+u0BD3
+u0BD6
+u0BD7
+u0BD9
+u0BDC
+u0BDF
+u0BE2
+u0BE5
+u0BE7
+u0BE8
+u0BEB
+u0BEE
+u0BEF
+u0BF0
+u0BF1
+u0BF2
+u0BF4
+u0BF7
+u0BFA
+u0BFD
+u0C00
+u0C01
+u0C03
+u0C05
+u0C06
+u0C09
+u0C0C
+u0C0E
+u0C0F
+u0C10
+u0C12
+u0C15
+u0C18
+u0C1B
+u0C1E
+u0C21
+u0C24
+u0C28
+u0C2A
+u0C2C
+u0C2F
+u0C32
+u0C33
+u0C35
+u0C38
+u0C39
+u0C3B
+u0C3E
+u0C40
+u0C41
+u0C44
+u0C46
+u0C47
+u0C48
+u0C4A
+u0C4D
+u0C50
+u0C53
+u0C55
+u0C56
+u0C59
+u0C5C
+u0C5F
+u0C60
+u0C61
+u0C62
+u0C65
+u0C66
+u0C68
+u0C6B
+u0C6E
+u0C6F
+u0C71
+u0C74
+u0C77
+u0C7A
+u0C7D
+u0C80
+u0C82
+u0C83
+u0C85
+u0C86
+u0C89
+u0C8B
+u0C8C
+u0C8E
+u0C90
+u0C92
+u0C93
+u0C95
+u0C97
+u0C9A
+u0C9C
+u0C9F
+u0CA1
+u0CA3
+u0CA7
+u0CA8
+u0CAA
+u0CAB
+u0CAF
+u0CB2
+u0CB3
+u0CB5
+u0CB8
+u0CB9
+u0CBB
+u0CBE
+u0CBF
+u0CC0
+u0CC1
+u0CC2
+u0CC4
+u0CC6
+u0CC7
+u0CC8
+u0CCA
+u0CCB
+u0CCC
+u0CCD
+u0CCF
+u0CD2
+u0CD5
+u0CD6
+u0CD8
+u0CDB
+u0CDE
+u0CE0
+u0CE1
+u0CE4
+u0CE6
+u0CE7
+u0CE9
+u0CEB
+u0CED
+u0CEF
+u0CF1
+u0CF3
+u0CF5
+u0CF7
+u0CF9
+u0CFC
+u0CFF
+u0D00
+u0D02
+u0D03
+u0D05
+u0D08
+u0D0B
+u0D0C
+u0D0D
+u0D0E
+u0D0F
+u0D10
+u0D11
+u0D12
+u0D13
+u0D15
+u0D18
+u0D1B
+u0D1F
+u0D22
+u0D25
+u0D28
+u0D2A
+u0D2B
+u0D2E
+u0D31
+u0D34
+u0D37
+u0D39
+u0D3A
+u0D3D
+u0D3E
+u0D40
+u0D41
+u0D43
+u0D46
+u0D47
+u0D48
+u0D49
+u0D4A
+u0D4B
+u0D4C
+u0D4D
+u0D4F
+u0D52
+u0D55
+u0D57
+u0D58
+u0D5B
+u0D5E
+u0D60
+u0D61
+u0D64
+u0D66
+u0D68
+u0D6C
+u0D6F
+u0D70
+u0D74
+u0D78
+u0D7B
+u0D7E
+u0D80
+u0D81
+u0D84
+u0D87
+u0D8B
+u0D8E
+u0D91
+u0D94
+u0D97
+u0D9A
+u0D9D
+u0DA1
+u0DA5
+u0DA8
+u0DAB
+u0DAE
+u0DB1
+u0DB4
+u0DB7
+u0DBA
+u0DBD
+u0DBF
+u0DC0
+u0DC3
+u0DC6
+u0DC9
+u0DCC
+u0DCF
+u0DD2
+u0DD5
+u0DD8
+u0DDB
+u0DDE
+u0DE1
+u0DE4
+u0DE7
+u0DEA
+u0DED
+u0DF0
+u0DF3
+u0DF6
+u0DF9
+u0DFC
+u0DFF
+u0E00
+u0E01
+u0E02
+u0E05
+u0E08
+u0E0C
+u0E0F
+u0E12
+u0E16
+u0E19
+u0E1C
+u0E1F
+u0E22
+u0E25
+u0E28
+u0E2B
+u0E2E
+u0E2F
+u0E30
+u0E31
+u0E32
+u0E33
+u0E34
+u0E37
+u0E3A
+u0E3E
+u0E3F
+u0E40
+u0E42
+u0E45
+u0E46
+u0E47
+u0E48
+u0E4B
+u0E4E
+u0E4F
+u0E50
+u0E52
+u0E55
+u0E58
+u0E59
+u0E5A
+u0E5B
+u0E5F
+u0E63
+u0E67
+u0E6A
+u0E6D
+u0E70
+u0E74
+u0E77
+u0E7B
+u0E7E
+u0E80
+u0E81
+u0E82
+u0E84
+u0E87
+u0E88
+u0E8A
+u0E8B
+u0E8D
+u0E8E
+u0E91
+u0E94
+u0E97
+u0E99
+u0E9A
+u0E9D
+u0E9F
+u0EA0
+u0EA1
+u0EA3
+u0EA5
+u0EA6
+u0EA7
+u0EA9
+u0EAA
+u0EAB
+u0EAC
+u0EAD
+u0EAE
+u0EAF
+u0EB0
+u0EB1
+u0EB2
+u0EB3
+u0EB4
+u0EB5
+u0EB8
+u0EB9
+u0EBB
+u0EBC
+u0EBD
+u0EBE
+u0EBF
+u0EC0
+u0EC1
+u0EC4
+u0EC6
+u0EC7
+u0EC8
+u0ECA
+u0ECD
+u0ED0
+u0ED3
+u0ED7
+u0ED9
+u0EDA
+u0EDC
+u0EDD
+u0EE0
+u0EE3
+u0EE6
+u0EE9
+u0EEC
+u0EF0
+u0EF3
+u0EF6
+u0EFA
+u0EFD
+u0F00
+u0F01
+u0F03
+u0F04
+u0F05
+u0F09
+u0F0D
+u0F0E
+u0F11
+u0F12
+u0F13
+u0F15
+u0F17
+u0F18
+u0F19
+u0F1A
+u0F1B
+u0F1E
+u0F1F
+u0F20
+u0F21
+u0F24
+u0F27
+u0F29
+u0F2A
+u0F2D
+u0F2E
+u0F31
+u0F33
+u0F34
+u0F35
+u0F36
+u0F37
+u0F38
+u0F39
+u0F3A
+u0F3B
+u0F3C
+u0F3D
+u0F3E
+u0F3F
+u0F40
+u0F42
+u0F43
+u0F46
+u0F47
+u0F49
+u0F4C
+u0F4D
+u0F4F
+u0F51
+u0F52
+u0F55
+u0F56
+u0F57
+u0F58
+u0F59
+u0F5B
+u0F5C
+u0F5F
+u0F62
+u0F65
+u0F68
+u0F69
+u0F6B
+u0F6E
+u0F71
+u0F72
+u0F73
+u0F74
+u0F75
+u0F76
+u0F77
+u0F78
+u0F79
+u0F7A
+u0F7D
+u0F7E
+u0F7F
+u0F80
+u0F81
+u0F83
+u0F84
+u0F85
+u0F86
+u0F87
+u0F8B
+u0F8F
+u0F90
+u0F92
+u0F93
+u0F95
+u0F97
+u0F99
+u0F9B
+u0F9C
+u0F9D
+u0F9F
+u0FA1
+u0FA2
+u0FA3
+u0FA6
+u0FA7
+u0FAA
+u0FAB
+u0FAC
+u0FAD
+u0FB0
+u0FB1
+u0FB2
+u0FB3
+u0FB4
+u0FB5
+u0FB6
+u0FB7
+u0FB8
+u0FB9
+u0FBA
+u0FBC
+u0FBE
+u0FC0
+u0FC2
+u0FC4
+u0FC6
+u0FC8
+u0FCB
+u0FCC
+u0FCD
+u0FD0
+u0FD4
+u0FD7
+u0FDB
+u0FDE
+u0FE2
+u0FE5
+u0FE8
+u0FEA
+u0FEC
+u0FEE
+u0FF0
+u0FF2
+u0FF4
+u0FF6
+u0FF8
+u0FFA
+u0FFC
+u0FFE
+u0a16
+u0a17
+u0a1c
+u0a21
+u0a2b
+u0a3c
+u0b21
+u0b22
+u0b2f
+u0b3c
+u0b3e
+u0b47
+u0b56
+u0b57
+u0b92
+u0bbe
+u0bc6
+u0bc7
+u0bd7
+u0c46
+u0c56
+u0cbf
+u0cc2
+u0cc6
+u0cd5
+u0cd6
+u0d3e
+u0d46
+u0d47
+u0d57
+u0e01
+u0e2e
+u0e32
+u0e3f
+u0e40
+u0e44
+u0e4d
+u0e81
+u0e99
+u0ea1
+u0eab
+u0eae
+u0eb2
+u0ec0
+u0ec4
+u0ecd
+u0f40
+u0f42
+u0f4c
+u0f51
+u0f56
+u0f5b
+u0f71
+u0f72
+u0f74
+u0f80
+u0f90
+u0f92
+u0f9c
+u0fa1
+u0fa6
+u0fab
+u0fb2
+u0fb3
+u0fb5
+u0fb7
+u1
+u1000
+u1002
+u1004
+u1006
+u1008
+u100A
+u100C
+u100E
+u100F
+u1010
+u1012
+u1014
+u1016
+u1018
+u101A
+u101C
+u101E
+u1020
+u1023
+u1025
+u1028
+u102A
+u102D
+u102F
+u1031
+u1033
+u1035
+u1037
+u1039
+u103B
+u103D
+u103F
+u1041
+u1043
+u1046
+u1048
+u104A
+u104C
+u104E
+u1050
+u1052
+u1055
+u1059
+u105C
+u105E
+u1060
+u1062
+u1064
+u1066
+u1068
+u106A
+u106C
+u106E
+u1070
+u1072
+u1074
+u1076
+u107A
+u107E
+u1082
+u1086
+u108A
+u108E
+u1092
+u1096
+u109A
+u109E
+u10A0
+u10A2
+u10A6
+u10A9
+u10AB
+u10AE
+u10B2
+u10B5
+u10B7
+u10BA
+u10BE
+u10C3
+u10C5
+u10C6
+u10C8
+u10CA
+u10CB
+u10CF
+u10D0
+u10D1
+u10D3
+u10D5
+u10D7
+u10D9
+u10DC
+u10E0
+u10E3
+u10E5
+u10E8
+u10EC
+u10F1
+u10F4
+u10F6
+u10F9
+u10FB
+u10FD
+u10FF
+u1100
+u1101
+u1102
+u1103
+u1105
+u1106
+u1107
+u1108
+u1109
+u110C
+u110F
+u110b
+u110c
+u110e
+u110f
+u1110
+u1111
+u1112
+u1113
+u1115
+u1117
+u1119
+u111B
+u111D
+u111F
+u1121
+u1123
+u1125
+u1127
+u112A
+u112D
+u1130
+u1133
+u1136
+u1139
+u113C
+u113F
+u113c
+u113e
+u1140
+u1142
+u1145
+u1147
+u1149
+u114B
+u114D
+u114F
+u114c
+u114e
+u1150
+u1151
+u1153
+u1155
+u1157
+u1159
+u115B
+u115D
+u115F
+u115f
+u1160
+u1161
+u1163
+u1165
+u1167
+u1169
+u116B
+u116D
+u116F
+u116d
+u116e
+u1171
+u1172
+u1173
+u1175
+u1177
+u1179
+u117B
+u117D
+u117F
+u1181
+u1183
+u1185
+u1187
+u1189
+u118B
+u118D
+u118F
+u1191
+u1193
+u1195
+u1197
+u1199
+u119B
+u119D
+u119F
+u119e
+u11A1
+u11A2
+u11A3
+u11A5
+u11A7
+u11A8
+u11A9
+u11AB
+u11AD
+u11AF
+u11B1
+u11B3
+u11B6
+u11B9
+u11BB
+u11BE
+u11C1
+u11C3
+u11C6
+u11C9
+u11CB
+u11CE
+u11D0
+u11D3
+u11D6
+u11D9
+u11DC
+u11DF
+u11E2
+u11E5
+u11E7
+u11E9
+u11EC
+u11EF
+u11F1
+u11F4
+u11F6
+u11F8
+u11F9
+u11FB
+u11FD
+u11FF
+u11a8
+u11ab
+u11ae
+u11af
+u11b7
+u11b8
+u11ba
+u11bc
+u11bd
+u11be
+u11bf
+u11c0
+u11c1
+u11c2
+u11eb
+u11f0
+u11f9
+u1200
+u1201
+u1203
+u1205
+u1207
+u120A
+u120C
+u120F
+u1211
+u1214
+u1216
+u1219
+u121B
+u121E
+u1222
+u1225
+u1227
+u1229
+u122C
+u1230
+u1233
+u1235
+u1237
+u123A
+u123C
+u123E
+u1241
+u1244
+u1247
+u1249
+u124A
+u124E
+u1251
+u1255
+u1258
+u125B
+u125E
+u1261
+u1264
+u1267
+u126A
+u126D
+u1271
+u1275
+u1278
+u127B
+u127E
+u1282
+u1285
+u1288
+u128B
+u128E
+u1291
+u1293
+u1296
+u1298
+u129B
+u129E
+u12A1
+u12A4
+u12A6
+u12A9
+u12AD
+u12B0
+u12B3
+u12B7
+u12BA
+u12BC
+u12BF
+u12C1
+u12C3
+u12C5
+u12C7
+u12C9
+u12CB
+u12CD
+u12CF
+u12D1
+u12D3
+u12D5
+u12D7
+u12D9
+u12DB
+u12DF
+u12E3
+u12E7
+u12EB
+u12EF
+u12F3
+u12F7
+u12FB
+u12FF
+u1303
+u1307
+u130B
+u130F
+u1313
+u1318
+u131D
+u1322
+u1327
+u132C
+u1331
+u1336
+u133B
+u1340
+u1345
+u1349
+u134A
+u134F
+u1354
+u1359
+u135E
+u1362
+u1366
+u136A
+u136E
+u1372
+u1375
+u1376
+u1377
+u1378
+u1379
+u137A
+u137B
+u137C
+u137E
+u1380
+u1382
+u1386
+u138A
+u138E
+u1392
+u1396
+u139A
+u139E
+u13A0
+u13A2
+u13A6
+u13AA
+u13AE
+u13B2
+u13B6
+u13BA
+u13BE
+u13C2
+u13C6
+u13C9
+u13CA
+u13CE
+u13D2
+u13D6
+u13DA
+u13DE
+u13E2
+u13E6
+u13EA
+u13EE
+u13F0
+u13F2
+u13F4
+u13F6
+u13F8
+u13FA
+u13FC
+u13FE
+u1400
+u1402
+u1404
+u1406
+u1408
+u140A
+u140D
+u1410
+u1413
+u1416
+u1419
+u141C
+u141F
+u1422
+u1425
+u1428
+u142B
+u142E
+u1431
+u1434
+u1436
+u1438
+u143A
+u143C
+u143E
+u1440
+u1442
+u1444
+u1446
+u1448
+u1449
+u144A
+u144C
+u144E
+u1450
+u1452
+u1454
+u1456
+u1458
+u145A
+u145C
+u145E
+u1460
+u1462
+u1464
+u1466
+u1468
+u146A
+u146C
+u146E
+u1470
+u1472
+u1474
+u1476
+u1478
+u147A
+u147C
+u147E
+u1480
+u1482
+u1484
+u1486
+u1488
+u148A
+u148C
+u148E
+u1490
+u1492
+u1494
+u1496
+u1499
+u149C
+u149F
+u14A2
+u14A5
+u14A8
+u14AB
+u14AE
+u14B1
+u14B5
+u14B9
+u14BD
+u14BF
+u14C1
+u14C3
+u14C5
+u14C7
+u14C9
+u14CB
+u14CD
+u14CF
+u14D1
+u14D3
+u14D5
+u14D7
+u14D9
+u14DB
+u14DD
+u14DF
+u14E1
+u14E3
+u14E5
+u14E7
+u14E9
+u14EB
+u14ED
+u14EF
+u14F1
+u14F3
+u14F5
+u14F7
+u14F9
+u14FB
+u14FD
+u14FF
+u1501
+u1503
+u1505
+u1507
+u1509
+u150B
+u150D
+u150F
+u1511
+u1513
+u1515
+u1517
+u1519
+u151B
+u1521
+u1526
+u152C
+u1530
+u1536
+u153A
+u153E
+u1545
+u1549
+u154A
+u154E
+u1552
+u1556
+u155B
+u1560
+u1565
+u1566
+u156A
+u156F
+u1574
+u1579
+u1580
+u1583
+u1586
+u158A
+u1591
+u1597
+u159C
+u15A3
+u15AA
+u15AF
+u15B3
+u15B7
+u15BC
+u15C1
+u15C7
+u15C9
+u15CD
+u15D1
+u15D5
+u15DA
+u15DE
+u15E2
+u15E5
+u15E8
+u15EC
+u15F0
+u15F7
+u15FC
+u1602
+u1609
+u160E
+u1612
+u1615
+u1616
+u161D
+u1622
+u1629
+u162D
+u1633
+u1637
+u163C
+u1640
+u1645
+u1648
+u164B
+u1650
+u1656
+u165B
+u165E
+u1664
+u1668
+u166C
+u1671
+u1675
+u1679
+u167D
+u1680
+u1683
+u1688
+u168B
+u1692
+u1696
+u169C
+u16A0
+u16A1
+u16A6
+u16AA
+u16AE
+u16B3
+u16B6
+u16BB
+u16C1
+u16C4
+u16C8
+u16CB
+u16CF
+u16D2
+u16D5
+u16D8
+u16DB
+u16DE
+u16E1
+u16E4
+u16E7
+u16EA
+u16ED
+u16F1
+u16F5
+u16F9
+u16FD
+u1700
+u1701
+u1705
+u1709
+u170D
+u1711
+u1715
+u1717
+u1719
+u171D
+u1721
+u1725
+u1729
+u172D
+u1730
+u1733
+u1737
+u173A
+u173D
+u1740
+u1743
+u1746
+u1748
+u1749
+u174E
+u1751
+u1754
+u1757
+u175A
+u175D
+u1760
+u1763
+u1766
+u176A
+u176F
+u1772
+u1775
+u1778
+u177B
+u177E
+u1780
+u1781
+u1784
+u1788
+u178C
+u1790
+u1794
+u1797
+u179A
+u179D
+u17A0
+u17A3
+u17A6
+u17A9
+u17AC
+u17AF
+u17B2
+u17B6
+u17BA
+u17BD
+u17C1
+u17C5
+u17C9
+u17CC
+u17D0
+u17D4
+u17D9
+u17DC
+u17E0
+u17E4
+u17E8
+u17EC
+u17F2
+u17F9
+u17FC
+u17FF
+u1800
+u1802
+u1805
+u1808
+u180B
+u180E
+u1811
+u1814
+u1817
+u181A
+u181D
+u1820
+u1823
+u1826
+u1829
+u182C
+u182F
+u1834
+u1837
+u183A
+u183D
+u1842
+u1846
+u1849
+u184C
+u184F
+u1852
+u1855
+u1858
+u185B
+u185E
+u1861
+u1864
+u1868
+u186B
+u186E
+u1872
+u1876
+u1879
+u187E
+u1882
+u1885
+u1888
+u188B
+u188E
+u1891
+u1894
+u1897
+u189A
+u189D
+u18A0
+u18A3
+u18A6
+u18A9
+u18AD
+u18B0
+u18B1
+u18B5
+u18B9
+u18BD
+u18C1
+u18C5
+u18C9
+u18CD
+u18D1
+u18D5
+u18D9
+u18DD
+u18E1
+u18E5
+u18E9
+u18ED
+u18F1
+u18F5
+u18F9
+u18FD
+u1901
+u1904
+u1907
+u190A
+u190E
+u1912
+u1915
+u1918
+u191B
+u191E
+u1921
+u1924
+u1927
+u192A
+u192C
+u192E
+u1930
+u1932
+u1934
+u1936
+u1938
+u193A
+u193C
+u193E
+u1941
+u1943
+u1945
+u1947
+u1949
+u194B
+u194D
+u194F
+u1951
+u1953
+u1955
+u1957
+u1959
+u195B
+u195D
+u195F
+u1961
+u1963
+u1965
+u1967
+u1969
+u196B
+u196D
+u196F
+u1971
+u1973
+u1975
+u1977
+u1979
+u197B
+u197D
+u197F
+u1981
+u1983
+u1985
+u1987
+u1989
+u198B
+u198D
+u198F
+u1991
+u1993
+u1995
+u1997
+u1999
+u199B
+u199D
+u199F
+u19A1
+u19A3
+u19A5
+u19A7
+u19A9
+u19AB
+u19AD
+u19AF
+u19B1
+u19B3
+u19B5
+u19B7
+u19B9
+u19BB
+u19BD
+u19BF
+u19C1
+u19C3
+u19C5
+u19C7
+u19C9
+u19CB
+u19CD
+u19CF
+u19D1
+u19D3
+u19D5
+u19D7
+u19D9
+u19DB
+u19DD
+u19DF
+u19E1
+u19E3
+u19E5
+u19E7
+u19E9
+u19EB
+u19ED
+u19EF
+u19F1
+u19F3
+u19F5
+u19F7
+u19F9
+u19FB
+u19FD
+u19FF
+u1A01
+u1A03
+u1A05
+u1A07
+u1A09
+u1A0B
+u1A0D
+u1A0F
+u1A11
+u1A13
+u1A15
+u1A17
+u1A19
+u1A1B
+u1A1D
+u1A1F
+u1A21
+u1A23
+u1A25
+u1A27
+u1A29
+u1A2B
+u1A2D
+u1A2F
+u1A31
+u1A33
+u1A35
+u1A37
+u1A3A
+u1A3C
+u1A3E
+u1A41
+u1A44
+u1A46
+u1A48
+u1A4A
+u1A4C
+u1A4E
+u1A50
+u1A52
+u1A54
+u1A56
+u1A58
+u1A5A
+u1A5C
+u1A5E
+u1A60
+u1A62
+u1A64
+u1A67
+u1A6A
+u1A6D
+u1A70
+u1A73
+u1A76
+u1A79
+u1A7B
+u1A7D
+u1A7F
+u1A80
+u1A81
+u1A83
+u1A85
+u1A87
+u1A89
+u1A8B
+u1A8D
+u1A8F
+u1A91
+u1A93
+u1A95
+u1A97
+u1A99
+u1A9B
+u1A9D
+u1A9F
+u1AA1
+u1AA3
+u1AA5
+u1AA7
+u1AA9
+u1AAB
+u1AAD
+u1AB0
+u1AB3
+u1AB6
+u1AB9
+u1ABC
+u1ABF
+u1AC2
+u1AC5
+u1AC8
+u1ACB
+u1ACE
+u1AD1
+u1AD4
+u1AD7
+u1AD9
+u1ADB
+u1ADD
+u1ADF
+u1AE1
+u1AE3
+u1AE5
+u1AE7
+u1AE9
+u1AEB
+u1AED
+u1AEF
+u1AF1
+u1AF3
+u1AF5
+u1AF7
+u1AF9
+u1AFB
+u1AFD
+u1AFF
+u1B01
+u1B03
+u1B05
+u1B07
+u1B09
+u1B0B
+u1B0D
+u1B0F
+u1B11
+u1B13
+u1B15
+u1B17
+u1B19
+u1B1A
+u1B1B
+u1B1D
+u1B1F
+u1B21
+u1B23
+u1B25
+u1B27
+u1B29
+u1B2B
+u1B2D
+u1B2F
+u1B31
+u1B33
+u1B35
+u1B37
+u1B39
+u1B3B
+u1B3D
+u1B3F
+u1B41
+u1B43
+u1B45
+u1B47
+u1B49
+u1B4B
+u1B4D
+u1B4F
+u1B51
+u1B53
+u1B55
+u1B57
+u1B59
+u1B5B
+u1B5D
+u1B5F
+u1B61
+u1B63
+u1B65
+u1B67
+u1B69
+u1B6B
+u1B6D
+u1B6F
+u1B71
+u1B73
+u1B75
+u1B77
+u1B79
+u1B7B
+u1B7D
+u1B7F
+u1B81
+u1B83
+u1B85
+u1B87
+u1B89
+u1B8B
+u1B8D
+u1B8F
+u1B91
+u1B93
+u1B95
+u1B97
+u1B99
+u1B9B
+u1B9D
+u1B9F
+u1BA1
+u1BA3
+u1BA5
+u1BA7
+u1BA9
+u1BAB
+u1BAD
+u1BAF
+u1BB1
+u1BB3
+u1BB5
+u1BB7
+u1BB9
+u1BBB
+u1BBD
+u1BBF
+u1BC1
+u1BC3
+u1BC5
+u1BC7
+u1BC9
+u1BCB
+u1BCD
+u1BCF
+u1BD1
+u1BD3
+u1BD5
+u1BD7
+u1BD9
+u1BDB
+u1BDD
+u1BDF
+u1BE1
+u1BE3
+u1BE5
+u1BE7
+u1BE9
+u1BEB
+u1BED
+u1BEF
+u1BF1
+u1BF3
+u1BF5
+u1BF7
+u1BF9
+u1BFB
+u1BFD
+u1BFF
+u1C01
+u1C03
+u1C05
+u1C07
+u1C09
+u1C0B
+u1C0D
+u1C0F
+u1C11
+u1C13
+u1C15
+u1C17
+u1C19
+u1C1B
+u1C1D
+u1C1F
+u1C21
+u1C23
+u1C25
+u1C27
+u1C29
+u1C2B
+u1C2D
+u1C2F
+u1C31
+u1C33
+u1C35
+u1C37
+u1C39
+u1C3B
+u1C3E
+u1C41
+u1C44
+u1C46
+u1C48
+u1C4A
+u1C4C
+u1C4E
+u1C50
+u1C52
+u1C54
+u1C56
+u1C58
+u1C5A
+u1C5C
+u1C5E
+u1C60
+u1C62
+u1C64
+u1C66
+u1C68
+u1C6A
+u1C6C
+u1C6E
+u1C70
+u1C72
+u1C74
+u1C76
+u1C78
+u1C7A
+u1C7C
+u1C7E
+u1C80
+u1C82
+u1C84
+u1C86
+u1C88
+u1C8A
+u1C8C
+u1C8E
+u1C90
+u1C92
+u1C94
+u1C96
+u1C98
+u1C9A
+u1C9C
+u1C9E
+u1CA0
+u1CA2
+u1CA4
+u1CA6
+u1CA8
+u1CAA
+u1CAC
+u1CAE
+u1CB0
+u1CB2
+u1CB4
+u1CB6
+u1CB8
+u1CBA
+u1CBC
+u1CBE
+u1CC0
+u1CC2
+u1CC4
+u1CC6
+u1CC8
+u1CCA
+u1CCC
+u1CCE
+u1CD0
+u1CD2
+u1CD4
+u1CD6
+u1CD8
+u1CDA
+u1CDC
+u1CDE
+u1CE0
+u1CE2
+u1CE4
+u1CE6
+u1CE8
+u1CEA
+u1CEC
+u1CEE
+u1CF0
+u1CF2
+u1CF4
+u1CF6
+u1CF8
+u1CFA
+u1CFD
+u1D00
+u1D02
+u1D04
+u1D07
+u1D0A
+u1D0C
+u1D0F
+u1D12
+u1D14
+u1D17
+u1D19
+u1D1C
+u1D1F
+u1D22
+u1D25
+u1D28
+u1D2B
+u1D2E
+u1D30
+u1D32
+u1D35
+u1D38
+u1D3A
+u1D3D
+u1D3F
+u1D41
+u1D44
+u1D46
+u1D48
+u1D4A
+u1D4C
+u1D4E
+u1D50
+u1D53
+u1D55
+u1D58
+u1D5A
+u1D5D
+u1D5F
+u1D62
+u1D64
+u1D67
+u1D6B
+u1D6E
+u1D70
+u1D72
+u1D75
+u1D79
+u1D7C
+u1D7E
+u1D80
+u1D83
+u1D85
+u1D87
+u1D89
+u1D8B
+u1D8E
+u1D90
+u1D92
+u1D94
+u1D96
+u1D98
+u1D9A
+u1D9C
+u1D9E
+u1DA0
+u1DA2
+u1E00
+u1E00a
+u1E01
+u1E02
+u1E02C
+u1E03
+u1E04
+u1E04D
+u1E05
+u1E05d
+u1E06
+u1E06D
+u1E07
+u1E08
+u1E09
+u1E0A
+u1E0AE
+u1E0B
+u1E0Be
+u1E0C
+u1E0CE
+u1E0D
+u1E0De
+u1E0E
+u1E0EK
+u1E0F
+u1E0Fh
+u1E10
+u1E10G
+u1E11
+u1E11g
+u1E12
+u1E12E
+u1E13
+u1E13e
+u1E14
+u1E15
+u1E16
+u1E17
+u1E18
+u1E18L
+u1E19
+u1E19l
+u1E1A
+u1E1AI
+u1E1B
+u1E1Bi
+u1E1C
+u1E1D
+u1E1E
+u1E1EG
+u1E1F
+u1E1Fg
+u1E20
+u1E20I
+u1E21
+u1E22
+u1E22I
+u1E23
+u1E23m
+u1E24
+u1E24I
+u1E25
+u1E25i
+u1E26
+u1E26I
+u1E27
+u1E27i
+u1E28
+u1E28K
+u1E29
+u1E29k
+u1E2A
+u1E2Ah
+u1E2B
+u1E2C
+u1E2CU
+u1E2D
+u1E2Du
+u1E2E
+u1E2F
+u1E30
+u1E30L
+u1E31
+u1E31l
+u1E32
+u1E32L
+u1E33
+u1E33l
+u1E34
+u1E34L
+u1E35
+u1E35l
+u1E36
+u1E36M
+u1E37
+u1E37m
+u1E38
+u1E39
+u1E3A
+u1E3AN
+u1E3B
+u1E3Bn
+u1E3C
+u1E3CN
+u1E3D
+u1E3E
+u1E3EN
+u1E3F
+u1E3Fn
+u1E40
+u1E41
+u1E41n
+u1E42
+u1E43
+u1E43n
+u1E44
+u1E44P
+u1E45
+u1E45p
+u1E46
+u1E46O
+u1E47
+u1E48
+u1E48R
+u1E49
+u1E49r
+u1E4A
+u1E4AT
+u1E4B
+u1E4Bt
+u1E4C
+u1E4D
+u1E4E
+u1E4F
+u1E50
+u1E51
+u1E52
+u1E53
+u1E54
+u1E54R
+u1E55
+u1E55r
+u1E56
+u1E56R
+u1E57
+u1E57r
+u1E58
+u1E58S
+u1E59
+u1E5A
+u1E5AS
+u1E5B
+u1E5Bs
+u1E5C
+u1E5D
+u1E5E
+u1E5ET
+u1E5F
+u1E5Ft
+u1E60
+u1E60T
+u1E61
+u1E61t
+u1E62
+u1E62T
+u1E63
+u1E63t
+u1E64
+u1E65
+u1E66
+u1E67
+u1E68
+u1E69
+u1E6A
+u1E6AW
+u1E6B
+u1E6Bw
+u1E6C
+u1E6CU
+u1E6D
+u1E6Du
+u1E6E
+u1E6EZ
+u1E6F
+u1E6Fz
+u1E70
+u1E70U
+u1E71
+u1E71u
+u1E72
+u1E72u
+u1E73
+u1E74
+u1E74e
+u1E75
+u1E76
+u1E76d
+u1E77
+u1E78
+u1E79
+u1E7A
+u1E7B
+u1E7C
+u1E7CY
+u1E7D
+u1E7Dy
+u1E7E
+u1E7EW
+u1E7F
+u1E7Fw
+u1E80
+u1E80Y
+u1E81
+u1E81y
+u1E82
+u1E82Y
+u1E83
+u1E83y
+u1E84
+u1E84X
+u1E85
+u1E85x
+u1E86
+u1E86X
+u1E87
+u1E87x
+u1E88
+u1E88Y
+u1E89
+u1E89y
+u1E8A
+u1E8AY
+u1E8B
+u1E8By
+u1E8C
+u1E8CY
+u1E8D
+u1E8Dy
+u1E8E
+u1E8EZ
+u1E8F
+u1E8Fz
+u1E90
+u1E91
+u1E92
+u1E93
+u1E94
+u1E94b
+u1E95
+u1E96
+u1E96k
+u1E97
+u1E97u
+u1E98
+u1E98y
+u1E99
+u1E9A
+u1E9B
+u1EA0
+u1EA0B
+u1EA1
+u1EA1b
+u1EA2
+u1EA2E
+u1EA3
+u1EA3e
+u1EA4
+u1EA5
+u1EA6
+u1EA7
+u1EA8
+u1EA9
+u1EAA
+u1EAB
+u1EAC
+u1EAD
+u1EAE
+u1EAF
+u1EB0
+u1EB1
+u1EB2
+u1EB3
+u1EB4
+u1EB5
+u1EB6
+u1EB7
+u1EB8
+u1EB8H
+u1EB9
+u1EB9h
+u1EBA
+u1EBAI
+u1EBB
+u1EBBi
+u1EBC
+u1EBCI
+u1EBD
+u1EBDi
+u1EBE
+u1EBF
+u1EC0
+u1EC1
+u1EC2
+u1EC3
+u1EC4
+u1EC5
+u1EC6
+u1EC7
+u1EC8
+u1EC8O
+u1EC9
+u1ECA
+u1ECAK
+u1ECB
+u1ECBk
+u1ECC
+u1ECCR
+u1ECD
+u1ECDr
+u1ECE
+u1ECEU
+u1ECF
+u1ECFu
+u1ED0
+u1ED1
+u1ED2
+u1ED3
+u1ED4
+u1ED5
+u1ED6
+u1ED7
+u1ED8
+u1ED9
+u1EDA
+u1EDB
+u1EDC
+u1EDD
+u1EDE
+u1EDF
+u1EE0
+u1EE1
+u1EE2
+u1EE3
+u1EE4
+u1EE4V
+u1EE5
+u1EE5v
+u1EE6
+u1EE6Y
+u1EE7
+u1EE7y
+u1EE8
+u1EE9
+u1EEA
+u1EEB
+u1EEC
+u1EED
+u1EEE
+u1EEF
+u1EF0
+u1EF1
+u1EF2
+u1EF2a
+u1EF3
+u1EF4
+u1EF4Z
+u1EF5
+u1EF5z
+u1EF6
+u1EF6a
+u1EF7
+u1EF8
+u1EF8a
+u1EF9
+u1F00
+u1F01
+u1F02
+u1F03
+u1F04
+u1F05
+u1F06
+u1F07
+u1F08
+u1F09
+u1F0A
+u1F0B
+u1F0C
+u1F0D
+u1F0E
+u1F0F
+u1F10
+u1F11
+u1F12
+u1F13
+u1F14
+u1F15
+u1F18
+u1F19
+u1F1A
+u1F1B
+u1F1C
+u1F1D
+u1F1E
+u1F20
+u1F21
+u1F22
+u1F23
+u1F24
+u1F25
+u1F26
+u1F27
+u1F28
+u1F29
+u1F2A
+u1F2B
+u1F2C
+u1F2D
+u1F2E
+u1F2F
+u1F30
+u1F31
+u1F32
+u1F33
+u1F34
+u1F35
+u1F36
+u1F37
+u1F38
+u1F39
+u1F3A
+u1F3B
+u1F3C
+u1F3D
+u1F3E
+u1F3F
+u1F40
+u1F41
+u1F42
+u1F43
+u1F44
+u1F45
+u1F48
+u1F49
+u1F4A
+u1F4B
+u1F4C
+u1F4D
+u1F50
+u1F51
+u1F52
+u1F53
+u1F54
+u1F55
+u1F56
+u1F57
+u1F59
+u1F5B
+u1F5D
+u1F5F
+u1F60
+u1F61
+u1F62
+u1F63
+u1F64
+u1F65
+u1F66
+u1F67
+u1F68
+u1F69
+u1F6A
+u1F6B
+u1F6C
+u1F6D
+u1F6E
+u1F6F
+u1F70
+u1F71
+u1F72
+u1F73
+u1F74
+u1F75
+u1F76
+u1F77
+u1F78
+u1F79
+u1F7A
+u1F7B
+u1F7C
+u1F7D
+u1F80
+u1F81
+u1F82
+u1F83
+u1F84
+u1F85
+u1F86
+u1F87
+u1F88
+u1F89
+u1F8A
+u1F8B
+u1F8C
+u1F8D
+u1F8E
+u1F8F
+u1F90
+u1F91
+u1F92
+u1F93
+u1F94
+u1F95
+u1F96
+u1F97
+u1F98
+u1F99
+u1F9A
+u1F9B
+u1F9C
+u1F9D
+u1F9E
+u1F9F
+u1FA0
+u1FA1
+u1FA2
+u1FA3
+u1FA4
+u1FA5
+u1FA6
+u1FA7
+u1FA8
+u1FA9
+u1FAA
+u1FAB
+u1FAC
+u1FAD
+u1FAE
+u1FAF
+u1FB0
+u1FB1
+u1FB2
+u1FB3
+u1FB4
+u1FB6
+u1FB7
+u1FB8
+u1FB9
+u1FBA
+u1FBB
+u1FBC
+u1FBE
+u1FBF
+u1FC1
+u1FC2
+u1FC3
+u1FC4
+u1FC6
+u1FC7
+u1FC8
+u1FC9
+u1FCA
+u1FCB
+u1FCC
+u1FCD
+u1FCE
+u1FCF
+u1FD0
+u1FD1
+u1FD2
+u1FD3
+u1FD6
+u1FD7
+u1FD8
+u1FD9
+u1FDA
+u1FDB
+u1FDD
+u1FDE
+u1FDF
+u1FE0
+u1FE1
+u1FE2
+u1FE3
+u1FE4
+u1FE5
+u1FE6
+u1FE7
+u1FE8
+u1FE9
+u1FEA
+u1FEB
+u1FEC
+u1FED
+u1FEE
+u1FF2
+u1FF3
+u1FF4
+u1FF6
+u1FF7
+u1FF8
+u1FF9
+u1FFA
+u1FFB
+u1FFC
+u1FFE
+u1fbf
+u1ffe
+u2
+u2000
+u2001
+u2002
+u2003
+u2004
+u2005
+u2006
+u2007
+u2008
+u2009
+u200A
+u200B
+u200C
+u200D
+u200E
+u200F
+u2010
+u2011
+u2012
+u2013
+u2014
+u2015
+u2016
+u2017
+u2018
+u2019
+u201A
+u201C
+u201D
+u201E
+u201F
+u2020
+u2027
+u2028
+u2029
+u202A
+u202B
+u202C
+u202D
+u202E
+u202F
+u202e
+u2030
+u2031
+u2032
+u2033
+u2034
+u2035
+u2038
+u2039
+u203A
+u203B
+u203E
+u203F
+u2040
+u2041
+u2043
+u2044
+u2045
+u2046
+u206A
+u206F
+u206f
+u2070
+u2074
+u2079
+u207A
+u207C
+u207D
+u207E
+u207F
+u2080
+u2089
+u208A
+u208C
+u208D
+u208E
+u20A0
+u20AB
+u20D0
+u20D1
+u20D2
+u20D3
+u20D4
+u20D5
+u20D6
+u20D7
+u20D8
+u20D9
+u20DA
+u20DB
+u20DC
+u20DD
+u20DE
+u20DF
+u20E0
+u20E1
+u20a1
+u20a2
+u20a3
+u20a4
+u20a5
+u20a6
+u20a7
+u20a8
+u20a9
+u20aa
+u20ab
+u20ac
+u2100
+u2101
+u2102
+u2103
+u2106
+u2107
+u2108
+u2109
+u210A
+u210B
+u210D
+u210E
+u210F
+u2110
+u2112
+u2113
+u2114
+u2115
+u2116
+u2117
+u2118
+u211D
+u211E
+u2123
+u2124
+u2125
+u2126
+u2127
+u2128
+u2129
+u212A
+u212B
+u212D
+u212E
+u212F
+u2130
+u2131
+u2132
+u2133
+u2134
+u2135
+u2138
+u2150
+u2153
+u215F
+u2160
+u216C
+u216D
+u216E
+u216F
+u217C
+u217D
+u217E
+u217F
+u2180
+u2181
+u2182
+u2190
+u2191
+u2192
+u2193
+u2194
+u2195
+u21D1
+u21D2
+u21D3
+u21D4
+u21D5
+u21EA
+u2200
+u2203
+u2204
+u2208
+u2209
+u220B
+u220C
+u220b
+u2212
+u2215
+u221E
+u2223
+u2224
+u2225
+u2226
+u222b
+u222e
+u2241
+u2243
+u2244
+u2245
+u2247
+u2248
+u2249
+u224D
+u224d
+u2260
+u2261
+u2262
+u2264
+u2265
+u226D
+u226E
+u226F
+u2270
+u2271
+u2272
+u2273
+u2274
+u2275
+u2276
+u2277
+u2278
+u2279
+u227A
+u227B
+u227C
+u227D
+u227a
+u227b
+u227c
+u227d
+u2280
+u2281
+u2282
+u2283
+u2284
+u2285
+u2286
+u2287
+u2288
+u2289
+u2291
+u2292
+u22A2
+u22A8
+u22A9
+u22AB
+u22AC
+u22AD
+u22AE
+u22AF
+u22B2
+u22B3
+u22B4
+u22B5
+u22E0
+u22E1
+u22E2
+u22E3
+u22EA
+u22EB
+u22EC
+u22ED
+u22F1
+u22a2
+u22a8
+u22a9
+u22ab
+u22b2
+u22b3
+u22b4
+u22b5
+u2300
+u2302
+u2307
+u2308
+u230B
+u230C
+u231F
+u2320
+u2321
+u2322
+u2328
+u2329
+u232A
+u232B
+u237A
+u2400
+u2424
+u2435
+u2440
+u244A
+u245D
+u2460
+u2467
+u246A
+u249B
+u249C
+u24AA
+u24D6
+u24E9
+u24EA
+u2500
+u2502
+u2524
+u2580
+u2595
+u25A0
+u25EF
+u25a0
+u25cb
+u2600
+u2613
+u261A
+u266F
+u2700
+u2701
+u2704
+u2706
+u2709
+u270C
+u2726
+u2727
+u2729
+u274B
+u274D
+u274F
+u2752
+u2756
+u2758
+u275E
+u2761
+u2767
+u2776
+u2793
+u2794
+u2798
+u27AF
+u27B1
+u27BE
+u27C0
+u2800
+u2900
+u2928
+u2A80
+u2B2A
+u2D2C
+u2E80
+u2F00
+u2F2E
+u2FE0
+u2FF0
+u3000
+u3001
+u3002
+u3003
+u3004
+u3005
+u3006
+u3007
+u3008
+u3009
+u300A
+u300B
+u300C
+u300D
+u300E
+u300F
+u300a
+u300b
+u300c
+u300d
+u300e
+u300f
+u3010
+u3011
+u3012
+u3013
+u3014
+u3015
+u3016
+u3017
+u3018
+u3019
+u301A
+u301B
+u301C
+u301D
+u301E
+u301F
+u3020
+u3021
+u3029
+u302A
+u302F
+u3030
+u3031
+u3035
+u3036
+u3037
+u303F
+u3040
+u3041
+u3042
+u3043
+u3044
+u3045
+u3046
+u3047
+u3048
+u3049
+u304A
+u304B
+u304C
+u304D
+u304E
+u304F
+u304b
+u304d
+u304f
+u3050
+u3051
+u3052
+u3053
+u3054
+u3055
+u3056
+u3057
+u3058
+u3059
+u305A
+u305B
+u305C
+u305D
+u305E
+u305F
+u305b
+u305d
+u305f
+u3060
+u3061
+u3062
+u3063
+u3064
+u3065
+u3066
+u3067
+u3068
+u3069
+u306F
+u306f
+u3070
+u3072
+u3073
+u3075
+u3076
+u3078
+u3079
+u307B
+u307C
+u307b
+u3082
+u3083
+u3084
+u3085
+u3086
+u3087
+u3088
+u308D
+u308E
+u308F
+u3094
+u3099
+u309A
+u309B
+u309C
+u309D
+u309E
+u309a
+u309d
+u30A0
+u30A1
+u30A2
+u30A3
+u30A4
+u30A5
+u30A6
+u30A7
+u30A8
+u30A9
+u30AA
+u30AB
+u30AC
+u30AD
+u30AE
+u30AF
+u30B0
+u30B1
+u30B2
+u30B3
+u30B4
+u30B5
+u30B6
+u30B7
+u30B8
+u30B9
+u30BA
+u30BB
+u30BC
+u30BD
+u30BE
+u30BF
+u30C0
+u30C1
+u30C2
+u30C3
+u30C4
+u30C5
+u30C6
+u30C7
+u30C8
+u30C9
+u30CF
+u30D0
+u30D2
+u30D3
+u30D5
+u30D6
+u30D8
+u30D9
+u30DB
+u30DC
+u30DD
+u30DF
+u30E1
+u30E2
+u30E3
+u30E4
+u30E5
+u30E6
+u30E7
+u30E8
+u30ED
+u30EE
+u30EF
+u30F0
+u30F1
+u30F2
+u30F4
+u30F5
+u30F6
+u30F7
+u30F8
+u30F9
+u30FA
+u30FB
+u30FC
+u30FD
+u30FE
+u30a1
+u30a2
+u30a3
+u30a4
+u30a5
+u30a6
+u30a7
+u30a8
+u30a9
+u30aa
+u30ab
+u30ad
+u30af
+u30b1
+u30b3
+u30b5
+u30b7
+u30b9
+u30bb
+u30bd
+u30bf
+u30c1
+u30c3
+u30c4
+u30c6
+u30c8
+u30ca
+u30cb
+u30cc
+u30cd
+u30ce
+u30cf
+u30d2
+u30d5
+u30d8
+u30db
+u30de
+u30df
+u30e0
+u30e1
+u30e2
+u30e3
+u30e4
+u30e5
+u30e6
+u30e7
+u30e8
+u30e9
+u30ea
+u30eb
+u30ec
+u30ed
+u30ef
+u30f0
+u30f1
+u30f2
+u30f3
+u30fb
+u30fc
+u30fd
+u3100
+u3105
+u312C
+u3130
+u3131
+u3180
+u318E
+u3190
+u3191
+u3192
+u3195
+u3196
+u319F
+u31A0
+u31C0
+u3200
+u321C
+u3220
+u3229
+u322A
+u3231
+u3243
+u3260
+u327B
+u327F
+u3280
+u3289
+u328A
+u32B0
+u32C0
+u32CB
+u32D0
+u32FE
+u3300
+u3376
+u337B
+u33DD
+u33E0
+u33FE
+u3400
+u3409
+u3433
+u3609
+u3630
+u3709
+u3749
+u3800
+u3837
+u3980
+u3A39
+u3A80
+u3C3B
+u3E3D
+u4000
+u400C
+u400D
+u400E
+u400F
+u403F
+u4180
+u4241
+u4443
+u4645
+u46B1
+u473B
+u4800
+u4948
+u4A4A
+u4AA5
+u4B4A
+u4B80
+u4D4C
+u4DB6
+u4E00
+u4F4E
+u4e00
+u4e01
+u4e03
+u4e09
+u4e0a
+u4e0b
+u4e19
+u4e2d
+u4e59
+u4e5d
+u4e8c
+u4e94
+u4eba
+u4ee3
+u4f01
+u4f11
+u4f1a
+u5000
+u5017
+u512a
+u5150
+u5154
+u5156
+u516b
+u516d
+u5199
+u52b4
+u533b
+u5341
+u5352
+u5354
+u5370
+u53f3
+u540d
+u547c
+u548c
+u5552
+u56db
+u571f
+u5730
+u5800
+u5857
+u591c
+u5927
+u5929
+u5973
+u5A59
+u5A64
+u5BC3
+u5C4A
+u5C5B
+u5C5C
+u5C66
+u5C80
+u5CA5
+u5F5E
+u5b66
+u5b97
+u5de6
+u5e73
+u5f0f
+u6000
+u601A
+u6060
+u6180
+u6210
+u6261
+u6463
+u6580
+u65e5
+u660e
+u662d
+u665C
+u665E
+u6665
+u6666
+u6680
+u6681
+u6689
+u66A5
+u6708
+u6709
+u6728
+u6800
+u6824
+u682a
+u6858
+u685B
+u685E
+u6868
+u686E
+u6871
+u6872
+u6874
+u687B
+u6880
+u68A5
+u6968
+u6A6A
+u6B24
+u6D6C
+u6F68
+u6b63
+u6c34
+u6cbb
+u6ce8
+u7001
+u7002
+u7004
+u7005
+u700A
+u7068
+u706b
+u70b9
+u7279
+u740A
+u742A
+u7473
+u748A
+u7532
+u7537
+u762A
+u764A
+u7675
+u76e3
+u772A
+u776A
+u7800
+u780A
+u7877
+u793e
+u795d
+u7968
+u796d
+u79d8
+u7A68
+u7C68
+u7D68
+u7F7E
+u7FE1
+u7FE2
+u7FFF
+u7FFFNQTWZ
+u800F
+u8058
+u805C
+u8066
+u8080
+u8086
+u8087
+u8088
+u8089
+u8094
+u8097
+u8098
+u80A3
+u80A5
+u80A6
+u80B0
+u80B7
+u80BC
+u80BE
+u80C0
+u80C4
+u80C9
+u80CC
+u80CD
+u80D0
+u80D1
+u80D4
+u80D7
+u80DC
+u80DD
+u80DE
+u80E3
+u80EA
+u80F2
+u80FA
+u8166
+u8181
+u81A5
+u81ea
+u81f3
+u8281
+u82C7
+u8368
+u8508
+u8780
+u8786
+u87A5
+u88A5
+u8980
+u8988
+u89A5
+u8A8B
+u8B8A
+u8C8D
+u8D8C
+u8E8F
+u8F8E
+u8ca1
+u8cc7
+u9069
+u9091
+u9190
+u91d1
+u9293
+u9392
+u9594
+u9596
+u9796
+u9805
+u9980
+u9998
+u9AA5
+u9B9A
+u9B9C
+u9D9C
+u9D9E
+u9DAB
+u9F9E
+u9FA0
+u9FA5
+u9fff
+uA000
+uA1A0
+uA1A2
+uA3A2
+uA490
+uA4D0
+uA504
+uA505
+uA506
+uA508
+uA509
+uA50B
+uA50C
+uA50D
+uA512
+uA514
+uA51B
+uA51D
+uA51E
+uA522
+uA539
+uA53E
+uA53F
+uA540
+uA550
+uA556
+uA579
+uA580
+uA5A4
+uA5A5
+uA5A50
+uA5A51
+uA5A53
+uA5A55
+uA5A56
+uA5A5A
+uA5A5C
+uA5A5F
+uA5A5H
+uA5A5J
+uA5A5L
+uA5A5W
+uA5A5Y
+uA5A5h
+uA5A5x
+uA7A6
+uA7A8
+uA8A8
+uA9A8
+uA9AA
+uABAB
+uABAC
+uABB7
+uABBF
+uAC00
+uACAB
+uADA5
+uAEAD
+uAEAF
+uB0AF
+uB1A5
+uB2A5
+uB2B1
+uB3B4
+uB4B3
+uB5B6
+uB6B5
+uB8A5
+uB8AB
+uB9A5
+uBAB9
+uBABB
+uBCBB
+uBD80
+uBEBD
+uBF89
+uC0B3
+uC1A5
+uC2C1
+uC3C2
+uC468
+uC5C6
+uC6C5
+uC7C8
+uC9C8
+uCAA5
+uCBA5
+uCBCA
+uCDCC
+uCECF
+uCFCE
+uCFD1
+uD0A8
+uD268
+uD2D3
+uD368
+uD5D4
+uD5D6
+uD768
+uD7A3
+uD7A4
+uD800
+uD8D8
+uD8D9
+uD9D9
+uDA68
+uDADB
+uDBFF
+uDC00
+uDCDB
+uDE30
+uDFE0
+uDFFF
+uE000
+uE030
+uE1A5
+uE280
+uE4E3
+uE4E5
+uE524
+uE6E7
+uE7E6
+uE800
+uE830
+uE8E9
+uEAE9
+uEBEC
+uECEB
+uEDEE
+uEEED
+uEFF0
+uF001
+uF002
+uF003
+uF0EF
+uF180
+uF3F4
+uF5F6
+uF780
+uF8F9
+uF900
+uFA2D
+uFB00
+uFB01
+uFB02
+uFB03
+uFB04
+uFB05
+uFB06
+uFB13
+uFB14
+uFB15
+uFB16
+uFB17
+uFB1E
+uFB1F
+uFB28
+uFB29
+uFB2A
+uFB2B
+uFB2C
+uFB2D
+uFB2E
+uFB2F
+uFB30
+uFB31
+uFB32
+uFB33
+uFB34
+uFB35
+uFB36
+uFB38
+uFB39
+uFB3A
+uFB3B
+uFB3C
+uFB3E
+uFB40
+uFB41
+uFB43
+uFB44
+uFB46
+uFB47
+uFB48
+uFB49
+uFB4A
+uFB4B
+uFB4C
+uFB4D
+uFB4E
+uFB50
+uFBB1
+uFBD3
+uFBFC
+uFD3D
+uFD3E
+uFD3F
+uFD50
+uFD8F
+uFD92
+uFDC7
+uFDF0
+uFDFB
+uFDFE
+uFE00
+uFE20
+uFE23
+uFE30
+uFE31
+uFE32
+uFE33
+uFE34
+uFE35
+uFE36
+uFE37
+uFE38
+uFE39
+uFE3A
+uFE3B
+uFE3C
+uFE3D
+uFE3E
+uFE3F
+uFE40
+uFE41
+uFE42
+uFE43
+uFE44
+uFE49
+uFE4C
+uFE4D
+uFE4F
+uFE50
+uFE52
+uFE54
+uFE57
+uFE58
+uFE59
+uFE5A
+uFE5B
+uFE5C
+uFE5D
+uFE5E
+uFE5F
+uFE61
+uFE62
+uFE63
+uFE64
+uFE66
+uFE68
+uFE69
+uFE6A
+uFE6B
+uFE70
+uFE72
+uFE74
+uFE76
+uFEFC
+uFEFF
+uFF00
+uFF01
+uFF03
+uFF04
+uFF05
+uFF07
+uFF08
+uFF09
+uFF0A
+uFF0B
+uFF0C
+uFF0D
+uFF0E
+uFF0F
+uFF10
+uFF19
+uFF1A
+uFF1B
+uFF1C
+uFF1E
+uFF1F
+uFF20
+uFF21
+uFF3A
+uFF3B
+uFF3C
+uFF3D
+uFF3F
+uFF41
+uFF5A
+uFF5B
+uFF5C
+uFF5D
+uFF5E
+uFF61
+uFF62
+uFF63
+uFF64
+uFF65
+uFF66
+uFF6F
+uFF70
+uFF71
+uFF9D
+uFF9E
+uFF9F
+uFFA0
+uFFA5
+uFFBE
+uFFC2
+uFFC7
+uFFCA
+uFFCF
+uFFD2
+uFFD7
+uFFDA
+uFFDC
+uFFE0
+uFFE1
+uFFE2
+uFFE4
+uFFE5
+uFFE6
+uFFE8
+uFFEC
+uFFED
+uFFEE
+uFFF0
+uFFFD
+uFFFE
+uFFFF
+uOdd
+uSectorShift
+ub
+uc
+uci
+ucl
+ucp
+udp
+udx
+udy
+ue
+uf
+uffff
+ugly
+uguig
+uhe
+uiuc
+ukukr
+ul
+ulenSq
+ulp
+ulps
+ulpval
+ultimately
+umlaut
+un
+unable
+unaccelerated
+unacceptable
+unaffected
+unaligned
+unalignedKnown
+unaltered
+unambiguous
+unappealing
+unascribed
+unassigned
+unauthorized
+unavailable
+unavoidable
+unbalanced
+unbiased
+unbind
+unblock
+unblocked
+unbound
+unbounded
+unc
+uncancelled
+uncaught
+uncaughtException
+uncertainty
+unchanged
+unchecked
+unclosed
+uncollated
+uncomment
+uncommitted
+uncommon
+unconditionally
+unconnected
+unconsumed
+undecorated
+undefined
+under
+underConstruction
+underallocation
+underbar
+underbars
+underdot
+underflow
+underflowed
+underline
+underlineOffset
+underlineThickness
+underlyhing
+underlying
+underneath
+underscore
+underscores
+understable
+understand
+understands
+understood
+undesirable
+undetermined
+undisplayable
+undo
+undone
+unduplicated
+unencoded
+unequal
+unescaped
+uneven
+unexpected
+unexpectedly
+unexportObject
+unflattened
+unforgeable
+unfortunate
+unfortunately
+unhappy
+unicast
+unicode
+unicodeBlockStarts
+unicodes
+unidirectional
+unifies
+uniform
+uniformity
+uniformly
+unify
+unimportant
+uninitialized
+uninitializedMap
+uninstantiable
+unintentionally
+uninterpreted
+uninvoked
+union
+unioning
+uniq
+unique
+uniqueMethods
+uniquely
+uniqueness
+unit
+unitInUse
+unitIncrement
+unitIndex
+units
+unitsInCommon
+unitsInUse
+unitsRequired
+universal
+universally
+unknown
+unknownAddress
+unknown_array
+unknowns
+unlabeled
+unless
+unlike
+unlikely
+unlimited
+unlink
+unload
+unloaded
+unlocalized
+unlock
+unlocks
+unmap
+unmappable
+unmapped
+unmapping
+unmaps
+unmarshaling
+unmarshalled
+unmarshalling
+unmatched
+unmodifiable
+unmodifiableCollection
+unmodifiableList
+unmodifiableMap
+unmodifiableSet
+unmodifiableSortedMap
+unmodifiableSortedSet
+unmodified
+unmounting
+unnamed
+unnecessarily
+unnecessary
+unneeded
+unnormalized
+unordered
+unpack
+unpackRules
+unpackTimes
+unpacking
+unparseable
+unparsed
+unpopulated
+unpredicable
+unpredictability
+unpredictable
+unprepared
+unpublished
+unqiue
+unqualifiedClassName
+unquoted
+unreachable
+unread
+unreadAvail
+unreasonably
+unrecognized
+unreferenced
+unregistered
+unrelated
+unreliable
+unreserved
+unresolvable
+unresolved
+unroll
+unrolled
+unsafe
+unsatisfactory
+unscaled
+unscaledVal
+unscaledValue
+unscrupulous
+unset
+unshared
+unsharedMarker
+unsightly
+unsigned
+unsignedLongCompare
+unspecified
+unstarted
+unsuccessful
+unsupported
+unsuspendSomeThreads
+unsynchronized
+until
+untilFocused
+unto
+untouched
+untransformed
+untrusted
+unusable
+unused
+unusual
+unwrap
+unwrapped
+up
+upCycleDefaultFocusTraversalKeys
+upCycleFocusTraversalKeys
+upFocusCycle
+upalpha
+upcalls
+upcates
+upcoming
+updatable
+update
+updateArray
+updateAsciiStream
+updateBigDecimal
+updateBinaryStream
+updateBlob
+updateBoolean
+updateBounds
+updateByte
+updateBytes
+updateCharacterStream
+updateClob
+updateCounts
+updateCur
+updateCursorImmediately
+updateDate
+updateDouble
+updateFloat
+updateInt
+updateLong
+updateLookupTable
+updateNull
+updateObject
+updateRef
+updateRow
+updateRunInfo
+updateShort
+updateStateTable
+updateString
+updateSystemColors
+updateTime
+updateTimestamp
+updated
+updater
+updates
+updatesAreDetected
+updating
+upercase
+uphold
+upon
+upper
+upperCase
+upperCaseChar
+upperChar
+upperCharArray
+upperMap
+uppercase
+uppercased
+upscaled
+upsilon
+upto
+upward
+upwards
+ur
+urge
+urgent
+uri
+uric
+uric_no_slash
+url
+urlc
+urlencoded
+urls
+urn
+urp
+ururd
+us
+usCollator
+usable
+usage
+use
+useCaches
+useDaylight
+useDaylightTime
+useDeferredClose
+useDouble
+useExponentialNotation
+useMonth
+usePlatformFontMetrics
+useProtocolVersion
+useProxy
+useShiftModifier
+useSocks
+useThousands
+useV4
+usecaches
+used
+usedInContractSeq
+useful
+usefull
+usefully
+useless
+user
+userBounds
+userInfo
+userName
+userinfo
+username
+usernames
+users
+uses
+usesFractionalMetrics
+usesLocalFilePerTable
+usesLocalFiles
+usesPlatformFont
+usesShift
+usesShiftModifier
+using
+usingProxy
+usno
+usr
+usr_paths
+usual
+usually
+ut
+utc
+utcCal
+utf
+utflen
+util
+utilities
+utility
+utilize
+utilized
+uuml
+uwe
+uxxxx
+uzuzb
+v
+v1
+v2
+v4
+v4addr
+v5
+v6
+vAdjustable
+vAdjustableValue
+val
+val1
+val2
+valBits
+valEquals
+valid
+validAttribs
+validMask
+validate
+validateFields
+validateObject
+validateTree
+validated
+validatedContents
+validation
+validations
+validity
+valign
+vals
+value
+value1
+value2
+valueHash
+valueIndex
+valueIsAdjusting
+valueList
+valueOf
+valueSearchNonNull
+valueSearchNull
+valueToExpression
+valueToName
+valued
+values
+valuesMatch
+van
+var
+variable
+variables
+variant
+variant1
+variant2
+variantLength
+variantNames
+variants
+variation
+variations
+varies
+variety
+various
+vary
+varying
+vast
+vbarOn
+vbarWidth
+vcap
+ve
+vec
+vecswap
+vector
+vectors
+vendor
+vendorCode
+vendors
+ver
+verification
+verificationEngine
+verificationKey
+verified
+verifier
+verifies
+verify
+verifySubclass
+verifying
+versa
+version
+versionColumnNotPseudo
+versionColumnPseudo
+versionColumnUnknown
+versioning
+versions
+vert
+vertex
+vertical
+verticalScrollBar
+vertically
+vertices
+very
+veto
+vetoable
+vetoableChange
+vetoableChangeSupportSerializedDataVersion
+vetoableSupport
+vetoed
+vetos
+vgap
+via
+vice
+victim
+video
+vie
+view
+viewHeight
+viewWidth
+viewable
+viewed
+viewedBuffer
+viewer
+viewers
+viewport
+views
+violate
+violated
+violates
+violating
+violation
+virgin
+virtual
+virtualBounds
+viruses
+vis
+visibility
+visible
+visibleAmount
+visibleIndex
+visibly
+visit
+visited
+visual
+vivie
+vkMap
+vlist
+vm
+vmAllowSuspension
+vmspec
+vnd
+void
+volatile
+volume
+vovol
+vowel
+vowels
+vs
+vt
+vulnerability
+vulnerable
+w
+w3
+wIsReal
+wa
+wait
+waitFor
+waitForAll
+waitForID
+waitForIdle
+waitForProcessExit
+waited
+waiters
+waiting
+waits
+wake
+wakeup
+walk
+walked
+walks
+wall
+wallSec
+walls
+want
+wants
+war
+warn
+warning
+warningString
+warnings
+warrant
+was
+wasNull
+wasn
+waste
+wasted
+wasting
+watch
+watermelon
+wav
+way
+ways
+wb
+wbits
+we
+weak
+weakChild
+weakThis
+weakValue
+weakWindow
+weaker
+wednesday
+weeded
+weeding
+week
+weekCount
+weekNo
+weekNumber
+weekday
+weekdays
+weeks
+weight
+weightX
+weightY
+weight_diff
+weights
+weightx
+weighty
+weird
+well
+went
+were
+weren
+west
+westward
+wether
+wh
+what
+whatever
+whatsoever
+wheel
+wheelAmt
+wheelScrollingEnabled
+when
+whenever
+where
+whereas
+whereby
+wherein
+whereupon
+wherever
+whether
+which
+whichever
+while
+whim
+white
+whiteSpaceChars
+whitespace
+whitespaceChars
+whitespaces
+whitespce
+who
+whoever
+whole
+wholly
+whose
+why
+wich
+wide
+widening
+wider
+widget
+widgets
+width
+widthToAlignmentPoint
+widths
+wiht
+wild
+wildcard
+wildcards
+will
+willing
+willy
+win
+win32
+wind
+winding
+window
+windowActivated
+windowBorder
+windowBounds
+windowClosed
+windowClosing
+windowClosingDelivered
+windowClosingException
+windowClosingNotify
+windowDeactivated
+windowDeiconfied
+windowDeiconified
+windowFocusL
+windowFocusListener
+windowFocusListenerK
+windowFocusWindowK
+windowGainedFocus
+windowIconified
+windowL
+windowListener
+windowListenerK
+windowLostFocus
+windowOpened
+windowSerializedDataVersion
+windowStateChanged
+windowStateL
+windowStateListener
+windowStateListenerK
+windowText
+windowed
+windowedModeBounds
+windowing
+windowless
+windows
+wins
+wire
+wise
+wish
+wishes
+wishing
+with
+withWhiteSpace
+within
+without
+wk
+wlen
+wls
+womStamp
+wombat
+won
+word
+wordChars
+wordcount
+words
+wordwise
+work
+workaround
+worker
+workhorse
+working
+workingLocale
+works
+world
+worry
+wors
+worst
+worth
+would
+wouldn
+wowol
+woy
+woyStamp
+wr
+wrap
+wrapped
+wrapper
+wrappers
+wrapping
+wraps
+wrinkle
+writable
+write
+writeArray
+writeAsciiStream
+writeBigDecimal
+writeBinaryStream
+writeBlob
+writeBlockHeader
+writeBoolean
+writeBooleans
+writeBuffer
+writeBufferSize
+writeByte
+writeBytes
+writeChar
+writeCharacterStream
+writeChars
+writeClass
+writeClassDesc
+writeClassDescriptor
+writeClob
+writeDate
+writeDouble
+writeDoubles
+writeExpression
+writeExternal
+writeExternalData
+writeFatalException
+writeFields
+writeFileDescriptor
+writeFloat
+writeFloats
+writeHandle
+writeInt
+writeInts
+writeLocation
+writeLong
+writeLongUTF
+writeLongs
+writeMethod
+writeNonProxy
+writeNonProxyDesc
+writeNull
+writeObject
+writeObject0
+writeObject1
+writeObjectMethod
+writeObjectOverride
+writeOrdinaryObject
+writeProxyDesc
+writeRef
+writeReplace
+writeReplaceMethod
+writeSQ
+writeSQL
+writeSerialData
+writeShort
+writeShorts
+writeSide
+writeStatement
+writeStreamHeader
+writeString
+writeStruct
+writeTime
+writeTimestamp
+writeTo
+writeTypeString
+writeURL
+writeUTF
+writeUTFBody
+writeUnshared
+writeable
+writeln
+writer
+writes
+writing
+writtem
+written
+wrong
+wrongBreakPositions
+wrongly
+wroteUnencodedChar
+wrt
+ws
+wst
+wt
+wtb
+www
+x
+x0
+x1
+x10
+x2
+xAlign
+xDec
+xIndex
+xInt
+xLen
+xLong
+xMax
+xOrg
+xPoints
+xbgrmodel
+xcp
+xcps
+xerr
+xes
+xform
+xhi
+xhxho
+xlen
+xlo
+xm
+xml
+xmul
+xn
+xoffs
+xor
+xorcolor
+xpoints
+xr
+xrgbRasRef
+xrgbmodel
+xstart
+xt
+xvec
+xx
+xxx
+xxxx
+xxyxyyyxyxyxxyxyx
+xxyxyyyxyxyxxyxyxyy
+xy
+xyz
+y
+y0
+y1
+y2
+yAlign
+yIndex
+yLen
+yMax
+yOrg
+yPoints
+y_amount
+year
+yearLength
+years
+yellow
+yen
+yerr
+yes
+yet
+yhi
+yi
+yield
+yielding
+yields
+yiyid
+ylen
+ylo
+ylong
+ym
+ymul
+yn
+yoffs
+yomi
+you
+your
+yourself
+yoyor
+ypoints
+yr
+ystart
+yucky
+yvec
+yxyyyxyxyxxyxyxyy
+yy
+yyyy
+yyyyMMdd
+yyyyy
+z
+za
+zapParsedStr
+zazha
+zed
+zero
+zeroDelta
+zeroDigit
+zeroDigitCount
+zeroPaddingNumber
+zeroed
+zeroes
+zeroeth
+zeroing
+zeros
+zeroth
+zet
+zh
+zhzho
+zi
+zip
+zlen
+zlong
+zone
+zoneID
+zoneIndex
+zoneOffset
+zoneResource
+zoneString
+zoneStrings
+zones
+zoro
+zuzul
+zval
+zy
+zzz
+zzzz

Added: branches/backport-util-concurrent/upstream/2.2/test/loops/words/kw.txt
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/loops/words/kw.txt	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/loops/words/kw.txt	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,50 @@
+assert
+abstract
+default
+if
+private
+this
+boolean
+do
+implements
+protected
+throw
+break
+double
+import
+public
+throws
+byte
+else
+instanceof
+return
+transient
+case
+extends
+int
+short
+try
+catch
+final
+interface
+static
+void
+char
+finally
+long
+strictfp
+volatile
+class
+float
+native
+super
+while
+const
+for
+new
+switch
+continue
+goto
+package
+synchronized
+

Added: branches/backport-util-concurrent/upstream/2.2/test/serialization/SerializationTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/serialization/SerializationTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/serialization/SerializationTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,205 @@
+
+import java.rmi.MarshalledObject;
+import java.io.*;
+import java.util.List;
+import java.util.ArrayList;
+
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.PriorityQueue;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.atomic.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Iterator;
+import java.util.Collection;
+
+/**
+ * Class to test serial compatibility between backport versions
+ */
+public class SerializationTest {
+
+    final static List ldata;
+    final static Map mdata;
+
+    static {
+        ldata = new ArrayList();
+        ldata.add("s1");
+        ldata.add("s2");
+        ldata.add("s3");
+        mdata = new HashMap();
+        mdata.put("key 1", "value 1");
+        mdata.put("key 2", new Long(4));
+    }
+
+    public static void main(String[] args) throws IOException {
+        if (args.length < 2) throw new IllegalArgumentException("Need 2 arguments");
+        String op       = args[0];
+        String filename = args[1];
+        File f = new File(filename);
+        if ("-serialize".equals(op) || "serialize".equals(op)) {
+            FileOutputStream fout = new FileOutputStream(f);
+            OutputStream out = new BufferedOutputStream(fout);
+            List objs = createObjects();
+            for (Iterator itr = objs.iterator(); itr.hasNext(); ) {
+                serializeObject(itr.next(), out);
+            }
+            out.flush();
+            out.close();
+        }
+        else {
+            FileInputStream fin = new FileInputStream(f);
+            InputStream in = new BufferedInputStream(fin);
+            deserializeObjects(in);
+        }
+    }
+
+    private static List createObjects() {
+        List objs = new ArrayList();
+
+        // collections
+
+        objs.add(new ArrayBlockingQueue(100, false, ldata));
+        objs.add(new ArrayDeque(ldata));
+        objs.add(new LinkedBlockingDeque(ldata));
+        objs.add(new LinkedBlockingQueue(ldata));
+        objs.add(new LinkedList(ldata));
+        objs.add(new PriorityQueue(ldata));
+        objs.add(new PriorityBlockingQueue(ldata));
+        CopyOnWriteArrayList cowl = new CopyOnWriteArrayList(ldata);
+        objs.add(cowl);
+        objs.add(cowl.subList(1, 2));
+        objs.add(new CopyOnWriteArraySet(ldata));
+        objs.add(new SynchronousQueue(false));
+        objs.add(new SynchronousQueue(true));
+
+        ConcurrentHashMap m = new ConcurrentHashMap(mdata);
+        objs.add(m);
+        //objs.add(m.keySet());
+        //objs.add(m.values());
+        objs.add(new ConcurrentLinkedQueue(ldata));
+        NavigableMap nm = new ConcurrentSkipListMap(mdata);
+        objs.add(nm);
+        objs.add(nm.subMap("key 0", "key 3"));
+        NavigableSet ns = new ConcurrentSkipListSet(mdata.keySet());
+        objs.add(ns);
+        objs.add(ns.subSet("key 0", "key 3"));
+        nm = new TreeMap(mdata);
+        objs.add(nm);
+        objs.add(nm.subMap("key 0", "key 3"));
+        ns = new TreeSet(mdata.keySet());
+        objs.add(ns);
+        objs.add(ns.subSet("key 0", "key 3"));
+
+        // atomics
+
+        objs.add(new AtomicBoolean(true));
+        objs.add(new AtomicInteger(123));
+        objs.add(new AtomicIntegerArray(new int[] { 1, 2, 3}));
+        objs.add(new AtomicLong(123L));
+        objs.add(new AtomicLongArray(new long[] { 1L, 2L, 3L}));
+        objs.add(new AtomicReference(new Integer(3)));
+        objs.add(new AtomicReferenceArray(new Integer[] {
+            new Integer(1), new Integer(2), new Integer(3)}));
+
+        // locks
+
+        serializeLock(objs, new ReentrantLock(false));
+        serializeLock(objs, new ReentrantLock(true));
+        ReentrantReadWriteLock rr = new ReentrantReadWriteLock();
+        objs.add(rr);
+        serializeLock(objs, rr.readLock());
+        serializeLock(objs, rr.writeLock());
+        serializeSemaphore(objs, new Semaphore(10, false));
+        serializeSemaphore(objs, new Semaphore(10, true));
+
+        // other
+        objs.add(TimeUnit.DAYS);
+        objs.add(TimeUnit.HOURS);
+        objs.add(TimeUnit.MINUTES);
+        objs.add(TimeUnit.SECONDS);
+        objs.add(TimeUnit.MILLISECONDS);
+        objs.add(TimeUnit.MICROSECONDS);
+        objs.add(TimeUnit.NANOSECONDS);
+
+        return objs;
+    }
+
+    private static void serializeLock(List objs, Lock l) {
+        l.lock();
+        try {
+            objs.add(l);
+            objs.add(l.newCondition());
+        }
+        catch (UnsupportedOperationException e) {}
+        finally {
+            l.unlock();
+        }
+    }
+
+    private static void serializeSemaphore(List objs, Semaphore s) {
+        s.acquireUninterruptibly();
+        try {
+            objs.add(s);
+        }
+        finally {
+            s.release();
+        }
+    }
+
+    private static void serializeObject(Object obj, OutputStream out) {
+        try {
+            ByteArrayOutputStream bos = new ByteArrayOutputStream();
+            ObjectOutputStream oos = new ObjectOutputStream(bos);
+            oos.writeObject(obj);
+            oos.flush();
+            oos.close();
+            int size = bos.size();
+            DataOutputStream dout = new DataOutputStream(out);
+            dout.writeInt(size);
+            bos.writeTo(dout);
+        }
+        catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    private static void deserializeObjects(InputStream in) throws IOException {
+        DataInput din = new DataInputStream(in);
+        while (true) {
+            int size;
+            try {
+                size = din.readInt();
+            }
+            catch (EOFException e) {
+                return;
+            }
+            byte[] arr = new byte[size];
+            din.readFully(arr);
+            ByteArrayInputStream bin = new ByteArrayInputStream(arr);
+            ObjectInputStream oin = new ObjectInputStream(bin);
+            try {
+                Object obj = oin.readObject();
+                System.out.println(obj);
+                if (obj instanceof Lock) {
+                    Lock l = (Lock)obj;
+                    l.lock();
+                    l.unlock();
+                }
+                else if (obj instanceof ReadWriteLock) {
+                    ReadWriteLock rl = (ReadWriteLock)obj;
+                    Lock r = rl.readLock();
+                    Lock w = rl.writeLock();
+                    r.lock();
+                    r.unlock();
+                    w.newCondition();
+                    w.lock();
+                    w.unlock();
+                }
+            }
+            catch (Throwable e) {
+                e.printStackTrace();
+            }
+        }
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/LinkedListTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/LinkedListTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/LinkedListTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,594 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes, 
+ * Pat Fisher, Mike Judd. 
+ */
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+
+public class LinkedListTest extends JSR166TestCase {
+    public static void main(String[] args) {
+	junit.textui.TestRunner.run (suite());	
+    }
+
+    public static Test suite() {
+	return new TestSuite(LinkedListTest.class);
+    }
+
+    /**
+     * Create a queue of given size containing consecutive
+     * Integers 0 ... n.
+     */
+    private LinkedList populatedQueue(int n) {
+        LinkedList q = new LinkedList();
+        assertTrue(q.isEmpty());
+	for(int i = 0; i < n; ++i)
+	    assertTrue(q.offer(new Integer(i)));
+        assertFalse(q.isEmpty());
+	assertEquals(n, q.size());
+        return q;
+    }
+ 
+    /**
+     * new queue is empty
+     */
+    public void testConstructor1() {
+        assertEquals(0, new LinkedList().size());
+    }
+
+    /**
+     * Initializing from null Collection throws NPE
+     */
+    public void testConstructor3() {
+        try {
+            LinkedList q = new LinkedList((Collection)null);
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Queue contains all elements of collection used to initialize
+
+     */
+    public void testConstructor6() {
+        try {
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE; ++i)
+                ints[i] = new Integer(i);
+            LinkedList q = new LinkedList(Arrays.asList(ints));
+            for (int i = 0; i < SIZE; ++i)
+                assertEquals(ints[i], q.poll());
+        }
+        finally {}
+    }
+
+    /**
+     * isEmpty is true before add, false after
+     */
+    public void testEmpty() {
+        LinkedList q = new LinkedList();
+        assertTrue(q.isEmpty());
+        q.add(new Integer(1));
+        assertFalse(q.isEmpty());
+        q.add(new Integer(2));
+        q.remove();
+        q.remove();
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * size changes when elements added and removed
+     */
+    public void testSize() {
+        LinkedList q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(SIZE-i, q.size());
+            q.remove();
+        }
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, q.size());
+            q.add(new Integer(i));
+        }
+    }
+
+    /**
+     * offer(null) succeeds
+     */
+    public void testOfferNull() {
+	try {
+            LinkedList q = new LinkedList();
+            q.offer(null);
+        } catch (NullPointerException ie) { 
+            unexpectedException();
+        }   
+    }
+
+    /**
+     * Offer succeeds 
+     */
+    public void testOffer() {
+        LinkedList q = new LinkedList();
+        assertTrue(q.offer(new Integer(0)));
+        assertTrue(q.offer(new Integer(1)));
+    }
+
+    /**
+     * add succeeds
+     */
+    public void testAdd() {
+        LinkedList q = new LinkedList();
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, q.size());
+            assertTrue(q.add(new Integer(i)));
+        }
+    }
+
+    /**
+     * addAll(null) throws NPE
+     */
+    public void testAddAll1() {
+        try {
+            LinkedList q = new LinkedList();
+            q.addAll(null);
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Queue contains all elements, in traversal order, of successful addAll
+     */
+    public void testAddAll5() {
+        try {
+            Integer[] empty = new Integer[0];
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE; ++i)
+                ints[i] = new Integer(i);
+            LinkedList q = new LinkedList();
+            assertFalse(q.addAll(Arrays.asList(empty)));
+            assertTrue(q.addAll(Arrays.asList(ints)));
+            for (int i = 0; i < SIZE; ++i)
+                assertEquals(ints[i], q.poll());
+        }
+        finally {}
+    }
+
+    /**
+     * addAll with too large an index throws IOOBE
+     */
+    public void testAddAll2_IndexOutOfBoundsException() {
+	try {
+	    LinkedList l = new LinkedList();
+	    l.add(new Object());
+	    LinkedList m = new LinkedList();
+	    m.add(new Object());
+	    l.addAll(4,m);
+	    shouldThrow();
+	} catch(IndexOutOfBoundsException  success) {}
+    }
+
+    /**
+     * addAll with negative index throws IOOBE
+     */
+    public void testAddAll4_BadIndex() {
+	try {
+	    LinkedList l = new LinkedList();
+	    l.add(new Object());
+	    LinkedList m = new LinkedList();
+	    m.add(new Object());
+	    l.addAll(-1,m);
+	    shouldThrow();
+	} catch(IndexOutOfBoundsException  success){}
+    }
+
+    /**
+     *  poll succeeds unless empty
+     */
+    public void testPoll() {
+        LinkedList q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.poll()).intValue());
+        }
+	assertNull(q.poll());
+    }
+
+    /**
+     *  peek returns next element, or null if empty
+     */
+    public void testPeek() {
+        LinkedList q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.peek()).intValue());
+            q.poll();
+            assertTrue(q.peek() == null ||
+                       i != ((Integer)q.peek()).intValue());
+        }
+	assertNull(q.peek());
+    }
+
+    /**
+     * element returns next element, or throws NSEE if empty
+     */
+    public void testElement() {
+        LinkedList q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.element()).intValue());
+            q.poll();
+        }
+        try {
+            q.element();
+            shouldThrow();
+        }
+        catch (NoSuchElementException success) {}
+    }
+
+    /**
+     *  remove removes next element, or throws NSEE if empty
+     */
+    public void testRemove() {
+        LinkedList q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.remove()).intValue());
+        }
+        try {
+            q.remove();
+            shouldThrow();
+        } catch (NoSuchElementException success){
+	}   
+    }
+
+    /**
+     * remove(x) removes x and returns true if present
+     */
+    public void testRemoveElement() {
+        LinkedList q = populatedQueue(SIZE);
+        for (int i = 1; i < SIZE; i+=2) {
+            assertTrue(q.remove(new Integer(i)));
+        }
+        for (int i = 0; i < SIZE; i+=2) {
+            assertTrue(q.remove(new Integer(i)));
+            assertFalse(q.remove(new Integer(i+1)));
+        }
+        assertTrue(q.isEmpty());
+    }
+	
+    /**
+     * contains(x) reports true when elements added but not yet removed
+     */
+    public void testContains() {
+        LinkedList q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(q.contains(new Integer(i)));
+            q.poll();
+            assertFalse(q.contains(new Integer(i)));
+        }
+    }
+
+    /**
+     * clear removes all elements
+     */
+    public void testClear() {
+        LinkedList q = populatedQueue(SIZE);
+        q.clear();
+        assertTrue(q.isEmpty());
+        assertEquals(0, q.size());
+        q.add(new Integer(1));
+        assertFalse(q.isEmpty());
+        q.clear();
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * containsAll(c) is true when c contains a subset of elements
+     */
+    public void testContainsAll() {
+        LinkedList q = populatedQueue(SIZE);
+        LinkedList p = new LinkedList();
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(q.containsAll(p));
+            assertFalse(p.containsAll(q));
+            p.add(new Integer(i));
+        }
+        assertTrue(p.containsAll(q));
+    }
+
+    /**
+     * retainAll(c) retains only those elements of c and reports true if changed
+     */
+    public void testRetainAll() {
+        LinkedList q = populatedQueue(SIZE);
+        LinkedList p = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            boolean changed = q.retainAll(p);
+            if (i == 0)
+                assertFalse(changed);
+            else
+                assertTrue(changed);
+
+            assertTrue(q.containsAll(p));
+            assertEquals(SIZE-i, q.size());
+            p.remove();
+        }
+    }
+
+    /**
+     * removeAll(c) removes only those elements of c and reports true if changed
+     */
+    public void testRemoveAll() {
+        for (int i = 1; i < SIZE; ++i) {
+            LinkedList q = populatedQueue(SIZE);
+            LinkedList p = populatedQueue(i);
+            assertTrue(q.removeAll(p));
+            assertEquals(SIZE-i, q.size());
+            for (int j = 0; j < i; ++j) {
+                Integer Object = (Integer)(p.remove());
+                assertFalse(q.contains);
+            }
+        }
+    }
+
+    /**
+     *  toArray contains all elements
+     */
+    public void testToArray() {
+        LinkedList q = populatedQueue(SIZE);
+	Object[] o = q.toArray();
+        Arrays.sort(o);
+	for(int i = 0; i < o.length; i++)
+	    assertEquals(o[i], q.poll());
+    }
+
+    /**
+     *  toArray(a) contains all elements
+     */
+    public void testToArray2() {
+        LinkedList q = populatedQueue(SIZE);
+	Integer[] ints = new Integer[SIZE];
+	ints = (Integer[])q.toArray(ints);
+        Arrays.sort(ints);
+        for(int i = 0; i < ints.length; i++)
+            assertEquals(ints[i], q.poll());
+    }
+
+    /**
+     * toArray(null) throws NPE
+     */
+    public void testToArray_BadArg() {
+	try {
+	    LinkedList l = new LinkedList();
+	    l.add(new Object());
+	    Object o[] = l.toArray(null);
+	    shouldThrow();
+	} catch(NullPointerException success){}
+    }
+
+    /**
+     * toArray with incompatable aray type throws CCE
+     */
+    public void testToArray1_BadArg() {
+	try {
+	    LinkedList l = new LinkedList();
+	    l.add(new Integer(5));
+	    Object o[] = l.toArray(new String[10] );
+	    shouldThrow();
+	} catch(ArrayStoreException  success){}
+    }
+    
+    /**
+     *  iterator iterates through all elements
+     */
+    public void testIterator() {
+        LinkedList q = populatedQueue(SIZE);
+        int i = 0;
+	Iterator it = q.iterator();
+        while(it.hasNext()) {
+            assertTrue(q.contains(it.next()));
+            ++i;
+        }
+        assertEquals(i, SIZE);
+    }
+
+    /**
+     *  iterator ordering is FIFO
+     */
+    public void testIteratorOrdering() {
+        final LinkedList q = new LinkedList();
+        q.add(new Integer(1));
+        q.add(new Integer(2));
+        q.add(new Integer(3));
+        int k = 0;
+        for (Iterator it = q.iterator(); it.hasNext();) {
+            int i = ((Integer)(it.next())).intValue();
+            assertEquals(++k, i);
+        }
+
+        assertEquals(3, k);
+    }
+
+    /**
+     * iterator.remove removes current element
+     */
+    public void testIteratorRemove () {
+        final LinkedList q = new LinkedList();
+        q.add(new Integer(1));
+        q.add(new Integer(2));
+        q.add(new Integer(3));
+        Iterator it = q.iterator();
+        it.next();
+        it.remove();
+        it = q.iterator();
+        assertEquals(it.next(), new Integer(2));
+        assertEquals(it.next(), new Integer(3));
+        assertFalse(it.hasNext());
+    }
+
+
+    /**
+     * toString contains toStrings of elements
+     */
+    public void testToString() {
+        LinkedList q = populatedQueue(SIZE);
+        String s = q.toString();
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(s.indexOf(String.valueOf(i)) >= 0);
+        }
+    }        
+
+    /**
+     * peek returns element inserted with addFirst
+     */
+    public void testAddFirst() {
+        LinkedList q = populatedQueue(3);
+	q.addFirst(four);
+	assertEquals(four,q.peek());
+    }	
+
+    /**
+     * peekFirst returns element inserted with push
+     */
+    public void testPush() {
+        LinkedList q = populatedQueue(3);
+        q.pollLast();
+	q.push(four);
+	assertEquals(four,q.peekFirst());
+    }	
+
+    /**
+     *  pop removes next element, or throws NSEE if empty
+     */
+    public void testPop() {
+        LinkedList q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.pop()).intValue());
+        }
+        try {
+            q.pop();
+            shouldThrow();
+        } catch (NoSuchElementException success){
+	}   
+    }
+
+    /**
+     * OfferFirst succeeds 
+     */
+    public void testOfferFirst() {
+        LinkedList q = new LinkedList();
+        assertTrue(q.offerFirst(new Integer(0)));
+        assertTrue(q.offerFirst(new Integer(1)));
+    }
+
+    /**
+     * OfferLast succeeds 
+     */
+    public void testOfferLast() {
+        LinkedList q = new LinkedList();
+        assertTrue(q.offerLast(new Integer(0)));
+        assertTrue(q.offerLast(new Integer(1)));
+    }
+
+    /**
+     *  pollLast succeeds unless empty
+     */
+    public void testPollLast() {
+        LinkedList q = populatedQueue(SIZE);
+        for (int i = SIZE-1; i >= 0; --i) {
+            assertEquals(i, ((Integer)q.pollLast()).intValue());
+        }
+	assertNull(q.pollLast());
+    }
+
+    /**
+     *  peekFirst returns next element, or null if empty
+     */
+    public void testPeekFirst() {
+        LinkedList q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.peekFirst()).intValue());
+            q.pollFirst();
+            assertTrue(q.peekFirst() == null ||
+                       i != ((Integer)q.peekFirst()).intValue());
+        }
+	assertNull(q.peekFirst());
+    }
+
+
+    /**
+     *  peekLast returns next element, or null if empty
+     */
+    public void testPeekLast() {
+        LinkedList q = populatedQueue(SIZE);
+        for (int i = SIZE-1; i >= 0; --i) {
+            assertEquals(i, ((Integer)q.peekLast()).intValue());
+            q.pollLast();
+            assertTrue(q.peekLast() == null ||
+                       i != ((Integer)q.peekLast()).intValue());
+        }
+	assertNull(q.peekLast());
+    }
+
+    public void testFirstElement() {
+        LinkedList q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.getFirst()).intValue());
+            q.pollFirst();
+        }
+        try {
+            q.getFirst();
+            shouldThrow();
+        }
+        catch (NoSuchElementException success) {}
+    }
+
+    /**
+     *  getLast returns next element, or throws NSEE if empty
+     */
+    public void testLastElement() {
+        LinkedList q = populatedQueue(SIZE);
+        for (int i = SIZE-1; i >= 0; --i) {
+            assertEquals(i, ((Integer)q.getLast()).intValue());
+            q.pollLast();
+        }
+        try {
+            q.getLast();
+            shouldThrow();
+        }
+        catch (NoSuchElementException success) {}
+	assertNull(q.peekLast());
+    }
+
+    /**
+     * removeFirstOccurrence(x) removes x and returns true if present
+     */
+    public void testRemoveFirstOccurrence() {
+        LinkedList q = populatedQueue(SIZE);
+        for (int i = 1; i < SIZE; i+=2) {
+            assertTrue(q.removeFirstOccurrence(new Integer(i)));
+        }
+        for (int i = 0; i < SIZE; i+=2) {
+            assertTrue(q.removeFirstOccurrence(new Integer(i)));
+            assertFalse(q.removeFirstOccurrence(new Integer(i+1)));
+        }
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * removeLastOccurrence(x) removes x and returns true if present
+     */
+    public void testRemoveLastOccurrence() {
+        LinkedList q = populatedQueue(SIZE);
+        for (int i = 1; i < SIZE; i+=2) {
+            assertTrue(q.removeLastOccurrence(new Integer(i)));
+        }
+        for (int i = 0; i < SIZE; i+=2) {
+            assertTrue(q.removeLastOccurrence(new Integer(i)));
+            assertFalse(q.removeLastOccurrence(new Integer(i+1)));
+        }
+        assertTrue(q.isEmpty());
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/RECONCILED_ON
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/RECONCILED_ON	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/RECONCILED_ON	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1 @@
+2004-11-30

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/backport.util.concurrent.1.4.library
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/backport.util.concurrent.1.4.library	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/backport.util.concurrent.1.4.library	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<library>
+  <!--JBuilder Library Definition File-->
+  <fullname>backport.util.concurrent.1.4</fullname>
+  <class>
+    <path>[../../backport-util-concurrent.jar]</path>
+  </class>
+  <source>
+    <path>[../../backport-util-concurrent-src.jar]</path>
+  </source>
+  <documentation>
+    <path>[../../backport-util-concurrent-doc.jar]</path>
+  </documentation>
+  <lastmodsaved>1101857966720</lastmodsaved>
+</library>

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/AbstractExecutorServiceTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/AbstractExecutorServiceTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/AbstractExecutorServiceTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,808 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import java.security.*;
+import java.util.List;
+import java.util.Collections;
+import java.util.ArrayList;
+import java.util.Iterator;
+
+public class AbstractExecutorServiceTest extends JSR166TestCase{
+    public static void main(String[] args) {
+        junit.textui.TestRunner.run (suite());
+    }
+    public static Test suite() {
+        return new TestSuite(AbstractExecutorServiceTest.class);
+    }
+
+    /**
+     * A no-frills implementation of AbstractExecutorService, designed
+     * to test the submit methods only.
+     */
+    static class DirectExecutorService extends AbstractExecutorService {
+        public void execute(Runnable r) { r.run(); }
+        public void shutdown() { shutdown = true; }
+        public List shutdownNow() { shutdown = true; return Collections.EMPTY_LIST; }
+        public boolean isShutdown() { return shutdown; }
+        public boolean isTerminated() { return isShutdown(); }
+        public boolean awaitTermination(long timeout, TimeUnit unit) { return isShutdown(); }
+        private volatile boolean shutdown = false;
+    }
+
+    /**
+     * execute(runnable) runs it to completion
+     */
+    public void testExecuteRunnable() {
+        try {
+            ExecutorService e = new DirectExecutorService();
+            TrackedShortRunnable task = new TrackedShortRunnable();
+            assertFalse(task.done);
+            Future future = e.submit(task);
+            future.get();
+            assertTrue(task.done);
+        }
+        catch (ExecutionException ex) {
+            unexpectedException();
+        }
+        catch (InterruptedException ex) {
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * Completed submit(callable) returns result
+     */
+    public void testSubmitCallable() {
+        try {
+            ExecutorService e = new DirectExecutorService();
+            Future future = e.submit(new StringTask());
+            String result = (String)future.get();
+            assertSame(TEST_STRING, result);
+        }
+        catch (ExecutionException ex) {
+            unexpectedException();
+        }
+        catch (InterruptedException ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * Completed submit(runnable) returns successfully
+     */
+    public void testSubmitRunnable() {
+        try {
+            ExecutorService e = new DirectExecutorService();
+            Future future = e.submit(new NoOpRunnable());
+            future.get();
+            assertTrue(future.isDone());
+        }
+        catch (ExecutionException ex) {
+            unexpectedException();
+        }
+        catch (InterruptedException ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * Completed submit(runnable, result) returns result
+     */
+    public void testSubmitRunnable2() {
+        try {
+            ExecutorService e = new DirectExecutorService();
+            Future future = e.submit(new NoOpRunnable(), TEST_STRING);
+            String result = (String)future.get();
+            assertSame(TEST_STRING, result);
+        }
+        catch (ExecutionException ex) {
+            unexpectedException();
+        }
+        catch (InterruptedException ex) {
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * A submitted privileged action to completion
+     */
+    public void testSubmitPrivilegedAction() {
+        Policy savedPolicy = null;
+        try {
+            savedPolicy = Policy.getPolicy();
+            AdjustablePolicy policy = new AdjustablePolicy();
+            policy.addPermission(new RuntimePermission("getContextClassLoader"));
+            policy.addPermission(new RuntimePermission("setContextClassLoader"));
+            Policy.setPolicy(policy);
+        } catch(AccessControlException ok) {
+            return;
+        }
+        try {
+            ExecutorService e = new DirectExecutorService();
+            Future future = e.submit(Executors.callable(new PrivilegedAction() {
+                    public Object run() {
+                        return TEST_STRING;
+                    }}));
+
+            Object result = future.get();
+            assertSame(TEST_STRING, result);
+        }
+        catch (ExecutionException ex) {
+            unexpectedException();
+        }
+        catch (InterruptedException ex) {
+            unexpectedException();
+        }
+        finally {
+            try {
+                Policy.setPolicy(savedPolicy);
+            } catch(AccessControlException ok) {
+                return;
+            }
+        }
+    }
+
+    /**
+     * A submitted a privileged exception action runs to completion
+     */
+    public void testSubmitPrivilegedExceptionAction() {
+        Policy savedPolicy = null;
+        try {
+            savedPolicy = Policy.getPolicy();
+            AdjustablePolicy policy = new AdjustablePolicy();
+            policy.addPermission(new RuntimePermission("getContextClassLoader"));
+            policy.addPermission(new RuntimePermission("setContextClassLoader"));
+            Policy.setPolicy(policy);
+        } catch(AccessControlException ok) {
+            return;
+        }
+
+        try {
+            ExecutorService e = new DirectExecutorService();
+            Future future = e.submit(Executors.callable(new PrivilegedExceptionAction() {
+                    public Object run() {
+                        return TEST_STRING;
+                    }}));
+
+            Object result = future.get();
+            assertSame(TEST_STRING, result);
+        }
+        catch (ExecutionException ex) {
+            unexpectedException();
+        }
+        catch (InterruptedException ex) {
+            unexpectedException();
+        }
+        finally {
+            Policy.setPolicy(savedPolicy);
+        }
+    }
+
+    /**
+     * A submitted failed privileged exception action reports exception
+     */
+    public void testSubmitFailedPrivilegedExceptionAction() {
+        Policy savedPolicy = null;
+        try {
+            savedPolicy = Policy.getPolicy();
+            AdjustablePolicy policy = new AdjustablePolicy();
+            policy.addPermission(new RuntimePermission("getContextClassLoader"));
+            policy.addPermission(new RuntimePermission("setContextClassLoader"));
+            Policy.setPolicy(policy);
+        } catch(AccessControlException ok) {
+            return;
+        }
+
+
+        try {
+            ExecutorService e = new DirectExecutorService();
+            Future future = e.submit(Executors.callable(new PrivilegedExceptionAction() {
+                    public Object run() throws Exception {
+                        throw new IndexOutOfBoundsException();
+                    }}));
+
+            Object result = future.get();
+            shouldThrow();
+        }
+        catch (ExecutionException success) {
+        }
+        catch (InterruptedException ex) {
+            unexpectedException();
+        }
+        finally {
+            Policy.setPolicy(savedPolicy);
+        }
+    }
+
+    /**
+     * execute(null runnable) throws NPE
+     */
+    public void testExecuteNullRunnable() {
+        try {
+            ExecutorService e = new DirectExecutorService();
+            TrackedShortRunnable task = null;
+            Future future = e.submit(task);
+            shouldThrow();
+        }
+        catch (NullPointerException success) {
+        }
+        catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * submit(null callable) throws NPE
+     */
+    public void testSubmitNullCallable() {
+        try {
+            ExecutorService e = new DirectExecutorService();
+            StringTask t = null;
+            Future future = e.submit(t);
+            shouldThrow();
+        }
+        catch (NullPointerException success) {
+        }
+        catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * submit(runnable) throws RejectedExecutionException if
+     * executor is saturated.
+     */
+    public void testExecute1() {
+        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, 60, TimeUnit.SECONDS, new ArrayBlockingQueue(1));
+        try {
+
+            for(int i = 0; i < 5; ++i){
+                p.submit(new MediumRunnable());
+            }
+            shouldThrow();
+        } catch(RejectedExecutionException success){}
+        joinPool(p);
+    }
+
+    /**
+     * submit(callable) throws RejectedExecutionException
+     * if executor is saturated.
+     */
+    public void testExecute2() {
+         ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, 60, TimeUnit.SECONDS, new ArrayBlockingQueue(1));
+        try {
+            for(int i = 0; i < 5; ++i) {
+                p.submit(new SmallCallable());
+            }
+            shouldThrow();
+        } catch(RejectedExecutionException e){}
+        joinPool(p);
+    }
+
+
+    /**
+     *  Blocking on submit(callable) throws InterruptedException if
+     *  caller interrupted.
+     */
+    public void testInterruptedSubmit() {
+        final ThreadPoolExecutor p = new ThreadPoolExecutor(1,1,60, TimeUnit.SECONDS, new ArrayBlockingQueue(10));
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        p.submit(new Callable() {
+                                public Object call() {
+                                    try {
+                                        Thread.sleep(MEDIUM_DELAY_MS);
+                                        shouldThrow();
+                                    } catch(InterruptedException e){
+                                    }
+                                    return null;
+                                }
+                            }).get();
+                    } catch(InterruptedException success){
+                    } catch(Exception e) {
+                        unexpectedException();
+                    }
+
+                }
+            });
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            t.interrupt();
+        } catch(Exception e){
+            unexpectedException();
+        }
+        joinPool(p);
+    }
+
+    /**
+     *  get of submitted callable throws Exception if callable
+     *  interrupted
+     */
+    public void testSubmitIE() {
+        final ThreadPoolExecutor p = new ThreadPoolExecutor(1,1,60, TimeUnit.SECONDS, new ArrayBlockingQueue(10));
+
+        final Callable c = new Callable() {
+                public Object call() {
+                    try {
+                        p.submit(new SmallCallable()).get();
+                        shouldThrow();
+                    } catch(InterruptedException e){}
+                    catch(RejectedExecutionException e2){}
+                    catch(ExecutionException e3){}
+                    return Boolean.TRUE;
+                }
+            };
+
+
+
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        c.call();
+                    } catch(Exception e){}
+                }
+          });
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            t.interrupt();
+            t.join();
+        } catch(InterruptedException e){
+            unexpectedException();
+        }
+
+        joinPool(p);
+    }
+
+    /**
+     *  get of submit(callable) throws ExecutionException if callable
+     *  throws exception
+     */
+    public void testSubmitEE() {
+        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1,60, TimeUnit.SECONDS, new ArrayBlockingQueue(10));
+
+        try {
+            Callable c = new Callable() {
+                    public Object call() {
+                        int i = 5/0;
+                        return Boolean.TRUE;
+                    }
+                };
+
+            for(int i =0; i < 5; i++){
+                p.submit(c).get();
+            }
+
+            shouldThrow();
+        }
+        catch(ExecutionException success){
+        } catch(Exception e) {
+            unexpectedException();
+        }
+        joinPool(p);
+    }
+
+    /**
+     * invokeAny(null) throws NPE
+     */
+    public void testInvokeAny1() {
+        ExecutorService e = new DirectExecutorService();
+        try {
+            e.invokeAny(null);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAny(empty collection) throws IAE
+     */
+    public void testInvokeAny2() {
+        ExecutorService e = new DirectExecutorService();
+        try {
+            e.invokeAny(new ArrayList());
+        } catch (IllegalArgumentException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAny(c) throws NPE if c has null elements
+     */
+    public void testInvokeAny3() {
+        ExecutorService e = new DirectExecutorService();
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(null);
+            e.invokeAny(l);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            ex.printStackTrace();
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAny(c) throws ExecutionException if no task in c completes
+     */
+    public void testInvokeAny4() {
+        ExecutorService e = new DirectExecutorService();
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new NPETask());
+            e.invokeAny(l);
+        } catch(ExecutionException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAny(c) returns result of some task in c if at least one completes
+     */
+    public void testInvokeAny5() {
+        ExecutorService e = new DirectExecutorService();
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(new StringTask());
+            String result = (String)e.invokeAny(l);
+            assertSame(TEST_STRING, result);
+        } catch (ExecutionException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAll(null) throws NPE
+     */
+    public void testInvokeAll1() {
+        ExecutorService e = new DirectExecutorService();
+        try {
+            e.invokeAll(null);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAll(empty collection) returns empty collection
+     */
+    public void testInvokeAll2() {
+        ExecutorService e = new DirectExecutorService();
+        try {
+            List r = e.invokeAll(new ArrayList());
+            assertTrue(r.isEmpty());
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAll(c) throws NPE if c has null elements
+     */
+    public void testInvokeAll3() {
+        ExecutorService e = new DirectExecutorService();
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(null);
+            e.invokeAll(l);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * get of returned element of invokeAll(c) throws exception on failed task
+     */
+    public void testInvokeAll4() {
+        ExecutorService e = new DirectExecutorService();
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new NPETask());
+            List result = e.invokeAll(l);
+            assertEquals(1, result.size());
+            for (Iterator it = result.iterator(); it.hasNext();)
+                ((Future)it.next()).get();
+        } catch(ExecutionException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAll(c) returns results of all completed tasks in c
+     */
+    public void testInvokeAll5() {
+        ExecutorService e = new DirectExecutorService();
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(new StringTask());
+            List result = e.invokeAll(l);
+            assertEquals(2, result.size());
+            for (Iterator it = result.iterator(); it.hasNext();)
+                assertSame(TEST_STRING, ((Future)it.next()).get());
+        } catch (ExecutionException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+
+    /**
+     * timed invokeAny(null) throws NPE
+     */
+    public void testTimedInvokeAny1() {
+        ExecutorService e = new DirectExecutorService();
+        try {
+            e.invokeAny(null, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAny(null time unit) throws NPE
+     */
+    public void testTimedInvokeAnyNullTimeUnit() {
+        ExecutorService e = new DirectExecutorService();
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            e.invokeAny(l, MEDIUM_DELAY_MS, null);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAny(empty collection) throws IAE
+     */
+    public void testTimedInvokeAny2() {
+        ExecutorService e = new DirectExecutorService();
+        try {
+            e.invokeAny(new ArrayList(), MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+        } catch (IllegalArgumentException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAny(c) throws NPE if c has null elements
+     */
+    public void testTimedInvokeAny3() {
+        ExecutorService e = new DirectExecutorService();
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(null);
+            e.invokeAny(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            ex.printStackTrace();
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAny(c) throws ExecutionException if no task completes
+     */
+    public void testTimedInvokeAny4() {
+        ExecutorService e = new DirectExecutorService();
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new NPETask());
+            e.invokeAny(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+        } catch(ExecutionException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAny(c) returns result of some task in c
+     */
+    public void testTimedInvokeAny5() {
+        ExecutorService e = new DirectExecutorService();
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(new StringTask());
+            String result = (String)e.invokeAny(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+            assertSame(TEST_STRING, result);
+        } catch (ExecutionException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAll(null) throws NPE
+     */
+    public void testTimedInvokeAll1() {
+        ExecutorService e = new DirectExecutorService();
+        try {
+            e.invokeAll(null, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAll(null time unit) throws NPE
+     */
+    public void testTimedInvokeAllNullTimeUnit() {
+        ExecutorService e = new DirectExecutorService();
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            e.invokeAll(l, MEDIUM_DELAY_MS, null);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAll(empty collection) returns empty collection
+     */
+    public void testTimedInvokeAll2() {
+        ExecutorService e = new DirectExecutorService();
+        try {
+            List r = e.invokeAll(new ArrayList(), MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+            assertTrue(r.isEmpty());
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAll(c) throws NPE if c has null elements
+     */
+    public void testTimedInvokeAll3() {
+        ExecutorService e = new DirectExecutorService();
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(null);
+            e.invokeAll(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * get of returned element of invokeAll(c) throws exception on failed task
+     */
+    public void testTimedInvokeAll4() {
+        ExecutorService e = new DirectExecutorService();
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new NPETask());
+            List result = e.invokeAll(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+            assertEquals(1, result.size());
+            for (Iterator it = result.iterator(); it.hasNext();)
+                ((Future)it.next()).get();
+        } catch(ExecutionException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAll(c) returns results of all completed tasks in c
+     */
+    public void testTimedInvokeAll5() {
+        ExecutorService e = new DirectExecutorService();
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(new StringTask());
+            List result = e.invokeAll(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+            assertEquals(2, result.size());
+            for (Iterator it = result.iterator(); it.hasNext();)
+                assertSame(TEST_STRING, ((Future)it.next()).get());
+        } catch (ExecutionException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAll cancels tasks not completed by timeout
+     */
+    public void testTimedInvokeAll6() {
+        ExecutorService e = new DirectExecutorService();
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(Executors.callable(new MediumPossiblyInterruptedRunnable(), TEST_STRING));
+            l.add(new StringTask());
+            List result = e.invokeAll(l, SMALL_DELAY_MS, TimeUnit.MILLISECONDS);
+            assertEquals(3, result.size());
+            Iterator it = result.iterator();
+            Future f1 = (Future)it.next();
+            Future f2 = (Future)it.next();
+            Future f3 = (Future)it.next();
+            assertTrue(f1.isDone());
+            assertFalse(f1.isCancelled());
+            assertTrue(f2.isDone());
+            assertTrue(f3.isDone());
+            assertTrue(f3.isCancelled());
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/AbstractQueueTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/AbstractQueueTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/AbstractQueueTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,188 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import java.io.*;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+public class AbstractQueueTest extends JSR166TestCase {
+    public static void main(String[] args) {
+        junit.textui.TestRunner.run (suite());
+    }
+    public static Test suite() {
+        return new TestSuite(AbstractQueueTest.class);
+    }
+
+    static class Succeed extends AbstractQueue {
+        public boolean offer(Object x) {
+            if (x == null) throw new NullPointerException();
+            return true;
+        }
+        public Object peek() { return one; }
+        public Object poll() { return one; }
+        public int size() { return 0; }
+        public Iterator iterator() { return null; } // not needed
+    }
+
+    static class Fail extends AbstractQueue {
+        public boolean offer(Object x) {
+            if (x == null) throw new NullPointerException();
+            return false;
+        }
+        public Object peek() { return null; }
+        public Object poll() { return null; }
+        public int size() { return 0; }
+        public Iterator iterator() { return null; } // not needed
+    }
+
+    /**
+     * add returns true if offer succeeds
+     */
+    public void testAddS() {
+        Succeed q = new Succeed();
+        assertTrue(q.add(two));
+    }
+
+    /**
+     * add throws ISE true if offer fails
+     */
+    public void testAddF() {
+        Fail q = new Fail();
+        try {
+            q.add(one);
+            shouldThrow();
+        } catch (IllegalStateException success) {
+        }
+    }
+
+    /**
+     * add throws NPE if offer does
+     */
+    public void testAddNPE() {
+        Succeed q = new Succeed();
+        try {
+            q.add(null);
+            shouldThrow();
+        } catch (NullPointerException success) {
+        }
+    }
+
+    /**
+     * remove returns normally if poll succeeds
+     */
+    public void testRemoveS() {
+        Succeed q = new Succeed();
+        q.remove();
+    }
+
+    /**
+     * remove throws NSEE if poll returns null
+     */
+    public void testRemoveF() {
+        Fail q = new Fail();
+        try {
+            q.remove();
+            shouldThrow();
+        } catch (NoSuchElementException success) {
+        }
+    }
+
+
+    /**
+     * element returns normally if peek succeeds
+     */
+    public void testElementS() {
+        Succeed q = new Succeed();
+        q.element();
+    }
+
+    /**
+     * element throws NSEE if peek returns null
+     */
+    public void testElementF() {
+        Fail q = new Fail();
+        try {
+            q.element();
+            shouldThrow();
+        } catch (NoSuchElementException success) {
+        }
+    }
+
+    /**
+     *  addAll(null) throws NPE
+     */
+    public void testAddAll1() {
+        try {
+            Succeed q = new Succeed();
+            q.addAll(null);
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * addAll(this) throws IAE
+     */
+    public void testAddAllSelf() {
+        try {
+            Succeed q = new Succeed();
+            q.addAll(q);
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success) {}
+    }
+
+
+    /**
+     *  addAll of a collection with null elements throws NPE
+     */
+    public void testAddAll2() {
+        try {
+            Succeed q = new Succeed();
+            Integer[] ints = new Integer[SIZE];
+            q.addAll(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+    /**
+     * addAll of a collection with any null elements throws NPE after
+     * possibly adding some elements
+     */
+    public void testAddAll3() {
+        try {
+            Succeed q = new Succeed();
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE-1; ++i)
+                ints[i] = new Integer(i);
+            q.addAll(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+    /**
+     * addAll throws ISE if an add fails
+     */
+    public void testAddAll4() {
+        try {
+            Fail q = new Fail();
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE; ++i)
+                ints[i] = new Integer(i);
+            q.addAll(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (IllegalStateException success) {}
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/AbstractQueuedSynchronizerTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/AbstractQueuedSynchronizerTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/AbstractQueuedSynchronizerTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,1299 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import java.io.*;
+
+public class AbstractQueuedSynchronizerTest extends JSR166TestCase {
+//    public static void main(String[] args) {
+//        junit.textui.TestRunner.run (suite());
+//    }
+//    public static Test suite() {
+//        return new TestSuite(AbstractQueuedSynchronizerTest.class);
+//    }
+//
+//    /**
+//     * A simple mutex class, adapted from the
+//     * AbstractQueuedSynchronizer javadoc.  Exclusive acquire tests
+//     * exercise this as a sample user extension.  Other
+//     * methods/features of AbstractQueuedSynchronizerTest are tested
+//     * via other test classes, including those for ReentrantLock,
+//     * ReentrantReadWriteLock, and Semaphore
+//     */
+//    static class Mutex extends AbstractQueuedSynchronizer {
+//        public boolean isHeldExclusively() { return getState() == 1; }
+//
+//        public boolean tryAcquire(int acquires) {
+//            assertTrue(acquires == 1);
+//            return compareAndSetState(0, 1);
+//        }
+//
+//        public boolean tryRelease(int releases) {
+//            if (getState() == 0) throw new IllegalMonitorStateException();
+//            setState(0);
+//            return true;
+//        }
+//
+//        public AbstractQueuedSynchronizer.ConditionObject newCondition() { return new AbstractQueuedSynchronizer.ConditionObject(); }
+//
+//    }
+//
+//
+//    /**
+//     * A simple latch class, to test shared mode.
+//     */
+//    static class BooleanLatch extends AbstractQueuedSynchronizer {
+//        public boolean isSignalled() { return getState() != 0; }
+//
+//        public int tryAcquireShared(int ignore) {
+//            return isSignalled()? 1 : -1;
+//        }
+//
+//        public boolean tryReleaseShared(int ignore) {
+//            setState(1);
+//            return true;
+//        }
+//    }
+//
+//    /**
+//     * A runnable calling acquireInterruptibly
+//     */
+//    class InterruptibleSyncRunnable implements Runnable {
+//        final Mutex sync;
+//        InterruptibleSyncRunnable(Mutex l) { sync = l; }
+//        public void run() {
+//            try {
+//                sync.acquireInterruptibly(1);
+//            } catch(InterruptedException success){}
+//        }
+//    }
+//
+//
+//    /**
+//     * A runnable calling acquireInterruptibly that expects to be
+//     * interrupted
+//     */
+//    class InterruptedSyncRunnable implements Runnable {
+//        final Mutex sync;
+//        InterruptedSyncRunnable(Mutex l) { sync = l; }
+//        public void run() {
+//            try {
+//                sync.acquireInterruptibly(1);
+//                threadShouldThrow();
+//            } catch(InterruptedException success){}
+//        }
+//    }
+//
+//    /**
+//     * isHeldExclusively is false upon construction
+//     */
+//    public void testIsHeldExclusively() {
+//	Mutex rl = new Mutex();
+//        assertFalse(rl.isHeldExclusively());
+//    }
+//
+//    /**
+//     * acquiring released sync succeeds
+//     */
+//    public void testAcquire() {
+//	Mutex rl = new Mutex();
+//        rl.acquire(1);
+//        assertTrue(rl.isHeldExclusively());
+//        rl.release(1);
+//        assertFalse(rl.isHeldExclusively());
+//    }
+//
+//    /**
+//     * tryAcquire on an released sync succeeds
+//     */
+//    public void testTryAcquire() {
+//	Mutex rl = new Mutex();
+//        assertTrue(rl.tryAcquire(1));
+//        assertTrue(rl.isHeldExclusively());
+//        rl.release(1);
+//    }
+//
+//    /**
+//     * hasQueuedThreads reports whether there are waiting threads
+//     */
+//    public void testhasQueuedThreads() {
+//	final Mutex sync = new Mutex();
+//        Thread t1 = new Thread(new InterruptedSyncRunnable(sync));
+//        Thread t2 = new Thread(new InterruptibleSyncRunnable(sync));
+//        try {
+//            assertFalse(sync.hasQueuedThreads());
+//            sync.acquire(1);
+//            t1.start();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertTrue(sync.hasQueuedThreads());
+//            t2.start();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertTrue(sync.hasQueuedThreads());
+//            t1.interrupt();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertTrue(sync.hasQueuedThreads());
+//            sync.release(1);
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertFalse(sync.hasQueuedThreads());
+//            t1.join();
+//            t2.join();
+//        } catch(Exception e){
+//            unexpectedException();
+//        }
+//    }
+//
+//    /**
+//     * isQueued(null) throws NPE
+//     */
+//    public void testIsQueuedNPE() {
+//	final Mutex sync = new Mutex();
+//        try {
+//            sync.isQueued(null);
+//            shouldThrow();
+//        } catch (NullPointerException success) {
+//        }
+//    }
+//
+//    /**
+//     * isQueued reports whether a thread is queued.
+//     */
+//    public void testIsQueued() {
+//	final Mutex sync = new Mutex();
+//        Thread t1 = new Thread(new InterruptedSyncRunnable(sync));
+//        Thread t2 = new Thread(new InterruptibleSyncRunnable(sync));
+//        try {
+//            assertFalse(sync.isQueued(t1));
+//            assertFalse(sync.isQueued(t2));
+//            sync.acquire(1);
+//            t1.start();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertTrue(sync.isQueued(t1));
+//            t2.start();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertTrue(sync.isQueued(t1));
+//            assertTrue(sync.isQueued(t2));
+//            t1.interrupt();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertFalse(sync.isQueued(t1));
+//            assertTrue(sync.isQueued(t2));
+//            sync.release(1);
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertFalse(sync.isQueued(t1));
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertFalse(sync.isQueued(t2));
+//            t1.join();
+//            t2.join();
+//        } catch(Exception e){
+//            unexpectedException();
+//        }
+//    }
+//
+//    /**
+//     * getFirstQueuedThread returns first waiting thread or null if none
+//     */
+//    public void testGetFirstQueuedThread() {
+//	final Mutex sync = new Mutex();
+//        Thread t1 = new Thread(new InterruptedSyncRunnable(sync));
+//        Thread t2 = new Thread(new InterruptibleSyncRunnable(sync));
+//        try {
+//            assertNull(sync.getFirstQueuedThread());
+//            sync.acquire(1);
+//            t1.start();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertEquals(t1, sync.getFirstQueuedThread());
+//            t2.start();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertEquals(t1, sync.getFirstQueuedThread());
+//            t1.interrupt();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertEquals(t2, sync.getFirstQueuedThread());
+//            sync.release(1);
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertNull(sync.getFirstQueuedThread());
+//            t1.join();
+//            t2.join();
+//        } catch(Exception e){
+//            unexpectedException();
+//        }
+//    }
+//
+//
+//    /**
+//     * hasContended reports false if no thread has ever blocked, else true
+//     */
+//    public void testHasContended() {
+//	final Mutex sync = new Mutex();
+//        Thread t1 = new Thread(new InterruptedSyncRunnable(sync));
+//        Thread t2 = new Thread(new InterruptibleSyncRunnable(sync));
+//        try {
+//            assertFalse(sync.hasContended());
+//            sync.acquire(1);
+//            t1.start();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertTrue(sync.hasContended());
+//            t2.start();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertTrue(sync.hasContended());
+//            t1.interrupt();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertTrue(sync.hasContended());
+//            sync.release(1);
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertTrue(sync.hasContended());
+//            t1.join();
+//            t2.join();
+//        } catch(Exception e){
+//            unexpectedException();
+//        }
+//    }
+//
+//    /**
+//     * getQueuedThreads includes waiting threads
+//     */
+//    public void testGetQueuedThreads() {
+//	final Mutex sync = new Mutex();
+//        Thread t1 = new Thread(new InterruptedSyncRunnable(sync));
+//        Thread t2 = new Thread(new InterruptibleSyncRunnable(sync));
+//        try {
+//            assertTrue(sync.getQueuedThreads().isEmpty());
+//            sync.acquire(1);
+//            assertTrue(sync.getQueuedThreads().isEmpty());
+//            t1.start();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertTrue(sync.getQueuedThreads().contains(t1));
+//            t2.start();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertTrue(sync.getQueuedThreads().contains(t1));
+//            assertTrue(sync.getQueuedThreads().contains(t2));
+//            t1.interrupt();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertFalse(sync.getQueuedThreads().contains(t1));
+//            assertTrue(sync.getQueuedThreads().contains(t2));
+//            sync.release(1);
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertTrue(sync.getQueuedThreads().isEmpty());
+//            t1.join();
+//            t2.join();
+//        } catch(Exception e){
+//            unexpectedException();
+//        }
+//    }
+//
+//    /**
+//     * getExclusiveQueuedThreads includes waiting threads
+//     */
+//    public void testGetExclusiveQueuedThreads() {
+//	final Mutex sync = new Mutex();
+//        Thread t1 = new Thread(new InterruptedSyncRunnable(sync));
+//        Thread t2 = new Thread(new InterruptibleSyncRunnable(sync));
+//        try {
+//            assertTrue(sync.getExclusiveQueuedThreads().isEmpty());
+//            sync.acquire(1);
+//            assertTrue(sync.getExclusiveQueuedThreads().isEmpty());
+//            t1.start();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertTrue(sync.getExclusiveQueuedThreads().contains(t1));
+//            t2.start();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertTrue(sync.getExclusiveQueuedThreads().contains(t1));
+//            assertTrue(sync.getExclusiveQueuedThreads().contains(t2));
+//            t1.interrupt();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertFalse(sync.getExclusiveQueuedThreads().contains(t1));
+//            assertTrue(sync.getExclusiveQueuedThreads().contains(t2));
+//            sync.release(1);
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertTrue(sync.getExclusiveQueuedThreads().isEmpty());
+//            t1.join();
+//            t2.join();
+//        } catch(Exception e){
+//            unexpectedException();
+//        }
+//    }
+//
+//    /**
+//     * getSharedQueuedThreads does not include exclusively waiting threads
+//     */
+//    public void testGetSharedQueuedThreads() {
+//	final Mutex sync = new Mutex();
+//        Thread t1 = new Thread(new InterruptedSyncRunnable(sync));
+//        Thread t2 = new Thread(new InterruptibleSyncRunnable(sync));
+//        try {
+//            assertTrue(sync.getSharedQueuedThreads().isEmpty());
+//            sync.acquire(1);
+//            assertTrue(sync.getSharedQueuedThreads().isEmpty());
+//            t1.start();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertTrue(sync.getSharedQueuedThreads().isEmpty());
+//            t2.start();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertTrue(sync.getSharedQueuedThreads().isEmpty());
+//            t1.interrupt();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertTrue(sync.getSharedQueuedThreads().isEmpty());
+//            sync.release(1);
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertTrue(sync.getSharedQueuedThreads().isEmpty());
+//            t1.join();
+//            t2.join();
+//        } catch(Exception e){
+//            unexpectedException();
+//        }
+//    }
+//
+//    /**
+//     * tryAcquireNanos is interruptible.
+//     */
+//    public void testInterruptedException2() {
+//	final Mutex sync = new Mutex();
+//	sync.acquire(1);
+//	Thread t = new Thread(new Runnable() {
+//                public void run() {
+//                    try {
+//			sync.tryAcquireNanos(1, MEDIUM_DELAY_MS * 1000 * 1000);
+//			threadShouldThrow();
+//		    } catch(InterruptedException success){}
+//		}
+//	    });
+//        try {
+//            t.start();
+//            t.interrupt();
+//        } catch(Exception e){
+//            unexpectedException();
+//        }
+//    }
+//
+//
+//    /**
+//     * TryAcquire on exclusively held sync fails
+//     */
+//    public void testTryAcquireWhenSynced() {
+//	final Mutex sync = new Mutex();
+//	sync.acquire(1);
+//	Thread t = new Thread(new Runnable() {
+//                public void run() {
+//                    threadAssertFalse(sync.tryAcquire(1));
+//		}
+//	    });
+//        try {
+//            t.start();
+//            t.join();
+//            sync.release(1);
+//        } catch(Exception e){
+//            unexpectedException();
+//        }
+//    }
+//
+//    /**
+//     * tryAcquireNanos on an exclusively held sync times out
+//     */
+//    public void testAcquireNanos_Timeout() {
+//	final Mutex sync = new Mutex();
+//	sync.acquire(1);
+//	Thread t = new Thread(new Runnable() {
+//                public void run() {
+//		    try {
+//                        threadAssertFalse(sync.tryAcquireNanos(1, 1000 * 1000));
+//                    } catch (Exception ex) {
+//                        threadUnexpectedException();
+//                    }
+//		}
+//	    });
+//        try {
+//            t.start();
+//            t.join();
+//            sync.release(1);
+//        } catch(Exception e){
+//            unexpectedException();
+//        }
+//    }
+//
+//
+//    /**
+//     * getState is true when acquired and false when not
+//     */
+//    public void testGetState() {
+//	final Mutex sync = new Mutex();
+//	sync.acquire(1);
+//	assertTrue(sync.isHeldExclusively());
+//	sync.release(1);
+//	assertFalse(sync.isHeldExclusively());
+//	Thread t = new Thread(new Runnable() {
+//		public void run() {
+//		    sync.acquire(1);
+//		    try {
+//			Thread.sleep(SMALL_DELAY_MS);
+//		    }
+//		    catch(Exception e) {
+//                        threadUnexpectedException();
+//                    }
+//		    sync.release(1);
+//		}
+//	    });
+//	try {
+//            t.start();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertTrue(sync.isHeldExclusively());
+//            t.join();
+//            assertFalse(sync.isHeldExclusively());
+//        } catch(Exception e){
+//            unexpectedException();
+//        }
+//    }
+//
+//
+//    /**
+//     * acquireInterruptibly is interruptible.
+//     */
+//    public void testAcquireInterruptibly1() {
+//	final Mutex sync = new Mutex();
+//	sync.acquire(1);
+//	Thread t = new Thread(new InterruptedSyncRunnable(sync));
+//        try {
+//            t.start();
+//            t.interrupt();
+//            sync.release(1);
+//            t.join();
+//        } catch(Exception e){
+//            unexpectedException();
+//        }
+//    }
+//
+//    /**
+//     * acquireInterruptibly succeeds when released, else is interruptible
+//     */
+//    public void testAcquireInterruptibly2() {
+//	final Mutex sync = new Mutex();
+//	try {
+//            sync.acquireInterruptibly(1);
+//        } catch(Exception e) {
+//            unexpectedException();
+//        }
+//	Thread t = new Thread(new InterruptedSyncRunnable(sync));
+//        try {
+//            t.start();
+//            t.interrupt();
+//            assertTrue(sync.isHeldExclusively());
+//            t.join();
+//        } catch(Exception e){
+//            unexpectedException();
+//        }
+//    }
+//
+//    /**
+//     * owns is true for a condition created by sync else false
+//     */
+//    public void testOwns() {
+//	final Mutex sync = new Mutex();
+//        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
+//        final Mutex sync2 = new Mutex();
+//        assertTrue(sync.owns(c));
+//        assertFalse(sync2.owns(c));
+//    }
+//
+//    /**
+//     * Calling await without holding sync throws IllegalMonitorStateException
+//     */
+//    public void testAwait_IllegalMonitor() {
+//	final Mutex sync = new Mutex();
+//        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
+//        try {
+//            c.await();
+//            shouldThrow();
+//        }
+//        catch (IllegalMonitorStateException success) {
+//        }
+//        catch (Exception ex) {
+//            unexpectedException();
+//        }
+//    }
+//
+//    /**
+//     * Calling signal without holding sync throws IllegalMonitorStateException
+//     */
+//    public void testSignal_IllegalMonitor() {
+//	final Mutex sync = new Mutex();
+//        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
+//        try {
+//            c.signal();
+//            shouldThrow();
+//        }
+//        catch (IllegalMonitorStateException success) {
+//        }
+//        catch (Exception ex) {
+//            unexpectedException();
+//        }
+//    }
+//
+//    /**
+//     * awaitNanos without a signal times out
+//     */
+//    public void testAwaitNanos_Timeout() {
+//	final Mutex sync = new Mutex();
+//        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
+//        try {
+//            sync.acquire(1);
+//            long t = c.awaitNanos(100);
+//            assertTrue(t <= 0);
+//            sync.release(1);
+//        }
+//        catch (Exception ex) {
+//            unexpectedException();
+//        }
+//    }
+//
+//    /**
+//     *  Timed await without a signal times out
+//     */
+//    public void testAwait_Timeout() {
+//	final Mutex sync = new Mutex();
+//        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
+//        try {
+//            sync.acquire(1);
+//            assertFalse(c.await(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+//            sync.release(1);
+//        }
+//        catch (Exception ex) {
+//            unexpectedException();
+//        }
+//    }
+//
+//    /**
+//     * awaitUntil without a signal times out
+//     */
+//    public void testAwaitUntil_Timeout() {
+//	final Mutex sync = new Mutex();
+//        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
+//        try {
+//            sync.acquire(1);
+//            edu.emory.mathcs.backport.java.util.Date d = new edu.emory.mathcs.backport.java.util.Date();
+//            assertFalse(c.awaitUntil(new edu.emory.mathcs.backport.java.util.Date(d.getTime() + 10)));
+//            sync.release(1);
+//        }
+//        catch (Exception ex) {
+//            unexpectedException();
+//        }
+//    }
+//
+//    /**
+//     * await returns when signalled
+//     */
+//    public void testAwait() {
+//	final Mutex sync = new Mutex();
+//        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
+//	Thread t = new Thread(new Runnable() {
+//		public void run() {
+//		    try {
+//			sync.acquire(1);
+//                        c.await();
+//                        sync.release(1);
+//		    }
+//		    catch(InterruptedException e) {
+//                        threadUnexpectedException();
+//                    }
+//		}
+//	    });
+//
+//        try {
+//            t.start();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            sync.acquire(1);
+//            c.signal();
+//            sync.release(1);
+//            t.join(SHORT_DELAY_MS);
+//            assertFalse(t.isAlive());
+//        }
+//        catch (Exception ex) {
+//            unexpectedException();
+//        }
+//    }
+//
+//
+//
+//    /**
+//     * hasWaiters throws NPE if null
+//     */
+//    public void testHasWaitersNPE() {
+//	final Mutex sync = new Mutex();
+//        try {
+//            sync.hasWaiters(null);
+//            shouldThrow();
+//        } catch (NullPointerException success) {
+//        } catch (Exception ex) {
+//            unexpectedException();
+//        }
+//    }
+//
+//    /**
+//     * getWaitQueueLength throws NPE if null
+//     */
+//    public void testGetWaitQueueLengthNPE() {
+//	final Mutex sync = new Mutex();
+//        try {
+//            sync.getWaitQueueLength(null);
+//            shouldThrow();
+//        } catch (NullPointerException success) {
+//        } catch (Exception ex) {
+//            unexpectedException();
+//        }
+//    }
+//
+//
+//    /**
+//     * getWaitingThreads throws NPE if null
+//     */
+//    public void testGetWaitingThreadsNPE() {
+//	final Mutex sync = new Mutex();
+//        try {
+//            sync.getWaitingThreads(null);
+//            shouldThrow();
+//        } catch (NullPointerException success) {
+//        } catch (Exception ex) {
+//            unexpectedException();
+//        }
+//    }
+//
+//
+//    /**
+//     * hasWaiters throws IAE if not owned
+//     */
+//    public void testHasWaitersIAE() {
+//	final Mutex sync = new Mutex();
+//        final AbstractQueuedSynchronizer.ConditionObject c = (sync.newCondition());
+//	final Mutex sync2 = new Mutex();
+//        try {
+//            sync2.hasWaiters(c);
+//            shouldThrow();
+//        } catch (IllegalArgumentException success) {
+//        } catch (Exception ex) {
+//            unexpectedException();
+//        }
+//    }
+//
+//    /**
+//     * hasWaiters throws IMSE if not synced
+//     */
+//    public void testHasWaitersIMSE() {
+//	final Mutex sync = new Mutex();
+//        final AbstractQueuedSynchronizer.ConditionObject c = (sync.newCondition());
+//        try {
+//            sync.hasWaiters(c);
+//            shouldThrow();
+//        } catch (IllegalMonitorStateException success) {
+//        } catch (Exception ex) {
+//            unexpectedException();
+//        }
+//    }
+//
+//
+//    /**
+//     * getWaitQueueLength throws IAE if not owned
+//     */
+//    public void testGetWaitQueueLengthIAE() {
+//	final Mutex sync = new Mutex();
+//        final AbstractQueuedSynchronizer.ConditionObject c = (sync.newCondition());
+//	final Mutex sync2 = new Mutex();
+//        try {
+//            sync2.getWaitQueueLength(c);
+//            shouldThrow();
+//        } catch (IllegalArgumentException success) {
+//        } catch (Exception ex) {
+//            unexpectedException();
+//        }
+//    }
+//
+//    /**
+//     * getWaitQueueLength throws IMSE if not synced
+//     */
+//    public void testGetWaitQueueLengthIMSE() {
+//	final Mutex sync = new Mutex();
+//        final AbstractQueuedSynchronizer.ConditionObject c = (sync.newCondition());
+//        try {
+//            sync.getWaitQueueLength(c);
+//            shouldThrow();
+//        } catch (IllegalMonitorStateException success) {
+//        } catch (Exception ex) {
+//            unexpectedException();
+//        }
+//    }
+//
+//
+//    /**
+//     * getWaitingThreads throws IAE if not owned
+//     */
+//    public void testGetWaitingThreadsIAE() {
+//	final Mutex sync = new Mutex();
+//        final AbstractQueuedSynchronizer.ConditionObject c = (sync.newCondition());
+//	final Mutex sync2 = new Mutex();
+//        try {
+//            sync2.getWaitingThreads(c);
+//            shouldThrow();
+//        } catch (IllegalArgumentException success) {
+//        } catch (Exception ex) {
+//            unexpectedException();
+//        }
+//    }
+//
+//    /**
+//     * getWaitingThreads throws IMSE if not synced
+//     */
+//    public void testGetWaitingThreadsIMSE() {
+//	final Mutex sync = new Mutex();
+//        final AbstractQueuedSynchronizer.ConditionObject c = (sync.newCondition());
+//        try {
+//            sync.getWaitingThreads(c);
+//            shouldThrow();
+//        } catch (IllegalMonitorStateException success) {
+//        } catch (Exception ex) {
+//            unexpectedException();
+//        }
+//    }
+//
+//
+//
+//    /**
+//     * hasWaiters returns true when a thread is waiting, else false
+//     */
+//    public void testHasWaiters() {
+//	final Mutex sync = new Mutex();
+//        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
+//	Thread t = new Thread(new Runnable() {
+//		public void run() {
+//		    try {
+//			sync.acquire(1);
+//                        threadAssertFalse(sync.hasWaiters(c));
+//                        threadAssertEquals(0, sync.getWaitQueueLength(c));
+//                        c.await();
+//                        sync.release(1);
+//		    }
+//		    catch(InterruptedException e) {
+//                        threadUnexpectedException();
+//                    }
+//		}
+//	    });
+//
+//        try {
+//            t.start();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            sync.acquire(1);
+//            assertTrue(sync.hasWaiters(c));
+//            assertEquals(1, sync.getWaitQueueLength(c));
+//            c.signal();
+//            sync.release(1);
+//            Thread.sleep(SHORT_DELAY_MS);
+//            sync.acquire(1);
+//            assertFalse(sync.hasWaiters(c));
+//            assertEquals(0, sync.getWaitQueueLength(c));
+//            sync.release(1);
+//            t.join(SHORT_DELAY_MS);
+//            assertFalse(t.isAlive());
+//        }
+//        catch (Exception ex) {
+//            unexpectedException();
+//        }
+//    }
+//
+//    /**
+//     * getWaitQueueLength returns number of waiting threads
+//     */
+//    public void testGetWaitQueueLength() {
+//	final Mutex sync = new Mutex();
+//        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
+//	Thread t1 = new Thread(new Runnable() {
+//		public void run() {
+//		    try {
+//			sync.acquire(1);
+//                        threadAssertFalse(sync.hasWaiters(c));
+//                        threadAssertEquals(0, sync.getWaitQueueLength(c));
+//                        c.await();
+//                        sync.release(1);
+//		    }
+//		    catch(InterruptedException e) {
+//                        threadUnexpectedException();
+//                    }
+//		}
+//	    });
+//
+//	Thread t2 = new Thread(new Runnable() {
+//		public void run() {
+//		    try {
+//			sync.acquire(1);
+//                        threadAssertTrue(sync.hasWaiters(c));
+//                        threadAssertEquals(1, sync.getWaitQueueLength(c));
+//                        c.await();
+//                        sync.release(1);
+//		    }
+//		    catch(InterruptedException e) {
+//                        threadUnexpectedException();
+//                    }
+//		}
+//	    });
+//
+//        try {
+//            t1.start();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            t2.start();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            sync.acquire(1);
+//            assertTrue(sync.hasWaiters(c));
+//            assertEquals(2, sync.getWaitQueueLength(c));
+//            c.signalAll();
+//            sync.release(1);
+//            Thread.sleep(SHORT_DELAY_MS);
+//            sync.acquire(1);
+//            assertFalse(sync.hasWaiters(c));
+//            assertEquals(0, sync.getWaitQueueLength(c));
+//            sync.release(1);
+//            t1.join(SHORT_DELAY_MS);
+//            t2.join(SHORT_DELAY_MS);
+//            assertFalse(t1.isAlive());
+//            assertFalse(t2.isAlive());
+//        }
+//        catch (Exception ex) {
+//            unexpectedException();
+//        }
+//    }
+//
+//    /**
+//     * getWaitingThreads returns only and all waiting threads
+//     */
+//    public void testGetWaitingThreads() {
+//	final Mutex sync = new Mutex();
+//        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
+//	Thread t1 = new Thread(new Runnable() {
+//		public void run() {
+//		    try {
+//			sync.acquire(1);
+//                        threadAssertTrue(sync.getWaitingThreads(c).isEmpty());
+//                        c.await();
+//                        sync.release(1);
+//		    }
+//		    catch(InterruptedException e) {
+//                        threadUnexpectedException();
+//                    }
+//		}
+//	    });
+//
+//	Thread t2 = new Thread(new Runnable() {
+//		public void run() {
+//		    try {
+//			sync.acquire(1);
+//                        threadAssertFalse(sync.getWaitingThreads(c).isEmpty());
+//                        c.await();
+//                        sync.release(1);
+//		    }
+//		    catch(InterruptedException e) {
+//                        threadUnexpectedException();
+//                    }
+//		}
+//	    });
+//
+//        try {
+//            sync.acquire(1);
+//            assertTrue(sync.getWaitingThreads(c).isEmpty());
+//            sync.release(1);
+//            t1.start();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            t2.start();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            sync.acquire(1);
+//            assertTrue(sync.hasWaiters(c));
+//            assertTrue(sync.getWaitingThreads(c).contains(t1));
+//            assertTrue(sync.getWaitingThreads(c).contains(t2));
+//            c.signalAll();
+//            sync.release(1);
+//            Thread.sleep(SHORT_DELAY_MS);
+//            sync.acquire(1);
+//            assertFalse(sync.hasWaiters(c));
+//            assertTrue(sync.getWaitingThreads(c).isEmpty());
+//            sync.release(1);
+//            t1.join(SHORT_DELAY_MS);
+//            t2.join(SHORT_DELAY_MS);
+//            assertFalse(t1.isAlive());
+//            assertFalse(t2.isAlive());
+//        }
+//        catch (Exception ex) {
+//            unexpectedException();
+//        }
+//    }
+//
+//
+//
+//    /**
+//     * awaitUninterruptibly doesn't abort on interrupt
+//     */
+//    public void testAwaitUninterruptibly() {
+//	final Mutex sync = new Mutex();
+//        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
+//	Thread t = new Thread(new Runnable() {
+//		public void run() {
+//                    sync.acquire(1);
+//                    c.awaitUninterruptibly();
+//                    sync.release(1);
+//		}
+//	    });
+//
+//        try {
+//            t.start();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            t.interrupt();
+//            sync.acquire(1);
+//            c.signal();
+//            sync.release(1);
+//            t.join(SHORT_DELAY_MS);
+//            assertFalse(t.isAlive());
+//        }
+//        catch (Exception ex) {
+//            unexpectedException();
+//        }
+//    }
+//
+//    /**
+//     * await is interruptible
+//     */
+//    public void testAwait_Interrupt() {
+//	final Mutex sync = new Mutex();
+//        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
+//	Thread t = new Thread(new Runnable() {
+//		public void run() {
+//		    try {
+//			sync.acquire(1);
+//                        c.await();
+//                        sync.release(1);
+//                        threadShouldThrow();
+//		    }
+//		    catch(InterruptedException success) {
+//                    }
+//		}
+//	    });
+//
+//        try {
+//            t.start();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            t.interrupt();
+//            t.join(SHORT_DELAY_MS);
+//            assertFalse(t.isAlive());
+//        }
+//        catch (Exception ex) {
+//            unexpectedException();
+//        }
+//    }
+//
+//    /**
+//     * awaitNanos is interruptible
+//     */
+//    public void testAwaitNanos_Interrupt() {
+//	final Mutex sync = new Mutex();
+//        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
+//	Thread t = new Thread(new Runnable() {
+//		public void run() {
+//		    try {
+//			sync.acquire(1);
+//                        c.awaitNanos(1000 * 1000 * 1000); // 1 sec
+//                        sync.release(1);
+//                        threadShouldThrow();
+//		    }
+//		    catch(InterruptedException success) {
+//                    }
+//		}
+//	    });
+//
+//        try {
+//            t.start();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            t.interrupt();
+//            t.join(SHORT_DELAY_MS);
+//            assertFalse(t.isAlive());
+//        }
+//        catch (Exception ex) {
+//            unexpectedException();
+//        }
+//    }
+//
+//    /**
+//     * awaitUntil is interruptible
+//     */
+//    public void testAwaitUntil_Interrupt() {
+//	final Mutex sync = new Mutex();
+//        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
+//	Thread t = new Thread(new Runnable() {
+//		public void run() {
+//		    try {
+//			sync.acquire(1);
+//                        edu.emory.mathcs.backport.java.util.Date d = new edu.emory.mathcs.backport.java.util.Date();
+//                        c.awaitUntil(new edu.emory.mathcs.backport.java.util.Date(d.getTime() + 10000));
+//                        sync.release(1);
+//                        threadShouldThrow();
+//		    }
+//		    catch(InterruptedException success) {
+//                    }
+//		}
+//	    });
+//
+//        try {
+//            t.start();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            t.interrupt();
+//            t.join(SHORT_DELAY_MS);
+//            assertFalse(t.isAlive());
+//        }
+//        catch (Exception ex) {
+//            unexpectedException();
+//        }
+//    }
+//
+//    /**
+//     * signalAll wakes up all threads
+//     */
+//    public void testSignalAll() {
+//	final Mutex sync = new Mutex();
+//        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
+//	Thread t1 = new Thread(new Runnable() {
+//		public void run() {
+//		    try {
+//			sync.acquire(1);
+//                        c.await();
+//                        sync.release(1);
+//		    }
+//		    catch(InterruptedException e) {
+//                        threadUnexpectedException();
+//                    }
+//		}
+//	    });
+//
+//	Thread t2 = new Thread(new Runnable() {
+//		public void run() {
+//		    try {
+//			sync.acquire(1);
+//                        c.await();
+//                        sync.release(1);
+//		    }
+//		    catch(InterruptedException e) {
+//                        threadUnexpectedException();
+//                    }
+//		}
+//	    });
+//
+//        try {
+//            t1.start();
+//            t2.start();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            sync.acquire(1);
+//            c.signalAll();
+//            sync.release(1);
+//            t1.join(SHORT_DELAY_MS);
+//            t2.join(SHORT_DELAY_MS);
+//            assertFalse(t1.isAlive());
+//            assertFalse(t2.isAlive());
+//        }
+//        catch (Exception ex) {
+//            unexpectedException();
+//        }
+//    }
+//
+//
+//    /**
+//     * toString indicates current state
+//     */
+//    public void testToString() {
+//        Mutex sync = new Mutex();
+//        String us = sync.toString();
+//        assertTrue(us.indexOf("State = 0") >= 0);
+//        sync.acquire(1);
+//        String ls = sync.toString();
+//        assertTrue(ls.indexOf("State = 1") >= 0);
+//    }
+//
+//    /**
+//     * A serialized AQS deserializes with current state
+//     */
+//    public void testSerialization() {
+//        Mutex l = new Mutex();
+//        l.acquire(1);
+//        assertTrue(l.isHeldExclusively());
+//
+//        try {
+//            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
+//            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
+//            out.writeObject(l);
+//            out.close();
+//
+//            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
+//            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
+//            Mutex r = (Mutex) in.readObject();
+//            assertTrue(r.isHeldExclusively());
+//        } catch(Exception e){
+//            e.printStackTrace();
+//            unexpectedException();
+//        }
+//    }
+//
+//
+//    /**
+//     * tryReleaseShared setting state changes getState
+//     */
+//    public void testGetStateWithReleaseShared() {
+//	final BooleanLatch l = new BooleanLatch();
+//	assertFalse(l.isSignalled());
+//	l.releaseShared(0);
+//	assertTrue(l.isSignalled());
+//    }
+//
+//    /**
+//     * releaseShared has no effect when already signalled
+//     */
+//    public void testReleaseShared() {
+//	final BooleanLatch l = new BooleanLatch();
+//	assertFalse(l.isSignalled());
+//	l.releaseShared(0);
+//	assertTrue(l.isSignalled());
+//	l.releaseShared(0);
+//	assertTrue(l.isSignalled());
+//    }
+//
+//    /**
+//     * acquireSharedInterruptibly returns after release, but not before
+//     */
+//    public void testAcquireSharedInterruptibly() {
+//	final BooleanLatch l = new BooleanLatch();
+//
+//	Thread t = new Thread(new Runnable() {
+//		public void run() {
+//		    try {
+//                        threadAssertFalse(l.isSignalled());
+//			l.acquireSharedInterruptibly(0);
+//                        threadAssertTrue(l.isSignalled());
+//		    } catch(InterruptedException e){
+//                        threadUnexpectedException();
+//                    }
+//		}
+//	    });
+//	try {
+//            t.start();
+//            assertFalse(l.isSignalled());
+//            Thread.sleep(SHORT_DELAY_MS);
+//            l.releaseShared(0);
+//            assertTrue(l.isSignalled());
+//            t.join();
+//        } catch (InterruptedException e){
+//            unexpectedException();
+//        }
+//    }
+//
+//
+//    /**
+//     * acquireSharedTimed returns after release
+//     */
+//    public void testAsquireSharedTimed() {
+//	final BooleanLatch l = new BooleanLatch();
+//
+//	Thread t = new Thread(new Runnable() {
+//		public void run() {
+//		    try {
+//                        threadAssertFalse(l.isSignalled());
+//			threadAssertTrue(l.tryAcquireSharedNanos(0, MEDIUM_DELAY_MS* 1000 * 1000));
+//                        threadAssertTrue(l.isSignalled());
+//
+//		    } catch(InterruptedException e){
+//                        threadUnexpectedException();
+//                    }
+//		}
+//	    });
+//	try {
+//            t.start();
+//            assertFalse(l.isSignalled());
+//            Thread.sleep(SHORT_DELAY_MS);
+//            l.releaseShared(0);
+//            assertTrue(l.isSignalled());
+//            t.join();
+//        } catch (InterruptedException e){
+//            unexpectedException();
+//        }
+//    }
+//
+//    /**
+//     * acquireSharedInterruptibly throws IE if interrupted before released
+//     */
+//    public void testAcquireSharedInterruptibly_InterruptedException() {
+//        final BooleanLatch l = new BooleanLatch();
+//        Thread t = new Thread(new Runnable() {
+//                public void run() {
+//                    try {
+//                        threadAssertFalse(l.isSignalled());
+//                        l.acquireSharedInterruptibly(0);
+//                        threadShouldThrow();
+//                    } catch(InterruptedException success){}
+//                }
+//            });
+//	t.start();
+//	try {
+//            assertFalse(l.isSignalled());
+//            t.interrupt();
+//            t.join();
+//        } catch (InterruptedException e){
+//            unexpectedException();
+//        }
+//    }
+//
+//    /**
+//     * acquireSharedTimed throws IE if interrupted before released
+//     */
+//    public void testAcquireSharedNanos_InterruptedException() {
+//        final BooleanLatch l = new BooleanLatch();
+//        Thread t = new Thread(new Runnable() {
+//                public void run() {
+//                    try {
+//                        threadAssertFalse(l.isSignalled());
+//                        l.tryAcquireSharedNanos(0, SMALL_DELAY_MS* 1000 * 1000);
+//                        threadShouldThrow();
+//                    } catch(InterruptedException success){}
+//                }
+//            });
+//        t.start();
+//        try {
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertFalse(l.isSignalled());
+//            t.interrupt();
+//            t.join();
+//        } catch (InterruptedException e){
+//            unexpectedException();
+//        }
+//    }
+//
+//    /**
+//     * acquireSharedTimed times out if not released before timeout
+//     */
+//    public void testAcquireSharedNanos_Timeout() {
+//        final BooleanLatch l = new BooleanLatch();
+//        Thread t = new Thread(new Runnable() {
+//                public void run() {
+//                    try {
+//                        threadAssertFalse(l.isSignalled());
+//                        threadAssertFalse(l.tryAcquireSharedNanos(0, SMALL_DELAY_MS* 1000 * 1000));
+//                    } catch(InterruptedException ie){
+//                        threadUnexpectedException();
+//                    }
+//                }
+//            });
+//        t.start();
+//        try {
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertFalse(l.isSignalled());
+//            t.join();
+//        } catch (InterruptedException e){
+//            unexpectedException();
+//        }
+//    }
+//
+//
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/ArrayBlockingQueueTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/ArrayBlockingQueueTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/ArrayBlockingQueueTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,1063 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import java.io.*;
+import java.util.ArrayList;
+import java.util.NoSuchElementException;
+import java.util.Iterator;
+import java.util.ConcurrentModificationException;
+
+public class ArrayBlockingQueueTest extends JSR166TestCase {
+    public static void main(String[] args) {
+        junit.textui.TestRunner.run (suite());
+    }
+    public static Test suite() {
+        return new TestSuite(ArrayBlockingQueueTest.class);
+    }
+
+    /**
+     * Create a queue of given size containing consecutive
+     * Integers 0 ... n.
+     */
+    private ArrayBlockingQueue populatedQueue(int n) {
+        ArrayBlockingQueue q = new ArrayBlockingQueue(n);
+        assertTrue(q.isEmpty());
+        for(int i = 0; i < n; i++)
+            assertTrue(q.offer(new Integer(i)));
+        assertFalse(q.isEmpty());
+        assertEquals(0, q.remainingCapacity());
+        assertEquals(n, q.size());
+        return q;
+    }
+
+    /**
+     * A new queue has the indicated capacity
+     */
+    public void testConstructor1() {
+        assertEquals(SIZE, new ArrayBlockingQueue(SIZE).remainingCapacity());
+    }
+
+    /**
+     * Constructor throws IAE if  capacity argument nonpositive
+     */
+    public void testConstructor2() {
+        try {
+            ArrayBlockingQueue q = new ArrayBlockingQueue(0);
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success) {}
+    }
+
+    /**
+     * Initializing from null Collection throws NPE
+     */
+    public void testConstructor3() {
+        try {
+            ArrayBlockingQueue q = new ArrayBlockingQueue(1, true, null);
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Initializing from Collection of null elements throws NPE
+     */
+    public void testConstructor4() {
+        try {
+            Integer[] ints = new Integer[SIZE];
+            ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE, false, Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Initializing from Collection with some null elements throws NPE
+     */
+    public void testConstructor5() {
+        try {
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE-1; ++i)
+                ints[i] = new Integer(i);
+            ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE, false, Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Initializing from too large collection throws IAE
+     */
+    public void testConstructor6() {
+        try {
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE; ++i)
+                ints[i] = new Integer(i);
+            ArrayBlockingQueue q = new ArrayBlockingQueue(1, false, Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success) {}
+    }
+
+    /**
+     * Queue contains all elements of collection used to initialize
+     */
+    public void testConstructor7() {
+        try {
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE; ++i)
+                ints[i] = new Integer(i);
+            ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE, true, Arrays.asList(ints));
+            for (int i = 0; i < SIZE; ++i)
+                assertEquals(ints[i], q.poll());
+        }
+        finally {}
+    }
+
+    /**
+     * Queue transitions from empty to full when elements added
+     */
+    public void testEmptyFull() {
+        ArrayBlockingQueue q = new ArrayBlockingQueue(2);
+        assertTrue(q.isEmpty());
+        assertEquals(2, q.remainingCapacity());
+        q.add(one);
+        assertFalse(q.isEmpty());
+        q.add(two);
+        assertFalse(q.isEmpty());
+        assertEquals(0, q.remainingCapacity());
+        assertFalse(q.offer(three));
+    }
+
+    /**
+     * remainingCapacity decreases on add, increases on remove
+     */
+    public void testRemainingCapacity() {
+        ArrayBlockingQueue q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, q.remainingCapacity());
+            assertEquals(SIZE-i, q.size());
+            q.remove();
+        }
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(SIZE-i, q.remainingCapacity());
+            assertEquals(i, q.size());
+            q.add(new Integer(i));
+        }
+    }
+
+    /**
+     *  offer(null) throws NPE
+     */
+    public void testOfferNull() {
+        try {
+            ArrayBlockingQueue q = new ArrayBlockingQueue(1);
+            q.offer(null);
+            shouldThrow();
+        } catch (NullPointerException success) { }
+    }
+
+    /**
+     *  add(null) throws NPE
+     */
+    public void testAddNull() {
+        try {
+            ArrayBlockingQueue q = new ArrayBlockingQueue(1);
+            q.add(null);
+            shouldThrow();
+        } catch (NullPointerException success) { }
+    }
+
+    /**
+     * Offer succeeds if not full; fails if full
+     */
+    public void testOffer() {
+        ArrayBlockingQueue q = new ArrayBlockingQueue(1);
+        assertTrue(q.offer(zero));
+        assertFalse(q.offer(one));
+    }
+
+    /**
+     * add succeeds if not full; throws ISE if full
+     */
+    public void testAdd() {
+        try {
+            ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE);
+            for (int i = 0; i < SIZE; ++i) {
+                assertTrue(q.add(new Integer(i)));
+            }
+            assertEquals(0, q.remainingCapacity());
+            q.add(new Integer(SIZE));
+        } catch (IllegalStateException success){
+        }
+    }
+
+    /**
+     *  addAll(null) throws NPE
+     */
+    public void testAddAll1() {
+        try {
+            ArrayBlockingQueue q = new ArrayBlockingQueue(1);
+            q.addAll(null);
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * addAll(this) throws IAE
+     */
+    public void testAddAllSelf() {
+        try {
+            ArrayBlockingQueue q = populatedQueue(SIZE);
+            q.addAll(q);
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success) {}
+    }
+
+
+    /**
+     *  addAll of a collection with null elements throws NPE
+     */
+    public void testAddAll2() {
+        try {
+            ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE);
+            Integer[] ints = new Integer[SIZE];
+            q.addAll(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+    /**
+     * addAll of a collection with any null elements throws NPE after
+     * possibly adding some elements
+     */
+    public void testAddAll3() {
+        try {
+            ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE);
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE-1; ++i)
+                ints[i] = new Integer(i);
+            q.addAll(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+    /**
+     * addAll throws ISE if not enough room
+     */
+    public void testAddAll4() {
+        try {
+            ArrayBlockingQueue q = new ArrayBlockingQueue(1);
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE; ++i)
+                ints[i] = new Integer(i);
+            q.addAll(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (IllegalStateException success) {}
+    }
+    /**
+     * Queue contains all elements, in traversal order, of successful addAll
+     */
+    public void testAddAll5() {
+        try {
+            Integer[] empty = new Integer[0];
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE; ++i)
+                ints[i] = new Integer(i);
+            ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE);
+            assertFalse(q.addAll(Arrays.asList(empty)));
+            assertTrue(q.addAll(Arrays.asList(ints)));
+            for (int i = 0; i < SIZE; ++i)
+                assertEquals(ints[i], q.poll());
+        }
+        finally {}
+    }
+
+    /**
+     *  put(null) throws NPE
+     */
+     public void testPutNull() {
+        try {
+            ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE);
+            q.put(null);
+            shouldThrow();
+        }
+        catch (NullPointerException success){
+        }
+        catch (InterruptedException ie) {
+            unexpectedException();
+        }
+     }
+
+    /**
+     * all elements successfully put are contained
+     */
+     public void testPut() {
+         try {
+             ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE);
+             for (int i = 0; i < SIZE; ++i) {
+                 Integer I = new Integer(i);
+                 q.put(I);
+                 assertTrue(q.contains(I));
+             }
+             assertEquals(0, q.remainingCapacity());
+         }
+        catch (InterruptedException ie) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * put blocks interruptibly if full
+     */
+    public void testBlockingPut() {
+        final ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    int added = 0;
+                    try {
+                        for (int i = 0; i < SIZE; ++i) {
+                            q.put(new Integer(i));
+                            ++added;
+                        }
+                        q.put(new Integer(SIZE));
+                        threadShouldThrow();
+                    } catch (InterruptedException ie){
+                        threadAssertEquals(added, SIZE);
+                    }
+                }});
+        try {
+            t.start();
+           Thread.sleep(MEDIUM_DELAY_MS);
+           t.interrupt();
+           t.join();
+        }
+        catch (InterruptedException ie) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * put blocks waiting for take when full
+     */
+    public void testPutWithTake() {
+        final ArrayBlockingQueue q = new ArrayBlockingQueue(2);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    int added = 0;
+                    try {
+                        q.put(new Object());
+                        ++added;
+                        q.put(new Object());
+                        ++added;
+                        q.put(new Object());
+                        ++added;
+                        q.put(new Object());
+                        ++added;
+                        threadShouldThrow();
+                    } catch (InterruptedException e){
+                        threadAssertTrue(added >= 2);
+                    }
+                }
+            });
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            q.take();
+            t.interrupt();
+            t.join();
+        } catch (Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * timed offer times out if full and elements not taken
+     */
+    public void testTimedOffer() {
+        final ArrayBlockingQueue q = new ArrayBlockingQueue(2);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        q.put(new Object());
+                        q.put(new Object());
+                        threadAssertFalse(q.offer(new Object(), SHORT_DELAY_MS/2, TimeUnit.MILLISECONDS));
+                        q.offer(new Object(), LONG_DELAY_MS, TimeUnit.MILLISECONDS);
+                        threadShouldThrow();
+                    } catch (InterruptedException success){}
+                }
+            });
+
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            t.interrupt();
+            t.join();
+        } catch (Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * take retrieves elements in FIFO order
+     */
+    public void testTake() {
+        try {
+            ArrayBlockingQueue q = populatedQueue(SIZE);
+            for (int i = 0; i < SIZE; ++i) {
+                assertEquals(i, ((Integer)q.take()).intValue());
+            }
+        } catch (InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * take blocks interruptibly when empty
+     */
+    public void testTakeFromEmpty() {
+        final ArrayBlockingQueue q = new ArrayBlockingQueue(2);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        q.take();
+                        threadShouldThrow();
+                    } catch (InterruptedException success){ }
+                }
+            });
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            t.interrupt();
+            t.join();
+        } catch (Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * Take removes existing elements until empty, then blocks interruptibly
+     */
+    public void testBlockingTake() {
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        ArrayBlockingQueue q = populatedQueue(SIZE);
+                        for (int i = 0; i < SIZE; ++i) {
+                            threadAssertEquals(i, ((Integer)q.take()).intValue());
+                        }
+                        q.take();
+                        threadShouldThrow();
+                    } catch (InterruptedException success){
+                    }
+                }});
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            t.interrupt();
+            t.join();
+        }
+        catch (InterruptedException ie) {
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * poll succeeds unless empty
+     */
+    public void testPoll() {
+        ArrayBlockingQueue q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.poll()).intValue());
+        }
+        assertNull(q.poll());
+    }
+
+    /**
+     * timed pool with zero timeout succeeds when non-empty, else times out
+     */
+    public void testTimedPoll0() {
+        try {
+            ArrayBlockingQueue q = populatedQueue(SIZE);
+            for (int i = 0; i < SIZE; ++i) {
+                assertEquals(i, ((Integer)q.poll(0, TimeUnit.MILLISECONDS)).intValue());
+            }
+            assertNull(q.poll(0, TimeUnit.MILLISECONDS));
+        } catch (InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * timed pool with nonzero timeout succeeds when non-empty, else times out
+     */
+    public void testTimedPoll() {
+        try {
+            ArrayBlockingQueue q = populatedQueue(SIZE);
+            for (int i = 0; i < SIZE; ++i) {
+                assertEquals(i, ((Integer)q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS)).intValue());
+            }
+            assertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+        } catch (InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * Interrupted timed poll throws InterruptedException instead of
+     * returning timeout status
+     */
+    public void testInterruptedTimedPoll() {
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        ArrayBlockingQueue q = populatedQueue(SIZE);
+                        for (int i = 0; i < SIZE; ++i) {
+                            threadAssertEquals(i, ((Integer)q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS)).intValue());
+                        }
+                        threadAssertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+                    } catch (InterruptedException success){
+                    }
+                }});
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            t.interrupt();
+            t.join();
+        }
+        catch (InterruptedException ie) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     *  timed poll before a delayed offer fails; after offer succeeds;
+     *  on interruption throws
+     */
+    public void testTimedPollWithOffer() {
+        final ArrayBlockingQueue q = new ArrayBlockingQueue(2);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        threadAssertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+                        q.poll(LONG_DELAY_MS, TimeUnit.MILLISECONDS);
+                        q.poll(LONG_DELAY_MS, TimeUnit.MILLISECONDS);
+                        threadShouldThrow();
+                    } catch (InterruptedException success) { }
+                }
+            });
+        try {
+            t.start();
+            Thread.sleep(SMALL_DELAY_MS);
+            assertTrue(q.offer(zero, SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+            t.interrupt();
+            t.join();
+        } catch (Exception e){
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * peek returns next element, or null if empty
+     */
+    public void testPeek() {
+        ArrayBlockingQueue q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.peek()).intValue());
+            q.poll();
+            assertTrue(q.peek() == null ||
+                       i != ((Integer)q.peek()).intValue());
+        }
+        assertNull(q.peek());
+    }
+
+    /**
+     * element returns next element, or throws NSEE if empty
+     */
+    public void testElement() {
+        ArrayBlockingQueue q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.element()).intValue());
+            q.poll();
+        }
+        try {
+            q.element();
+            shouldThrow();
+        }
+        catch (NoSuchElementException success) {}
+    }
+
+    /**
+     * remove removes next element, or throws NSEE if empty
+     */
+    public void testRemove() {
+        ArrayBlockingQueue q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.remove()).intValue());
+        }
+        try {
+            q.remove();
+            shouldThrow();
+        } catch (NoSuchElementException success){
+        }
+    }
+
+    /**
+     * remove(x) removes x and returns true if present
+     */
+    public void testRemoveElement() {
+        ArrayBlockingQueue q = populatedQueue(SIZE);
+        for (int i = 1; i < SIZE; i+=2) {
+            assertTrue(q.remove(new Integer(i)));
+        }
+        for (int i = 0; i < SIZE; i+=2) {
+            assertTrue(q.remove(new Integer(i)));
+            assertFalse(q.remove(new Integer(i+1)));
+        }
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * contains(x) reports true when elements added but not yet removed
+     */
+    public void testContains() {
+        ArrayBlockingQueue q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(q.contains(new Integer(i)));
+            q.poll();
+            assertFalse(q.contains(new Integer(i)));
+        }
+    }
+
+    /**
+     * clear removes all elements
+     */
+    public void testClear() {
+        ArrayBlockingQueue q = populatedQueue(SIZE);
+        q.clear();
+        assertTrue(q.isEmpty());
+        assertEquals(0, q.size());
+        assertEquals(SIZE, q.remainingCapacity());
+        q.add(one);
+        assertFalse(q.isEmpty());
+        assertTrue(q.contains(one));
+        q.clear();
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * containsAll(c) is true when c contains a subset of elements
+     */
+    public void testContainsAll() {
+        ArrayBlockingQueue q = populatedQueue(SIZE);
+        ArrayBlockingQueue p = new ArrayBlockingQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(q.containsAll(p));
+            assertFalse(p.containsAll(q));
+            p.add(new Integer(i));
+        }
+        assertTrue(p.containsAll(q));
+    }
+
+    /**
+     * retainAll(c) retains only those elements of c and reports true if changed
+     */
+    public void testRetainAll() {
+        ArrayBlockingQueue q = populatedQueue(SIZE);
+        ArrayBlockingQueue p = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            boolean changed = q.retainAll(p);
+            if (i == 0)
+                assertFalse(changed);
+            else
+                assertTrue(changed);
+
+            assertTrue(q.containsAll(p));
+            assertEquals(SIZE-i, q.size());
+            p.remove();
+        }
+    }
+
+    /**
+     * removeAll(c) removes only those elements of c and reports true if changed
+     */
+    public void testRemoveAll() {
+        for (int i = 1; i < SIZE; ++i) {
+            ArrayBlockingQueue q = populatedQueue(SIZE);
+            ArrayBlockingQueue p = populatedQueue(i);
+            assertTrue(q.removeAll(p));
+            assertEquals(SIZE-i, q.size());
+            for (int j = 0; j < i; ++j) {
+                Integer I = (Integer)(p.remove());
+                assertFalse(q.contains(I));
+            }
+        }
+    }
+
+    /**
+     *  toArray contains all elements
+     */
+    public void testToArray() {
+        ArrayBlockingQueue q = populatedQueue(SIZE);
+        Object[] o = q.toArray();
+        try {
+        for(int i = 0; i < o.length; i++)
+            assertEquals(o[i], q.take());
+        } catch (InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * toArray(a) contains all elements
+     */
+    public void testToArray2() {
+        ArrayBlockingQueue q = populatedQueue(SIZE);
+        Integer[] ints = new Integer[SIZE];
+        ints = (Integer[])q.toArray(ints);
+        try {
+            for(int i = 0; i < ints.length; i++)
+                assertEquals(ints[i], q.take());
+        } catch (InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * toArray(null) throws NPE
+     */
+    public void testToArray_BadArg() {
+        try {
+            ArrayBlockingQueue q = populatedQueue(SIZE);
+            Object o[] = q.toArray(null);
+            shouldThrow();
+        } catch(NullPointerException success){}
+    }
+
+    /**
+     * toArray with incompatible array type throws CCE
+     */
+    public void testToArray1_BadArg() {
+        try {
+            ArrayBlockingQueue q = populatedQueue(SIZE);
+            Object o[] = q.toArray(new String[10] );
+            shouldThrow();
+        } catch(ArrayStoreException  success){}
+    }
+
+
+    /**
+     * iterator iterates through all elements
+     */
+    public void testIterator() {
+        ArrayBlockingQueue q = populatedQueue(SIZE);
+        Iterator it = q.iterator();
+        try {
+            while(it.hasNext()){
+                assertEquals(it.next(), q.take());
+            }
+        } catch (InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * iterator.remove removes current element
+     */
+    public void testIteratorRemove () {
+        final ArrayBlockingQueue q = new ArrayBlockingQueue(3);
+        q.add(two);
+        q.add(one);
+        q.add(three);
+
+        Iterator it = q.iterator();
+        it.next();
+        it.remove();
+
+        it = q.iterator();
+        assertEquals(it.next(), one);
+        assertEquals(it.next(), three);
+        assertFalse(it.hasNext());
+    }
+
+    /**
+     * iterator ordering is FIFO
+     */
+    public void testIteratorOrdering() {
+        final ArrayBlockingQueue q = new ArrayBlockingQueue(3);
+        q.add(one);
+        q.add(two);
+        q.add(three);
+
+        assertEquals("queue should be full", 0, q.remainingCapacity());
+
+        int k = 0;
+        for (Iterator it = q.iterator(); it.hasNext();) {
+            int i = ((Integer)(it.next())).intValue();
+            assertEquals(++k, i);
+        }
+        assertEquals(3, k);
+    }
+
+    /**
+     * Modifications do not cause iterators to fail
+     */
+    public void testWeaklyConsistentIteration () {
+        final ArrayBlockingQueue q = new ArrayBlockingQueue(3);
+        q.add(one);
+        q.add(two);
+        q.add(three);
+        try {
+            for (Iterator it = q.iterator(); it.hasNext();) {
+                q.remove();
+                it.next();
+            }
+        }
+        catch (ConcurrentModificationException e) {
+            unexpectedException();
+        }
+        assertEquals(0, q.size());
+    }
+
+
+    /**
+     * toString contains toStrings of elements
+     */
+    public void testToString() {
+        ArrayBlockingQueue q = populatedQueue(SIZE);
+        String s = q.toString();
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(s.indexOf(String.valueOf(i)) >= 0);
+        }
+    }
+
+
+    /**
+     * offer transfers elements across Executor tasks
+     */
+    public void testOfferInExecutor() {
+        final ArrayBlockingQueue q = new ArrayBlockingQueue(2);
+        q.add(one);
+        q.add(two);
+        ExecutorService executor = Executors.newFixedThreadPool(2);
+        executor.execute(new Runnable() {
+            public void run() {
+                threadAssertFalse(q.offer(three));
+                try {
+                    threadAssertTrue(q.offer(three, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS));
+                    threadAssertEquals(0, q.remainingCapacity());
+                }
+                catch (InterruptedException e) {
+                    threadUnexpectedException();
+                }
+            }
+        });
+
+        executor.execute(new Runnable() {
+            public void run() {
+                try {
+                    Thread.sleep(SMALL_DELAY_MS);
+                    threadAssertEquals(one, q.take());
+                }
+                catch (InterruptedException e) {
+                    threadUnexpectedException();
+                }
+            }
+        });
+
+        joinPool(executor);
+
+    }
+
+    /**
+     * poll retrieves elements across Executor threads
+     */
+    public void testPollInExecutor() {
+        final ArrayBlockingQueue q = new ArrayBlockingQueue(2);
+        ExecutorService executor = Executors.newFixedThreadPool(2);
+        executor.execute(new Runnable() {
+            public void run() {
+                threadAssertNull(q.poll());
+                try {
+                    threadAssertTrue(null != q.poll(MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS));
+                    threadAssertTrue(q.isEmpty());
+                }
+                catch (InterruptedException e) {
+                    threadUnexpectedException();
+                }
+            }
+        });
+
+        executor.execute(new Runnable() {
+            public void run() {
+                try {
+                    Thread.sleep(SMALL_DELAY_MS);
+                    q.put(one);
+                }
+                catch (InterruptedException e) {
+                    threadUnexpectedException();
+                }
+            }
+        });
+
+        joinPool(executor);
+    }
+
+    /**
+     * A deserialized serialized queue has same elements in same order
+     */
+    public void testSerialization() {
+        ArrayBlockingQueue q = populatedQueue(SIZE);
+
+        try {
+            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
+            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
+            out.writeObject(q);
+            out.close();
+
+            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
+            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
+            ArrayBlockingQueue r = (ArrayBlockingQueue)in.readObject();
+            assertEquals(q.size(), r.size());
+            while (!q.isEmpty())
+                assertEquals(q.remove(), r.remove());
+        } catch(Exception e){
+            e.printStackTrace();
+            unexpectedException();
+        }
+    }
+
+    /**
+     * drainTo(null) throws NPE
+     */
+    public void testDrainToNull() {
+        ArrayBlockingQueue q = populatedQueue(SIZE);
+        try {
+            q.drainTo(null);
+            shouldThrow();
+        } catch(NullPointerException success) {
+        }
+    }
+
+    /**
+     * drainTo(this) throws IAE
+     */
+    public void testDrainToSelf() {
+        ArrayBlockingQueue q = populatedQueue(SIZE);
+        try {
+            q.drainTo(q);
+            shouldThrow();
+        } catch(IllegalArgumentException success) {
+        }
+    }
+
+    /**
+     * drainTo(c) empties queue into another collection c
+     */
+    public void testDrainTo() {
+        ArrayBlockingQueue q = populatedQueue(SIZE);
+        ArrayList l = new ArrayList();
+        q.drainTo(l);
+        assertEquals(q.size(), 0);
+        assertEquals(l.size(), SIZE);
+        for (int i = 0; i < SIZE; ++i)
+            assertEquals(l.get(i), new Integer(i));
+        q.add(zero);
+        q.add(one);
+        assertFalse(q.isEmpty());
+        assertTrue(q.contains(zero));
+        assertTrue(q.contains(one));
+        l.clear();
+        q.drainTo(l);
+        assertEquals(q.size(), 0);
+        assertEquals(l.size(), 2);
+        for (int i = 0; i < 2; ++i)
+            assertEquals(l.get(i), new Integer(i));
+    }
+
+    /**
+     * drainTo empties full queue, unblocking a waiting put.
+     */
+    public void testDrainToWithActivePut() {
+        final ArrayBlockingQueue q = populatedQueue(SIZE);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        q.put(new Integer(SIZE+1));
+                    } catch (InterruptedException ie){
+                        threadUnexpectedException();
+                    }
+                }
+            });
+        try {
+            t.start();
+            ArrayList l = new ArrayList();
+            q.drainTo(l);
+            assertTrue(l.size() >= SIZE);
+            for (int i = 0; i < SIZE; ++i)
+                assertEquals(l.get(i), new Integer(i));
+            t.join();
+            assertTrue(q.size() + l.size() >= SIZE);
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * drainTo(null, n) throws NPE
+     */
+    public void testDrainToNullN() {
+        ArrayBlockingQueue q = populatedQueue(SIZE);
+        try {
+            q.drainTo(null, 0);
+            shouldThrow();
+        } catch(NullPointerException success) {
+        }
+    }
+
+    /**
+     * drainTo(this, n) throws IAE
+     */
+    public void testDrainToSelfN() {
+        ArrayBlockingQueue q = populatedQueue(SIZE);
+        try {
+            q.drainTo(q, 0);
+            shouldThrow();
+        } catch(IllegalArgumentException success) {
+        }
+    }
+
+    /**
+     * drainTo(c, n) empties first max {n, size} elements of queue into c
+     */
+    public void testDrainToN() {
+        ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE*2);
+        for (int i = 0; i < SIZE + 2; ++i) {
+            for(int j = 0; j < SIZE; j++)
+                assertTrue(q.offer(new Integer(j)));
+            ArrayList l = new ArrayList();
+            q.drainTo(l, i);
+            int k = (i < SIZE)? i : SIZE;
+            assertEquals(l.size(), k);
+            assertEquals(q.size(), SIZE-k);
+            for (int j = 0; j < k; ++j)
+                assertEquals(l.get(j), new Integer(j));
+            while (q.poll() != null) ;
+        }
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/ArrayDequeTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/ArrayDequeTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/ArrayDequeTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,657 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.ArrayDeque;
+import java.util.Collection;
+import java.util.Arrays;
+import java.util.NoSuchElementException;
+import java.util.Iterator;
+import java.util.Random;
+
+public class ArrayDequeTest extends JSR166TestCase {
+    public static void main(String[] args) {
+	junit.textui.TestRunner.run (suite());
+    }
+
+    public static Test suite() {
+	return new TestSuite(ArrayDequeTest.class);
+    }
+
+    /**
+     * Create a queue of given size containing consecutive
+     * Integers 0 ... n.
+     */
+    private ArrayDeque populatedDeque(int n) {
+        ArrayDeque q = new ArrayDeque();
+        assertTrue(q.isEmpty());
+	for(int i = 0; i < n; ++i)
+	    assertTrue(q.offerLast(new Integer(i)));
+        assertFalse(q.isEmpty());
+	assertEquals(n, q.size());
+        return q;
+    }
+
+    /**
+     * new queue is empty
+     */
+    public void testConstructor1() {
+        assertEquals(0, new ArrayDeque().size());
+    }
+
+    /**
+     * Initializing from null Collection throws NPE
+     */
+    public void testConstructor3() {
+        try {
+            ArrayDeque q = new ArrayDeque((Collection)null);
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Queue contains all elements of collection used to initialize
+
+     */
+    public void testConstructor6() {
+        try {
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE; ++i)
+                ints[i] = new Integer(i);
+            ArrayDeque q = new ArrayDeque(Arrays.asList(ints));
+            for (int i = 0; i < SIZE; ++i)
+                assertEquals(ints[i], q.pollFirst());
+        }
+        finally {}
+    }
+
+    /**
+     * isEmpty is true before add, false after
+     */
+    public void testEmpty() {
+        ArrayDeque q = new ArrayDeque();
+        assertTrue(q.isEmpty());
+        q.add(new Integer(1));
+        assertFalse(q.isEmpty());
+        q.add(new Integer(2));
+        q.removeFirst();
+        q.removeFirst();
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * size changes when elements added and removed
+     */
+    public void testSize() {
+        ArrayDeque q = populatedDeque(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(SIZE-i, q.size());
+            q.removeFirst();
+        }
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, q.size());
+            q.add(new Integer(i));
+        }
+    }
+
+    /**
+     * push(null) throws NPE
+     */
+    public void testPushNull() {
+	try {
+            ArrayDeque q = new ArrayDeque(1);
+            q.push(null);
+            shouldThrow();
+        } catch (NullPointerException success) { }
+    }
+
+    /**
+     * peekFirst returns element inserted with push
+     */
+    public void testPush() {
+        ArrayDeque q = populatedDeque(3);
+        q.pollLast();
+	q.push(four);
+	assertEquals(four,q.peekFirst());
+    }
+
+    /**
+     *  pop removes next element, or throws NSEE if empty
+     */
+    public void testPop() {
+        ArrayDeque q = populatedDeque(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.pop()).intValue());
+        }
+        try {
+            q.pop();
+            shouldThrow();
+        } catch (NoSuchElementException success){
+	}
+    }
+
+    /**
+     * offer(null) throws NPE
+     */
+    public void testOfferFirstNull() {
+	try {
+            ArrayDeque q = new ArrayDeque();
+            q.offerFirst(null);
+            shouldThrow();
+        } catch (NullPointerException success) {
+        }
+    }
+
+    /**
+     * OfferFirst succeeds
+     */
+    public void testOfferFirst() {
+        ArrayDeque q = new ArrayDeque();
+        assertTrue(q.offerFirst(new Integer(0)));
+        assertTrue(q.offerFirst(new Integer(1)));
+    }
+
+    /**
+     * OfferLast succeeds
+     */
+    public void testOfferLast() {
+        ArrayDeque q = new ArrayDeque();
+        assertTrue(q.offerLast(new Integer(0)));
+        assertTrue(q.offerLast(new Integer(1)));
+    }
+
+    /**
+     * add succeeds
+     */
+    public void testAdd() {
+        ArrayDeque q = new ArrayDeque();
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, q.size());
+            assertTrue(q.add(new Integer(i)));
+        }
+    }
+
+    /**
+     * addAll(null) throws NPE
+     */
+    public void testAddAll1() {
+        try {
+            ArrayDeque q = new ArrayDeque();
+            q.addAll(null);
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Queue contains all elements, in traversal order, of successful addAll
+     */
+    public void testAddAll5() {
+        try {
+            Integer[] empty = new Integer[0];
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE; ++i)
+                ints[i] = new Integer(i);
+            ArrayDeque q = new ArrayDeque();
+            assertFalse(q.addAll(Arrays.asList(empty)));
+            assertTrue(q.addAll(Arrays.asList(ints)));
+            for (int i = 0; i < SIZE; ++i)
+                assertEquals(ints[i], q.pollFirst());
+        }
+        finally {}
+    }
+
+    /**
+     *  pollFirst succeeds unless empty
+     */
+    public void testPollFirst() {
+        ArrayDeque q = populatedDeque(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.pollFirst()).intValue());
+        }
+	assertNull(q.pollFirst());
+    }
+
+    /**
+     *  pollLast succeeds unless empty
+     */
+    public void testPollLast() {
+        ArrayDeque q = populatedDeque(SIZE);
+        for (int i = SIZE-1; i >= 0; --i) {
+            assertEquals(i, ((Integer)q.pollLast()).intValue());
+        }
+	assertNull(q.pollLast());
+    }
+
+    /**
+     *  poll succeeds unless empty
+     */
+    public void testPoll() {
+        ArrayDeque q = populatedDeque(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.poll()).intValue());
+        }
+	assertNull(q.poll());
+    }
+
+    /**
+     *  remove removes next element, or throws NSEE if empty
+     */
+    public void testRemove() {
+        ArrayDeque q = populatedDeque(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.remove()).intValue());
+        }
+        try {
+            q.remove();
+            shouldThrow();
+        } catch (NoSuchElementException success){
+	}
+    }
+
+    /**
+     *  peekFirst returns next element, or null if empty
+     */
+    public void testPeekFirst() {
+        ArrayDeque q = populatedDeque(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.peekFirst()).intValue());
+            q.pollFirst();
+            assertTrue(q.peekFirst() == null ||
+                       i != ((Integer)q.peekFirst()).intValue());
+        }
+	assertNull(q.peekFirst());
+    }
+
+    /**
+     *  peek returns next element, or null if empty
+     */
+    public void testPeek() {
+        ArrayDeque q = populatedDeque(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.peek()).intValue());
+            q.poll();
+            assertTrue(q.peek() == null ||
+                       i != ((Integer)q.peek()).intValue());
+        }
+	assertNull(q.peek());
+    }
+
+    /**
+     *  peekLast returns next element, or null if empty
+     */
+    public void testPeekLast() {
+        ArrayDeque q = populatedDeque(SIZE);
+        for (int i = SIZE-1; i >= 0; --i) {
+            assertEquals(i, ((Integer)q.peekLast()).intValue());
+            q.pollLast();
+            assertTrue(q.peekLast() == null ||
+                       i != ((Integer)q.peekLast()).intValue());
+        }
+	assertNull(q.peekLast());
+    }
+
+    /**
+     * getFirst returns next getFirst, or throws NSEE if empty
+     */
+    public void testFirstElement() {
+        ArrayDeque q = populatedDeque(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.getFirst()).intValue());
+            q.pollFirst();
+        }
+        try {
+            q.getFirst();
+            shouldThrow();
+        }
+        catch (NoSuchElementException success) {}
+    }
+
+    /**
+     *  getLast returns next element, or throws NSEE if empty
+     */
+    public void testLastElement() {
+        ArrayDeque q = populatedDeque(SIZE);
+        for (int i = SIZE-1; i >= 0; --i) {
+            assertEquals(i, ((Integer)q.getLast()).intValue());
+            q.pollLast();
+        }
+        try {
+            q.getLast();
+            shouldThrow();
+        }
+        catch (NoSuchElementException success) {}
+	assertNull(q.peekLast());
+    }
+
+
+    /**
+     *  removeFirst removes next element, or throws NSEE if empty
+     */
+    public void testRemoveFirst() {
+        ArrayDeque q = populatedDeque(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.removeFirst()).intValue());
+        }
+        try {
+            q.removeFirst();
+            shouldThrow();
+        } catch (NoSuchElementException success){
+	}
+    }
+
+    /**
+     * removeFirstOccurrence(x) removes x and returns true if present
+     */
+    public void testRemoveFirstOccurrence() {
+        ArrayDeque q = populatedDeque(SIZE);
+        for (int i = 1; i < SIZE; i+=2) {
+            assertTrue(q.removeFirstOccurrence(new Integer(i)));
+        }
+        for (int i = 0; i < SIZE; i+=2) {
+            assertTrue(q.removeFirstOccurrence(new Integer(i)));
+            assertFalse(q.removeFirstOccurrence(new Integer(i+1)));
+        }
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * removeLastOccurrence(x) removes x and returns true if present
+     */
+    public void testRemoveLastOccurrence() {
+        ArrayDeque q = populatedDeque(SIZE);
+        for (int i = 1; i < SIZE; i+=2) {
+            assertTrue(q.removeLastOccurrence(new Integer(i)));
+        }
+        for (int i = 0; i < SIZE; i+=2) {
+            assertTrue(q.removeLastOccurrence(new Integer(i)));
+            assertFalse(q.removeLastOccurrence(new Integer(i+1)));
+        }
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * contains(x) reports true when elements added but not yet removed
+     */
+    public void testContains() {
+        ArrayDeque q = populatedDeque(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(q.contains(new Integer(i)));
+            q.pollFirst();
+            assertFalse(q.contains(new Integer(i)));
+        }
+    }
+
+    /**
+     * clear removes all elements
+     */
+    public void testClear() {
+        ArrayDeque q = populatedDeque(SIZE);
+        q.clear();
+        assertTrue(q.isEmpty());
+        assertEquals(0, q.size());
+        q.add(new Integer(1));
+        assertFalse(q.isEmpty());
+        q.clear();
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * containsAll(c) is true when c contains a subset of elements
+     */
+    public void testContainsAll() {
+        ArrayDeque q = populatedDeque(SIZE);
+        ArrayDeque p = new ArrayDeque();
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(q.containsAll(p));
+            assertFalse(p.containsAll(q));
+            p.add(new Integer(i));
+        }
+        assertTrue(p.containsAll(q));
+    }
+
+    /**
+     * retainAll(c) retains only those elements of c and reports true if changed
+     */
+    public void testRetainAll() {
+        ArrayDeque q = populatedDeque(SIZE);
+        ArrayDeque p = populatedDeque(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            boolean changed = q.retainAll(p);
+            if (i == 0)
+                assertFalse(changed);
+            else
+                assertTrue(changed);
+
+            assertTrue(q.containsAll(p));
+            assertEquals(SIZE-i, q.size());
+            p.removeFirst();
+        }
+    }
+
+    /**
+     * removeAll(c) removes only those elements of c and reports true if changed
+     */
+    public void testRemoveAll() {
+        for (int i = 1; i < SIZE; ++i) {
+            ArrayDeque q = populatedDeque(SIZE);
+            ArrayDeque p = populatedDeque(i);
+            assertTrue(q.removeAll(p));
+            assertEquals(SIZE-i, q.size());
+            for (int j = 0; j < i; ++j) {
+                Integer I = (Integer)(p.removeFirst());
+                assertFalse(q.contains(I));
+            }
+        }
+    }
+
+    /**
+     *  toArray contains all elements
+     */
+    public void testToArray() {
+        ArrayDeque q = populatedDeque(SIZE);
+	Object[] o = q.toArray();
+        Arrays.sort(o);
+	for(int i = 0; i < o.length; i++)
+	    assertEquals(o[i], q.pollFirst());
+    }
+
+    /**
+     *  toArray(a) contains all elements
+     */
+    public void testToArray2() {
+        ArrayDeque q = populatedDeque(SIZE);
+	Integer[] ints = new Integer[SIZE];
+	ints = (Integer[])q.toArray(ints);
+        Arrays.sort(ints);
+        for(int i = 0; i < ints.length; i++)
+            assertEquals(ints[i], q.pollFirst());
+    }
+
+    /**
+     * toArray(null) throws NPE
+     */
+    public void testToArray_BadArg() {
+	try {
+	    ArrayDeque l = new ArrayDeque();
+	    l.add(new Object());
+	    Object o[] = l.toArray(null);
+	    shouldThrow();
+	} catch(NullPointerException success){}
+    }
+
+    /**
+     * toArray with incompatable aray type throws CCE
+     */
+    public void testToArray1_BadArg() {
+	try {
+	    ArrayDeque l = new ArrayDeque();
+	    l.add(new Integer(5));
+	    Object o[] = l.toArray(new String[10] );
+	    shouldThrow();
+	} catch(ArrayStoreException  success){}
+    }
+
+    /**
+     *  iterator iterates through all elements
+     */
+    public void testIterator() {
+        ArrayDeque q = populatedDeque(SIZE);
+        int i = 0;
+	Iterator it = q.iterator();
+        while(it.hasNext()) {
+            assertTrue(q.contains(it.next()));
+            ++i;
+        }
+        assertEquals(i, SIZE);
+    }
+
+    /**
+     *  iterator ordering is FIFO
+     */
+    public void testIteratorOrdering() {
+        final ArrayDeque q = new ArrayDeque();
+        q.add(new Integer(1));
+        q.add(new Integer(2));
+        q.add(new Integer(3));
+        int k = 0;
+        for (Iterator it = q.iterator(); it.hasNext();) {
+            int i = ((Integer)(it.next())).intValue();
+            assertEquals(++k, i);
+        }
+
+        assertEquals(3, k);
+    }
+
+    /**
+     * iterator.remove removes current element
+     */
+    public void testIteratorRemove () {
+        final ArrayDeque q = new ArrayDeque();
+        final Random rng = new Random();
+        for (int iters = 0; iters < 100; ++iters) {
+            int max = rng.nextInt(5) + 2;
+            int split = rng.nextInt(max-1) + 1;
+            for (int j = 1; j <= max; ++j)
+                q.add(new Integer(j));
+            Iterator it = q.iterator();
+            for (int j = 1; j <= split; ++j)
+                assertEquals(it.next(), new Integer(j));
+            it.remove();
+            assertEquals(it.next(), new Integer(split+1));
+            for (int j = 1; j <= split; ++j)
+                q.remove(new Integer(j));
+            it = q.iterator();
+            for (int j = split+1; j <= max; ++j) {
+                assertEquals(it.next(), new Integer(j));
+                it.remove();
+            }
+            assertFalse(it.hasNext());
+            assertTrue(q.isEmpty());
+        }
+    }
+
+    /**
+     *  Descending iterator iterates through all elements
+     */
+    public void testDescendingIterator() {
+        ArrayDeque q = populatedDeque(SIZE);
+        int i = 0;
+	Iterator it = q.descendingIterator();
+        while(it.hasNext()) {
+            assertTrue(q.contains(it.next()));
+            ++i;
+        }
+        assertEquals(i, SIZE);
+        assertFalse(it.hasNext());
+        try {
+            it.next();
+        } catch(NoSuchElementException success) {
+        }
+    }
+
+    /**
+     *  Descending iterator ordering is reverse FIFO
+     */
+    public void testDescendingIteratorOrdering() {
+        final ArrayDeque q = new ArrayDeque();
+        for (int iters = 0; iters < 100; ++iters) {
+            q.add(new Integer(3));
+            q.add(new Integer(2));
+            q.add(new Integer(1));
+            int k = 0;
+            for (Iterator it = q.descendingIterator(); it.hasNext();) {
+                int i = ((Integer)(it.next())).intValue();
+                assertEquals(++k, i);
+            }
+
+            assertEquals(3, k);
+            q.remove();
+            q.remove();
+            q.remove();
+        }
+    }
+
+    /**
+     * descendingIterator.remove removes current element
+     */
+    public void testDescendingIteratorRemove () {
+        final ArrayDeque q = new ArrayDeque();
+        final Random rng = new Random();
+        for (int iters = 0; iters < 100; ++iters) {
+            int max = rng.nextInt(5) + 2;
+            int split = rng.nextInt(max-1) + 1;
+            for (int j = max; j >= 1; --j)
+                q.add(new Integer(j));
+            Iterator it = q.descendingIterator();
+            for (int j = 1; j <= split; ++j)
+                assertEquals(it.next(), new Integer(j));
+            it.remove();
+            assertEquals(it.next(), new Integer(split+1));
+            for (int j = 1; j <= split; ++j)
+                q.remove(new Integer(j));
+            it = q.descendingIterator();
+            for (int j = split+1; j <= max; ++j) {
+                assertEquals(it.next(), new Integer(j));
+                it.remove();
+            }
+            assertFalse(it.hasNext());
+            assertTrue(q.isEmpty());
+        }
+    }
+
+
+    /**
+     * toString contains toStrings of elements
+     */
+    public void testToString() {
+        ArrayDeque q = populatedDeque(SIZE);
+        String s = q.toString();
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(s.indexOf(String.valueOf(i)) >= 0);
+        }
+    }
+
+    /**
+     * peekFirst returns element inserted with addFirst
+     */
+    public void testAddFirst() {
+        ArrayDeque q = populatedDeque(3);
+	q.addFirst(four);
+	assertEquals(four,q.peekFirst());
+    }
+
+    /**
+     * peekLast returns element inserted with addLast
+     */
+    public void testAddLast() {
+        ArrayDeque q = populatedDeque(3);
+	q.addLast(four);
+	assertEquals(four,q.peekLast());
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicBooleanTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicBooleanTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicBooleanTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,156 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.concurrent.atomic.*;
+import java.io.*;
+
+public class AtomicBooleanTest extends JSR166TestCase {
+    public static void main (String[] args) {
+        junit.textui.TestRunner.run (suite());
+    }
+    public static Test suite() {
+        return new TestSuite(AtomicBooleanTest.class);
+    }
+
+    /**
+     * constructor initializes to given value
+     */
+    public void testConstructor() {
+        AtomicBoolean ai = new AtomicBoolean(true);
+	assertEquals(true,ai.get());
+    }
+
+    /**
+     * default constructed initializes to false
+     */
+    public void testConstructor2() {
+        AtomicBoolean ai = new AtomicBoolean();
+	assertEquals(false,ai.get());
+    }
+
+    /**
+     * get returns the last value set
+     */
+    public void testGetSet() {
+        AtomicBoolean ai = new AtomicBoolean(true);
+	assertEquals(true,ai.get());
+	ai.set(false);
+	assertEquals(false,ai.get());
+	ai.set(true);
+	assertEquals(true,ai.get());
+
+    }
+
+    /**
+     * get returns the last value lazySet in same thread
+     */
+    public void testGetLazySet() {
+        AtomicBoolean ai = new AtomicBoolean(true);
+        assertEquals(true,ai.get());
+        ai.lazySet(false);
+        assertEquals(false,ai.get());
+        ai.lazySet(true);
+        assertEquals(true,ai.get());
+    }
+
+    /**
+     * compareAndSet succeeds in changing value if equal to expected else fails
+     */
+    public void testCompareAndSet() {
+        AtomicBoolean ai = new AtomicBoolean(true);
+	assertTrue(ai.compareAndSet(true,false));
+	assertEquals(false,ai.get());
+	assertTrue(ai.compareAndSet(false,false));
+	assertEquals(false,ai.get());
+	assertFalse(ai.compareAndSet(true,false));
+	assertFalse((ai.get()));
+	assertTrue(ai.compareAndSet(false,true));
+	assertEquals(true,ai.get());
+    }
+
+    /**
+     * compareAndSet in one thread enables another waiting for value
+     * to succeed
+     */
+    public void testCompareAndSetInMultipleThreads() {
+        final AtomicBoolean ai = new AtomicBoolean(true);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    while(!ai.compareAndSet(false, true)) Thread.yield();
+                }});
+        try {
+            t.start();
+            assertTrue(ai.compareAndSet(true, false));
+            t.join(LONG_DELAY_MS);
+            assertFalse(t.isAlive());
+        }
+        catch(Exception e) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * repeated weakCompareAndSet succeeds in changing value when equal
+     * to expected
+     */
+    public void testWeakCompareAndSet() {
+        AtomicBoolean ai = new AtomicBoolean(true);
+	while(!ai.weakCompareAndSet(true,false));
+	assertEquals(false,ai.get());
+	while(!ai.weakCompareAndSet(false,false));
+        assertEquals(false,ai.get());
+        while(!ai.weakCompareAndSet(false,true));
+	assertEquals(true,ai.get());
+    }
+
+    /**
+     * getAndSet returns previous value and sets to given value
+     */
+    public void testGetAndSet() {
+        AtomicBoolean ai = new AtomicBoolean(true);
+	assertEquals(true,ai.getAndSet(false));
+	assertEquals(false,ai.getAndSet(false));
+	assertEquals(false,ai.getAndSet(true));
+	assertEquals(true,ai.get());
+    }
+
+    /**
+     * a deserialized serialized atomic holds same value
+     */
+    public void testSerialization() {
+        AtomicBoolean l = new AtomicBoolean();
+
+        try {
+            l.set(true);
+            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
+            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
+            out.writeObject(l);
+            out.close();
+
+            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
+            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
+            AtomicBoolean r = (AtomicBoolean) in.readObject();
+            assertEquals(l.get(), r.get());
+        } catch(Exception e){
+            e.printStackTrace();
+            unexpectedException();
+        }
+    }
+
+    /**
+     * toString returns current value.
+     */
+    public void testToString() {
+        AtomicBoolean ai = new AtomicBoolean();
+        assertEquals(ai.toString(), Boolean.toString(false));
+        ai.set(true);
+        assertEquals(ai.toString(), Boolean.toString(true));
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicIntegerArrayTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicIntegerArrayTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicIntegerArrayTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,369 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.concurrent.atomic.*;
+import java.io.*;
+
+public class AtomicIntegerArrayTest extends JSR166TestCase {
+
+    public static void main (String[] args) {
+        junit.textui.TestRunner.run (suite());
+    }
+    public static Test suite() {
+        return new TestSuite(AtomicIntegerArrayTest.class);
+    }
+
+
+    /**
+     * constructor creates array of given size with all elements zero
+     */
+    public void testConstructor() {
+        AtomicIntegerArray ai = new AtomicIntegerArray(SIZE);
+        for (int i = 0; i < SIZE; ++i)
+            assertEquals(0,ai.get(i));
+    }
+
+    /**
+     * constructor with null array throws NPE
+     */
+    public void testConstructor2NPE() {
+        try {
+            int[] a = null;
+            AtomicIntegerArray ai = new AtomicIntegerArray(a);
+        } catch (NullPointerException success) {
+        } catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * constructor with array is of same size and has all elements
+     */
+    public void testConstructor2() {
+        int[] a = { 17, 3, -42, 99, -7};
+        AtomicIntegerArray ai = new AtomicIntegerArray(a);
+        assertEquals(a.length, ai.length());
+        for (int i = 0; i < a.length; ++i)
+            assertEquals(a[i], ai.get(i));
+    }
+
+    /**
+     * get and set for out of bound indices throw IndexOutOfBoundsException
+     */
+    public void testIndexing(){
+        AtomicIntegerArray ai = new AtomicIntegerArray(SIZE);
+        try {
+            ai.get(SIZE);
+        } catch(IndexOutOfBoundsException success){
+        }
+        try {
+            ai.get(-1);
+        } catch(IndexOutOfBoundsException success){
+        }
+        try {
+            ai.set(SIZE, 0);
+        } catch(IndexOutOfBoundsException success){
+        }
+        try {
+            ai.set(-1, 0);
+        } catch(IndexOutOfBoundsException success){
+        }
+    }
+
+    /**
+     * get returns the last value set at index
+     */
+    public void testGetSet() {
+        AtomicIntegerArray ai = new AtomicIntegerArray(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            ai.set(i, 1);
+            assertEquals(1,ai.get(i));
+            ai.set(i, 2);
+            assertEquals(2,ai.get(i));
+            ai.set(i, -3);
+            assertEquals(-3,ai.get(i));
+        }
+    }
+
+    /**
+     * get returns the last value lazySet at index by same thread
+     */
+    public void testGetLazySet() {
+        AtomicIntegerArray ai = new AtomicIntegerArray(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            ai.lazySet(i, 1);
+            assertEquals(1,ai.get(i));
+            ai.lazySet(i, 2);
+            assertEquals(2,ai.get(i));
+            ai.lazySet(i, -3);
+            assertEquals(-3,ai.get(i));
+        }
+    }
+
+    /**
+     * compareAndSet succeeds in changing value if equal to expected else fails
+     */
+    public void testCompareAndSet() {
+        AtomicIntegerArray ai = new AtomicIntegerArray(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            ai.set(i, 1);
+            assertTrue(ai.compareAndSet(i, 1,2));
+            assertTrue(ai.compareAndSet(i, 2,-4));
+            assertEquals(-4,ai.get(i));
+            assertFalse(ai.compareAndSet(i, -5,7));
+            assertFalse((7 == ai.get(i)));
+            assertTrue(ai.compareAndSet(i, -4,7));
+            assertEquals(7,ai.get(i));
+        }
+    }
+
+    /**
+     * compareAndSet in one thread enables another waiting for value
+     * to succeed
+     */
+    public void testCompareAndSetInMultipleThreads() {
+        final AtomicIntegerArray a = new AtomicIntegerArray(1);
+        a.set(0, 1);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    while(!a.compareAndSet(0, 2, 3)) Thread.yield();
+                }});
+        try {
+            t.start();
+            assertTrue(a.compareAndSet(0, 1, 2));
+            t.join(LONG_DELAY_MS);
+            assertFalse(t.isAlive());
+            assertEquals(a.get(0), 3);
+        }
+        catch(Exception e) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * repeated weakCompareAndSet succeeds in changing value when equal
+     * to expected
+     */
+    public void testWeakCompareAndSet() {
+        AtomicIntegerArray ai = new AtomicIntegerArray(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            ai.set(i, 1);
+            while(!ai.weakCompareAndSet(i, 1,2));
+            while(!ai.weakCompareAndSet(i, 2,-4));
+            assertEquals(-4,ai.get(i));
+            while(!ai.weakCompareAndSet(i, -4,7));
+            assertEquals(7,ai.get(i));
+        }
+    }
+
+    /**
+     *  getAndSet returns previous value and sets to given value at given index
+     */
+    public void testGetAndSet() {
+        AtomicIntegerArray ai = new AtomicIntegerArray(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            ai.set(i, 1);
+            assertEquals(1,ai.getAndSet(i,0));
+            assertEquals(0,ai.getAndSet(i,-10));
+            assertEquals(-10,ai.getAndSet(i,1));
+        }
+    }
+
+    /**
+     *  getAndAdd returns previous value and adds given value
+     */
+    public void testGetAndAdd() {
+        AtomicIntegerArray ai = new AtomicIntegerArray(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            ai.set(i, 1);
+            assertEquals(1,ai.getAndAdd(i,2));
+            assertEquals(3,ai.get(i));
+            assertEquals(3,ai.getAndAdd(i,-4));
+            assertEquals(-1,ai.get(i));
+        }
+    }
+
+    /**
+     * getAndDecrement returns previous value and decrements
+     */
+    public void testGetAndDecrement() {
+        AtomicIntegerArray ai = new AtomicIntegerArray(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            ai.set(i, 1);
+            assertEquals(1,ai.getAndDecrement(i));
+            assertEquals(0,ai.getAndDecrement(i));
+            assertEquals(-1,ai.getAndDecrement(i));
+        }
+    }
+
+    /**
+     * getAndIncrement returns previous value and increments
+     */
+    public void testGetAndIncrement() {
+        AtomicIntegerArray ai = new AtomicIntegerArray(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            ai.set(i, 1);
+            assertEquals(1,ai.getAndIncrement(i));
+            assertEquals(2,ai.get(i));
+            ai.set(i,-2);
+            assertEquals(-2,ai.getAndIncrement(i));
+            assertEquals(-1,ai.getAndIncrement(i));
+            assertEquals(0,ai.getAndIncrement(i));
+            assertEquals(1,ai.get(i));
+        }
+    }
+
+    /**
+     *  addAndGet adds given value to current, and returns current value
+     */
+    public void testAddAndGet() {
+        AtomicIntegerArray ai = new AtomicIntegerArray(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            ai.set(i, 1);
+            assertEquals(3,ai.addAndGet(i,2));
+            assertEquals(3,ai.get(i));
+            assertEquals(-1,ai.addAndGet(i,-4));
+            assertEquals(-1,ai.get(i));
+        }
+    }
+
+    /**
+     * decrementAndGet decrements and returns current value
+     */
+    public void testDecrementAndGet() {
+        AtomicIntegerArray ai = new AtomicIntegerArray(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            ai.set(i, 1);
+            assertEquals(0,ai.decrementAndGet(i));
+            assertEquals(-1,ai.decrementAndGet(i));
+            assertEquals(-2,ai.decrementAndGet(i));
+            assertEquals(-2,ai.get(i));
+        }
+    }
+
+    /**
+     *  incrementAndGet increments and returns current value
+     */
+    public void testIncrementAndGet() {
+        AtomicIntegerArray ai = new AtomicIntegerArray(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            ai.set(i, 1);
+            assertEquals(2,ai.incrementAndGet(i));
+            assertEquals(2,ai.get(i));
+            ai.set(i, -2);
+            assertEquals(-1,ai.incrementAndGet(i));
+            assertEquals(0,ai.incrementAndGet(i));
+            assertEquals(1,ai.incrementAndGet(i));
+            assertEquals(1,ai.get(i));
+        }
+    }
+
+    static final int COUNTDOWN = 100000;
+
+    class Counter implements Runnable {
+        final AtomicIntegerArray ai;
+        volatile int counts;
+        Counter(AtomicIntegerArray a) { ai = a; }
+        public void run() {
+            for (;;) {
+                boolean done = true;
+                for (int i = 0; i < ai.length(); ++i) {
+                    int v = ai.get(i);
+                    threadAssertTrue(v >= 0);
+                    if (v != 0) {
+                        done = false;
+                        if (ai.compareAndSet(i, v, v-1))
+                            ++counts;
+                    }
+                }
+                if (done)
+                    break;
+            }
+        }
+    }
+
+    /**
+     * Multiple threads using same array of counters successfully
+     * update a number of times equal to total count
+     */
+    public void testCountingInMultipleThreads() {
+        try {
+            final AtomicIntegerArray ai = new AtomicIntegerArray(SIZE);
+            for (int i = 0; i < SIZE; ++i)
+                ai.set(i, COUNTDOWN);
+            Counter c1 = new Counter(ai);
+            Counter c2 = new Counter(ai);
+            Thread t1 = new Thread(c1);
+            Thread t2 = new Thread(c2);
+            t1.start();
+            t2.start();
+            t1.join();
+            t2.join();
+            assertEquals(c1.counts+c2.counts, SIZE * COUNTDOWN);
+        }
+        catch(InterruptedException ie) {
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * a deserialized serialized array holds same values
+     */
+    public void testSerialization() {
+        AtomicIntegerArray l = new AtomicIntegerArray(SIZE);
+        for (int i = 0; i < SIZE; ++i)
+            l.set(i, -i);
+
+        try {
+            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
+            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
+            out.writeObject(l);
+            out.close();
+
+            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
+            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
+            AtomicIntegerArray r = (AtomicIntegerArray) in.readObject();
+            for (int i = 0; i < SIZE; ++i) {
+                assertEquals(l.get(i), r.get(i));
+            }
+        } catch(Exception e){
+            e.printStackTrace();
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * toString returns current value.
+     */
+    public void testToString() {
+        int[] a = { 17, 3, -42, 99, -7};
+        AtomicIntegerArray ai = new AtomicIntegerArray(a);
+        assertEquals(toString(a), ai.toString());
+    }
+
+    private static String toString(int[] array) {
+        if (array.length == 0)
+            return "[]";
+
+        StringBuffer buf = new StringBuffer();
+        buf.append('[');
+        buf.append(array[0]);
+
+        for (int i = 1; i < array.length; i++) {
+            buf.append(", ");
+            buf.append(array[i]);
+        }
+
+        buf.append("]");
+        return buf.toString();
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicIntegerFieldUpdaterTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicIntegerFieldUpdaterTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicIntegerFieldUpdaterTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,293 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+import edu.emory.mathcs.backport.java.util.concurrent.atomic.*;
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.*;
+
+public class AtomicIntegerFieldUpdaterTest extends JSR166TestCase {
+//    volatile int x = 0;
+//    int w;
+//    long z;
+//    public static void main(String[] args){
+//        junit.textui.TestRunner.run(suite());
+//    }
+//    public static Test suite() {
+//        return new TestSuite(AtomicIntegerFieldUpdaterTest.class);
+//    }
+//
+//    /**
+//     * Construction with non-existent field throws RuntimeException
+//     */
+//    public void testConstructor() {
+//        try{
+//            AtomicIntegerFieldUpdater
+//                a = AtomicIntegerFieldUpdater.newUpdater
+//                (AtomicIntegerFieldUpdaterTest.class, "y");
+//            shouldThrow();
+//        }
+//        catch (RuntimeException rt) {}
+//    }
+//
+//    /**
+//     * construction with field not of given type throws RuntimeException
+//     */
+//    public void testConstructor2() {
+//        try{
+//            AtomicIntegerFieldUpdater
+//                a = AtomicIntegerFieldUpdater.newUpdater
+//                (AtomicIntegerFieldUpdaterTest.class, "z");
+//            shouldThrow();
+//        }
+//        catch (RuntimeException rt) {}
+//    }
+//
+//    /**
+//     * construction with non-volatile field throws RuntimeException
+//     */
+//    public void testConstructor3() {
+//        try{
+//            AtomicIntegerFieldUpdater
+//                a = AtomicIntegerFieldUpdater.newUpdater
+//                (AtomicIntegerFieldUpdaterTest.class, "w");
+//            shouldThrow();
+//        }
+//        catch (RuntimeException rt) {}
+//    }
+//
+//    /**
+//     *  get returns the last value set or assigned
+//     */
+//    public void testGetSet() {
+//        AtomicIntegerFieldUpdater a;
+//        try {
+//            a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
+//        } catch (RuntimeException ok) {
+//            return;
+//        }
+//        x = 1;
+//	assertEquals(1,a.get(this));
+//	a.set(this,2);
+//	assertEquals(2,a.get(this));
+//	a.set(this,-3);
+//	assertEquals(-3,a.get(this));
+//
+//    }
+//
+//    /**
+//     *  get returns the last value lazySet by same thread
+//     */
+//    public void testGetLazySet() {
+//        AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a;
+//        try {
+//            a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
+//        } catch (RuntimeException ok) {
+//            return;
+//        }
+//        x = 1;
+//        assertEquals(1,a.get(this));
+//        a.lazySet(this,2);
+//        assertEquals(2,a.get(this));
+//        a.lazySet(this,-3);
+//        assertEquals(-3,a.get(this));
+//
+//    }
+//
+//    /**
+//     * compareAndSet succeeds in changing value if equal to expected else fails
+//     */
+//    public void testCompareAndSet() {
+//        AtomicIntegerFieldUpdater a;
+//        try {
+//            a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
+//        } catch (RuntimeException ok) {
+//            return;
+//        }
+//        x = 1;
+//	assertTrue(a.compareAndSet(this,1,2));
+//	assertTrue(a.compareAndSet(this,2,-4));
+//	assertEquals(-4,a.get(this));
+//	assertFalse(a.compareAndSet(this,-5,7));
+//	assertFalse((7 == a.get(this)));
+//	assertTrue(a.compareAndSet(this,-4,7));
+//	assertEquals(7,a.get(this));
+//    }
+//
+//
+//    /**
+//     * compareAndSet in one thread enables another waiting for value
+//     * to succeed
+//     */
+//    public void testCompareAndSetInMultipleThreads() {
+//        x = 1;
+//        final AtomicIntegerFieldUpdater a;
+//        try {
+//            a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
+//        } catch (RuntimeException ok) {
+//            return;
+//        }
+//
+//        Thread t = new Thread(new Runnable() {
+//                public void run() {
+//                    while(!a.compareAndSet(AtomicIntegerFieldUpdaterTest.this, 2, 3)) Thread.yield();
+//                }});
+//        try {
+//            t.start();
+//            assertTrue(a.compareAndSet(this, 1, 2));
+//            t.join(LONG_DELAY_MS);
+//            assertFalse(t.isAlive());
+//            assertEquals(a.get(this), 3);
+//        }
+//        catch(Exception e) {
+//            unexpectedException();
+//        }
+//    }
+//
+//    /**
+//     * repeated weakCompareAndSet succeeds in changing value when equal
+//     * to expected
+//     */
+//    public void testWeakCompareAndSet() {
+//        AtomicIntegerFieldUpdater a;
+//        try {
+//            a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
+//        } catch (RuntimeException ok) {
+//            return;
+//        }
+//        x = 1;
+//	while(!a.weakCompareAndSet(this,1,2));
+//	while(!a.weakCompareAndSet(this,2,-4));
+//	assertEquals(-4,a.get(this));
+//	while(!a.weakCompareAndSet(this,-4,7));
+//	assertEquals(7,a.get(this));
+//    }
+//
+//    /**
+//     *  getAndSet returns previous value and sets to given value
+//     */
+//    public void testGetAndSet() {
+//        AtomicIntegerFieldUpdater a;
+//        try {
+//            a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
+//        } catch (RuntimeException ok) {
+//            return;
+//        }
+//        x = 1;
+//	assertEquals(1,a.getAndSet(this, 0));
+//	assertEquals(0,a.getAndSet(this,-10));
+//	assertEquals(-10,a.getAndSet(this,1));
+//    }
+//
+//    /**
+//     * getAndAdd returns previous value and adds given value
+//     */
+//    public void testGetAndAdd() {
+//        AtomicIntegerFieldUpdater a;
+//        try {
+//            a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
+//        } catch (RuntimeException ok) {
+//            return;
+//        }
+//        x = 1;
+//	assertEquals(1,a.getAndAdd(this,2));
+//	assertEquals(3,a.get(this));
+//	assertEquals(3,a.getAndAdd(this,-4));
+//	assertEquals(-1,a.get(this));
+//    }
+//
+//    /**
+//     * getAndDecrement returns previous value and decrements
+//     */
+//    public void testGetAndDecrement() {
+//        AtomicIntegerFieldUpdater a;
+//        try {
+//            a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
+//        } catch (RuntimeException ok) {
+//            return;
+//        }
+//        x = 1;
+//	assertEquals(1,a.getAndDecrement(this));
+//	assertEquals(0,a.getAndDecrement(this));
+//	assertEquals(-1,a.getAndDecrement(this));
+//    }
+//
+//    /**
+//     * getAndIncrement returns previous value and increments
+//     */
+//    public void testGetAndIncrement() {
+//        AtomicIntegerFieldUpdater a;
+//        try {
+//            a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
+//        } catch (RuntimeException ok) {
+//            return;
+//        }
+//        x = 1;
+//	assertEquals(1,a.getAndIncrement(this));
+//	assertEquals(2,a.get(this));
+//	a.set(this,-2);
+//	assertEquals(-2,a.getAndIncrement(this));
+//	assertEquals(-1,a.getAndIncrement(this));
+//	assertEquals(0,a.getAndIncrement(this));
+//	assertEquals(1,a.get(this));
+//    }
+//
+//    /**
+//     * addAndGet adds given value to current, and returns current value
+//     */
+//    public void testAddAndGet() {
+//        AtomicIntegerFieldUpdater a;
+//        try {
+//            a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
+//        } catch (RuntimeException ok) {
+//            return;
+//        }
+//        x = 1;
+//	assertEquals(3,a.addAndGet(this,2));
+//	assertEquals(3,a.get(this));
+//	assertEquals(-1,a.addAndGet(this,-4));
+//	assertEquals(-1,a.get(this));
+//    }
+//
+//    /**
+//     * decrementAndGet decrements and returns current value
+//     */
+//    public void testDecrementAndGet() {
+//        AtomicIntegerFieldUpdater a;
+//        try {
+//            a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
+//        } catch (RuntimeException ok) {
+//            return;
+//        }
+//        x = 1;
+//	assertEquals(0,a.decrementAndGet(this));
+//	assertEquals(-1,a.decrementAndGet(this));
+//	assertEquals(-2,a.decrementAndGet(this));
+//	assertEquals(-2,a.get(this));
+//    }
+//
+//    /**
+//     * incrementAndGet increments and returns current value
+//     */
+//    public void testIncrementAndGet() {
+//        AtomicIntegerFieldUpdater a;
+//        try {
+//            a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
+//        } catch (RuntimeException ok) {
+//            return;
+//        }
+//        x = 1;
+//	assertEquals(2,a.incrementAndGet(this));
+//	assertEquals(2,a.get(this));
+//	a.set(this,-2);
+//	assertEquals(-1,a.incrementAndGet(this));
+//	assertEquals(0,a.incrementAndGet(this));
+//	assertEquals(1,a.incrementAndGet(this));
+//	assertEquals(1,a.get(this));
+//    }
+//
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicIntegerTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicIntegerTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicIntegerTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,271 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.concurrent.atomic.*;
+import java.io.*;
+
+public class AtomicIntegerTest extends JSR166TestCase {
+    public static void main (String[] args) {
+        junit.textui.TestRunner.run (suite());
+    }
+    public static Test suite() {
+        return new TestSuite(AtomicIntegerTest.class);
+    }
+
+    /**
+     * constructor initializes to given value
+     */
+    public void testConstructor(){
+        AtomicInteger ai = new AtomicInteger(1);
+	assertEquals(1,ai.get());
+    }
+
+    /**
+     * default constructed initializes to zero
+     */
+    public void testConstructor2(){
+        AtomicInteger ai = new AtomicInteger();
+	assertEquals(0,ai.get());
+    }
+
+    /**
+     * get returns the last value set
+     */
+    public void testGetSet(){
+        AtomicInteger ai = new AtomicInteger(1);
+	assertEquals(1,ai.get());
+	ai.set(2);
+	assertEquals(2,ai.get());
+	ai.set(-3);
+	assertEquals(-3,ai.get());
+    }
+
+    /**
+     * get returns the last value lazySet in same thread
+     */
+    public void testGetLazySet(){
+        AtomicInteger ai = new AtomicInteger(1);
+        assertEquals(1,ai.get());
+        ai.lazySet(2);
+        assertEquals(2,ai.get());
+        ai.lazySet(-3);
+        assertEquals(-3,ai.get());
+    }
+
+    /**
+     * compareAndSet succeeds in changing value if equal to expected else fails
+     */
+    public void testCompareAndSet(){
+        AtomicInteger ai = new AtomicInteger(1);
+	assertTrue(ai.compareAndSet(1,2));
+	assertTrue(ai.compareAndSet(2,-4));
+	assertEquals(-4,ai.get());
+	assertFalse(ai.compareAndSet(-5,7));
+	assertFalse((7 == ai.get()));
+	assertTrue(ai.compareAndSet(-4,7));
+	assertEquals(7,ai.get());
+    }
+
+    /**
+     * compareAndSet in one thread enables another waiting for value
+     * to succeed
+     */
+    public void testCompareAndSetInMultipleThreads() {
+        final AtomicInteger ai = new AtomicInteger(1);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    while(!ai.compareAndSet(2, 3)) Thread.yield();
+                }});
+        try {
+            t.start();
+            assertTrue(ai.compareAndSet(1, 2));
+            t.join(LONG_DELAY_MS);
+            assertFalse(t.isAlive());
+            assertEquals(ai.get(), 3);
+        }
+        catch(Exception e) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * repeated weakCompareAndSet succeeds in changing value when equal
+     * to expected
+     */
+    public void testWeakCompareAndSet(){
+        AtomicInteger ai = new AtomicInteger(1);
+	while(!ai.weakCompareAndSet(1,2));
+	while(!ai.weakCompareAndSet(2,-4));
+	assertEquals(-4,ai.get());
+        while(!ai.weakCompareAndSet(-4,7));
+	assertEquals(7,ai.get());
+    }
+
+    /**
+     * getAndSet returns previous value and sets to given value
+     */
+    public void testGetAndSet(){
+        AtomicInteger ai = new AtomicInteger(1);
+	assertEquals(1,ai.getAndSet(0));
+	assertEquals(0,ai.getAndSet(-10));
+	assertEquals(-10,ai.getAndSet(1));
+    }
+
+    /**
+     * getAndAdd returns previous value and adds given value
+     */
+    public void testGetAndAdd(){
+        AtomicInteger ai = new AtomicInteger(1);
+	assertEquals(1,ai.getAndAdd(2));
+	assertEquals(3,ai.get());
+	assertEquals(3,ai.getAndAdd(-4));
+	assertEquals(-1,ai.get());
+    }
+
+    /**
+     * getAndDecrement returns previous value and decrements
+     */
+    public void testGetAndDecrement(){
+        AtomicInteger ai = new AtomicInteger(1);
+	assertEquals(1,ai.getAndDecrement());
+	assertEquals(0,ai.getAndDecrement());
+	assertEquals(-1,ai.getAndDecrement());
+    }
+
+    /**
+     * getAndIncrement returns previous value and increments
+     */
+    public void testGetAndIncrement(){
+        AtomicInteger ai = new AtomicInteger(1);
+	assertEquals(1,ai.getAndIncrement());
+	assertEquals(2,ai.get());
+	ai.set(-2);
+	assertEquals(-2,ai.getAndIncrement());
+	assertEquals(-1,ai.getAndIncrement());
+	assertEquals(0,ai.getAndIncrement());
+	assertEquals(1,ai.get());
+    }
+
+    /**
+     * addAndGet adds given value to current, and returns current value
+     */
+    public void testAddAndGet(){
+        AtomicInteger ai = new AtomicInteger(1);
+	assertEquals(3,ai.addAndGet(2));
+	assertEquals(3,ai.get());
+	assertEquals(-1,ai.addAndGet(-4));
+	assertEquals(-1,ai.get());
+    }
+
+    /**
+     * decrementAndGet decrements and returns current value
+     */
+    public void testDecrementAndGet(){
+        AtomicInteger ai = new AtomicInteger(1);
+	assertEquals(0,ai.decrementAndGet());
+	assertEquals(-1,ai.decrementAndGet());
+	assertEquals(-2,ai.decrementAndGet());
+	assertEquals(-2,ai.get());
+    }
+
+    /**
+     * incrementAndGet increments and returns current value
+     */
+    public void testIncrementAndGet(){
+        AtomicInteger ai = new AtomicInteger(1);
+	assertEquals(2,ai.incrementAndGet());
+	assertEquals(2,ai.get());
+	ai.set(-2);
+	assertEquals(-1,ai.incrementAndGet());
+	assertEquals(0,ai.incrementAndGet());
+	assertEquals(1,ai.incrementAndGet());
+	assertEquals(1,ai.get());
+    }
+
+    /**
+     * a deserialized serialized atomic holds same value
+     */
+    public void testSerialization() {
+        AtomicInteger l = new AtomicInteger();
+
+        try {
+            l.set(22);
+            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
+            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
+            out.writeObject(l);
+            out.close();
+
+            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
+            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
+            AtomicInteger r = (AtomicInteger) in.readObject();
+            assertEquals(l.get(), r.get());
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * toString returns current value.
+     */
+    public void testToString() {
+        AtomicInteger ai = new AtomicInteger();
+        for (int i = -12; i < 6; ++i) {
+            ai.set(i);
+            assertEquals(ai.toString(), Integer.toString(i));
+        }
+    }
+
+    /**
+     * intValue returns current value.
+     */
+    public void testIntValue() {
+        AtomicInteger ai = new AtomicInteger();
+        for (int i = -12; i < 6; ++i) {
+            ai.set(i);
+            assertEquals(i, ai.intValue());
+        }
+    }
+
+
+    /**
+     * longValue returns current value.
+     */
+    public void testLongValue() {
+        AtomicInteger ai = new AtomicInteger();
+        for (int i = -12; i < 6; ++i) {
+            ai.set(i);
+            assertEquals((long)i, ai.longValue());
+        }
+    }
+
+    /**
+     * floatValue returns current value.
+     */
+    public void testFloatValue() {
+        AtomicInteger ai = new AtomicInteger();
+        for (int i = -12; i < 6; ++i) {
+            ai.set(i);
+            assertEquals((float)i, ai.floatValue(), 0.0f);
+        }
+    }
+
+    /**
+     * doubleValue returns current value.
+     */
+    public void testDoubleValue() {
+        AtomicInteger ai = new AtomicInteger();
+        for (int i = -12; i < 6; ++i) {
+            ai.set(i);
+            assertEquals((double)i, ai.doubleValue(), 0.0);
+        }
+    }
+
+
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicLongArrayTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicLongArrayTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicLongArrayTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,364 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.concurrent.atomic.*;
+import java.io.*;
+import edu.emory.mathcs.backport.java.util.*;
+
+public class AtomicLongArrayTest extends JSR166TestCase {
+    public static void main (String[] args) {
+        junit.textui.TestRunner.run (suite());
+    }
+    public static Test suite() {
+        return new TestSuite(AtomicLongArrayTest.class);
+    }
+
+    /**
+     * constructor creates array of given size with all elements zero
+     */
+    public void testConstructor(){
+        AtomicLongArray ai = new AtomicLongArray(SIZE);
+        for (int i = 0; i < SIZE; ++i)
+            assertEquals(0,ai.get(i));
+    }
+
+    /**
+     * constructor with null array throws NPE
+     */
+    public void testConstructor2NPE() {
+        try {
+            long[] a = null;
+            AtomicLongArray ai = new AtomicLongArray(a);
+        } catch (NullPointerException success) {
+        } catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * constructor with array is of same size and has all elements
+     */
+    public void testConstructor2() {
+        long[] a = { 17L, 3L, -42L, 99L, -7L};
+        AtomicLongArray ai = new AtomicLongArray(a);
+        assertEquals(a.length, ai.length());
+        for (int i = 0; i < a.length; ++i)
+            assertEquals(a[i], ai.get(i));
+    }
+
+    /**
+     * get and set for out of bound indices throw IndexOutOfBoundsException
+     */
+    public void testIndexing(){
+        AtomicLongArray ai = new AtomicLongArray(SIZE);
+        try {
+            ai.get(SIZE);
+        } catch(IndexOutOfBoundsException success){
+        }
+        try {
+            ai.get(-1);
+        } catch(IndexOutOfBoundsException success){
+        }
+        try {
+            ai.set(SIZE, 0);
+        } catch(IndexOutOfBoundsException success){
+        }
+        try {
+            ai.set(-1, 0);
+        } catch(IndexOutOfBoundsException success){
+        }
+    }
+
+    /**
+     * get returns the last value set at index
+     */
+    public void testGetSet(){
+        AtomicLongArray ai = new AtomicLongArray(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            ai.set(i, 1);
+            assertEquals(1,ai.get(i));
+            ai.set(i, 2);
+            assertEquals(2,ai.get(i));
+            ai.set(i, -3);
+            assertEquals(-3,ai.get(i));
+        }
+    }
+
+    /**
+     * get returns the last value lazySet at index by same thread
+     */
+    public void testGetLazySet(){
+        AtomicLongArray ai = new AtomicLongArray(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            ai.lazySet(i, 1);
+            assertEquals(1,ai.get(i));
+            ai.lazySet(i, 2);
+            assertEquals(2,ai.get(i));
+            ai.lazySet(i, -3);
+            assertEquals(-3,ai.get(i));
+        }
+    }
+
+    /**
+     * compareAndSet succeeds in changing value if equal to expected else fails
+     */
+    public void testCompareAndSet(){
+        AtomicLongArray ai = new AtomicLongArray(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            ai.set(i, 1);
+            assertTrue(ai.compareAndSet(i, 1,2));
+            assertTrue(ai.compareAndSet(i, 2,-4));
+            assertEquals(-4,ai.get(i));
+            assertFalse(ai.compareAndSet(i, -5,7));
+            assertFalse((7 == ai.get(i)));
+            assertTrue(ai.compareAndSet(i, -4,7));
+            assertEquals(7,ai.get(i));
+        }
+    }
+
+    /**
+     * compareAndSet in one thread enables another waiting for value
+     * to succeed
+     */
+    public void testCompareAndSetInMultipleThreads() {
+        final AtomicLongArray a = new AtomicLongArray(1);
+        a.set(0, 1);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    while(!a.compareAndSet(0, 2, 3)) Thread.yield();
+                }});
+        try {
+            t.start();
+            assertTrue(a.compareAndSet(0, 1, 2));
+            t.join(LONG_DELAY_MS);
+            assertFalse(t.isAlive());
+            assertEquals(a.get(0), 3);
+        }
+        catch(Exception e) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * repeated weakCompareAndSet succeeds in changing value when equal
+     * to expected
+     */
+    public void testWeakCompareAndSet(){
+        AtomicLongArray ai = new AtomicLongArray(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            ai.set(i, 1);
+            while(!ai.weakCompareAndSet(i, 1,2));
+            while(!ai.weakCompareAndSet(i, 2,-4));
+            assertEquals(-4,ai.get(i));
+            while(!ai.weakCompareAndSet(i, -4,7));
+            assertEquals(7,ai.get(i));
+        }
+    }
+
+    /**
+     *  getAndSet returns previous value and sets to given value at given index
+     */
+    public void testGetAndSet(){
+        AtomicLongArray ai = new AtomicLongArray(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            ai.set(i, 1);
+            assertEquals(1,ai.getAndSet(i,0));
+            assertEquals(0,ai.getAndSet(i,-10));
+            assertEquals(-10,ai.getAndSet(i,1));
+        }
+    }
+
+    /**
+     *  getAndAdd returns previous value and adds given value
+     */
+    public void testGetAndAdd(){
+        AtomicLongArray ai = new AtomicLongArray(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            ai.set(i, 1);
+            assertEquals(1,ai.getAndAdd(i,2));
+            assertEquals(3,ai.get(i));
+            assertEquals(3,ai.getAndAdd(i,-4));
+            assertEquals(-1,ai.get(i));
+        }
+    }
+
+    /**
+     * getAndDecrement returns previous value and decrements
+     */
+    public void testGetAndDecrement(){
+        AtomicLongArray ai = new AtomicLongArray(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            ai.set(i, 1);
+            assertEquals(1,ai.getAndDecrement(i));
+            assertEquals(0,ai.getAndDecrement(i));
+            assertEquals(-1,ai.getAndDecrement(i));
+        }
+    }
+
+    /**
+     * getAndIncrement returns previous value and increments
+     */
+    public void testGetAndIncrement(){
+        AtomicLongArray ai = new AtomicLongArray(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            ai.set(i, 1);
+            assertEquals(1,ai.getAndIncrement(i));
+            assertEquals(2,ai.get(i));
+            ai.set(i,-2);
+            assertEquals(-2,ai.getAndIncrement(i));
+            assertEquals(-1,ai.getAndIncrement(i));
+            assertEquals(0,ai.getAndIncrement(i));
+            assertEquals(1,ai.get(i));
+        }
+    }
+
+    /**
+     *  addAndGet adds given value to current, and returns current value
+     */
+    public void testAddAndGet() {
+        AtomicLongArray ai = new AtomicLongArray(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            ai.set(i, 1);
+            assertEquals(3,ai.addAndGet(i,2));
+            assertEquals(3,ai.get(i));
+            assertEquals(-1,ai.addAndGet(i,-4));
+            assertEquals(-1,ai.get(i));
+        }
+    }
+
+    /**
+     * decrementAndGet decrements and returns current value
+     */
+    public void testDecrementAndGet(){
+        AtomicLongArray ai = new AtomicLongArray(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            ai.set(i, 1);
+            assertEquals(0,ai.decrementAndGet(i));
+            assertEquals(-1,ai.decrementAndGet(i));
+            assertEquals(-2,ai.decrementAndGet(i));
+            assertEquals(-2,ai.get(i));
+        }
+    }
+
+    /**
+     * incrementAndGet increments and returns current value
+     */
+    public void testIncrementAndGet() {
+        AtomicLongArray ai = new AtomicLongArray(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            ai.set(i, 1);
+            assertEquals(2,ai.incrementAndGet(i));
+            assertEquals(2,ai.get(i));
+            ai.set(i, -2);
+            assertEquals(-1,ai.incrementAndGet(i));
+            assertEquals(0,ai.incrementAndGet(i));
+            assertEquals(1,ai.incrementAndGet(i));
+            assertEquals(1,ai.get(i));
+        }
+    }
+
+    static final long COUNTDOWN = 100000;
+
+    class Counter implements Runnable {
+        final AtomicLongArray ai;
+        volatile long counts;
+        Counter(AtomicLongArray a) { ai = a; }
+        public void run() {
+            for (;;) {
+                boolean done = true;
+                for (int i = 0; i < ai.length(); ++i) {
+                    long v = ai.get(i);
+                    threadAssertTrue(v >= 0);
+                    if (v != 0) {
+                        done = false;
+                        if (ai.compareAndSet(i, v, v-1))
+                            ++counts;
+                    }
+                }
+                if (done)
+                    break;
+            }
+        }
+    }
+
+    /**
+     * Multiple threads using same array of counters successfully
+     * update a number of times equal to total count
+     */
+    public void testCountingInMultipleThreads() {
+        try {
+            final AtomicLongArray ai = new AtomicLongArray(SIZE);
+            for (int i = 0; i < SIZE; ++i)
+                ai.set(i, COUNTDOWN);
+            Counter c1 = new Counter(ai);
+            Counter c2 = new Counter(ai);
+            Thread t1 = new Thread(c1);
+            Thread t2 = new Thread(c2);
+            t1.start();
+            t2.start();
+            t1.join();
+            t2.join();
+            assertEquals(c1.counts+c2.counts, SIZE * COUNTDOWN);
+        }
+        catch(InterruptedException ie) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * a deserialized serialized array holds same values
+     */
+    public void testSerialization() {
+        AtomicLongArray l = new AtomicLongArray(SIZE);
+        for (int i = 0; i < SIZE; ++i)
+            l.set(i, -i);
+
+        try {
+            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
+            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
+            out.writeObject(l);
+            out.close();
+
+            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
+            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
+            AtomicLongArray r = (AtomicLongArray) in.readObject();
+            for (int i = 0; i < SIZE; ++i) {
+                assertEquals(l.get(i), r.get(i));
+            }
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * toString returns current value.
+     */
+    public void testToString() {
+        long[] a = { 17, 3, -42, 99, -7};
+        AtomicLongArray ai = new AtomicLongArray(a);
+        assertEquals(toString(a), ai.toString());
+    }
+
+    private static String toString(long[] array) {
+        if (array.length == 0)
+            return "[]";
+
+        StringBuffer buf = new StringBuffer();
+        buf.append('[');
+        buf.append(array[0]);
+
+        for (int i = 1; i < array.length; i++) {
+            buf.append(", ");
+            buf.append(array[i]);
+        }
+
+        buf.append("]");
+        return buf.toString();
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicLongFieldUpdaterTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicLongFieldUpdaterTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicLongFieldUpdaterTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,293 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+import edu.emory.mathcs.backport.java.util.concurrent.atomic.*;
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.*;
+
+public class AtomicLongFieldUpdaterTest extends JSR166TestCase {
+//    volatile long x = 0;
+//    int z;
+//    long w;
+//
+//    public static void main(String[] args){
+//        junit.textui.TestRunner.run(suite());
+//    }
+//    public static Test suite() {
+//        return new TestSuite(AtomicLongFieldUpdaterTest.class);
+//    }
+//
+//    /**
+//     * Construction with non-existent field throws RuntimeException
+//     */
+//    public void testConstructor(){
+//        try{
+//            AtomicLongFieldUpdater
+//                a = AtomicLongFieldUpdater.newUpdater
+//                (AtomicLongFieldUpdaterTest.class, "y");
+//            shouldThrow();
+//        }
+//        catch (RuntimeException rt) {}
+//    }
+//
+//    /**
+//     * construction with field not of given type throws RuntimeException
+//     */
+//    public void testConstructor2(){
+//        try{
+//            AtomicLongFieldUpdater
+//                a = AtomicLongFieldUpdater.newUpdater
+//                (AtomicLongFieldUpdaterTest.class, "z");
+//            shouldThrow();
+//        }
+//        catch (RuntimeException rt) {}
+//    }
+//
+//    /**
+//     * construction with non-volatile field throws RuntimeException
+//     */
+//    public void testConstructor3(){
+//        try{
+//            AtomicLongFieldUpdater
+//                a = AtomicLongFieldUpdater.newUpdater
+//                (AtomicLongFieldUpdaterTest.class, "w");
+//            shouldThrow();
+//        }
+//
+//        catch (RuntimeException rt) {}
+//    }
+//
+//    /**
+//     *  get returns the last value set or assigned
+//     */
+//    public void testGetSet(){
+//        AtomicLongFieldUpdater a;
+//        try {
+//            a = AtomicLongFieldUpdater.newUpdater(AtomicLongFieldUpdaterTest.class, "x");
+//        } catch (RuntimeException ok) {
+//            return;
+//        }
+//        x = 1;
+//	assertEquals(1,a.get(this));
+//	a.set(this,2);
+//	assertEquals(2,a.get(this));
+//	a.set(this,-3);
+//	assertEquals(-3,a.get(this));
+//    }
+//
+//    /**
+//     *  get returns the last value lazySet by same thread
+//     */
+//    public void testGetLazySet(){
+//        AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
+//        try {
+//            a = AtomicLongFieldUpdater.newUpdater(AtomicLongFieldUpdaterTest.class, "x");
+//        } catch (RuntimeException ok) {
+//            return;
+//        }
+//        x = 1;
+//        assertEquals(1,a.get(this));
+//        a.lazySet(this,2);
+//        assertEquals(2,a.get(this));
+//        a.lazySet(this,-3);
+//        assertEquals(-3,a.get(this));
+//    }
+//
+//    /**
+//     * compareAndSet succeeds in changing value if equal to expected else fails
+//     */
+//    public void testCompareAndSet(){
+//        AtomicLongFieldUpdater a;
+//        try {
+//            a = AtomicLongFieldUpdater.newUpdater(AtomicLongFieldUpdaterTest.class, "x");
+//        } catch (RuntimeException ok) {
+//            return;
+//        }
+//        x = 1;
+//	assertTrue(a.compareAndSet(this,1,2));
+//	assertTrue(a.compareAndSet(this,2,-4));
+//	assertEquals(-4,a.get(this));
+//	assertFalse(a.compareAndSet(this,-5,7));
+//	assertFalse((7 == a.get(this)));
+//	assertTrue(a.compareAndSet(this,-4,7));
+//	assertEquals(7,a.get(this));
+//    }
+//
+//
+//    /**
+//     * compareAndSet in one thread enables another waiting for value
+//     * to succeed
+//     */
+//    public void testCompareAndSetInMultipleThreads() {
+//        x = 1;
+//        final AtomicLongFieldUpdater a;
+//        try {
+//            a = AtomicLongFieldUpdater.newUpdater(AtomicLongFieldUpdaterTest.class, "x");
+//        } catch (RuntimeException ok) {
+//            return;
+//        }
+//
+//        Thread t = new Thread(new Runnable() {
+//                public void run() {
+//                    while(!a.compareAndSet(AtomicLongFieldUpdaterTest.this, 2, 3)) Thread.yield();
+//                }});
+//        try {
+//            t.start();
+//            assertTrue(a.compareAndSet(this, 1, 2));
+//            t.join(LONG_DELAY_MS);
+//            assertFalse(t.isAlive());
+//            assertEquals(a.get(this), 3);
+//        }
+//        catch(Exception e) {
+//            unexpectedException();
+//        }
+//    }
+//
+//    /**
+//     * repeated weakCompareAndSet succeeds in changing value when equal
+//     * to expected
+//     */
+//    public void testWeakCompareAndSet(){
+//        AtomicLongFieldUpdater a;
+//        try {
+//            a = AtomicLongFieldUpdater.newUpdater(AtomicLongFieldUpdaterTest.class, "x");
+//        } catch (RuntimeException ok) {
+//            return;
+//        }
+//        x = 1;
+//	while(!a.weakCompareAndSet(this,1,2));
+//        while(!a.weakCompareAndSet(this,2,-4));
+//	assertEquals(-4,a.get(this));
+//	while(!a.weakCompareAndSet(this,-4,7));
+//	assertEquals(7,a.get(this));
+//    }
+//
+//    /**
+//     *  getAndSet returns previous value and sets to given value
+//     */
+//    public void testGetAndSet(){
+//        AtomicLongFieldUpdater a;
+//        try {
+//            a = AtomicLongFieldUpdater.newUpdater(AtomicLongFieldUpdaterTest.class, "x");
+//        } catch (RuntimeException ok) {
+//            return;
+//        }
+//        x = 1;
+//	assertEquals(1,a.getAndSet(this, 0));
+//	assertEquals(0,a.getAndSet(this,-10));
+//	assertEquals(-10,a.getAndSet(this,1));
+//    }
+//
+//    /**
+//     * getAndAdd returns previous value and adds given value
+//     */
+//    public void testGetAndAdd(){
+//        AtomicLongFieldUpdater a;
+//        try {
+//            a = AtomicLongFieldUpdater.newUpdater(AtomicLongFieldUpdaterTest.class, "x");
+//        } catch (RuntimeException ok) {
+//            return;
+//        }
+//        x = 1;
+//	assertEquals(1,a.getAndAdd(this,2));
+//	assertEquals(3,a.get(this));
+//	assertEquals(3,a.getAndAdd(this,-4));
+//	assertEquals(-1,a.get(this));
+//    }
+//
+//    /**
+//     * getAndDecrement returns previous value and decrements
+//     */
+//    public void testGetAndDecrement(){
+//        AtomicLongFieldUpdater a;
+//        try {
+//            a = AtomicLongFieldUpdater.newUpdater(AtomicLongFieldUpdaterTest.class, "x");
+//        } catch (RuntimeException ok) {
+//            return;
+//        }
+//        x = 1;
+//	assertEquals(1,a.getAndDecrement(this));
+//	assertEquals(0,a.getAndDecrement(this));
+//	assertEquals(-1,a.getAndDecrement(this));
+//    }
+//
+//    /**
+//     * getAndIncrement returns previous value and increments
+//     */
+//    public void testGetAndIncrement(){
+//        AtomicLongFieldUpdater a;
+//        try {
+//            a = AtomicLongFieldUpdater.newUpdater(AtomicLongFieldUpdaterTest.class, "x");
+//        } catch (RuntimeException ok) {
+//            return;
+//        }
+//        x = 1;
+//	assertEquals(1,a.getAndIncrement(this));
+//	assertEquals(2,a.get(this));
+//	a.set(this,-2);
+//	assertEquals(-2,a.getAndIncrement(this));
+//	assertEquals(-1,a.getAndIncrement(this));
+//	assertEquals(0,a.getAndIncrement(this));
+//	assertEquals(1,a.get(this));
+//    }
+//
+//    /**
+//     * addAndGet adds given value to current, and returns current value
+//     */
+//    public void testAddAndGet(){
+//        AtomicLongFieldUpdater a;
+//        try {
+//            a = AtomicLongFieldUpdater.newUpdater(AtomicLongFieldUpdaterTest.class, "x");
+//        } catch (RuntimeException ok) {
+//            return;
+//        }
+//        x = 1;
+//	assertEquals(3,a.addAndGet(this,2));
+//	assertEquals(3,a.get(this));
+//	assertEquals(-1,a.addAndGet(this,-4));
+//	assertEquals(-1,a.get(this));
+//    }
+//
+//    /**
+//     *  decrementAndGet decrements and returns current value
+//     */
+//    public void testDecrementAndGet(){
+//        AtomicLongFieldUpdater a;
+//        try {
+//            a = AtomicLongFieldUpdater.newUpdater(AtomicLongFieldUpdaterTest.class, "x");
+//        } catch (RuntimeException ok) {
+//            return;
+//        }
+//        x = 1;
+//	assertEquals(0,a.decrementAndGet(this));
+//	assertEquals(-1,a.decrementAndGet(this));
+//	assertEquals(-2,a.decrementAndGet(this));
+//	assertEquals(-2,a.get(this));
+//    }
+//
+//    /**
+//     * incrementAndGet increments and returns current value
+//     */
+//    public void testIncrementAndGet(){
+//        AtomicLongFieldUpdater a;
+//        try {
+//            a = AtomicLongFieldUpdater.newUpdater(AtomicLongFieldUpdaterTest.class, "x");
+//        } catch (RuntimeException ok) {
+//            return;
+//        }
+//        x = 1;
+//	assertEquals(2,a.incrementAndGet(this));
+//	assertEquals(2,a.get(this));
+//	a.set(this,-2);
+//	assertEquals(-1,a.incrementAndGet(this));
+//	assertEquals(0,a.incrementAndGet(this));
+//	assertEquals(1,a.incrementAndGet(this));
+//	assertEquals(1,a.get(this));
+//    }
+//
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicLongTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicLongTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicLongTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,260 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.concurrent.atomic.*;
+import java.io.*;
+
+public class AtomicLongTest extends JSR166TestCase {
+    public static void main (String[] args) {
+        junit.textui.TestRunner.run (suite());
+    }
+    public static Test suite() {
+        return new TestSuite(AtomicLongTest.class);
+    }
+
+    /**
+     * constructor initializes to given value
+     */
+    public void testConstructor(){
+        AtomicLong ai = new AtomicLong(1);
+	assertEquals(1,ai.get());
+    }
+
+    /**
+     * default constructed initializes to zero
+     */
+    public void testConstructor2(){
+        AtomicLong ai = new AtomicLong();
+	assertEquals(0,ai.get());
+    }
+
+    /**
+     * get returns the last value set
+     */
+    public void testGetSet(){
+        AtomicLong ai = new AtomicLong(1);
+	assertEquals(1,ai.get());
+	ai.set(2);
+	assertEquals(2,ai.get());
+	ai.set(-3);
+	assertEquals(-3,ai.get());
+
+    }
+
+    /**
+     * get returns the last value lazySet in same thread
+     */
+    public void testGetLazySet(){
+        AtomicLong ai = new AtomicLong(1);
+        assertEquals(1,ai.get());
+        ai.lazySet(2);
+        assertEquals(2,ai.get());
+        ai.lazySet(-3);
+        assertEquals(-3,ai.get());
+
+    }
+
+    /**
+     * compareAndSet succeeds in changing value if equal to expected else fails
+     */
+    public void testCompareAndSet(){
+        AtomicLong ai = new AtomicLong(1);
+	assertTrue(ai.compareAndSet(1,2));
+	assertTrue(ai.compareAndSet(2,-4));
+	assertEquals(-4,ai.get());
+	assertFalse(ai.compareAndSet(-5,7));
+	assertFalse((7 == ai.get()));
+	assertTrue(ai.compareAndSet(-4,7));
+	assertEquals(7,ai.get());
+    }
+
+    /**
+     * compareAndSet in one thread enables another waiting for value
+     * to succeed
+     */
+    public void testCompareAndSetInMultipleThreads() {
+        final AtomicLong ai = new AtomicLong(1);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    while(!ai.compareAndSet(2, 3)) Thread.yield();
+                }});
+        try {
+            t.start();
+            assertTrue(ai.compareAndSet(1, 2));
+            t.join(LONG_DELAY_MS);
+            assertFalse(t.isAlive());
+            assertEquals(ai.get(), 3);
+        }
+        catch(Exception e) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * repeated weakCompareAndSet succeeds in changing value when equal
+     * to expected
+     */
+    public void testWeakCompareAndSet(){
+        AtomicLong ai = new AtomicLong(1);
+	while(!ai.weakCompareAndSet(1,2));
+	while(!ai.weakCompareAndSet(2,-4));
+	assertEquals(-4,ai.get());
+	while(!ai.weakCompareAndSet(-4,7));
+	assertEquals(7,ai.get());
+    }
+
+    /**
+     * getAndSet returns previous value and sets to given value
+     */
+    public void testGetAndSet(){
+        AtomicLong ai = new AtomicLong(1);
+	assertEquals(1,ai.getAndSet(0));
+	assertEquals(0,ai.getAndSet(-10));
+	assertEquals(-10,ai.getAndSet(1));
+    }
+
+    /**
+     * getAndAdd returns previous value and adds given value
+     */
+    public void testGetAndAdd(){
+        AtomicLong ai = new AtomicLong(1);
+	assertEquals(1,ai.getAndAdd(2));
+	assertEquals(3,ai.get());
+	assertEquals(3,ai.getAndAdd(-4));
+	assertEquals(-1,ai.get());
+    }
+
+    /**
+     * getAndDecrement returns previous value and decrements
+     */
+    public void testGetAndDecrement(){
+        AtomicLong ai = new AtomicLong(1);
+	assertEquals(1,ai.getAndDecrement());
+	assertEquals(0,ai.getAndDecrement());
+	assertEquals(-1,ai.getAndDecrement());
+    }
+
+    /**
+     * getAndIncrement returns previous value and increments
+     */
+    public void testGetAndIncrement(){
+        AtomicLong ai = new AtomicLong(1);
+	assertEquals(1,ai.getAndIncrement());
+	assertEquals(2,ai.get());
+	ai.set(-2);
+	assertEquals(-2,ai.getAndIncrement());
+	assertEquals(-1,ai.getAndIncrement());
+	assertEquals(0,ai.getAndIncrement());
+	assertEquals(1,ai.get());
+    }
+
+    /**
+     * addAndGet adds given value to current, and returns current value
+     */
+    public void testAddAndGet(){
+        AtomicLong ai = new AtomicLong(1);
+	assertEquals(3,ai.addAndGet(2));
+	assertEquals(3,ai.get());
+	assertEquals(-1,ai.addAndGet(-4));
+	assertEquals(-1,ai.get());
+    }
+
+    /**
+     * decrementAndGet decrements and returns current value
+     */
+    public void testDecrementAndGet(){
+        AtomicLong ai = new AtomicLong(1);
+	assertEquals(0,ai.decrementAndGet());
+	assertEquals(-1,ai.decrementAndGet());
+	assertEquals(-2,ai.decrementAndGet());
+	assertEquals(-2,ai.get());
+    }
+
+    /**
+     * incrementAndGet increments and returns current value
+     */
+    public void testIncrementAndGet(){
+        AtomicLong ai = new AtomicLong(1);
+	assertEquals(2,ai.incrementAndGet());
+	assertEquals(2,ai.get());
+	ai.set(-2);
+	assertEquals(-1,ai.incrementAndGet());
+	assertEquals(0,ai.incrementAndGet());
+	assertEquals(1,ai.incrementAndGet());
+	assertEquals(1,ai.get());
+    }
+
+    /**
+     * a deserialized serialized atomic holds same value
+     */
+    public void testSerialization() {
+        AtomicLong l = new AtomicLong();
+
+        try {
+            l.set(-22);
+            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
+            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
+            out.writeObject(l);
+            out.close();
+
+            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
+            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
+            AtomicLong r = (AtomicLong) in.readObject();
+            assertEquals(l.get(), r.get());
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * toString returns current value.
+     */
+    public void testToString() {
+        AtomicLong ai = new AtomicLong();
+        for (long i = -12; i < 6; ++i) {
+            ai.set(i);
+            assertEquals(ai.toString(), Long.toString(i));
+        }
+    }
+
+    /**
+     * longValue returns current value.
+     */
+    public void testLongValue() {
+        AtomicLong ai = new AtomicLong();
+        for (int i = -12; i < 6; ++i) {
+            ai.set(i);
+            assertEquals((long)i, ai.longValue());
+        }
+    }
+
+    /**
+     * floatValue returns current value.
+     */
+    public void testFloatValue() {
+        AtomicLong ai = new AtomicLong();
+        for (int i = -12; i < 6; ++i) {
+            ai.set(i);
+            assertEquals((float)i, ai.floatValue(), 0.0f);
+        }
+    }
+
+    /**
+     * doubleValue returns current value.
+     */
+    public void testDoubleValue() {
+        AtomicLong ai = new AtomicLong();
+        for (int i = -12; i < 6; ++i) {
+            ai.set(i);
+            assertEquals((double)i, ai.doubleValue(), 0.0);
+        }
+    }
+
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicMarkableReferenceTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicMarkableReferenceTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicMarkableReferenceTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,158 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.concurrent.atomic.*;
+
+public class AtomicMarkableReferenceTest extends JSR166TestCase{
+    public static void main (String[] args) {
+        junit.textui.TestRunner.run (suite());
+    }
+    public static Test suite() {
+        return new TestSuite(AtomicMarkableReferenceTest.class);
+    }
+
+    /**
+     *  constructor initializes to given reference and mark
+     */
+    public void testConstructor(){
+        AtomicMarkableReference ai = new AtomicMarkableReference(one, false);
+	assertEquals(one,ai.getReference());
+	assertFalse(ai.isMarked());
+        AtomicMarkableReference a2 = new AtomicMarkableReference(null, true);
+	assertNull(a2.getReference());
+	assertTrue(a2.isMarked());
+
+    }
+
+    /**
+     *  get returns the last values of reference and mark set
+     */
+    public void testGetSet(){
+        boolean[] mark = new boolean[1];
+        AtomicMarkableReference ai = new AtomicMarkableReference(one, false);
+	assertEquals(one,ai.getReference());
+	assertFalse(ai.isMarked());
+        assertEquals(one, ai.get(mark));
+        assertFalse(mark[0]);
+	ai.set(two, false);
+	assertEquals(two,ai.getReference());
+	assertFalse(ai.isMarked());
+        assertEquals(two, ai.get(mark));
+        assertFalse(mark[0]);
+	ai.set(one, true);
+	assertEquals(one,ai.getReference());
+	assertTrue(ai.isMarked());
+        assertEquals(one, ai.get(mark));
+        assertTrue(mark[0]);
+    }
+
+    /**
+     * attemptMark succeeds in single thread
+     */
+    public void testAttemptMark(){
+        boolean[] mark = new boolean[1];
+        AtomicMarkableReference ai = new AtomicMarkableReference(one, false);
+        assertFalse(ai.isMarked());
+        assertTrue(ai.attemptMark(one, true));
+	assertTrue(ai.isMarked());
+        assertEquals(one, ai.get(mark));
+        assertTrue(mark[0]);
+    }
+
+    /**
+     * compareAndSet succeeds in changing values if equal to expected reference
+     * and mark else fails
+     */
+    public void testCompareAndSet(){
+        boolean[] mark = new boolean[1];
+        AtomicMarkableReference ai = new AtomicMarkableReference(one, false);
+	assertEquals(one, ai.get(mark));
+        assertFalse(ai.isMarked());
+	assertFalse(mark[0]);
+
+        assertTrue(ai.compareAndSet(one, two, false, false));
+	assertEquals(two, ai.get(mark));
+	assertFalse(mark[0]);
+
+        assertTrue(ai.compareAndSet(two, m3, false, true));
+	assertEquals(m3, ai.get(mark));
+	assertTrue(mark[0]);
+
+        assertFalse(ai.compareAndSet(two, m3, true, true));
+	assertEquals(m3, ai.get(mark));
+	assertTrue(mark[0]);
+    }
+
+    /**
+     * compareAndSet in one thread enables another waiting for reference value
+     * to succeed
+     */
+    public void testCompareAndSetInMultipleThreads() {
+        final AtomicMarkableReference ai = new AtomicMarkableReference(one, false);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    while(!ai.compareAndSet(two, three, false, false)) Thread.yield();
+                }});
+        try {
+            t.start();
+            assertTrue(ai.compareAndSet(one, two, false, false));
+            t.join(LONG_DELAY_MS);
+            assertFalse(t.isAlive());
+            assertEquals(ai.getReference(), three);
+            assertFalse(ai.isMarked());
+        }
+        catch(Exception e) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * compareAndSet in one thread enables another waiting for mark value
+     * to succeed
+     */
+    public void testCompareAndSetInMultipleThreads2() {
+        final AtomicMarkableReference ai = new AtomicMarkableReference(one, false);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    while(!ai.compareAndSet(one, one, true, false)) Thread.yield();
+                }});
+        try {
+            t.start();
+            assertTrue(ai.compareAndSet(one, one, false, true));
+            t.join(LONG_DELAY_MS);
+            assertFalse(t.isAlive());
+            assertEquals(ai.getReference(), one);
+            assertFalse(ai.isMarked());
+        }
+        catch(Exception e) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * repeated weakCompareAndSet succeeds in changing values when equal
+     * to expected
+     */
+    public void testWeakCompareAndSet(){
+        boolean[] mark = new boolean[1];
+        AtomicMarkableReference ai = new AtomicMarkableReference(one, false);
+	assertEquals(one, ai.get(mark));
+        assertFalse(ai.isMarked());
+	assertFalse(mark[0]);
+
+        while(!ai.weakCompareAndSet(one, two, false, false));
+	assertEquals(two, ai.get(mark));
+	assertFalse(mark[0]);
+
+        while(!ai.weakCompareAndSet(two, m3, false, true));
+	assertEquals(m3, ai.get(mark));
+	assertTrue(mark[0]);
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicReferenceArrayTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicReferenceArrayTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicReferenceArrayTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,233 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.concurrent.atomic.*;
+import java.io.*;
+import edu.emory.mathcs.backport.java.util.*;
+
+public class AtomicReferenceArrayTest extends JSR166TestCase
+{
+    public static void main (String[] args) {
+        junit.textui.TestRunner.run (suite());
+    }
+    public static Test suite() {
+        return new TestSuite(AtomicReferenceArrayTest.class);
+    }
+
+    /**
+     * constructor creates array of given size with all elements null
+     */
+    public void testConstructor(){
+        AtomicReferenceArray ai = new AtomicReferenceArray(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertNull(ai.get(i));
+        }
+    }
+
+    /**
+     * constructor with null array throws NPE
+     */
+    public void testConstructor2NPE() {
+        try {
+            Integer[] a = null;
+            AtomicReferenceArray ai = new AtomicReferenceArray(a);
+        } catch (NullPointerException success) {
+        } catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * constructor with array is of same size and has all elements
+     */
+    public void testConstructor2() {
+        Integer[] a = { two, one, three, four, seven};
+        AtomicReferenceArray ai = new AtomicReferenceArray(a);
+        assertEquals(a.length, ai.length());
+        for (int i = 0; i < a.length; ++i)
+            assertEquals(a[i], ai.get(i));
+    }
+
+
+    /**
+     * get and set for out of bound indices throw IndexOutOfBoundsException
+     */
+    public void testIndexing(){
+        AtomicReferenceArray ai = new AtomicReferenceArray(SIZE);
+        try {
+            ai.get(SIZE);
+        } catch(IndexOutOfBoundsException success){
+        }
+        try {
+            ai.get(-1);
+        } catch(IndexOutOfBoundsException success){
+        }
+        try {
+            ai.set(SIZE, null);
+        } catch(IndexOutOfBoundsException success){
+        }
+        try {
+            ai.set(-1, null);
+        } catch(IndexOutOfBoundsException success){
+        }
+    }
+
+    /**
+     * get returns the last value set at index
+     */
+    public void testGetSet(){
+        AtomicReferenceArray ai = new AtomicReferenceArray(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            ai.set(i, one);
+            assertEquals(one,ai.get(i));
+            ai.set(i, two);
+            assertEquals(two,ai.get(i));
+            ai.set(i, m3);
+            assertEquals(m3,ai.get(i));
+        }
+    }
+
+    /**
+     * get returns the last value lazySet at index by same thread
+     */
+    public void testGetLazySet(){
+        AtomicReferenceArray ai = new AtomicReferenceArray(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            ai.lazySet(i, one);
+            assertEquals(one,ai.get(i));
+            ai.lazySet(i, two);
+            assertEquals(two,ai.get(i));
+            ai.lazySet(i, m3);
+            assertEquals(m3,ai.get(i));
+        }
+    }
+
+    /**
+     * compareAndSet succeeds in changing value if equal to expected else fails
+     */
+    public void testCompareAndSet(){
+        AtomicReferenceArray ai = new AtomicReferenceArray(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            ai.set(i, one);
+            assertTrue(ai.compareAndSet(i, one,two));
+            assertTrue(ai.compareAndSet(i, two,m4));
+            assertEquals(m4,ai.get(i));
+            assertFalse(ai.compareAndSet(i, m5,seven));
+            assertFalse((seven.equals(ai.get(i))));
+            assertTrue(ai.compareAndSet(i, m4,seven));
+            assertEquals(seven,ai.get(i));
+        }
+    }
+
+    /**
+     * compareAndSet in one thread enables another waiting for value
+     * to succeed
+     */
+    public void testCompareAndSetInMultipleThreads() {
+        final AtomicReferenceArray a = new AtomicReferenceArray(1);
+        a.set(0, one);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    while(!a.compareAndSet(0, two, three)) Thread.yield();
+                }});
+        try {
+            t.start();
+            assertTrue(a.compareAndSet(0, one, two));
+            t.join(LONG_DELAY_MS);
+            assertFalse(t.isAlive());
+            assertEquals(a.get(0), three);
+        }
+        catch(Exception e) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * repeated weakCompareAndSet succeeds in changing value when equal
+     * to expected
+     */
+    public void testWeakCompareAndSet(){
+        AtomicReferenceArray ai = new AtomicReferenceArray(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            ai.set(i, one);
+            while(!ai.weakCompareAndSet(i, one,two));
+            while(!ai.weakCompareAndSet(i, two,m4));
+            assertEquals(m4,ai.get(i));
+            while(!ai.weakCompareAndSet(i, m4,seven));
+            assertEquals(seven,ai.get(i));
+        }
+    }
+
+    /**
+     * getAndSet returns previous value and sets to given value at given index
+     */
+    public void testGetAndSet(){
+        AtomicReferenceArray ai = new AtomicReferenceArray(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            ai.set(i, one);
+            assertEquals(one,ai.getAndSet(i,zero));
+            assertEquals(0,((Integer)ai.getAndSet(i,m10)).intValue());
+            assertEquals(m10,ai.getAndSet(i,one));
+        }
+    }
+
+    /**
+     * a deserialized serialized array holds same values
+     */
+    public void testSerialization() {
+        AtomicReferenceArray l = new AtomicReferenceArray(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            l.set(i, new Integer(-i));
+        }
+
+        try {
+            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
+            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
+            out.writeObject(l);
+            out.close();
+
+            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
+            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
+            AtomicReferenceArray r = (AtomicReferenceArray) in.readObject();
+            assertEquals(l.length(), r.length());
+            for (int i = 0; i < SIZE; ++i) {
+                assertEquals(r.get(i), l.get(i));
+            }
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * toString returns current value.
+     */
+    public void testToString() {
+        Integer[] a = { two, one, three, four, seven};
+        AtomicReferenceArray ai = new AtomicReferenceArray(a);
+        assertEquals(toString(a), ai.toString());
+    }
+
+    private static String toString(Integer[] array) {
+        if (array.length == 0)
+            return "[]";
+
+        StringBuffer buf = new StringBuffer();
+        buf.append('[');
+        buf.append(array[0]);
+
+        for (int i = 1; i < array.length; i++) {
+            buf.append(", ");
+            buf.append(array[i]);
+        }
+
+        buf.append("]");
+        return buf.toString();
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicReferenceFieldUpdaterTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicReferenceFieldUpdaterTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicReferenceFieldUpdaterTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,185 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+import edu.emory.mathcs.backport.java.util.concurrent.atomic.*;
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.*;
+
+public class AtomicReferenceFieldUpdaterTest extends JSR166TestCase{
+//    volatile Integer x = null;
+//    Object z;
+//    Integer w;
+//
+//    public static void main(String[] args){
+//        junit.textui.TestRunner.run(suite());
+//    }
+//    public static Test suite() {
+//        return new TestSuite(AtomicReferenceFieldUpdaterTest.class);
+//    }
+//
+//    /**
+//     * Construction with non-existent field throws RuntimeException
+//     */
+//    public void testConstructor(){
+//        try{
+//            AtomicReferenceFieldUpdater
+//                a = AtomicReferenceFieldUpdater.newUpdater
+//                (AtomicReferenceFieldUpdaterTest.class, Integer.class, "y");
+//            shouldThrow();
+//        }
+//        catch (RuntimeException rt) {}
+//    }
+//
+//
+//    /**
+//     * construction with field not of given type throws RuntimeException
+//     */
+//    public void testConstructor2(){
+//        try{
+//            AtomicReferenceFieldUpdater
+//                a = AtomicReferenceFieldUpdater.newUpdater
+//                (AtomicReferenceFieldUpdaterTest.class, Integer.class, "z");
+//            shouldThrow();
+//        }
+//        catch (RuntimeException rt) {}
+//    }
+//
+//    /**
+//     * Constructor with non-volatile field throws exception
+//     */
+//    public void testConstructor3(){
+//        try{
+//            AtomicReferenceFieldUpdater
+//                a = AtomicReferenceFieldUpdater.newUpdater
+//                (AtomicReferenceFieldUpdaterTest.class, Integer.class, "w");
+//            shouldThrow();
+//        }
+//        catch (RuntimeException rt) {}
+//    }
+//
+//    /**
+//     *  get returns the last value set or assigned
+//     */
+//    public void testGetSet(){
+//        AtomicReferenceFieldUpdater a;
+//        try {
+//            a = AtomicReferenceFieldUpdater.newUpdater(AtomicReferenceFieldUpdaterTest.class, Integer.class, "x");
+//        } catch (RuntimeException ok) {
+//            return;
+//        }
+//        x = one;
+//	assertEquals(one,a.get(this));
+//	a.set(this,two);
+//	assertEquals(two,a.get(this));
+//	a.set(this,-3);
+//	assertEquals(-3,a.get(this));
+//    }
+//
+//    /**
+//     *  get returns the last value lazySet by same thread
+//     */
+//    public void testGetLazySet(){
+//        AtomicReferenceFieldUpdater<AtomicReferenceFieldUpdaterTest, Integer>a;
+//        try {
+//            a = AtomicReferenceFieldUpdater.newUpdater(AtomicReferenceFieldUpdaterTest.class, Integer.class, "x");
+//        } catch (RuntimeException ok) {
+//            return;
+//        }
+//        x = one;
+//        assertEquals(one,a.get(this));
+//        a.lazySet(this,two);
+//        assertEquals(two,a.get(this));
+//        a.lazySet(this,m3);
+//        assertEquals(m3,a.get(this));
+//    }
+//
+//    /**
+//     * compareAndSet succeeds in changing value if equal to expected else fails
+//     */
+//    public void testCompareAndSet(){
+//        AtomicReferenceFieldUpdater a;
+//        try {
+//            a = AtomicReferenceFieldUpdater.newUpdater(AtomicReferenceFieldUpdaterTest.class, Integer.class, "x");
+//        } catch (RuntimeException ok) {
+//            return;
+//        }
+//        x = one;
+//	assertTrue(a.compareAndSet(this,one,two));
+//	assertTrue(a.compareAndSet(this,two,m4));
+//	assertEquals(m4,a.get(this));
+//	assertFalse(a.compareAndSet(this,m5,seven));
+//	assertFalse((seven == a.get(this)));
+//	assertTrue(a.compareAndSet(this,m4,seven));
+//	assertEquals(seven,a.get(this));
+//    }
+//
+//    /**
+//     * compareAndSet in one thread enables another waiting for value
+//     * to succeed
+//     */
+//    public void testCompareAndSetInMultipleThreads() {
+//        x = one;
+//        final AtomicReferenceFieldUpdater a;
+//        try {
+//            a = AtomicReferenceFieldUpdater.newUpdater(AtomicReferenceFieldUpdaterTest.class, Integer.class, "x");
+//        } catch (RuntimeException ok) {
+//            return;
+//        }
+//
+//        Thread t = new Thread(new Runnable() {
+//                public void run() {
+//                    while(!a.compareAndSet(AtomicReferenceFieldUpdaterTest.this, two, three)) Thread.yield();
+//                }});
+//        try {
+//            t.start();
+//            assertTrue(a.compareAndSet(this, one, two));
+//            t.join(LONG_DELAY_MS);
+//            assertFalse(t.isAlive());
+//            assertEquals(a.get(this), three);
+//        }
+//        catch(Exception e) {
+//            unexpectedException();
+//        }
+//    }
+//
+//    /**
+//     * repeated weakCompareAndSet succeeds in changing value when equal
+//     * to expected
+//     */
+//    public void testWeakCompareAndSet(){
+//        AtomicReferenceFieldUpdater a;
+//        try {
+//            a = AtomicReferenceFieldUpdater.newUpdater(AtomicReferenceFieldUpdaterTest.class, Integer.class, "x");
+//        } catch (RuntimeException ok) {
+//            return;
+//        }
+//        x = one;
+//	while(!a.weakCompareAndSet(this,one,two));
+//	while(!a.weakCompareAndSet(this,two,m4));
+//	assertEquals(m4,a.get(this));
+//	while(!a.weakCompareAndSet(this,m4,seven));
+//	assertEquals(seven,a.get(this));
+//    }
+//
+//    /**
+//     * getAndSet returns previous value and sets to given value
+//     */
+//    public void testGetAndSet(){
+//        AtomicReferenceFieldUpdater a;
+//        try {
+//            a = AtomicReferenceFieldUpdater.newUpdater(AtomicReferenceFieldUpdaterTest.class, Integer.class, "x");
+//        } catch (RuntimeException ok) {
+//            return;
+//        }
+//        x = one;
+//	assertEquals(one,a.getAndSet(this, zero));
+//	assertEquals(zero,a.getAndSet(this,m10));
+//	assertEquals(m10,a.getAndSet(this,1));
+//    }
+//
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicReferenceTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicReferenceTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicReferenceTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,154 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.concurrent.atomic.*;
+import java.io.*;
+
+public class AtomicReferenceTest extends JSR166TestCase {
+    public static void main (String[] args) {
+        junit.textui.TestRunner.run (suite());
+    }
+    public static Test suite() {
+        return new TestSuite(AtomicReferenceTest.class);
+    }
+
+    /**
+     * constructor initializes to given value
+     */
+    public void testConstructor(){
+        AtomicReference ai = new AtomicReference(one);
+	assertEquals(one,ai.get());
+    }
+
+    /**
+     * default constructed initializes to null
+     */
+    public void testConstructor2(){
+        AtomicReference ai = new AtomicReference();
+	assertNull(ai.get());
+    }
+
+    /**
+     * get returns the last value set
+     */
+    public void testGetSet(){
+        AtomicReference ai = new AtomicReference(one);
+	assertEquals(one,ai.get());
+	ai.set(two);
+	assertEquals(two,ai.get());
+	ai.set(m3);
+	assertEquals(m3,ai.get());
+
+    }
+
+    /**
+     * get returns the last value lazySet in same thread
+     */
+    public void testGetLazySet(){
+        AtomicReference ai = new AtomicReference(one);
+        assertEquals(one,ai.get());
+        ai.lazySet(two);
+        assertEquals(two,ai.get());
+        ai.lazySet(m3);
+        assertEquals(m3,ai.get());
+    }
+
+    /**
+     * compareAndSet succeeds in changing value if equal to expected else fails
+     */
+    public void testCompareAndSet(){
+        AtomicReference ai = new AtomicReference(one);
+	assertTrue(ai.compareAndSet(one,two));
+	assertTrue(ai.compareAndSet(two,m4));
+	assertEquals(m4,ai.get());
+	assertFalse(ai.compareAndSet(m5,seven));
+	assertFalse((seven.equals(ai.get())));
+	assertTrue(ai.compareAndSet(m4,seven));
+	assertEquals(seven,ai.get());
+    }
+
+    /**
+     * compareAndSet in one thread enables another waiting for value
+     * to succeed
+     */
+    public void testCompareAndSetInMultipleThreads() {
+        final AtomicReference ai = new AtomicReference(one);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    while(!ai.compareAndSet(two, three)) Thread.yield();
+                }});
+        try {
+            t.start();
+            assertTrue(ai.compareAndSet(one, two));
+            t.join(LONG_DELAY_MS);
+            assertFalse(t.isAlive());
+            assertEquals(ai.get(), three);
+        }
+        catch(Exception e) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * repeated weakCompareAndSet succeeds in changing value when equal
+     * to expected
+     */
+    public void testWeakCompareAndSet(){
+        AtomicReference ai = new AtomicReference(one);
+	while(!ai.weakCompareAndSet(one,two));
+	while(!ai.weakCompareAndSet(two,m4));
+	assertEquals(m4,ai.get());
+        while(!ai.weakCompareAndSet(m4,seven));
+	assertEquals(seven,ai.get());
+    }
+
+    /**
+     * getAndSet returns previous value and sets to given value
+     */
+    public void testGetAndSet(){
+        AtomicReference ai = new AtomicReference(one);
+	assertEquals(one,ai.getAndSet(zero));
+	assertEquals(zero,ai.getAndSet(m10));
+	assertEquals(m10,ai.getAndSet(one));
+    }
+
+    /**
+     * a deserialized serialized atomic holds same value
+     */
+    public void testSerialization() {
+        AtomicReference l = new AtomicReference();
+
+        try {
+            l.set(one);
+            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
+            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
+            out.writeObject(l);
+            out.close();
+
+            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
+            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
+            AtomicReference r = (AtomicReference) in.readObject();
+            assertEquals(l.get(), r.get());
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * toString returns current value.
+     */
+    public void testToString() {
+        AtomicReference ai = new AtomicReference(one);
+        assertEquals(ai.toString(), one.toString());
+        ai.set(two);
+        assertEquals(ai.toString(), two.toString());
+    }
+
+}
+

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicStampedReferenceTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicStampedReferenceTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/AtomicStampedReferenceTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,158 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.concurrent.atomic.*;
+
+public class AtomicStampedReferenceTest extends JSR166TestCase{
+    public static void main (String[] args) {
+        junit.textui.TestRunner.run (suite());
+    }
+    public static Test suite() {
+        return new TestSuite(AtomicStampedReferenceTest.class);
+    }
+
+    /**
+     * constructor initializes to given reference and stamp
+     */
+    public void testConstructor(){
+        AtomicStampedReference ai = new AtomicStampedReference(one, 0);
+	assertEquals(one,ai.getReference());
+	assertEquals(0, ai.getStamp());
+        AtomicStampedReference a2 = new AtomicStampedReference(null, 1);
+	assertNull(a2.getReference());
+	assertEquals(1, a2.getStamp());
+
+    }
+
+    /**
+     *  get returns the last values of reference and stamp set
+     */
+    public void testGetSet(){
+        int[] mark = new int[1];
+        AtomicStampedReference ai = new AtomicStampedReference(one, 0);
+	assertEquals(one,ai.getReference());
+	assertEquals(0, ai.getStamp());
+        assertEquals(one, ai.get(mark));
+        assertEquals(0, mark[0]);
+	ai.set(two, 0);
+	assertEquals(two,ai.getReference());
+	assertEquals(0, ai.getStamp());
+        assertEquals(two, ai.get(mark));
+        assertEquals(0, mark[0]);
+	ai.set(one, 1);
+	assertEquals(one,ai.getReference());
+	assertEquals(1, ai.getStamp());
+        assertEquals(one, ai.get(mark));
+        assertEquals(1,mark[0]);
+    }
+
+    /**
+     *  attemptStamp succeeds in single thread
+     */
+    public void testAttemptStamp(){
+        int[] mark = new int[1];
+        AtomicStampedReference ai = new AtomicStampedReference(one, 0);
+        assertEquals(0, ai.getStamp());
+        assertTrue(ai.attemptStamp(one, 1));
+	assertEquals(1, ai.getStamp());
+        assertEquals(one, ai.get(mark));
+        assertEquals(1, mark[0]);
+    }
+
+    /**
+     * compareAndSet succeeds in changing values if equal to expected reference
+     * and stamp else fails
+     */
+    public void testCompareAndSet(){
+        int[] mark = new int[1];
+        AtomicStampedReference ai = new AtomicStampedReference(one, 0);
+	assertEquals(one, ai.get(mark));
+        assertEquals(0, ai.getStamp());
+	assertEquals(0, mark[0]);
+
+        assertTrue(ai.compareAndSet(one, two, 0, 0));
+	assertEquals(two, ai.get(mark));
+	assertEquals(0, mark[0]);
+
+        assertTrue(ai.compareAndSet(two, m3, 0, 1));
+	assertEquals(m3, ai.get(mark));
+	assertEquals(1, mark[0]);
+
+        assertFalse(ai.compareAndSet(two, m3, 1, 1));
+	assertEquals(m3, ai.get(mark));
+	assertEquals(1, mark[0]);
+    }
+
+    /**
+     * compareAndSet in one thread enables another waiting for reference value
+     * to succeed
+     */
+    public void testCompareAndSetInMultipleThreads() {
+        final AtomicStampedReference ai = new AtomicStampedReference(one, 0);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    while(!ai.compareAndSet(two, three, 0, 0)) Thread.yield();
+                }});
+        try {
+            t.start();
+            assertTrue(ai.compareAndSet(one, two, 0, 0));
+            t.join(LONG_DELAY_MS);
+            assertFalse(t.isAlive());
+            assertEquals(ai.getReference(), three);
+            assertEquals(ai.getStamp(), 0);
+        }
+        catch(Exception e) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * compareAndSet in one thread enables another waiting for stamp value
+     * to succeed
+     */
+    public void testCompareAndSetInMultipleThreads2() {
+        final AtomicStampedReference ai = new AtomicStampedReference(one, 0);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    while(!ai.compareAndSet(one, one, 1, 2)) Thread.yield();
+                }});
+        try {
+            t.start();
+            assertTrue(ai.compareAndSet(one, one, 0, 1));
+            t.join(LONG_DELAY_MS);
+            assertFalse(t.isAlive());
+            assertEquals(ai.getReference(), one);
+            assertEquals(ai.getStamp(), 2);
+        }
+        catch(Exception e) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * repeated weakCompareAndSet succeeds in changing values when equal
+     * to expected
+     */
+    public void testWeakCompareAndSet(){
+        int[] mark = new int[1];
+        AtomicStampedReference ai = new AtomicStampedReference(one, 0);
+	assertEquals(one, ai.get(mark));
+        assertEquals(0, ai.getStamp ());
+	assertEquals(0, mark[0]);
+
+        while(!ai.weakCompareAndSet(one, two, 0, 0));
+	assertEquals(two, ai.get(mark));
+	assertEquals(0, mark[0]);
+
+        while(!ai.weakCompareAndSet(two, m3, 0, 1));
+	assertEquals(m3, ai.get(mark));
+	assertEquals(1, mark[0]);
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/ConcurrentHashMapTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/ConcurrentHashMapTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/ConcurrentHashMapTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,611 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import java.io.*;
+import java.util.Enumeration;
+import java.util.Set;
+import java.util.Collection;
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.Iterator;
+
+public class ConcurrentHashMapTest extends JSR166TestCase{
+    public static void main(String[] args) {
+	junit.textui.TestRunner.run (suite());
+    }
+    public static Test suite() {
+	return new TestSuite(ConcurrentHashMapTest.class);
+    }
+
+    /**
+     * Create a map from Integers 1-5 to Strings "A"-"E".
+     */
+    private static ConcurrentHashMap map5() {
+        ConcurrentHashMap map = new ConcurrentHashMap(5);
+        assertTrue(map.isEmpty());
+        map.put(one, "A");
+        map.put(two, "B");
+        map.put(three, "C");
+        map.put(four, "D");
+        map.put(five, "E");
+        assertFalse(map.isEmpty());
+        assertEquals(5, map.size());
+        return map;
+    }
+
+    /**
+     *  clear removes all pairs
+     */
+    public void testClear() {
+        ConcurrentHashMap map = map5();
+        map.clear();
+        assertEquals(map.size(), 0);
+    }
+
+    /**
+     *  Maps with same contents are equal
+     */
+    public void testEquals() {
+        ConcurrentHashMap map1 = map5();
+        ConcurrentHashMap map2 = map5();
+        assertEquals(map1, map2);
+        assertEquals(map2, map1);
+        map1.clear();
+        assertFalse(map1.equals(map2));
+        assertFalse(map2.equals(map1));
+    }
+
+    /**
+     *  contains returns true for contained value
+     */
+    public void testContains() {
+        ConcurrentHashMap map = map5();
+        assertTrue(map.contains("A"));
+        assertFalse(map.contains("Z"));
+    }
+
+    /**
+     *  containsKey returns true for contained key
+     */
+    public void testContainsKey() {
+        ConcurrentHashMap map = map5();
+        assertTrue(map.containsKey(one));
+        assertFalse(map.containsKey(zero));
+    }
+
+    /**
+     *  containsValue returns true for held values
+     */
+    public void testContainsValue() {
+        ConcurrentHashMap map = map5();
+        assertTrue(map.containsValue("A"));
+        assertFalse(map.containsValue("Z"));
+    }
+
+    /**
+     *   enumeration returns an enumeration containing the correct
+     *   elements
+     */
+    public void testEnumeration() {
+        ConcurrentHashMap map = map5();
+        Enumeration e = map.elements();
+        int count = 0;
+        while(e.hasMoreElements()){
+            count++;
+            e.nextElement();
+        }
+        assertEquals(5, count);
+    }
+
+    /**
+     *  get returns the correct element at the given key,
+     *  or null if not present
+     */
+    public void testGet() {
+        ConcurrentHashMap map = map5();
+        assertEquals("A", (String)map.get(one));
+        ConcurrentHashMap empty = new ConcurrentHashMap();
+        assertNull(map.get("anything"));
+    }
+
+    /**
+     *  isEmpty is true of empty map and false for non-empty
+     */
+    public void testIsEmpty() {
+        ConcurrentHashMap empty = new ConcurrentHashMap();
+        ConcurrentHashMap map = map5();
+        assertTrue(empty.isEmpty());
+        assertFalse(map.isEmpty());
+    }
+
+    /**
+     *   keys returns an enumeration containing all the keys from the map
+     */
+    public void testKeys() {
+        ConcurrentHashMap map = map5();
+        Enumeration e = map.keys();
+        int count = 0;
+        while(e.hasMoreElements()){
+            count++;
+            e.nextElement();
+        }
+        assertEquals(5, count);
+    }
+
+    /**
+     *   keySet returns a Set containing all the keys
+     */
+    public void testKeySet() {
+        ConcurrentHashMap map = map5();
+        Set s = map.keySet();
+        assertEquals(5, s.size());
+        assertTrue(s.contains(one));
+        assertTrue(s.contains(two));
+        assertTrue(s.contains(three));
+        assertTrue(s.contains(four));
+        assertTrue(s.contains(five));
+    }
+
+    /**
+     *  keySet.toArray returns contains all keys
+     */
+    public void testKeySetToArray() {
+        ConcurrentHashMap map = map5();
+        Set s = map.keySet();
+        Object[] ar = s.toArray();
+        assertTrue(s.containsAll(Arrays.asList(ar)));
+        assertEquals(5, ar.length);
+        ar[0] = m10;
+        assertFalse(s.containsAll(Arrays.asList(ar)));
+    }
+
+    /**
+     *  Values.toArray contains all values
+     */
+    public void testValuesToArray() {
+        ConcurrentHashMap map = map5();
+        Collection v = map.values();
+        Object[] ar = v.toArray();
+        ArrayList s = new ArrayList(Arrays.asList(ar));
+        assertEquals(5, ar.length);
+        assertTrue(s.contains("A"));
+        assertTrue(s.contains("B"));
+        assertTrue(s.contains("C"));
+        assertTrue(s.contains("D"));
+        assertTrue(s.contains("E"));
+    }
+
+    /**
+     *  entrySet.toArray contains all entries
+     */
+    public void testEntrySetToArray() {
+        ConcurrentHashMap map = map5();
+        Set s = map.entrySet();
+        Object[] ar = s.toArray();
+        assertEquals(5, ar.length);
+        for (int i = 0; i < 5; ++i) {
+            assertTrue(map.containsKey(((Map.Entry)(ar[i])).getKey()));
+            assertTrue(map.containsValue(((Map.Entry)(ar[i])).getValue()));
+        }
+    }
+
+    /**
+     * values collection contains all values
+     */
+    public void testValues() {
+        ConcurrentHashMap map = map5();
+        Collection s = map.values();
+        assertEquals(5, s.size());
+        assertTrue(s.contains("A"));
+        assertTrue(s.contains("B"));
+        assertTrue(s.contains("C"));
+        assertTrue(s.contains("D"));
+        assertTrue(s.contains("E"));
+    }
+
+    /**
+     * entrySet contains all pairs
+     */
+    public void testEntrySet() {
+        ConcurrentHashMap map = map5();
+        Set s = map.entrySet();
+        assertEquals(5, s.size());
+        Iterator it = s.iterator();
+        while (it.hasNext()) {
+            Map.Entry e = (Map.Entry) it.next();
+            assertTrue(
+                       (e.getKey().equals(one) && e.getValue().equals("A")) ||
+                       (e.getKey().equals(two) && e.getValue().equals("B")) ||
+                       (e.getKey().equals(three) && e.getValue().equals("C")) ||
+                       (e.getKey().equals(four) && e.getValue().equals("D")) ||
+                       (e.getKey().equals(five) && e.getValue().equals("E")));
+        }
+    }
+
+    /**
+     *   putAll  adds all key-value pairs from the given map
+     */
+    public void testPutAll() {
+        ConcurrentHashMap empty = new ConcurrentHashMap();
+        ConcurrentHashMap map = map5();
+        empty.putAll(map);
+        assertEquals(5, empty.size());
+        assertTrue(empty.containsKey(one));
+        assertTrue(empty.containsKey(two));
+        assertTrue(empty.containsKey(three));
+        assertTrue(empty.containsKey(four));
+        assertTrue(empty.containsKey(five));
+    }
+
+    /**
+     *   putIfAbsent works when the given key is not present
+     */
+    public void testPutIfAbsent() {
+        ConcurrentHashMap map = map5();
+        map.putIfAbsent(six, "Z");
+        assertTrue(map.containsKey(six));
+    }
+
+    /**
+     *   putIfAbsent does not add the pair if the key is already present
+     */
+    public void testPutIfAbsent2() {
+        ConcurrentHashMap map = map5();
+        assertEquals("A", map.putIfAbsent(one, "Z"));
+    }
+
+    /**
+     *   replace fails when the given key is not present
+     */
+    public void testReplace() {
+        ConcurrentHashMap map = map5();
+        assertNull(map.replace(six, "Z"));
+        assertFalse(map.containsKey(six));
+    }
+
+    /**
+     *   replace succeeds if the key is already present
+     */
+    public void testReplace2() {
+        ConcurrentHashMap map = map5();
+        assertNotNull(map.replace(one, "Z"));
+        assertEquals("Z", map.get(one));
+    }
+
+
+    /**
+     * replace value fails when the given key not mapped to expected value
+     */
+    public void testReplaceValue() {
+        ConcurrentHashMap map = map5();
+        assertEquals("A", map.get(one));
+        assertFalse(map.replace(one, "Z", "Z"));
+        assertEquals("A", map.get(one));
+    }
+
+    /**
+     * replace value succeeds when the given key mapped to expected value
+     */
+    public void testReplaceValue2() {
+        ConcurrentHashMap map = map5();
+        assertEquals("A", map.get(one));
+        assertTrue(map.replace(one, "A", "Z"));
+        assertEquals("Z", map.get(one));
+    }
+
+
+    /**
+     *   remove removes the correct key-value pair from the map
+     */
+    public void testRemove() {
+        ConcurrentHashMap map = map5();
+        map.remove(five);
+        assertEquals(4, map.size());
+        assertFalse(map.containsKey(five));
+    }
+
+    /**
+     * remove(key,value) removes only if pair present
+     */
+    public void testRemove2() {
+        ConcurrentHashMap map = map5();
+        map.remove(five, "E");
+        assertEquals(4, map.size());
+        assertFalse(map.containsKey(five));
+        map.remove(four, "A");
+        assertEquals(4, map.size());
+        assertTrue(map.containsKey(four));
+
+    }
+
+    /**
+     *   size returns the correct values
+     */
+    public void testSize() {
+        ConcurrentHashMap map = map5();
+        ConcurrentHashMap empty = new ConcurrentHashMap();
+        assertEquals(0, empty.size());
+        assertEquals(5, map.size());
+    }
+
+    /**
+     * toString contains toString of elements
+     */
+    public void testToString() {
+        ConcurrentHashMap map = map5();
+        String s = map.toString();
+        for (int i = 1; i <= 5; ++i) {
+            assertTrue(s.indexOf(String.valueOf(i)) >= 0);
+        }
+    }
+
+    // Exception tests
+
+    /**
+     * Cannot create with negative capacity
+     */
+    public void testConstructor1() {
+        try {
+            new ConcurrentHashMap(-1,0,1);
+            shouldThrow();
+        } catch(IllegalArgumentException e){}
+    }
+
+    /**
+     * Cannot create with negative concurrency level
+     */
+    public void testConstructor2() {
+        try {
+            new ConcurrentHashMap(1,0,-1);
+            shouldThrow();
+        } catch(IllegalArgumentException e){}
+    }
+
+    /**
+     * Cannot create with only negative capacity
+     */
+    public void testConstructor3() {
+        try {
+            new ConcurrentHashMap(-1);
+            shouldThrow();
+        } catch(IllegalArgumentException e){}
+    }
+
+    /**
+     * get(null) throws NPE
+     */
+    public void testGet_NullPointerException() {
+        try {
+            ConcurrentHashMap c = new ConcurrentHashMap(5);
+            c.get(null);
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * containsKey(null) throws NPE
+     */
+    public void testContainsKey_NullPointerException() {
+        try {
+            ConcurrentHashMap c = new ConcurrentHashMap(5);
+            c.containsKey(null);
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * containsValue(null) throws NPE
+     */
+    public void testContainsValue_NullPointerException() {
+        try {
+            ConcurrentHashMap c = new ConcurrentHashMap(5);
+            c.containsValue(null);
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * contains(null) throws NPE
+     */
+    public void testContains_NullPointerException() {
+        try {
+            ConcurrentHashMap c = new ConcurrentHashMap(5);
+            c.contains(null);
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * put(null,x) throws NPE
+     */
+    public void testPut1_NullPointerException() {
+        try {
+            ConcurrentHashMap c = new ConcurrentHashMap(5);
+            c.put(null, "whatever");
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * put(x, null) throws NPE
+     */
+    public void testPut2_NullPointerException() {
+        try {
+            ConcurrentHashMap c = new ConcurrentHashMap(5);
+            c.put("whatever", null);
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * putIfAbsent(null, x) throws NPE
+     */
+    public void testPutIfAbsent1_NullPointerException() {
+        try {
+            ConcurrentHashMap c = new ConcurrentHashMap(5);
+            c.putIfAbsent(null, "whatever");
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * replace(null, x) throws NPE
+     */
+    public void testReplace_NullPointerException() {
+        try {
+            ConcurrentHashMap c = new ConcurrentHashMap(5);
+            c.replace(null, "whatever");
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * replace(null, x, y) throws NPE
+     */
+    public void testReplaceValue_NullPointerException() {
+        try {
+            ConcurrentHashMap c = new ConcurrentHashMap(5);
+            c.replace(null, one, "whatever");
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * putIfAbsent(x, null) throws NPE
+     */
+    public void testPutIfAbsent2_NullPointerException() {
+        try {
+            ConcurrentHashMap c = new ConcurrentHashMap(5);
+            c.putIfAbsent("whatever", null);
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+
+    /**
+     * replace(x, null) throws NPE
+     */
+    public void testReplace2_NullPointerException() {
+        try {
+            ConcurrentHashMap c = new ConcurrentHashMap(5);
+            c.replace("whatever", null);
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * replace(x, null, y) throws NPE
+     */
+    public void testReplaceValue2_NullPointerException() {
+        try {
+            ConcurrentHashMap c = new ConcurrentHashMap(5);
+            c.replace("whatever", null, "A");
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * replace(x, y, null) throws NPE
+     */
+    public void testReplaceValue3_NullPointerException() {
+        try {
+            ConcurrentHashMap c = new ConcurrentHashMap(5);
+            c.replace("whatever", one, null);
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+
+    /**
+     * remove(null) throws NPE
+     */
+    public void testRemove1_NullPointerException() {
+        try {
+            ConcurrentHashMap c = new ConcurrentHashMap(5);
+            c.put("sadsdf", "asdads");
+            c.remove(null);
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * remove(null, x) throws NPE
+     */
+    public void testRemove2_NullPointerException() {
+        try {
+            ConcurrentHashMap c = new ConcurrentHashMap(5);
+            c.put("sadsdf", "asdads");
+            c.remove(null, "whatever");
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * remove(x, null) returns false
+     */
+    public void testRemove3() {
+        try {
+            ConcurrentHashMap c = new ConcurrentHashMap(5);
+            c.put("sadsdf", "asdads");
+            assertFalse(c.remove("sadsdf", null));
+        } catch(NullPointerException e){
+            fail();
+        }
+    }
+
+    /**
+     * A deserialized map equals original
+     */
+    public void testSerialization() {
+        ConcurrentHashMap q = map5();
+
+        try {
+            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
+            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
+            out.writeObject(q);
+            out.close();
+
+            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
+            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
+            ConcurrentHashMap r = (ConcurrentHashMap)in.readObject();
+            assertEquals(q.size(), r.size());
+            assertTrue(q.equals(r));
+            assertTrue(r.equals(q));
+        } catch(Exception e){
+            e.printStackTrace();
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * SetValue of an EntrySet entry sets value in the map.
+     */
+    public void testSetValueWriteThrough() {
+        // Adapted from a bug report by Eric Zoerner
+        ConcurrentHashMap map = new ConcurrentHashMap(2, 5.0f, 1);
+        assertTrue(map.isEmpty());
+        for (int i = 0; i < 20; i++)
+            map.put(new Integer(i), new Integer(i));
+        assertFalse(map.isEmpty());
+        Map.Entry entry1 = (Map.Entry)map.entrySet().iterator().next();
+
+        // assert that entry1 is not 16
+        assertTrue("entry is 16, test not valid",
+                   !entry1.getKey().equals(new Integer(16)));
+
+        // remove 16 (a different key) from map
+        // which just happens to cause entry1 to be cloned in map
+        map.remove(new Integer(16));
+        entry1.setValue("XYZ");
+        assertTrue(map.containsValue("XYZ")); // fails
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/ConcurrentLinkedQueueTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/ConcurrentLinkedQueueTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/ConcurrentLinkedQueueTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,539 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+import junit.framework.*;
+import java.util.Collection;
+import java.util.Arrays;
+import java.util.NoSuchElementException;
+import java.util.Iterator;
+import java.util.ConcurrentModificationException;
+import java.io.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+
+public class ConcurrentLinkedQueueTest extends JSR166TestCase {
+
+    public static void main(String[] args) {
+        junit.textui.TestRunner.run (suite());
+    }
+
+    public static Test suite() {
+        return new TestSuite(ConcurrentLinkedQueueTest.class);
+    }
+
+    /**
+     * Create a queue of given size containing consecutive
+     * Integers 0 ... n.
+     */
+    private ConcurrentLinkedQueue populatedQueue(int n) {
+        ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
+        assertTrue(q.isEmpty());
+        for(int i = 0; i < n; ++i)
+            assertTrue(q.offer(new Integer(i)));
+        assertFalse(q.isEmpty());
+        assertEquals(n, q.size());
+        return q;
+    }
+
+    /**
+     * new queue is empty
+     */
+    public void testConstructor1() {
+        assertEquals(0, new ConcurrentLinkedQueue().size());
+    }
+
+    /**
+     *  Initializing from null Collection throws NPE
+     */
+    public void testConstructor3() {
+        try {
+            ConcurrentLinkedQueue q = new ConcurrentLinkedQueue((Collection)null);
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Initializing from Collection of null elements throws NPE
+     */
+    public void testConstructor4() {
+        try {
+            Integer[] ints = new Integer[SIZE];
+            ConcurrentLinkedQueue q = new ConcurrentLinkedQueue(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Initializing from Collection with some null elements throws NPE
+     */
+    public void testConstructor5() {
+        try {
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE-1; ++i)
+                ints[i] = new Integer(i);
+            ConcurrentLinkedQueue q = new ConcurrentLinkedQueue(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Queue contains all elements of collection used to initialize
+     */
+    public void testConstructor6() {
+        try {
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE; ++i)
+                ints[i] = new Integer(i);
+            ConcurrentLinkedQueue q = new ConcurrentLinkedQueue(Arrays.asList(ints));
+            for (int i = 0; i < SIZE; ++i)
+                assertEquals(ints[i], q.poll());
+        }
+        finally {}
+    }
+
+    /**
+     * isEmpty is true before add, false after
+     */
+    public void testEmpty() {
+        ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
+        assertTrue(q.isEmpty());
+        q.add(one);
+        assertFalse(q.isEmpty());
+        q.add(two);
+        q.remove();
+        q.remove();
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * size changes when elements added and removed
+     */
+    public void testSize() {
+        ConcurrentLinkedQueue q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(SIZE-i, q.size());
+            q.remove();
+        }
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, q.size());
+            q.add(new Integer(i));
+        }
+    }
+
+    /**
+     * offer(null) throws NPE
+     */
+    public void testOfferNull() {
+        try {
+            ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
+            q.offer(null);
+            shouldThrow();
+        } catch (NullPointerException success) { }
+    }
+
+    /**
+     * add(null) throws NPE
+     */
+    public void testAddNull() {
+        try {
+            ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
+            q.add(null);
+            shouldThrow();
+        } catch (NullPointerException success) { }
+    }
+
+
+    /**
+     * Offer returns true
+     */
+    public void testOffer() {
+        ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
+        assertTrue(q.offer(zero));
+        assertTrue(q.offer(one));
+    }
+
+    /**
+     * add returns true
+     */
+    public void testAdd() {
+        ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, q.size());
+            assertTrue(q.add(new Integer(i)));
+        }
+    }
+
+    /**
+     * addAll(null) throws NPE
+     */
+    public void testAddAll1() {
+        try {
+            ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
+            q.addAll(null);
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * addAll(this) throws IAE
+     */
+    public void testAddAllSelf() {
+        try {
+            ConcurrentLinkedQueue q = populatedQueue(SIZE);
+            q.addAll(q);
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success) {}
+    }
+
+    /**
+     * addAll of a collection with null elements throws NPE
+     */
+    public void testAddAll2() {
+        try {
+            ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
+            Integer[] ints = new Integer[SIZE];
+            q.addAll(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+    /**
+     *  addAll of a collection with any null elements throws NPE after
+     * possibly adding some elements
+     */
+    public void testAddAll3() {
+        try {
+            ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE-1; ++i)
+                ints[i] = new Integer(i);
+            q.addAll(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Queue contains all elements, in traversal order, of successful addAll
+     */
+    public void testAddAll5() {
+        try {
+            Integer[] empty = new Integer[0];
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE; ++i)
+                ints[i] = new Integer(i);
+            ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
+            assertFalse(q.addAll(Arrays.asList(empty)));
+            assertTrue(q.addAll(Arrays.asList(ints)));
+            for (int i = 0; i < SIZE; ++i)
+                assertEquals(ints[i], q.poll());
+        }
+        finally {}
+    }
+
+    /**
+     * poll succeeds unless empty
+     */
+    public void testPoll() {
+        ConcurrentLinkedQueue q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.poll()).intValue());
+        }
+        assertNull(q.poll());
+    }
+
+    /**
+     * peek returns next element, or null if empty
+     */
+    public void testPeek() {
+        ConcurrentLinkedQueue q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.peek()).intValue());
+            q.poll();
+            assertTrue(q.peek() == null ||
+                       i != ((Integer)q.peek()).intValue());
+        }
+        assertNull(q.peek());
+    }
+
+    /**
+     * element returns next element, or throws NSEE if empty
+     */
+    public void testElement() {
+        ConcurrentLinkedQueue q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.element()).intValue());
+            q.poll();
+        }
+        try {
+            q.element();
+            shouldThrow();
+        }
+        catch (NoSuchElementException success) {}
+    }
+
+    /**
+     *  remove removes next element, or throws NSEE if empty
+     */
+    public void testRemove() {
+        ConcurrentLinkedQueue q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.remove()).intValue());
+        }
+        try {
+            q.remove();
+            shouldThrow();
+        } catch (NoSuchElementException success){
+        }
+    }
+
+    /**
+     * remove(x) removes x and returns true if present
+     */
+    public void testRemoveElement() {
+        ConcurrentLinkedQueue q = populatedQueue(SIZE);
+        for (int i = 1; i < SIZE; i+=2) {
+            assertTrue(q.remove(new Integer(i)));
+        }
+        for (int i = 0; i < SIZE; i+=2) {
+            assertTrue(q.remove(new Integer(i)));
+            assertFalse(q.remove(new Integer(i+1)));
+        }
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * contains(x) reports true when elements added but not yet removed
+     */
+    public void testContains() {
+        ConcurrentLinkedQueue q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(q.contains(new Integer(i)));
+            q.poll();
+            assertFalse(q.contains(new Integer(i)));
+        }
+    }
+
+    /**
+     * clear removes all elements
+     */
+    public void testClear() {
+        ConcurrentLinkedQueue q = populatedQueue(SIZE);
+        q.clear();
+        assertTrue(q.isEmpty());
+        assertEquals(0, q.size());
+        q.add(one);
+        assertFalse(q.isEmpty());
+        q.clear();
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * containsAll(c) is true when c contains a subset of elements
+     */
+    public void testContainsAll() {
+        ConcurrentLinkedQueue q = populatedQueue(SIZE);
+        ConcurrentLinkedQueue p = new ConcurrentLinkedQueue();
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(q.containsAll(p));
+            assertFalse(p.containsAll(q));
+            p.add(new Integer(i));
+        }
+        assertTrue(p.containsAll(q));
+    }
+
+    /**
+     * retainAll(c) retains only those elements of c and reports true if change
+     */
+    public void testRetainAll() {
+        ConcurrentLinkedQueue q = populatedQueue(SIZE);
+        ConcurrentLinkedQueue p = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            boolean changed = q.retainAll(p);
+            if (i == 0)
+                assertFalse(changed);
+            else
+                assertTrue(changed);
+
+            assertTrue(q.containsAll(p));
+            assertEquals(SIZE-i, q.size());
+            p.remove();
+        }
+    }
+
+    /**
+     * removeAll(c) removes only those elements of c and reports true if changed
+     */
+    public void testRemoveAll() {
+        for (int i = 1; i < SIZE; ++i) {
+            ConcurrentLinkedQueue q = populatedQueue(SIZE);
+            ConcurrentLinkedQueue p = populatedQueue(i);
+            assertTrue(q.removeAll(p));
+            assertEquals(SIZE-i, q.size());
+            for (int j = 0; j < i; ++j) {
+                Integer I = (Integer)(p.remove());
+                assertFalse(q.contains(I));
+            }
+        }
+    }
+
+    /**
+     * toArray contains all elements
+     */
+    public void testToArray() {
+        ConcurrentLinkedQueue q = populatedQueue(SIZE);
+        Object[] o = q.toArray();
+        Arrays.sort(o);
+        for(int i = 0; i < o.length; i++)
+            assertEquals(o[i], q.poll());
+    }
+
+    /**
+     *  toArray(a) contains all elements
+     */
+    public void testToArray2() {
+        ConcurrentLinkedQueue q = populatedQueue(SIZE);
+        Integer[] ints = new Integer[SIZE];
+        ints = (Integer[])q.toArray(ints);
+        Arrays.sort(ints);
+        for(int i = 0; i < ints.length; i++)
+            assertEquals(ints[i], q.poll());
+    }
+
+    /**
+     * toArray(null) throws NPE
+     */
+    public void testToArray_BadArg() {
+        try {
+            ConcurrentLinkedQueue q = populatedQueue(SIZE);
+            Object o[] = q.toArray(null);
+            shouldThrow();
+        } catch(NullPointerException success){}
+    }
+
+    /**
+     * toArray with incompatible array type throws CCE
+     */
+    public void testToArray1_BadArg() {
+        try {
+            ConcurrentLinkedQueue q = populatedQueue(SIZE);
+            Object o[] = q.toArray(new String[10] );
+            shouldThrow();
+        } catch(ArrayStoreException  success){}
+    }
+
+    /**
+     *  iterator iterates through all elements
+     */
+    public void testIterator() {
+        ConcurrentLinkedQueue q = populatedQueue(SIZE);
+        int i = 0;
+        Iterator it = q.iterator();
+        while(it.hasNext()) {
+            assertTrue(q.contains(it.next()));
+            ++i;
+        }
+        assertEquals(i, SIZE);
+    }
+
+    /**
+     * iterator ordering is FIFO
+     */
+    public void testIteratorOrdering() {
+        final ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
+        q.add(one);
+        q.add(two);
+        q.add(three);
+
+        int k = 0;
+        for (Iterator it = q.iterator(); it.hasNext();) {
+            int i = ((Integer)(it.next())).intValue();
+            assertEquals(++k, i);
+        }
+
+        assertEquals(3, k);
+    }
+
+    /**
+     * Modifications do not cause iterators to fail
+     */
+    public void testWeaklyConsistentIteration () {
+        final ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
+        q.add(one);
+        q.add(two);
+        q.add(three);
+
+        try {
+            for (Iterator it = q.iterator(); it.hasNext();) {
+                q.remove();
+                it.next();
+            }
+        }
+        catch (ConcurrentModificationException e) {
+            shouldThrow();
+        }
+
+        assertEquals("queue should be empty again", 0, q.size());
+    }
+
+    /**
+     * iterator.remove removes current element
+     */
+    public void testIteratorRemove () {
+        final ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
+        q.add(one);
+        q.add(two);
+        q.add(three);
+        Iterator it = q.iterator();
+        it.next();
+        it.remove();
+        it = q.iterator();
+        assertEquals(it.next(), two);
+        assertEquals(it.next(), three);
+        assertFalse(it.hasNext());
+    }
+
+
+    /**
+     * toString contains toStrings of elements
+     */
+    public void testToString() {
+        ConcurrentLinkedQueue q = populatedQueue(SIZE);
+        String s = q.toString();
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(s.indexOf(String.valueOf(i)) >= 0);
+        }
+    }
+
+    /**
+     * A deserialized serialized queue has same elements in same order
+     */
+    public void testSerialization() {
+        ConcurrentLinkedQueue q = populatedQueue(SIZE);
+        try {
+            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
+            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
+            out.writeObject(q);
+            out.close();
+
+            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
+            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
+            ConcurrentLinkedQueue r = (ConcurrentLinkedQueue)in.readObject();
+            assertEquals(q.size(), r.size());
+            while (!q.isEmpty())
+                assertEquals(q.remove(), r.remove());
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/ConcurrentSkipListMapTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/ConcurrentSkipListMapTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/ConcurrentSkipListMapTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,1277 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import java.io.*;
+import java.util.Random;
+import java.util.BitSet;
+import java.util.Set;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Collection;
+import java.util.ArrayList;
+import java.util.NoSuchElementException;
+
+public class ConcurrentSkipListMapTest extends JSR166TestCase {
+    public static void main(String[] args) {
+	junit.textui.TestRunner.run (suite());
+    }
+    public static Test suite() {
+	return new TestSuite(ConcurrentSkipListMapTest.class);
+    }
+
+    /**
+     * Create a map from Integers 1-5 to Strings "A"-"E".
+     */
+    private static ConcurrentSkipListMap map5() {
+	ConcurrentSkipListMap map = new ConcurrentSkipListMap();
+        assertTrue(map.isEmpty());
+	map.put(one, "A");
+	map.put(five, "E");
+	map.put(three, "C");
+	map.put(two, "B");
+	map.put(four, "D");
+        assertFalse(map.isEmpty());
+        assertEquals(5, map.size());
+	return map;
+    }
+
+    /**
+     *  clear removes all pairs
+     */
+    public void testClear() {
+        ConcurrentSkipListMap map = map5();
+	map.clear();
+	assertEquals(map.size(), 0);
+    }
+
+    /**
+     *
+     */
+    public void testConstructFromSorted() {
+        ConcurrentSkipListMap map = map5();
+        ConcurrentSkipListMap map2 = new ConcurrentSkipListMap(map);
+        assertEquals(map, map2);
+    }
+
+    /**
+     *  Maps with same contents are equal
+     */
+    public void testEquals() {
+        ConcurrentSkipListMap map1 = map5();
+        ConcurrentSkipListMap map2 = map5();
+        assertEquals(map1, map2);
+        assertEquals(map2, map1);
+	map1.clear();
+        assertFalse(map1.equals(map2));
+        assertFalse(map2.equals(map1));
+    }
+
+    /**
+     *  containsKey returns true for contained key
+     */
+    public void testContainsKey() {
+        ConcurrentSkipListMap map = map5();
+	assertTrue(map.containsKey(one));
+        assertFalse(map.containsKey(zero));
+    }
+
+    /**
+     *  containsValue returns true for held values
+     */
+    public void testContainsValue() {
+        ConcurrentSkipListMap map = map5();
+	assertTrue(map.containsValue("A"));
+        assertFalse(map.containsValue("Z"));
+    }
+
+    /**
+     *  get returns the correct element at the given key,
+     *  or null if not present
+     */
+    public void testGet() {
+        ConcurrentSkipListMap map = map5();
+	assertEquals("A", (String)map.get(one));
+        ConcurrentSkipListMap empty = new ConcurrentSkipListMap();
+        assertNull(empty.get(one));
+    }
+
+    /**
+     *  isEmpty is true of empty map and false for non-empty
+     */
+    public void testIsEmpty() {
+        ConcurrentSkipListMap empty = new ConcurrentSkipListMap();
+        ConcurrentSkipListMap map = map5();
+	assertTrue(empty.isEmpty());
+        assertFalse(map.isEmpty());
+    }
+
+    /**
+     *   firstKey returns first key
+     */
+    public void testFirstKey() {
+        ConcurrentSkipListMap map = map5();
+	assertEquals(one, map.firstKey());
+    }
+
+    /**
+     *   lastKey returns last key
+     */
+    public void testLastKey() {
+        ConcurrentSkipListMap map = map5();
+	assertEquals(five, map.lastKey());
+    }
+
+
+    /**
+     *  keySet.toArray returns contains all keys
+     */
+    public void testKeySetToArray() {
+        ConcurrentSkipListMap map = map5();
+	Set s = map.keySet();
+        Object[] ar = s.toArray();
+        assertTrue(s.containsAll(Arrays.asList(ar)));
+	assertEquals(5, ar.length);
+        ar[0] = m10;
+        assertFalse(s.containsAll(Arrays.asList(ar)));
+    }
+
+    /**
+     *  descendingkeySet.toArray returns contains all keys
+     */
+    public void testDescendingKeySetToArray() {
+        ConcurrentSkipListMap map = map5();
+	Set s = map.descendingKeySet();
+        Object[] ar = s.toArray();
+	assertEquals(5, ar.length);
+        assertTrue(s.containsAll(Arrays.asList(ar)));
+        ar[0] = m10;
+        assertFalse(s.containsAll(Arrays.asList(ar)));
+    }
+
+    /**
+     *   keySet returns a Set containing all the keys
+     */
+    public void testKeySet() {
+        ConcurrentSkipListMap map = map5();
+	Set s = map.keySet();
+	assertEquals(5, s.size());
+	assertTrue(s.contains(one));
+	assertTrue(s.contains(two));
+	assertTrue(s.contains(three));
+	assertTrue(s.contains(four));
+	assertTrue(s.contains(five));
+    }
+
+    /**
+     *   keySet is ordered
+     */
+    public void testKeySetOrder() {
+        ConcurrentSkipListMap map = map5();
+	Set s = map.keySet();
+        Iterator i = s.iterator();
+        Integer last = (Integer)i.next();
+        assertEquals(last, one);
+        while (i.hasNext()) {
+            Integer k = (Integer)i.next();
+            assertTrue(last.compareTo(k) < 0);
+            last = k;
+        }
+    }
+
+    /**
+     *   descendingKeySet is ordered
+     */
+    public void testDescendingKeySetOrder() {
+        ConcurrentSkipListMap map = map5();
+	Set s = map.descendingKeySet();
+        Iterator i = s.iterator();
+        Integer last = (Integer)i.next();
+        assertEquals(last, five);
+        while (i.hasNext()) {
+            Integer k = (Integer)i.next();
+            assertTrue(last.compareTo(k) > 0);
+            last = k;
+        }
+    }
+
+
+    /**
+     *  Values.toArray contains all values
+     */
+    public void testValuesToArray() {
+        ConcurrentSkipListMap map = map5();
+	Collection v = map.values();
+        Object[] ar = v.toArray();
+        ArrayList s = new ArrayList(Arrays.asList(ar));
+	assertEquals(5, ar.length);
+	assertTrue(s.contains("A"));
+	assertTrue(s.contains("B"));
+	assertTrue(s.contains("C"));
+	assertTrue(s.contains("D"));
+	assertTrue(s.contains("E"));
+    }
+
+    /**
+     * values collection contains all values
+     */
+    public void testValues() {
+        ConcurrentSkipListMap map = map5();
+	Collection s = map.values();
+	assertEquals(5, s.size());
+	assertTrue(s.contains("A"));
+	assertTrue(s.contains("B"));
+	assertTrue(s.contains("C"));
+	assertTrue(s.contains("D"));
+	assertTrue(s.contains("E"));
+    }
+
+    /**
+     * entrySet contains all pairs
+     */
+    public void testEntrySet() {
+        ConcurrentSkipListMap map = map5();
+	Set s = map.entrySet();
+	assertEquals(5, s.size());
+        Iterator it = s.iterator();
+        while (it.hasNext()) {
+            Map.Entry e = (Map.Entry) it.next();
+            assertTrue(
+                       (e.getKey().equals(one) && e.getValue().equals("A")) ||
+                       (e.getKey().equals(two) && e.getValue().equals("B")) ||
+                       (e.getKey().equals(three) && e.getValue().equals("C")) ||
+                       (e.getKey().equals(four) && e.getValue().equals("D")) ||
+                       (e.getKey().equals(five) && e.getValue().equals("E")));
+        }
+    }
+
+    /**
+     * descendingEntrySet contains all pairs
+     */
+    public void testDescendingEntrySet() {
+        ConcurrentSkipListMap map = map5();
+	Set s = map.descendingMap().entrySet();
+	assertEquals(5, s.size());
+        Iterator it = s.iterator();
+        while (it.hasNext()) {
+            Map.Entry e = (Map.Entry) it.next();
+            assertTrue(
+                       (e.getKey().equals(one) && e.getValue().equals("A")) ||
+                       (e.getKey().equals(two) && e.getValue().equals("B")) ||
+                       (e.getKey().equals(three) && e.getValue().equals("C")) ||
+                       (e.getKey().equals(four) && e.getValue().equals("D")) ||
+                       (e.getKey().equals(five) && e.getValue().equals("E")));
+        }
+    }
+
+    /**
+     *  entrySet.toArray contains all entries
+     */
+    public void testEntrySetToArray() {
+        ConcurrentSkipListMap map = map5();
+	Set s = map.entrySet();
+        Object[] ar = s.toArray();
+        assertEquals(5, ar.length);
+        for (int i = 0; i < 5; ++i) {
+            assertTrue(map.containsKey(((Map.Entry)(ar[i])).getKey()));
+            assertTrue(map.containsValue(((Map.Entry)(ar[i])).getValue()));
+        }
+    }
+
+    /**
+     *  descendingEntrySet.toArray contains all entries
+     */
+    public void testDescendingEntrySetToArray() {
+        ConcurrentSkipListMap map = map5();
+	Set s = map.descendingMap().entrySet();
+        Object[] ar = s.toArray();
+        assertEquals(5, ar.length);
+        for (int i = 0; i < 5; ++i) {
+            assertTrue(map.containsKey(((Map.Entry)(ar[i])).getKey()));
+            assertTrue(map.containsValue(((Map.Entry)(ar[i])).getValue()));
+        }
+    }
+
+    /**
+     *   putAll  adds all key-value pairs from the given map
+     */
+    public void testPutAll() {
+        ConcurrentSkipListMap empty = new ConcurrentSkipListMap();
+        ConcurrentSkipListMap map = map5();
+	empty.putAll(map);
+	assertEquals(5, empty.size());
+	assertTrue(empty.containsKey(one));
+	assertTrue(empty.containsKey(two));
+	assertTrue(empty.containsKey(three));
+	assertTrue(empty.containsKey(four));
+	assertTrue(empty.containsKey(five));
+    }
+
+    /**
+     *   putIfAbsent works when the given key is not present
+     */
+    public void testPutIfAbsent() {
+        ConcurrentSkipListMap map = map5();
+	map.putIfAbsent(six, "Z");
+        assertTrue(map.containsKey(six));
+    }
+
+    /**
+     *   putIfAbsent does not add the pair if the key is already present
+     */
+    public void testPutIfAbsent2() {
+        ConcurrentSkipListMap map = map5();
+        assertEquals("A", map.putIfAbsent(one, "Z"));
+    }
+
+    /**
+     *   replace fails when the given key is not present
+     */
+    public void testReplace() {
+        ConcurrentSkipListMap map = map5();
+	assertNull(map.replace(six, "Z"));
+        assertFalse(map.containsKey(six));
+    }
+
+    /**
+     *   replace succeeds if the key is already present
+     */
+    public void testReplace2() {
+        ConcurrentSkipListMap map = map5();
+        assertNotNull(map.replace(one, "Z"));
+        assertEquals("Z", map.get(one));
+    }
+
+
+    /**
+     * replace value fails when the given key not mapped to expected value
+     */
+    public void testReplaceValue() {
+        ConcurrentSkipListMap map = map5();
+        assertEquals("A", map.get(one));
+	assertFalse(map.replace(one, "Z", "Z"));
+        assertEquals("A", map.get(one));
+    }
+
+    /**
+     * replace value succeeds when the given key mapped to expected value
+     */
+    public void testReplaceValue2() {
+        ConcurrentSkipListMap map = map5();
+        assertEquals("A", map.get(one));
+	assertTrue(map.replace(one, "A", "Z"));
+        assertEquals("Z", map.get(one));
+    }
+
+
+    /**
+     *   remove removes the correct key-value pair from the map
+     */
+    public void testRemove() {
+        ConcurrentSkipListMap map = map5();
+	map.remove(five);
+	assertEquals(4, map.size());
+	assertFalse(map.containsKey(five));
+    }
+
+    /**
+     * remove(key,value) removes only if pair present
+     */
+    public void testRemove2() {
+        ConcurrentSkipListMap map = map5();
+	assertTrue(map.containsKey(five));
+        assertEquals("E", map.get(five));
+	map.remove(five, "E");
+	assertEquals(4, map.size());
+	assertFalse(map.containsKey(five));
+	map.remove(four, "A");
+	assertEquals(4, map.size());
+	assertTrue(map.containsKey(four));
+
+    }
+
+    /**
+     * lowerEntry returns preceding entry.
+     */
+    public void testLowerEntry() {
+        ConcurrentSkipListMap map = map5();
+        Map.Entry e1 = map.lowerEntry(three);
+        assertEquals(two, e1.getKey());
+
+        Map.Entry e2 = map.lowerEntry(six);
+        assertEquals(five, e2.getKey());
+
+        Map.Entry e3 = map.lowerEntry(one);
+        assertNull(e3);
+
+        Map.Entry e4 = map.lowerEntry(zero);
+        assertNull(e4);
+
+    }
+
+    /**
+     * higherEntry returns next entry.
+     */
+    public void testHigherEntry() {
+        ConcurrentSkipListMap map = map5();
+        Map.Entry e1 = map.higherEntry(three);
+        assertEquals(four, e1.getKey());
+
+        Map.Entry e2 = map.higherEntry(zero);
+        assertEquals(one, e2.getKey());
+
+        Map.Entry e3 = map.higherEntry(five);
+        assertNull(e3);
+
+        Map.Entry e4 = map.higherEntry(six);
+        assertNull(e4);
+
+    }
+
+    /**
+     * floorEntry returns preceding entry.
+     */
+    public void testFloorEntry() {
+        ConcurrentSkipListMap map = map5();
+        Map.Entry e1 = map.floorEntry(three);
+        assertEquals(three, e1.getKey());
+
+        Map.Entry e2 = map.floorEntry(six);
+        assertEquals(five, e2.getKey());
+
+        Map.Entry e3 = map.floorEntry(one);
+        assertEquals(one, e3.getKey());
+
+        Map.Entry e4 = map.floorEntry(zero);
+        assertNull(e4);
+
+    }
+
+    /**
+     * ceilingEntry returns next entry.
+     */
+    public void testCeilingEntry() {
+        ConcurrentSkipListMap map = map5();
+        Map.Entry e1 = map.ceilingEntry(three);
+        assertEquals(three, e1.getKey());
+
+        Map.Entry e2 = map.ceilingEntry(zero);
+        assertEquals(one, e2.getKey());
+
+        Map.Entry e3 = map.ceilingEntry(five);
+        assertEquals(five, e3.getKey());
+
+        Map.Entry e4 = map.ceilingEntry(six);
+        assertNull(e4);
+
+    }
+
+    /**
+     * lowerEntry, higherEntry, ceilingEntry, and floorEntry return
+     * imutable entries
+     */
+    public void testEntryImmutablity() {
+        ConcurrentSkipListMap map = map5();
+        Map.Entry e = map.lowerEntry(three);
+        assertEquals(two, e.getKey());
+        try {
+            e.setValue("X");
+            fail();
+        } catch(UnsupportedOperationException success) {}
+        e = map.higherEntry(zero);
+        assertEquals(one, e.getKey());
+        try {
+            e.setValue("X");
+            fail();
+        } catch(UnsupportedOperationException success) {}
+        e = map.floorEntry(one);
+        assertEquals(one, e.getKey());
+        try {
+            e.setValue("X");
+            fail();
+        } catch(UnsupportedOperationException success) {}
+        e = map.ceilingEntry(five);
+        assertEquals(five, e.getKey());
+        try {
+            e.setValue("X");
+            fail();
+        } catch(UnsupportedOperationException success) {}
+    }
+
+
+
+    /**
+     * lowerKey returns preceding element
+     */
+    public void testLowerKey() {
+        ConcurrentSkipListMap q = map5();
+        Object e1 = q.lowerKey(three);
+        assertEquals(two, e1);
+
+        Object e2 = q.lowerKey(six);
+        assertEquals(five, e2);
+
+        Object e3 = q.lowerKey(one);
+        assertNull(e3);
+
+        Object e4 = q.lowerKey(zero);
+        assertNull(e4);
+
+    }
+
+    /**
+     * higherKey returns next element
+     */
+    public void testHigherKey() {
+        ConcurrentSkipListMap q = map5();
+        Object e1 = q.higherKey(three);
+        assertEquals(four, e1);
+
+        Object e2 = q.higherKey(zero);
+        assertEquals(one, e2);
+
+        Object e3 = q.higherKey(five);
+        assertNull(e3);
+
+        Object e4 = q.higherKey(six);
+        assertNull(e4);
+
+    }
+
+    /**
+     * floorKey returns preceding element
+     */
+    public void testFloorKey() {
+        ConcurrentSkipListMap q = map5();
+        Object e1 = q.floorKey(three);
+        assertEquals(three, e1);
+
+        Object e2 = q.floorKey(six);
+        assertEquals(five, e2);
+
+        Object e3 = q.floorKey(one);
+        assertEquals(one, e3);
+
+        Object e4 = q.floorKey(zero);
+        assertNull(e4);
+
+    }
+
+    /**
+     * ceilingKey returns next element
+     */
+    public void testCeilingKey() {
+        ConcurrentSkipListMap q = map5();
+        Object e1 = q.ceilingKey(three);
+        assertEquals(three, e1);
+
+        Object e2 = q.ceilingKey(zero);
+        assertEquals(one, e2);
+
+        Object e3 = q.ceilingKey(five);
+        assertEquals(five, e3);
+
+        Object e4 = q.ceilingKey(six);
+        assertNull(e4);
+
+    }
+
+    /**
+     * pollFirstEntry returns entries in order
+     */
+    public void testPollFirstEntry() {
+        ConcurrentSkipListMap map = map5();
+        Map.Entry e = map.pollFirstEntry();
+        assertEquals(one, e.getKey());
+        assertEquals("A", e.getValue());
+        e = map.pollFirstEntry();
+        assertEquals(two, e.getKey());
+        map.put(one, "A");
+        e = map.pollFirstEntry();
+        assertEquals(one, e.getKey());
+        assertEquals("A", e.getValue());
+        e = map.pollFirstEntry();
+        assertEquals(three, e.getKey());
+        map.remove(four);
+        e = map.pollFirstEntry();
+        assertEquals(five, e.getKey());
+        try {
+            e.setValue("A");
+            shouldThrow();
+        } catch (Exception ok) {
+        }
+        e = map.pollFirstEntry();
+        assertNull(e);
+    }
+
+    /**
+     * pollLastEntry returns entries in order
+     */
+    public void testPollLastEntry() {
+        ConcurrentSkipListMap map = map5();
+        Map.Entry e = map.pollLastEntry();
+        assertEquals(five, e.getKey());
+        assertEquals("E", e.getValue());
+        e = map.pollLastEntry();
+        assertEquals(four, e.getKey());
+        map.put(five, "E");
+        e = map.pollLastEntry();
+        assertEquals(five, e.getKey());
+        assertEquals("E", e.getValue());
+        e = map.pollLastEntry();
+        assertEquals(three, e.getKey());
+        map.remove(two);
+        e = map.pollLastEntry();
+        assertEquals(one, e.getKey());
+        try {
+            e.setValue("E");
+            shouldThrow();
+        } catch (Exception ok) {
+        }
+        e = map.pollLastEntry();
+        assertNull(e);
+    }
+
+    /**
+     *   size returns the correct values
+     */
+    public void testSize() {
+        ConcurrentSkipListMap map = map5();
+        ConcurrentSkipListMap empty = new ConcurrentSkipListMap();
+	assertEquals(0, empty.size());
+	assertEquals(5, map.size());
+    }
+
+    /**
+     * toString contains toString of elements
+     */
+    public void testToString() {
+        ConcurrentSkipListMap map = map5();
+        String s = map.toString();
+        for (int i = 1; i <= 5; ++i) {
+            assertTrue(s.indexOf(String.valueOf(i)) >= 0);
+        }
+    }
+
+    // Exception tests
+
+    /**
+     * get(null) of nonempty map throws NPE
+     */
+    public void testGet_NullPointerException() {
+        try {
+            ConcurrentSkipListMap c = map5();
+            c.get(null);
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * containsKey(null) of nonempty map throws NPE
+     */
+    public void testContainsKey_NullPointerException() {
+        try {
+            ConcurrentSkipListMap c = map5();
+            c.containsKey(null);
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * containsValue(null) throws NPE
+     */
+    public void testContainsValue_NullPointerException() {
+        try {
+            ConcurrentSkipListMap c = new ConcurrentSkipListMap();
+            c.containsValue(null);
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+
+    /**
+     * put(null,x) throws NPE
+     */
+    public void testPut1_NullPointerException() {
+        try {
+            ConcurrentSkipListMap c = map5();
+            c.put(null, "whatever");
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * putIfAbsent(null, x) throws NPE
+     */
+    public void testPutIfAbsent1_NullPointerException() {
+        try {
+            ConcurrentSkipListMap c = map5();
+            c.putIfAbsent(null, "whatever");
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * replace(null, x) throws NPE
+     */
+    public void testReplace_NullPointerException() {
+        try {
+            ConcurrentSkipListMap c = map5();
+            c.replace(null, "whatever");
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * replace(null, x, y) throws NPE
+     */
+    public void testReplaceValue_NullPointerException() {
+        try {
+            ConcurrentSkipListMap c = map5();
+            c.replace(null, one, "whatever");
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * remove(null) throws NPE
+     */
+    public void testRemove1_NullPointerException() {
+        try {
+            ConcurrentSkipListMap c = new ConcurrentSkipListMap();
+            c.put("sadsdf", "asdads");
+            c.remove(null);
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * remove(null, x) throws NPE
+     */
+    public void testRemove2_NullPointerException() {
+        try {
+            ConcurrentSkipListMap c = new ConcurrentSkipListMap();
+            c.put("sadsdf", "asdads");
+            c.remove(null, "whatever");
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * remove(x, null) returns false
+     */
+    public void testRemove3() {
+        try {
+            ConcurrentSkipListMap c = new ConcurrentSkipListMap();
+            c.put("sadsdf", "asdads");
+            assertFalse(c.remove("sadsdf", null));
+        } catch(NullPointerException e){
+            fail();
+        }
+    }
+
+    /**
+     * A deserialized map equals original
+     */
+    public void testSerialization() {
+        ConcurrentSkipListMap q = map5();
+
+        try {
+            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
+            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
+            out.writeObject(q);
+            out.close();
+
+            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
+            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
+            ConcurrentSkipListMap r = (ConcurrentSkipListMap)in.readObject();
+            assertEquals(q.size(), r.size());
+            assertTrue(q.equals(r));
+            assertTrue(r.equals(q));
+        } catch(Exception e){
+            e.printStackTrace();
+            unexpectedException();
+        }
+    }
+
+
+
+    /**
+     * subMap returns map with keys in requested range
+     */
+    public void testSubMapContents() {
+        ConcurrentSkipListMap map = map5();
+        NavigableMap sm = map.subMap(two, true, four, false);
+        assertEquals(two, sm.firstKey());
+        assertEquals(three, sm.lastKey());
+        assertEquals(2, sm.size());
+        assertFalse(sm.containsKey(one));
+        assertTrue(sm.containsKey(two));
+        assertTrue(sm.containsKey(three));
+        assertFalse(sm.containsKey(four));
+        assertFalse(sm.containsKey(five));
+        Iterator i = sm.keySet().iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(two, k);
+        k = (Integer)(i.next());
+        assertEquals(three, k);
+        assertFalse(i.hasNext());
+        Iterator r = sm.descendingKeySet().iterator();
+        k = (Integer)(r.next());
+        assertEquals(three, k);
+        k = (Integer)(r.next());
+        assertEquals(two, k);
+        assertFalse(r.hasNext());
+
+        Iterator j = sm.keySet().iterator();
+        j.next();
+        j.remove();
+        assertFalse(map.containsKey(two));
+        assertEquals(4, map.size());
+        assertEquals(1, sm.size());
+        assertEquals(three, sm.firstKey());
+        assertEquals(three, sm.lastKey());
+        assertTrue(sm.remove(three) != null);
+        assertTrue(sm.isEmpty());
+        assertEquals(3, map.size());
+    }
+
+    public void testSubMapContents2() {
+        ConcurrentSkipListMap map = map5();
+        NavigableMap sm = map.subMap(two, true, three, false);
+        assertEquals(1, sm.size());
+        assertEquals(two, sm.firstKey());
+        assertEquals(two, sm.lastKey());
+        assertFalse(sm.containsKey(one));
+        assertTrue(sm.containsKey(two));
+        assertFalse(sm.containsKey(three));
+        assertFalse(sm.containsKey(four));
+        assertFalse(sm.containsKey(five));
+        Iterator i = sm.keySet().iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(two, k);
+        assertFalse(i.hasNext());
+        Iterator r = sm.descendingKeySet().iterator();
+        k = (Integer)(r.next());
+        assertEquals(two, k);
+        assertFalse(r.hasNext());
+
+        Iterator j = sm.keySet().iterator();
+        j.next();
+        j.remove();
+        assertFalse(map.containsKey(two));
+        assertEquals(4, map.size());
+        assertEquals(0, sm.size());
+        assertTrue(sm.isEmpty());
+        assertTrue(sm.remove(three) == null);
+        assertEquals(4, map.size());
+    }
+
+    /**
+     * headMap returns map with keys in requested range
+     */
+    public void testHeadMapContents() {
+        ConcurrentSkipListMap map = map5();
+        NavigableMap sm = map.headMap(four, false);
+        assertTrue(sm.containsKey(one));
+        assertTrue(sm.containsKey(two));
+        assertTrue(sm.containsKey(three));
+        assertFalse(sm.containsKey(four));
+        assertFalse(sm.containsKey(five));
+        Iterator i = sm.keySet().iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(one, k);
+        k = (Integer)(i.next());
+        assertEquals(two, k);
+        k = (Integer)(i.next());
+        assertEquals(three, k);
+        assertFalse(i.hasNext());
+        sm.clear();
+        assertTrue(sm.isEmpty());
+        assertEquals(2, map.size());
+        assertEquals(four, map.firstKey());
+    }
+
+    /**
+     * tailMap returns map with keys in requested range
+     */
+    public void testTailMapContents() {
+        ConcurrentSkipListMap map = map5();
+        NavigableMap sm = map.tailMap(two, true);
+        assertFalse(sm.containsKey(one));
+        assertTrue(sm.containsKey(two));
+        assertTrue(sm.containsKey(three));
+        assertTrue(sm.containsKey(four));
+        assertTrue(sm.containsKey(five));
+        Iterator i = sm.keySet().iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(two, k);
+        k = (Integer)(i.next());
+        assertEquals(three, k);
+        k = (Integer)(i.next());
+        assertEquals(four, k);
+        k = (Integer)(i.next());
+        assertEquals(five, k);
+        assertFalse(i.hasNext());
+        Iterator r = sm.descendingKeySet().iterator();
+        k = (Integer)(r.next());
+        assertEquals(five, k);
+        k = (Integer)(r.next());
+        assertEquals(four, k);
+        k = (Integer)(r.next());
+        assertEquals(three, k);
+        k = (Integer)(r.next());
+        assertEquals(two, k);
+        assertFalse(r.hasNext());
+
+        Iterator ei = sm.entrySet().iterator();
+        Map.Entry e;
+        e = (Map.Entry)(ei.next());
+        assertEquals(two, e.getKey());
+        assertEquals("B", e.getValue());
+        e = (Map.Entry)(ei.next());
+        assertEquals(three, e.getKey());
+        assertEquals("C", e.getValue());
+        e = (Map.Entry)(ei.next());
+        assertEquals(four, e.getKey());
+        assertEquals("D", e.getValue());
+        e = (Map.Entry)(ei.next());
+        assertEquals(five, e.getKey());
+        assertEquals("E", e.getValue());
+        assertFalse(i.hasNext());
+
+        NavigableMap ssm = sm.tailMap(four, true);
+        assertEquals(four, ssm.firstKey());
+        assertEquals(five, ssm.lastKey());
+        assertTrue(ssm.remove(four) != null);
+        assertEquals(1, ssm.size());
+        assertEquals(3, sm.size());
+        assertEquals(4, map.size());
+    }
+
+    Random rnd = new Random(666);
+    BitSet bs;
+
+    /**
+     * Submaps of submaps subdivide correctly
+     */
+    public void testRecursiveSubMaps() {
+	int mapSize = 1000;
+	Class cl = ConcurrentSkipListMap.class;
+        NavigableMap map = newMap(cl);
+        bs = new BitSet(mapSize);
+
+        populate(map, mapSize);
+        check(map,                 0, mapSize - 1, true);
+        check(map.descendingMap(), 0, mapSize - 1, false);
+
+        mutateMap(map, 0, mapSize - 1);
+        check(map,                 0, mapSize - 1, true);
+        check(map.descendingMap(), 0, mapSize - 1, false);
+
+        bashSubMap(map.subMap(new Integer(0), true, new Integer(mapSize), false),
+                   0, mapSize - 1, true);
+    }
+
+    static NavigableMap newMap(Class cl) {
+        NavigableMap result = null;
+	try {
+            result = (NavigableMap) cl.newInstance();
+	} catch(Exception e) {
+            fail();
+	}
+        assertEquals(result.size(), 0);
+        assertFalse(result.keySet().iterator().hasNext());
+        return result;
+    }
+
+    void populate(NavigableMap map, int limit) {
+        for (int i = 0, n = 2 * limit / 3; i < n; i++) {
+            int key = rnd.nextInt(limit);
+            put(map, key);
+        }
+    }
+
+    void mutateMap(NavigableMap map, int min, int max) {
+        int size = map.size();
+        int rangeSize = max - min + 1;
+
+        // Remove a bunch of entries directly
+        for (int i = 0, n = rangeSize / 2; i < n; i++) {
+            remove(map, min - 5 + rnd.nextInt(rangeSize + 10));
+        }
+
+        // Remove a bunch of entries with iterator
+        for(Iterator it = map.keySet().iterator(); it.hasNext(); ) {
+            if (rnd.nextBoolean()) {
+                bs.clear(((Integer)it.next()).intValue());
+                it.remove();
+            }
+        }
+
+        // Add entries till we're back to original size
+        while (map.size() < size) {
+            int key = min + rnd.nextInt(rangeSize);
+            assertTrue(key >= min && key<= max);
+            put(map, key);
+        }
+    }
+
+    void mutateSubMap(NavigableMap map, int min, int max) {
+        int size = map.size();
+        int rangeSize = max - min + 1;
+
+        // Remove a bunch of entries directly
+        for (int i = 0, n = rangeSize / 2; i < n; i++) {
+            remove(map, min - 5 + rnd.nextInt(rangeSize + 10));
+        }
+
+        // Remove a bunch of entries with iterator
+        for(Iterator it = map.keySet().iterator(); it.hasNext(); ) {
+            if (rnd.nextBoolean()) {
+                bs.clear(((Integer)it.next()).intValue());
+                it.remove();
+            }
+        }
+
+        // Add entries till we're back to original size
+        while (map.size() < size) {
+            int key = min - 5 + rnd.nextInt(rangeSize + 10);
+            if (key >= min && key<= max) {
+                put(map, key);
+            } else {
+                try {
+                    map.put(new Integer(key), new Integer(2 * key));
+                    fail();
+                } catch(IllegalArgumentException e) {
+                    // expected
+                }
+            }
+        }
+    }
+
+    void put(NavigableMap map, int key) {
+        if (map.put(new Integer(key), new Integer(2 * key)) == null)
+            bs.set(key);
+    }
+
+    void remove(NavigableMap map, int key) {
+        if (map.remove(new Integer(key)) != null)
+            bs.clear(key);
+    }
+
+    void bashSubMap(NavigableMap map,
+                    int min, int max, boolean ascending) {
+        check(map, min, max, ascending);
+        check(map.descendingMap(), min, max, !ascending);
+
+        mutateSubMap(map, min, max);
+        check(map, min, max, ascending);
+        check(map.descendingMap(), min, max, !ascending);
+
+        // Recurse
+        if (max - min < 2)
+            return;
+        int midPoint = (min + max) / 2;
+
+        // headMap - pick direction and endpoint inclusion randomly
+        boolean incl = rnd.nextBoolean();
+        NavigableMap hm = map.headMap(new Integer(midPoint), incl);
+        if (ascending) {
+            if (rnd.nextBoolean())
+                bashSubMap(hm, min, midPoint - (incl ? 0 : 1), true);
+            else
+                bashSubMap(hm.descendingMap(), min, midPoint - (incl ? 0 : 1),
+                           false);
+        } else {
+            if (rnd.nextBoolean())
+                bashSubMap(hm, midPoint + (incl ? 0 : 1), max, false);
+            else
+                bashSubMap(hm.descendingMap(), midPoint + (incl ? 0 : 1), max,
+                           true);
+        }
+
+        // tailMap - pick direction and endpoint inclusion randomly
+        incl = rnd.nextBoolean();
+        NavigableMap tm = map.tailMap(new Integer(midPoint),incl);
+        if (ascending) {
+            if (rnd.nextBoolean())
+                bashSubMap(tm, midPoint + (incl ? 0 : 1), max, true);
+            else
+                bashSubMap(tm.descendingMap(), midPoint + (incl ? 0 : 1), max,
+                           false);
+        } else {
+            if (rnd.nextBoolean()) {
+                bashSubMap(tm, min, midPoint - (incl ? 0 : 1), false);
+            } else {
+                bashSubMap(tm.descendingMap(), min, midPoint - (incl ? 0 : 1),
+                           true);
+            }
+        }
+
+        // subMap - pick direction and endpoint inclusion randomly
+        int rangeSize = max - min + 1;
+        int[] endpoints = new int[2];
+        endpoints[0] = min + rnd.nextInt(rangeSize);
+        endpoints[1] = min + rnd.nextInt(rangeSize);
+        Arrays.sort(endpoints);
+        boolean lowIncl = rnd.nextBoolean();
+        boolean highIncl = rnd.nextBoolean();
+        if (ascending) {
+            NavigableMap sm = map.subMap(
+                new Integer(endpoints[0]), lowIncl, new Integer(endpoints[1]), highIncl);
+            if (rnd.nextBoolean())
+                bashSubMap(sm, endpoints[0] + (lowIncl ? 0 : 1),
+                           endpoints[1] - (highIncl ? 0 : 1), true);
+            else
+                bashSubMap(sm.descendingMap(), endpoints[0] + (lowIncl ? 0 : 1),
+                           endpoints[1] - (highIncl ? 0 : 1), false);
+        } else {
+            NavigableMap sm = map.subMap(
+                new Integer(endpoints[1]), highIncl, new Integer(endpoints[0]), lowIncl);
+            if (rnd.nextBoolean())
+                bashSubMap(sm, endpoints[0] + (lowIncl ? 0 : 1),
+                           endpoints[1] - (highIncl ? 0 : 1), false);
+            else
+                bashSubMap(sm.descendingMap(), endpoints[0] + (lowIncl ? 0 : 1),
+                           endpoints[1] - (highIncl ? 0 : 1), true);
+        }
+    }
+
+    /**
+     * min and max are both inclusive.  If max < min, interval is empty.
+     */
+    void check(NavigableMap map,
+                      final int min, final int max, final boolean ascending) {
+       class ReferenceSet {
+            int lower(int key) {
+                return ascending ? lowerAscending(key) : higherAscending(key);
+            }
+            int floor(int key) {
+                return ascending ? floorAscending(key) : ceilingAscending(key);
+            }
+            int ceiling(int key) {
+                return ascending ? ceilingAscending(key) : floorAscending(key);
+            }
+            int higher(int key) {
+                return ascending ? higherAscending(key) : lowerAscending(key);
+            }
+            int first() {
+                return ascending ? firstAscending() : lastAscending();
+            }
+            int last() {
+                return ascending ? lastAscending() : firstAscending();
+            }
+            int lowerAscending(int key) {
+                return floorAscending(key - 1);
+            }
+            int floorAscending(int key) {
+                if (key < min)
+                    return -1;
+                else if (key > max)
+                    key = max;
+
+                // BitSet should support this! Test would run much faster
+                while (key >= min) {
+                    if (bs.get(key))
+                        return(key);
+                    key--;
+                }
+                return -1;
+            }
+            int ceilingAscending(int key) {
+                if (key < min)
+                    key = min;
+                else if (key > max)
+                    return -1;
+                int result = bs.nextSetBit(key);
+                return result > max ? -1 : result;
+            }
+            int higherAscending(int key) {
+                return ceilingAscending(key + 1);
+            }
+            private int firstAscending() {
+                int result = ceilingAscending(min);
+                return result > max ? -1 : result;
+            }
+            private int lastAscending() {
+                int result = floorAscending(max);
+                return result < min ? -1 : result;
+            }
+        }
+        ReferenceSet rs = new ReferenceSet();
+
+        // Test contents using containsKey
+        int size = 0;
+        for (int i = min; i <= max; i++) {
+            boolean bsContainsI = bs.get(i);
+            assertEquals(bsContainsI, map.containsKey(new Integer(i)));
+            if (bsContainsI)
+                size++;
+        }
+        assertEquals(map.size(), size);
+
+        // Test contents using contains keySet iterator
+        int size2 = 0;
+        int previousKey = -1;
+        for (Iterator itr = map.keySet().iterator(); itr.hasNext();) {
+            int key = ((Integer)itr.next()).intValue();
+            assertTrue(bs.get(key));
+            size2++;
+            assertTrue(previousKey < 0 ||
+                (ascending ? key - previousKey > 0 : key - previousKey < 0));
+            previousKey = key;
+        }
+        assertEquals(size2, size);
+
+        // Test navigation ops
+        for (int key = min - 1; key <= max + 1; key++) {
+            assertEq((Integer)map.lowerKey(new Integer(key)), rs.lower(key));
+            assertEq((Integer)map.floorKey(new Integer(key)), rs.floor(key));
+            assertEq((Integer)map.higherKey(new Integer(key)), rs.higher(key));
+            assertEq((Integer)map.ceilingKey(new Integer(key)), rs.ceiling(key));
+        }
+
+        // Test extrema
+        if (map.size() != 0) {
+            assertEq((Integer)map.firstKey(), rs.first());
+            assertEq((Integer)map.lastKey(), rs.last());
+        } else {
+            assertEq(new Integer(rs.first()), -1);
+            assertEq(new Integer(rs.last()),  -1);
+            try {
+                map.firstKey();
+                fail();
+            } catch(NoSuchElementException e) {
+                // expected
+            }
+            try {
+                map.lastKey();
+                fail();
+            } catch(NoSuchElementException e) {
+                // expected
+            }
+        }
+    }
+
+    static void assertEq(Integer i, int j) {
+        if (i == null)
+            assertEquals(j, -1);
+        else
+            assertEquals(i.intValue(), j);
+    }
+
+    static boolean eq(Integer i, int j) {
+        return i == null ? j == -1 : i.intValue() == j;
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/ConcurrentSkipListSetTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/ConcurrentSkipListSetTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/ConcurrentSkipListSetTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,1012 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+import junit.framework.*;
+import java.util.Comparator;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.SortedSet;
+import java.io.*;
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import java.util.Random;
+import java.util.BitSet;
+import java.util.NoSuchElementException;
+
+public class ConcurrentSkipListSetTest extends JSR166TestCase {
+    public static void main(String[] args) {
+        junit.textui.TestRunner.run (suite());
+    }
+    public static Test suite() {
+        return new TestSuite(ConcurrentSkipListSetTest.class);
+    }
+
+    static class MyReverseComparator implements Comparator {
+        public int compare(Object x, Object y) {
+            int i = ((Integer)x).intValue();
+            int j = ((Integer)y).intValue();
+            if (i < j) return 1;
+            if (i > j) return -1;
+            return 0;
+        }
+    }
+
+    /**
+     * Create a set of given size containing consecutive
+     * Integers 0 ... n.
+     */
+    private ConcurrentSkipListSet populatedSet(int n) {
+        ConcurrentSkipListSet q = new ConcurrentSkipListSet();
+        assertTrue(q.isEmpty());
+        for(int i = n-1; i >= 0; i-=2)
+            assertTrue(q.add(new Integer(i)));
+        for(int i = (n & 1); i < n; i+=2)
+            assertTrue(q.add(new Integer(i)));
+        assertFalse(q.isEmpty());
+        assertEquals(n, q.size());
+        return q;
+    }
+
+    /**
+     * Create set of first 5 ints
+     */
+    private ConcurrentSkipListSet set5() {
+        ConcurrentSkipListSet q = new ConcurrentSkipListSet();
+        assertTrue(q.isEmpty());
+        q.add(one);
+        q.add(two);
+        q.add(three);
+        q.add(four);
+        q.add(five);
+        assertEquals(5, q.size());
+        return q;
+    }
+
+    /**
+     * A new set has unbounded capacity
+     */
+    public void testConstructor1() {
+        assertEquals(0, new ConcurrentSkipListSet().size());
+    }
+
+    /**
+     * Initializing from null Collection throws NPE
+     */
+    public void testConstructor3() {
+        try {
+            ConcurrentSkipListSet q = new ConcurrentSkipListSet((Collection)null);
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Initializing from Collection of null elements throws NPE
+     */
+    public void testConstructor4() {
+        try {
+            Integer[] ints = new Integer[SIZE];
+            ConcurrentSkipListSet q = new ConcurrentSkipListSet(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Initializing from Collection with some null elements throws NPE
+     */
+    public void testConstructor5() {
+        try {
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE-1; ++i)
+                ints[i] = new Integer(i);
+            ConcurrentSkipListSet q = new ConcurrentSkipListSet(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Set contains all elements of collection used to initialize
+     */
+    public void testConstructor6() {
+        try {
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE; ++i)
+                ints[i] = new Integer(i);
+            ConcurrentSkipListSet q = new ConcurrentSkipListSet(Arrays.asList(ints));
+            for (int i = 0; i < SIZE; ++i)
+                assertEquals(ints[i], q.pollFirst());
+        }
+        finally {}
+    }
+
+    /**
+     * The comparator used in constructor is used
+     */
+    public void testConstructor7() {
+        try {
+            MyReverseComparator cmp = new MyReverseComparator();
+            ConcurrentSkipListSet q = new ConcurrentSkipListSet(cmp);
+            assertEquals(cmp, q.comparator());
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE; ++i)
+                ints[i] = new Integer(i);
+            q.addAll(Arrays.asList(ints));
+            for (int i = SIZE-1; i >= 0; --i)
+                assertEquals(ints[i], q.pollFirst());
+        }
+        finally {}
+    }
+
+    /**
+     * isEmpty is true before add, false after
+     */
+    public void testEmpty() {
+        ConcurrentSkipListSet q = new ConcurrentSkipListSet();
+        assertTrue(q.isEmpty());
+        q.add(new Integer(1));
+        assertFalse(q.isEmpty());
+        q.add(new Integer(2));
+        q.pollFirst();
+        q.pollFirst();
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * size changes when elements added and removed
+     */
+    public void testSize() {
+        ConcurrentSkipListSet q = populatedSet(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(SIZE-i, q.size());
+            q.pollFirst();
+        }
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, q.size());
+            q.add(new Integer(i));
+        }
+    }
+
+    /**
+     * add(null) throws NPE
+     */
+    public void testAddNull() {
+        try {
+            ConcurrentSkipListSet q = new ConcurrentSkipListSet();
+            q.add(null);
+            shouldThrow();
+        } catch (NullPointerException success) { }
+    }
+
+    /**
+     * Add of comparable element succeeds
+     */
+    public void testAdd() {
+        ConcurrentSkipListSet q = new ConcurrentSkipListSet();
+        assertTrue(q.add(zero));
+        assertTrue(q.add(one));
+    }
+
+    /**
+     * Add of duplicate element fails
+     */
+    public void testAddDup() {
+        ConcurrentSkipListSet q = new ConcurrentSkipListSet();
+        assertTrue(q.add(zero));
+        assertFalse(q.add(zero));
+    }
+
+    /**
+     * Add of non-Comparable throws CCE
+     */
+    public void testAddNonComparable() {
+        try {
+            ConcurrentSkipListSet q = new ConcurrentSkipListSet();
+            q.add(new Object());
+            q.add(new Object());
+            q.add(new Object());
+            shouldThrow();
+        }
+        catch(ClassCastException success) {}
+    }
+
+    /**
+     * addAll(null) throws NPE
+     */
+    public void testAddAll1() {
+        try {
+            ConcurrentSkipListSet q = new ConcurrentSkipListSet();
+            q.addAll(null);
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+    /**
+     * addAll of a collection with null elements throws NPE
+     */
+    public void testAddAll2() {
+        try {
+            ConcurrentSkipListSet q = new ConcurrentSkipListSet();
+            Integer[] ints = new Integer[SIZE];
+            q.addAll(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+    /**
+     * addAll of a collection with any null elements throws NPE after
+     * possibly adding some elements
+     */
+    public void testAddAll3() {
+        try {
+            ConcurrentSkipListSet q = new ConcurrentSkipListSet();
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE-1; ++i)
+                ints[i] = new Integer(i);
+            q.addAll(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Set contains all elements of successful addAll
+     */
+    public void testAddAll5() {
+        try {
+            Integer[] empty = new Integer[0];
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE; ++i)
+                ints[i] = new Integer(SIZE-1-i);
+            ConcurrentSkipListSet q = new ConcurrentSkipListSet();
+            assertFalse(q.addAll(Arrays.asList(empty)));
+            assertTrue(q.addAll(Arrays.asList(ints)));
+            for (int i = 0; i < SIZE; ++i)
+                assertEquals(new Integer(i), q.pollFirst());
+        }
+        finally {}
+    }
+
+    /**
+     * pollFirst succeeds unless empty
+     */
+    public void testPollFirst() {
+        ConcurrentSkipListSet q = populatedSet(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.pollFirst()).intValue());
+        }
+        assertNull(q.pollFirst());
+    }
+
+    /**
+     * pollLast succeeds unless empty
+     */
+    public void testPollLast() {
+        ConcurrentSkipListSet q = populatedSet(SIZE);
+        for (int i = SIZE-1; i >= 0; --i) {
+            assertEquals(i, ((Integer)q.pollLast()).intValue());
+        }
+        assertNull(q.pollFirst());
+    }
+
+
+    /**
+     * remove(x) removes x and returns true if present
+     */
+    public void testRemoveElement() {
+        ConcurrentSkipListSet q = populatedSet(SIZE);
+        for (int i = 1; i < SIZE; i+=2) {
+            assertTrue(q.remove(new Integer(i)));
+        }
+        for (int i = 0; i < SIZE; i+=2) {
+            assertTrue(q.remove(new Integer(i)));
+            assertFalse(q.remove(new Integer(i+1)));
+        }
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * contains(x) reports true when elements added but not yet removed
+     */
+    public void testContains() {
+        ConcurrentSkipListSet q = populatedSet(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(q.contains(new Integer(i)));
+            q.pollFirst();
+            assertFalse(q.contains(new Integer(i)));
+        }
+    }
+
+    /**
+     * clear removes all elements
+     */
+    public void testClear() {
+        ConcurrentSkipListSet q = populatedSet(SIZE);
+        q.clear();
+        assertTrue(q.isEmpty());
+        assertEquals(0, q.size());
+        q.add(new Integer(1));
+        assertFalse(q.isEmpty());
+        q.clear();
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * containsAll(c) is true when c contains a subset of elements
+     */
+    public void testContainsAll() {
+        ConcurrentSkipListSet q = populatedSet(SIZE);
+        ConcurrentSkipListSet p = new ConcurrentSkipListSet();
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(q.containsAll(p));
+            assertFalse(p.containsAll(q));
+            p.add(new Integer(i));
+        }
+        assertTrue(p.containsAll(q));
+    }
+
+    /**
+     * retainAll(c) retains only those elements of c and reports true if changed
+     */
+    public void testRetainAll() {
+        ConcurrentSkipListSet q = populatedSet(SIZE);
+        ConcurrentSkipListSet p = populatedSet(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            boolean changed = q.retainAll(p);
+            if (i == 0)
+                assertFalse(changed);
+            else
+                assertTrue(changed);
+
+            assertTrue(q.containsAll(p));
+            assertEquals(SIZE-i, q.size());
+            p.pollFirst();
+        }
+    }
+
+    /**
+     * removeAll(c) removes only those elements of c and reports true if changed
+     */
+    public void testRemoveAll() {
+        for (int i = 1; i < SIZE; ++i) {
+            ConcurrentSkipListSet q = populatedSet(SIZE);
+            ConcurrentSkipListSet p = populatedSet(i);
+            assertTrue(q.removeAll(p));
+            assertEquals(SIZE-i, q.size());
+            for (int j = 0; j < i; ++j) {
+                Integer I = (Integer)(p.pollFirst());
+                assertFalse(q.contains(I));
+            }
+        }
+    }
+
+
+
+    /**
+     * lower returns preceding element
+     */
+    public void testLower() {
+        ConcurrentSkipListSet q = set5();
+        Object e1 = q.lower(three);
+        assertEquals(two, e1);
+
+        Object e2 = q.lower(six);
+        assertEquals(five, e2);
+
+        Object e3 = q.lower(one);
+        assertNull(e3);
+
+        Object e4 = q.lower(zero);
+        assertNull(e4);
+
+    }
+
+    /**
+     * higher returns next element
+     */
+    public void testHigher() {
+        ConcurrentSkipListSet q = set5();
+        Object e1 = q.higher(three);
+        assertEquals(four, e1);
+
+        Object e2 = q.higher(zero);
+        assertEquals(one, e2);
+
+        Object e3 = q.higher(five);
+        assertNull(e3);
+
+        Object e4 = q.higher(six);
+        assertNull(e4);
+
+    }
+
+    /**
+     * floor returns preceding element
+     */
+    public void testFloor() {
+        ConcurrentSkipListSet q = set5();
+        Object e1 = q.floor(three);
+        assertEquals(three, e1);
+
+        Object e2 = q.floor(six);
+        assertEquals(five, e2);
+
+        Object e3 = q.floor(one);
+        assertEquals(one, e3);
+
+        Object e4 = q.floor(zero);
+        assertNull(e4);
+
+    }
+
+    /**
+     * ceiling returns next element
+     */
+    public void testCeiling() {
+        ConcurrentSkipListSet q = set5();
+        Object e1 = q.ceiling(three);
+        assertEquals(three, e1);
+
+        Object e2 = q.ceiling(zero);
+        assertEquals(one, e2);
+
+        Object e3 = q.ceiling(five);
+        assertEquals(five, e3);
+
+        Object e4 = q.ceiling(six);
+        assertNull(e4);
+
+    }
+
+    /**
+     * toArray contains all elements
+     */
+    public void testToArray() {
+        ConcurrentSkipListSet q = populatedSet(SIZE);
+        Object[] o = q.toArray();
+        Arrays.sort(o);
+        for(int i = 0; i < o.length; i++)
+            assertEquals(o[i], q.pollFirst());
+    }
+
+    /**
+     * toArray(a) contains all elements
+     */
+    public void testToArray2() {
+        ConcurrentSkipListSet q = populatedSet(SIZE);
+        Integer[] ints = new Integer[SIZE];
+        ints = (Integer[])q.toArray(ints);
+        Arrays.sort(ints);
+        for(int i = 0; i < ints.length; i++)
+            assertEquals(ints[i], q.pollFirst());
+    }
+
+    /**
+     * iterator iterates through all elements
+     */
+    public void testIterator() {
+        ConcurrentSkipListSet q = populatedSet(SIZE);
+        int i = 0;
+        Iterator it = q.iterator();
+        while(it.hasNext()) {
+            assertTrue(q.contains(it.next()));
+            ++i;
+        }
+        assertEquals(i, SIZE);
+    }
+
+    /**
+     * iterator of empty set has no elements
+     */
+    public void testEmptyIterator() {
+        ConcurrentSkipListSet q = new ConcurrentSkipListSet();
+        int i = 0;
+        Iterator it = q.iterator();
+        while(it.hasNext()) {
+            assertTrue(q.contains(it.next()));
+            ++i;
+        }
+        assertEquals(i, 0);
+    }
+
+    /**
+     * iterator.remove removes current element
+     */
+    public void testIteratorRemove () {
+        final ConcurrentSkipListSet q = new ConcurrentSkipListSet();
+        q.add(new Integer(2));
+        q.add(new Integer(1));
+        q.add(new Integer(3));
+
+        Iterator it = q.iterator();
+        it.next();
+        it.remove();
+
+        it = q.iterator();
+        assertEquals(it.next(), new Integer(2));
+        assertEquals(it.next(), new Integer(3));
+        assertFalse(it.hasNext());
+    }
+
+
+    /**
+     * toString contains toStrings of elements
+     */
+    public void testToString() {
+        ConcurrentSkipListSet q = populatedSet(SIZE);
+        String s = q.toString();
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(s.indexOf(String.valueOf(i)) >= 0);
+        }
+    }
+
+    /**
+     * A deserialized serialized set has same elements
+     */
+    public void testSerialization() {
+        ConcurrentSkipListSet q = populatedSet(SIZE);
+        try {
+            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
+            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
+            out.writeObject(q);
+            out.close();
+
+            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
+            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
+            ConcurrentSkipListSet r = (ConcurrentSkipListSet)in.readObject();
+            assertEquals(q.size(), r.size());
+            while (!q.isEmpty())
+                assertEquals(q.pollFirst(), r.pollFirst());
+        } catch(Exception e){
+            e.printStackTrace();
+            unexpectedException();
+        }
+    }
+
+    /**
+     * subSet returns set with keys in requested range
+     */
+    public void testSubSetContents() {
+        ConcurrentSkipListSet set = set5();
+        SortedSet sm = set.subSet(two, four);
+        assertEquals(two, sm.first());
+        assertEquals(three, sm.last());
+        assertEquals(2, sm.size());
+        assertFalse(sm.contains(one));
+        assertTrue(sm.contains(two));
+        assertTrue(sm.contains(three));
+        assertFalse(sm.contains(four));
+        assertFalse(sm.contains(five));
+        Iterator i = sm.iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(two, k);
+        k = (Integer)(i.next());
+        assertEquals(three, k);
+        assertFalse(i.hasNext());
+        Iterator j = sm.iterator();
+        j.next();
+        j.remove();
+        assertFalse(set.contains(two));
+        assertEquals(4, set.size());
+        assertEquals(1, sm.size());
+        assertEquals(three, sm.first());
+        assertEquals(three, sm.last());
+        assertTrue(sm.remove(three));
+        assertTrue(sm.isEmpty());
+        assertEquals(3, set.size());
+    }
+
+    public void testSubSetContents2() {
+        ConcurrentSkipListSet set = set5();
+        SortedSet sm = set.subSet(two, three);
+        assertEquals(1, sm.size());
+        assertEquals(two, sm.first());
+        assertEquals(two, sm.last());
+        assertFalse(sm.contains(one));
+        assertTrue(sm.contains(two));
+        assertFalse(sm.contains(three));
+        assertFalse(sm.contains(four));
+        assertFalse(sm.contains(five));
+        Iterator i = sm.iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(two, k);
+        assertFalse(i.hasNext());
+        Iterator j = sm.iterator();
+        j.next();
+        j.remove();
+        assertFalse(set.contains(two));
+        assertEquals(4, set.size());
+        assertEquals(0, sm.size());
+        assertTrue(sm.isEmpty());
+        assertFalse(sm.remove(three));
+        assertEquals(4, set.size());
+    }
+
+    /**
+     * headSet returns set with keys in requested range
+     */
+    public void testHeadSetContents() {
+        ConcurrentSkipListSet set = set5();
+        SortedSet sm = set.headSet(four);
+        assertTrue(sm.contains(one));
+        assertTrue(sm.contains(two));
+        assertTrue(sm.contains(three));
+        assertFalse(sm.contains(four));
+        assertFalse(sm.contains(five));
+        Iterator i = sm.iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(one, k);
+        k = (Integer)(i.next());
+        assertEquals(two, k);
+        k = (Integer)(i.next());
+        assertEquals(three, k);
+        assertFalse(i.hasNext());
+        sm.clear();
+        assertTrue(sm.isEmpty());
+        assertEquals(2, set.size());
+        assertEquals(four, set.first());
+    }
+
+    /**
+     * tailSet returns set with keys in requested range
+     */
+    public void testTailSetContents() {
+        ConcurrentSkipListSet set = set5();
+        SortedSet sm = set.tailSet(two);
+        assertFalse(sm.contains(one));
+        assertTrue(sm.contains(two));
+        assertTrue(sm.contains(three));
+        assertTrue(sm.contains(four));
+        assertTrue(sm.contains(five));
+        Iterator i = sm.iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(two, k);
+        k = (Integer)(i.next());
+        assertEquals(three, k);
+        k = (Integer)(i.next());
+        assertEquals(four, k);
+        k = (Integer)(i.next());
+        assertEquals(five, k);
+        assertFalse(i.hasNext());
+
+        SortedSet ssm = sm.tailSet(four);
+        assertEquals(four, ssm.first());
+        assertEquals(five, ssm.last());
+        assertTrue(ssm.remove(four));
+        assertEquals(1, ssm.size());
+        assertEquals(3, sm.size());
+        assertEquals(4, set.size());
+    }
+
+
+    Random rnd = new Random(666);
+    BitSet bs;
+
+    /**
+     * Subsets of subsets subdivide correctly
+     */
+    public void testRecursiveSubSets() {
+        int setSize = 1000;
+        Class cl = ConcurrentSkipListSet.class;
+
+        NavigableSet set = newSet(cl);
+        bs = new BitSet(setSize);
+
+        populate(set, setSize);
+        check(set,                 0, setSize - 1, true);
+        check(set.descendingSet(), 0, setSize - 1, false);
+
+        mutateSet(set, 0, setSize - 1);
+        check(set,                 0, setSize - 1, true);
+        check(set.descendingSet(), 0, setSize - 1, false);
+
+        bashSubSet(set.subSet(new Integer(0), true, new Integer(setSize), false),
+                   0, setSize - 1, true);
+    }
+
+    static NavigableSet newSet(Class cl) {
+        NavigableSet result = null;
+        try {
+            result = (NavigableSet) cl.newInstance();
+        } catch(Exception e) {
+            fail();
+        }
+        assertEquals(result.size(), 0);
+        assertFalse(result.iterator().hasNext());
+        return result;
+    }
+
+    void populate(NavigableSet set, int limit) {
+        for (int i = 0, n = 2 * limit / 3; i < n; i++) {
+            int element = rnd.nextInt(limit);
+            put(set, element);
+        }
+    }
+
+    void mutateSet(NavigableSet set, int min, int max) {
+        int size = set.size();
+        int rangeSize = max - min + 1;
+
+        // Remove a bunch of entries directly
+        for (int i = 0, n = rangeSize / 2; i < n; i++) {
+            remove(set, min - 5 + rnd.nextInt(rangeSize + 10));
+        }
+
+        // Remove a bunch of entries with iterator
+        for(Iterator it = set.iterator(); it.hasNext(); ) {
+            if (rnd.nextBoolean()) {
+                bs.clear(((Integer)it.next()).intValue());
+                it.remove();
+            }
+        }
+
+        // Add entries till we're back to original size
+        while (set.size() < size) {
+            int element = min + rnd.nextInt(rangeSize);
+            assertTrue(element >= min && element<= max);
+            put(set, element);
+        }
+    }
+
+    void mutateSubSet(NavigableSet set, int min, int max) {
+        int size = set.size();
+        int rangeSize = max - min + 1;
+
+        // Remove a bunch of entries directly
+        for (int i = 0, n = rangeSize / 2; i < n; i++) {
+            remove(set, min - 5 + rnd.nextInt(rangeSize + 10));
+        }
+
+        // Remove a bunch of entries with iterator
+        for(Iterator it = set.iterator(); it.hasNext(); ) {
+            if (rnd.nextBoolean()) {
+                bs.clear(((Integer)it.next()).intValue());
+                it.remove();
+            }
+        }
+
+        // Add entries till we're back to original size
+        while (set.size() < size) {
+            int element = min - 5 + rnd.nextInt(rangeSize + 10);
+            if (element >= min && element<= max) {
+                put(set, element);
+            } else {
+                try {
+                    set.add(new Integer(element));
+                    fail();
+                } catch(IllegalArgumentException e) {
+                    // expected
+                }
+            }
+        }
+    }
+
+    void put(NavigableSet set, int element) {
+        if (set.add(new Integer(element)))
+            bs.set(element);
+    }
+
+    void remove(NavigableSet set, int element) {
+        if (set.remove(new Integer(element)))
+            bs.clear(element);
+    }
+
+    void bashSubSet(NavigableSet set,
+                    int min, int max, boolean ascending) {
+        check(set, min, max, ascending);
+        check(set.descendingSet(), min, max, !ascending);
+
+        mutateSubSet(set, min, max);
+        check(set, min, max, ascending);
+        check(set.descendingSet(), min, max, !ascending);
+
+        // Recurse
+        if (max - min < 2)
+            return;
+        int midPoint = (min + max) / 2;
+
+        // headSet - pick direction and endpoint inclusion randomly
+        boolean incl = rnd.nextBoolean();
+        NavigableSet hm = set.headSet(new Integer(midPoint), incl);
+        if (ascending) {
+            if (rnd.nextBoolean())
+                bashSubSet(hm, min, midPoint - (incl ? 0 : 1), true);
+            else
+                bashSubSet(hm.descendingSet(), min, midPoint - (incl ? 0 : 1),
+                           false);
+        } else {
+            if (rnd.nextBoolean())
+                bashSubSet(hm, midPoint + (incl ? 0 : 1), max, false);
+            else
+                bashSubSet(hm.descendingSet(), midPoint + (incl ? 0 : 1), max,
+                           true);
+        }
+
+        // tailSet - pick direction and endpoint inclusion randomly
+        incl = rnd.nextBoolean();
+        NavigableSet tm = set.tailSet(new Integer(midPoint),incl);
+        if (ascending) {
+            if (rnd.nextBoolean())
+                bashSubSet(tm, midPoint + (incl ? 0 : 1), max, true);
+            else
+                bashSubSet(tm.descendingSet(), midPoint + (incl ? 0 : 1), max,
+                           false);
+        } else {
+            if (rnd.nextBoolean()) {
+                bashSubSet(tm, min, midPoint - (incl ? 0 : 1), false);
+            } else {
+                bashSubSet(tm.descendingSet(), min, midPoint - (incl ? 0 : 1),
+                           true);
+            }
+        }
+
+        // subSet - pick direction and endpoint inclusion randomly
+        int rangeSize = max - min + 1;
+        int[] endpoints = new int[2];
+        endpoints[0] = min + rnd.nextInt(rangeSize);
+        endpoints[1] = min + rnd.nextInt(rangeSize);
+        Arrays.sort(endpoints);
+        boolean lowIncl = rnd.nextBoolean();
+        boolean highIncl = rnd.nextBoolean();
+        if (ascending) {
+            NavigableSet sm = set.subSet(
+                new Integer(endpoints[0]), lowIncl, new Integer(endpoints[1]), highIncl);
+            if (rnd.nextBoolean())
+                bashSubSet(sm, endpoints[0] + (lowIncl ? 0 : 1),
+                           endpoints[1] - (highIncl ? 0 : 1), true);
+            else
+                bashSubSet(sm.descendingSet(), endpoints[0] + (lowIncl ? 0 : 1),
+                           endpoints[1] - (highIncl ? 0 : 1), false);
+        } else {
+            NavigableSet sm = set.subSet(
+                new Integer(endpoints[1]), highIncl, new Integer(endpoints[0]), lowIncl);
+            if (rnd.nextBoolean())
+                bashSubSet(sm, endpoints[0] + (lowIncl ? 0 : 1),
+                           endpoints[1] - (highIncl ? 0 : 1), false);
+            else
+                bashSubSet(sm.descendingSet(), endpoints[0] + (lowIncl ? 0 : 1),
+                           endpoints[1] - (highIncl ? 0 : 1), true);
+        }
+    }
+
+    /**
+     * min and max are both inclusive.  If max < min, interval is empty.
+     */
+    void check(NavigableSet set,
+                      final int min, final int max, final boolean ascending) {
+       class ReferenceSet {
+            int lower(int element) {
+                return ascending ?
+                    lowerAscending(element) : higherAscending(element);
+            }
+            int floor(int element) {
+                return ascending ?
+                    floorAscending(element) : ceilingAscending(element);
+            }
+            int ceiling(int element) {
+                return ascending ?
+                    ceilingAscending(element) : floorAscending(element);
+            }
+            int higher(int element) {
+                return ascending ?
+                    higherAscending(element) : lowerAscending(element);
+            }
+            int first() {
+                return ascending ? firstAscending() : lastAscending();
+            }
+            int last() {
+                return ascending ? lastAscending() : firstAscending();
+            }
+            int lowerAscending(int element) {
+                return floorAscending(element - 1);
+            }
+            int floorAscending(int element) {
+                if (element < min)
+                    return -1;
+                else if (element > max)
+                    element = max;
+
+                // BitSet should support this! Test would run much faster
+                while (element >= min) {
+                    if (bs.get(element))
+                        return(element);
+                    element--;
+                }
+                return -1;
+            }
+            int ceilingAscending(int element) {
+                if (element < min)
+                    element = min;
+                else if (element > max)
+                    return -1;
+                int result = bs.nextSetBit(element);
+                return result > max ? -1 : result;
+            }
+            int higherAscending(int element) {
+                return ceilingAscending(element + 1);
+            }
+            private int firstAscending() {
+                int result = ceilingAscending(min);
+                return result > max ? -1 : result;
+            }
+            private int lastAscending() {
+                int result = floorAscending(max);
+                return result < min ? -1 : result;
+            }
+        }
+        ReferenceSet rs = new ReferenceSet();
+
+        // Test contents using containsElement
+        int size = 0;
+        for (int i = min; i <= max; i++) {
+            boolean bsContainsI = bs.get(i);
+            assertEquals(bsContainsI, set.contains(new Integer(i)));
+            if (bsContainsI)
+                size++;
+        }
+        assertEquals(set.size(), size);
+
+        // Test contents using contains elementSet iterator
+        int size2 = 0;
+        int previousElement = -1;
+        for (Iterator itr = set.iterator(); itr.hasNext();) {
+            int element = ((Integer)itr.next()).intValue();
+            assertTrue(bs.get(element));
+            size2++;
+            assertTrue(previousElement < 0 || (ascending ?
+                element - previousElement > 0 : element - previousElement < 0));
+            previousElement = element;
+        }
+        assertEquals(size2, size);
+
+        // Test navigation ops
+        for (int element = min - 1; element <= max + 1; element++) {
+            assertEq((Integer)set.lower(new Integer(element)), rs.lower(element));
+            assertEq((Integer)set.floor(new Integer(element)), rs.floor(element));
+            assertEq((Integer)set.higher(new Integer(element)), rs.higher(element));
+            assertEq((Integer)set.ceiling(new Integer(element)), rs.ceiling(element));
+        }
+
+        // Test extrema
+        if (set.size() != 0) {
+            assertEq((Integer)set.first(), rs.first());
+            assertEq((Integer)set.last(), rs.last());
+        } else {
+            assertEq(new Integer(rs.first()), -1);
+            assertEq(new Integer(rs.last()),  -1);
+            try {
+                set.first();
+                fail();
+            } catch(NoSuchElementException e) {
+                // expected
+            }
+            try {
+                set.last();
+                fail();
+            } catch(NoSuchElementException e) {
+                // expected
+            }
+        }
+    }
+
+    static void assertEq(Integer i, int j) {
+        if (i == null)
+            assertEquals(j, -1);
+        else
+            assertEquals(i.intValue(), j);
+    }
+
+    static boolean eq(Integer i, int j) {
+        return i == null ? j == -1 : i.intValue() == j;
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/ConcurrentSkipListSubMapTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/ConcurrentSkipListSubMapTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/ConcurrentSkipListSubMapTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,1470 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+import junit.framework.*;
+import java.util.Collection;
+import java.util.Set;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.ArrayList;
+import java.util.SortedMap;
+import java.io.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+
+public class ConcurrentSkipListSubMapTest extends JSR166TestCase {
+    public static void main(String[] args) {
+        junit.textui.TestRunner.run (suite());
+    }
+    public static Test suite() {
+        return new TestSuite(ConcurrentSkipListSubMapTest.class);
+    }
+
+    /**
+     * Create a map from Integers 1-5 to Strings "A"-"E".
+     */
+    private static ConcurrentNavigableMap map5() {
+        ConcurrentSkipListMap map = new ConcurrentSkipListMap();
+        assertTrue(map.isEmpty());
+        map.put(zero, "Z");
+        map.put(one, "A");
+        map.put(five, "E");
+        map.put(three, "C");
+        map.put(two, "B");
+        map.put(four, "D");
+        map.put(seven, "F");
+        assertFalse(map.isEmpty());
+        assertEquals(7, map.size());
+        return (ConcurrentNavigableMap)map.subMap(one, true, seven, false);
+    }
+
+    /**
+     * Create a map from Integers -5 to -1 to Strings "A"-"E".
+     */
+    private static ConcurrentNavigableMap dmap5() {
+        ConcurrentSkipListMap map = new ConcurrentSkipListMap();
+        assertTrue(map.isEmpty());
+        map.put(m1, "A");
+        map.put(m5, "E");
+        map.put(m3, "C");
+        map.put(m2, "B");
+        map.put(m4, "D");
+        assertFalse(map.isEmpty());
+        assertEquals(5, map.size());
+        return (ConcurrentNavigableMap)map.descendingMap();
+    }
+
+    private static ConcurrentNavigableMap map0() {
+        ConcurrentSkipListMap map = new ConcurrentSkipListMap();
+        assertTrue(map.isEmpty());
+        return (ConcurrentNavigableMap)map.tailMap(one, true);
+    }
+
+    private static ConcurrentNavigableMap dmap0() {
+        ConcurrentSkipListMap map = new ConcurrentSkipListMap();
+        assertTrue(map.isEmpty());
+        return map;
+    }
+
+    /**
+     *  clear removes all pairs
+     */
+    public void testClear() {
+        ConcurrentNavigableMap map = map5();
+        map.clear();
+        assertEquals(map.size(), 0);
+    }
+
+
+    /**
+     *  Maps with same contents are equal
+     */
+    public void testEquals() {
+        ConcurrentNavigableMap map1 = map5();
+        ConcurrentNavigableMap map2 = map5();
+        assertEquals(map1, map2);
+        assertEquals(map2, map1);
+        map1.clear();
+        assertFalse(map1.equals(map2));
+        assertFalse(map2.equals(map1));
+    }
+
+    /**
+     *  containsKey returns true for contained key
+     */
+    public void testContainsKey() {
+        ConcurrentNavigableMap map = map5();
+        assertTrue(map.containsKey(one));
+        assertFalse(map.containsKey(zero));
+    }
+
+    /**
+     *  containsValue returns true for held values
+     */
+    public void testContainsValue() {
+        ConcurrentNavigableMap map = map5();
+        assertTrue(map.containsValue("A"));
+        assertFalse(map.containsValue("Z"));
+    }
+
+    /**
+     *  get returns the correct element at the given key,
+     *  or null if not present
+     */
+    public void testGet() {
+        ConcurrentNavigableMap map = map5();
+        assertEquals("A", (String)map.get(one));
+        ConcurrentNavigableMap empty = map0();
+        assertNull(empty.get(one));
+    }
+
+    /**
+     *  isEmpty is true of empty map and false for non-empty
+     */
+    public void testIsEmpty() {
+        ConcurrentNavigableMap empty = map0();
+        ConcurrentNavigableMap map = map5();
+        assertTrue(empty.isEmpty());
+        assertFalse(map.isEmpty());
+    }
+
+    /**
+     *   firstKey returns first key
+     */
+    public void testFirstKey() {
+        ConcurrentNavigableMap map = map5();
+        assertEquals(one, map.firstKey());
+    }
+
+    /**
+     *   lastKey returns last key
+     */
+    public void testLastKey() {
+        ConcurrentNavigableMap map = map5();
+        assertEquals(five, map.lastKey());
+    }
+
+
+    /**
+     *   keySet returns a Set containing all the keys
+     */
+    public void testKeySet() {
+        ConcurrentNavigableMap map = map5();
+        Set s = map.keySet();
+        assertEquals(5, s.size());
+        assertTrue(s.contains(one));
+        assertTrue(s.contains(two));
+        assertTrue(s.contains(three));
+        assertTrue(s.contains(four));
+        assertTrue(s.contains(five));
+    }
+
+    /**
+     *   keySet is ordered
+     */
+    public void testKeySetOrder() {
+        ConcurrentNavigableMap map = map5();
+        Set s = map.keySet();
+        Iterator i = s.iterator();
+        Integer last = (Integer)i.next();
+        assertEquals(last, one);
+        while (i.hasNext()) {
+            Integer k = (Integer)i.next();
+            assertTrue(last.compareTo(k) < 0);
+            last = k;
+        }
+    }
+
+    /**
+     * values collection contains all values
+     */
+    public void testValues() {
+        ConcurrentNavigableMap map = map5();
+        Collection s = map.values();
+        assertEquals(5, s.size());
+        assertTrue(s.contains("A"));
+        assertTrue(s.contains("B"));
+        assertTrue(s.contains("C"));
+        assertTrue(s.contains("D"));
+        assertTrue(s.contains("E"));
+    }
+
+    /**
+     *  keySet.toArray returns contains all keys
+     */
+    public void testKeySetToArray() {
+        ConcurrentNavigableMap map = map5();
+        Set s = map.keySet();
+        Object[] ar = s.toArray();
+        assertTrue(s.containsAll(Arrays.asList(ar)));
+        assertEquals(5, ar.length);
+        ar[0] = m10;
+        assertFalse(s.containsAll(Arrays.asList(ar)));
+    }
+
+    /**
+     *  descendingkeySet.toArray returns contains all keys
+     */
+    public void testDescendingKeySetToArray() {
+        ConcurrentNavigableMap map = map5();
+        Set s = map.descendingKeySet();
+        Object[] ar = s.toArray();
+        assertEquals(5, ar.length);
+        assertTrue(s.containsAll(Arrays.asList(ar)));
+        ar[0] = m10;
+        assertFalse(s.containsAll(Arrays.asList(ar)));
+    }
+
+    /**
+     *  Values.toArray contains all values
+     */
+    public void testValuesToArray() {
+        ConcurrentNavigableMap map = map5();
+        Collection v = map.values();
+        Object[] ar = v.toArray();
+        ArrayList s = new ArrayList(Arrays.asList(ar));
+        assertEquals(5, ar.length);
+        assertTrue(s.contains("A"));
+        assertTrue(s.contains("B"));
+        assertTrue(s.contains("C"));
+        assertTrue(s.contains("D"));
+        assertTrue(s.contains("E"));
+    }
+
+
+    /**
+     * entrySet contains all pairs
+     */
+    public void testEntrySet() {
+        ConcurrentNavigableMap map = map5();
+        Set s = map.entrySet();
+        assertEquals(5, s.size());
+        Iterator it = s.iterator();
+        while (it.hasNext()) {
+            Map.Entry e = (Map.Entry) it.next();
+            assertTrue(
+                       (e.getKey().equals(one) && e.getValue().equals("A")) ||
+                       (e.getKey().equals(two) && e.getValue().equals("B")) ||
+                       (e.getKey().equals(three) && e.getValue().equals("C")) ||
+                       (e.getKey().equals(four) && e.getValue().equals("D")) ||
+                       (e.getKey().equals(five) && e.getValue().equals("E")));
+        }
+    }
+
+    /**
+     *   putAll  adds all key-value pairs from the given map
+     */
+    public void testPutAll() {
+        ConcurrentNavigableMap empty = map0();
+        ConcurrentNavigableMap map = map5();
+        empty.putAll(map);
+        assertEquals(5, empty.size());
+        assertTrue(empty.containsKey(one));
+        assertTrue(empty.containsKey(two));
+        assertTrue(empty.containsKey(three));
+        assertTrue(empty.containsKey(four));
+        assertTrue(empty.containsKey(five));
+    }
+
+    /**
+     *   putIfAbsent works when the given key is not present
+     */
+    public void testPutIfAbsent() {
+        ConcurrentNavigableMap map = map5();
+        map.putIfAbsent(six, "Z");
+        assertTrue(map.containsKey(six));
+    }
+
+    /**
+     *   putIfAbsent does not add the pair if the key is already present
+     */
+    public void testPutIfAbsent2() {
+        ConcurrentNavigableMap map = map5();
+        assertEquals("A", map.putIfAbsent(one, "Z"));
+    }
+
+    /**
+     *   replace fails when the given key is not present
+     */
+    public void testReplace() {
+        ConcurrentNavigableMap map = map5();
+        assertNull(map.replace(six, "Z"));
+        assertFalse(map.containsKey(six));
+    }
+
+    /**
+     *   replace succeeds if the key is already present
+     */
+    public void testReplace2() {
+        ConcurrentNavigableMap map = map5();
+        assertNotNull(map.replace(one, "Z"));
+        assertEquals("Z", map.get(one));
+    }
+
+
+    /**
+     * replace value fails when the given key not mapped to expected value
+     */
+    public void testReplaceValue() {
+        ConcurrentNavigableMap map = map5();
+        assertEquals("A", map.get(one));
+        assertFalse(map.replace(one, "Z", "Z"));
+        assertEquals("A", map.get(one));
+    }
+
+    /**
+     * replace value succeeds when the given key mapped to expected value
+     */
+    public void testReplaceValue2() {
+        ConcurrentNavigableMap map = map5();
+        assertEquals("A", map.get(one));
+        assertTrue(map.replace(one, "A", "Z"));
+        assertEquals("Z", map.get(one));
+    }
+
+
+    /**
+     *   remove removes the correct key-value pair from the map
+     */
+    public void testRemove() {
+        ConcurrentNavigableMap map = map5();
+        map.remove(five);
+        assertEquals(4, map.size());
+        assertFalse(map.containsKey(five));
+    }
+
+    /**
+     * remove(key,value) removes only if pair present
+     */
+    public void testRemove2() {
+        ConcurrentNavigableMap map = map5();
+        assertTrue(map.containsKey(five));
+        assertEquals("E", map.get(five));
+        map.remove(five, "E");
+        assertEquals(4, map.size());
+        assertFalse(map.containsKey(five));
+        map.remove(four, "A");
+        assertEquals(4, map.size());
+        assertTrue(map.containsKey(four));
+
+    }
+
+    /**
+     * lowerEntry returns preceding entry.
+     */
+    public void testLowerEntry() {
+        ConcurrentNavigableMap map = map5();
+        Map.Entry e1 = map.lowerEntry(three);
+        assertEquals(two, e1.getKey());
+
+        Map.Entry e2 = map.lowerEntry(six);
+        assertEquals(five, e2.getKey());
+
+        Map.Entry e3 = map.lowerEntry(one);
+        assertNull(e3);
+
+        Map.Entry e4 = map.lowerEntry(zero);
+        assertNull(e4);
+
+    }
+
+    /**
+     * higherEntry returns next entry.
+     */
+    public void testHigherEntry() {
+        ConcurrentNavigableMap map = map5();
+        Map.Entry e1 = map.higherEntry(three);
+        assertEquals(four, e1.getKey());
+
+        Map.Entry e2 = map.higherEntry(zero);
+        assertEquals(one, e2.getKey());
+
+        Map.Entry e3 = map.higherEntry(five);
+        assertNull(e3);
+
+        Map.Entry e4 = map.higherEntry(six);
+        assertNull(e4);
+
+    }
+
+    /**
+     * floorEntry returns preceding entry.
+     */
+    public void testFloorEntry() {
+        ConcurrentNavigableMap map = map5();
+        Map.Entry e1 = map.floorEntry(three);
+        assertEquals(three, e1.getKey());
+
+        Map.Entry e2 = map.floorEntry(six);
+        assertEquals(five, e2.getKey());
+
+        Map.Entry e3 = map.floorEntry(one);
+        assertEquals(one, e3.getKey());
+
+        Map.Entry e4 = map.floorEntry(zero);
+        assertNull(e4);
+
+    }
+
+    /**
+     * ceilingEntry returns next entry.
+     */
+    public void testCeilingEntry() {
+        ConcurrentNavigableMap map = map5();
+        Map.Entry e1 = map.ceilingEntry(three);
+        assertEquals(three, e1.getKey());
+
+        Map.Entry e2 = map.ceilingEntry(zero);
+        assertEquals(one, e2.getKey());
+
+        Map.Entry e3 = map.ceilingEntry(five);
+        assertEquals(five, e3.getKey());
+
+        Map.Entry e4 = map.ceilingEntry(six);
+        assertNull(e4);
+
+    }
+
+    /**
+     * pollFirstEntry returns entries in order
+     */
+    public void testPollFirstEntry() {
+        ConcurrentNavigableMap map = map5();
+        Map.Entry e = map.pollFirstEntry();
+        assertEquals(one, e.getKey());
+        assertEquals("A", e.getValue());
+        e = map.pollFirstEntry();
+        assertEquals(two, e.getKey());
+        map.put(one, "A");
+        e = map.pollFirstEntry();
+        assertEquals(one, e.getKey());
+        assertEquals("A", e.getValue());
+        e = map.pollFirstEntry();
+        assertEquals(three, e.getKey());
+        map.remove(four);
+        e = map.pollFirstEntry();
+        assertEquals(five, e.getKey());
+        try {
+            e.setValue("A");
+            shouldThrow();
+        } catch (Exception ok) {
+        }
+        e = map.pollFirstEntry();
+        assertNull(e);
+    }
+
+    /**
+     * pollLastEntry returns entries in order
+     */
+    public void testPollLastEntry() {
+        ConcurrentNavigableMap map = map5();
+        Map.Entry e = map.pollLastEntry();
+        assertEquals(five, e.getKey());
+        assertEquals("E", e.getValue());
+        e = map.pollLastEntry();
+        assertEquals(four, e.getKey());
+        map.put(five, "E");
+        e = map.pollLastEntry();
+        assertEquals(five, e.getKey());
+        assertEquals("E", e.getValue());
+        e = map.pollLastEntry();
+        assertEquals(three, e.getKey());
+        map.remove(two);
+        e = map.pollLastEntry();
+        assertEquals(one, e.getKey());
+        try {
+            e.setValue("E");
+            shouldThrow();
+        } catch (Exception ok) {
+        }
+        e = map.pollLastEntry();
+        assertNull(e);
+    }
+
+    /**
+     *   size returns the correct values
+     */
+    public void testSize() {
+        ConcurrentNavigableMap map = map5();
+        ConcurrentNavigableMap empty = map0();
+        assertEquals(0, empty.size());
+        assertEquals(5, map.size());
+    }
+
+    /**
+     * toString contains toString of elements
+     */
+    public void testToString() {
+        ConcurrentNavigableMap map = map5();
+        String s = map.toString();
+        for (int i = 1; i <= 5; ++i) {
+            assertTrue(s.indexOf(String.valueOf(i)) >= 0);
+        }
+    }
+
+    // Exception tests
+
+    /**
+     * get(null) of nonempty map throws NPE
+     */
+    public void testGet_NullPointerException() {
+        try {
+            ConcurrentNavigableMap c = map5();
+            c.get(null);
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * containsKey(null) of nonempty map throws NPE
+     */
+    public void testContainsKey_NullPointerException() {
+        try {
+            ConcurrentNavigableMap c = map5();
+            c.containsKey(null);
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * containsValue(null) throws NPE
+     */
+    public void testContainsValue_NullPointerException() {
+        try {
+            ConcurrentNavigableMap c = map0();
+            c.containsValue(null);
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+
+    /**
+     * put(null,x) throws NPE
+     */
+    public void testPut1_NullPointerException() {
+        try {
+            ConcurrentNavigableMap c = map5();
+            c.put(null, "whatever");
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * putIfAbsent(null, x) throws NPE
+     */
+    public void testPutIfAbsent1_NullPointerException() {
+        try {
+            ConcurrentNavigableMap c = map5();
+            c.putIfAbsent(null, "whatever");
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * replace(null, x) throws NPE
+     */
+    public void testReplace_NullPointerException() {
+        try {
+            ConcurrentNavigableMap c = map5();
+            c.replace(null, "whatever");
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * replace(null, x, y) throws NPE
+     */
+    public void testReplaceValue_NullPointerException() {
+        try {
+            ConcurrentNavigableMap c = map5();
+            c.replace(null, one, "whatever");
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * remove(null) throws NPE
+     */
+    public void testRemove1_NullPointerException() {
+        try {
+            ConcurrentNavigableMap c = map5();
+            c.remove(null);
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * remove(null, x) throws NPE
+     */
+    public void testRemove2_NullPointerException() {
+        try {
+            ConcurrentNavigableMap c = map5();
+            c.remove(null, "whatever");
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * A deserialized map equals original
+     */
+    public void testSerialization() {
+        ConcurrentNavigableMap q = map5();
+
+        try {
+            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
+            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
+            out.writeObject(q);
+            out.close();
+
+            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
+            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
+            ConcurrentNavigableMap r = (ConcurrentNavigableMap)in.readObject();
+            assertEquals(q.size(), r.size());
+            assertTrue(q.equals(r));
+            assertTrue(r.equals(q));
+        } catch(Exception e){
+            e.printStackTrace();
+            unexpectedException();
+        }
+    }
+
+
+
+    /**
+     * subMap returns map with keys in requested range
+     */
+    public void testSubMapContents() {
+        ConcurrentNavigableMap map = map5();
+        SortedMap sm = map.subMap(two, four);
+        assertEquals(two, sm.firstKey());
+        assertEquals(three, sm.lastKey());
+        assertEquals(2, sm.size());
+        assertFalse(sm.containsKey(one));
+        assertTrue(sm.containsKey(two));
+        assertTrue(sm.containsKey(three));
+        assertFalse(sm.containsKey(four));
+        assertFalse(sm.containsKey(five));
+        Iterator i = sm.keySet().iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(two, k);
+        k = (Integer)(i.next());
+        assertEquals(three, k);
+        assertFalse(i.hasNext());
+        Iterator j = sm.keySet().iterator();
+        j.next();
+        j.remove();
+        assertFalse(map.containsKey(two));
+        assertEquals(4, map.size());
+        assertEquals(1, sm.size());
+        assertEquals(three, sm.firstKey());
+        assertEquals(three, sm.lastKey());
+        assertTrue(sm.remove(three) != null);
+        assertTrue(sm.isEmpty());
+        assertEquals(3, map.size());
+    }
+
+    public void testSubMapContents2() {
+        ConcurrentNavigableMap map = map5();
+        SortedMap sm = map.subMap(two, three);
+        assertEquals(1, sm.size());
+        assertEquals(two, sm.firstKey());
+        assertEquals(two, sm.lastKey());
+        assertFalse(sm.containsKey(one));
+        assertTrue(sm.containsKey(two));
+        assertFalse(sm.containsKey(three));
+        assertFalse(sm.containsKey(four));
+        assertFalse(sm.containsKey(five));
+        Iterator i = sm.keySet().iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(two, k);
+        assertFalse(i.hasNext());
+        Iterator j = sm.keySet().iterator();
+        j.next();
+        j.remove();
+        assertFalse(map.containsKey(two));
+        assertEquals(4, map.size());
+        assertEquals(0, sm.size());
+        assertTrue(sm.isEmpty());
+        assertTrue(sm.remove(three) == null);
+        assertEquals(4, map.size());
+    }
+
+    /**
+     * headMap returns map with keys in requested range
+     */
+    public void testHeadMapContents() {
+        ConcurrentNavigableMap map = map5();
+        SortedMap sm = map.headMap(four);
+        assertTrue(sm.containsKey(one));
+        assertTrue(sm.containsKey(two));
+        assertTrue(sm.containsKey(three));
+        assertFalse(sm.containsKey(four));
+        assertFalse(sm.containsKey(five));
+        Iterator i = sm.keySet().iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(one, k);
+        k = (Integer)(i.next());
+        assertEquals(two, k);
+        k = (Integer)(i.next());
+        assertEquals(three, k);
+        assertFalse(i.hasNext());
+        sm.clear();
+        assertTrue(sm.isEmpty());
+        assertEquals(2, map.size());
+        assertEquals(four, map.firstKey());
+    }
+
+    /**
+     * headMap returns map with keys in requested range
+     */
+    public void testTailMapContents() {
+        ConcurrentNavigableMap map = map5();
+        SortedMap sm = map.tailMap(two);
+        assertFalse(sm.containsKey(one));
+        assertTrue(sm.containsKey(two));
+        assertTrue(sm.containsKey(three));
+        assertTrue(sm.containsKey(four));
+        assertTrue(sm.containsKey(five));
+        Iterator i = sm.keySet().iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(two, k);
+        k = (Integer)(i.next());
+        assertEquals(three, k);
+        k = (Integer)(i.next());
+        assertEquals(four, k);
+        k = (Integer)(i.next());
+        assertEquals(five, k);
+        assertFalse(i.hasNext());
+
+        Iterator ei = sm.entrySet().iterator();
+        Map.Entry e;
+        e = (Map.Entry)(ei.next());
+        assertEquals(two, e.getKey());
+        assertEquals("B", e.getValue());
+        e = (Map.Entry)(ei.next());
+        assertEquals(three, e.getKey());
+        assertEquals("C", e.getValue());
+        e = (Map.Entry)(ei.next());
+        assertEquals(four, e.getKey());
+        assertEquals("D", e.getValue());
+        e = (Map.Entry)(ei.next());
+        assertEquals(five, e.getKey());
+        assertEquals("E", e.getValue());
+        assertFalse(i.hasNext());
+
+        SortedMap ssm = sm.tailMap(four);
+        assertEquals(four, ssm.firstKey());
+        assertEquals(five, ssm.lastKey());
+        assertTrue(ssm.remove(four) != null);
+        assertEquals(1, ssm.size());
+        assertEquals(3, sm.size());
+        assertEquals(4, map.size());
+    }
+
+    /**
+     *  clear removes all pairs
+     */
+    public void testDescendingClear() {
+        ConcurrentNavigableMap map = dmap5();
+        map.clear();
+        assertEquals(map.size(), 0);
+    }
+
+
+    /**
+     *  Maps with same contents are equal
+     */
+    public void testDescendingEquals() {
+        ConcurrentNavigableMap map1 = dmap5();
+        ConcurrentNavigableMap map2 = dmap5();
+        assertEquals(map1, map2);
+        assertEquals(map2, map1);
+        map1.clear();
+        assertFalse(map1.equals(map2));
+        assertFalse(map2.equals(map1));
+    }
+
+    /**
+     *  containsKey returns true for contained key
+     */
+    public void testDescendingContainsKey() {
+        ConcurrentNavigableMap map = dmap5();
+        assertTrue(map.containsKey(m1));
+        assertFalse(map.containsKey(zero));
+    }
+
+    /**
+     *  containsValue returns true for held values
+     */
+    public void testDescendingContainsValue() {
+        ConcurrentNavigableMap map = dmap5();
+        assertTrue(map.containsValue("A"));
+        assertFalse(map.containsValue("Z"));
+    }
+
+    /**
+     *  get returns the correct element at the given key,
+     *  or null if not present
+     */
+    public void testDescendingGet() {
+        ConcurrentNavigableMap map = dmap5();
+        assertEquals("A", (String)map.get(m1));
+        ConcurrentNavigableMap empty = dmap0();
+        assertNull(empty.get(m1));
+    }
+
+    /**
+     *  isEmpty is true of empty map and false for non-empty
+     */
+    public void testDescendingIsEmpty() {
+        ConcurrentNavigableMap empty = dmap0();
+        ConcurrentNavigableMap map = dmap5();
+        assertTrue(empty.isEmpty());
+        assertFalse(map.isEmpty());
+    }
+
+    /**
+     *   firstKey returns first key
+     */
+    public void testDescendingFirstKey() {
+        ConcurrentNavigableMap map = dmap5();
+        assertEquals(m1, map.firstKey());
+    }
+
+    /**
+     *   lastKey returns last key
+     */
+    public void testDescendingLastKey() {
+        ConcurrentNavigableMap map = dmap5();
+        assertEquals(m5, map.lastKey());
+    }
+
+
+    /**
+     *   keySet returns a Set containing all the keys
+     */
+    public void testDescendingKeySet() {
+        ConcurrentNavigableMap map = dmap5();
+        Set s = map.keySet();
+        assertEquals(5, s.size());
+        assertTrue(s.contains(m1));
+        assertTrue(s.contains(m2));
+        assertTrue(s.contains(m3));
+        assertTrue(s.contains(m4));
+        assertTrue(s.contains(m5));
+    }
+
+    /**
+     *   keySet is ordered
+     */
+    public void testDescendingKeySetOrder() {
+        ConcurrentNavigableMap map = dmap5();
+        Set s = map.keySet();
+        Iterator i = s.iterator();
+        Integer last = (Integer)i.next();
+        assertEquals(last, m1);
+        while (i.hasNext()) {
+            Integer k = (Integer)i.next();
+            assertTrue(last.compareTo(k) > 0);
+            last = k;
+        }
+    }
+
+    /**
+     * values collection contains all values
+     */
+    public void testDescendingValues() {
+        ConcurrentNavigableMap map = dmap5();
+        Collection s = map.values();
+        assertEquals(5, s.size());
+        assertTrue(s.contains("A"));
+        assertTrue(s.contains("B"));
+        assertTrue(s.contains("C"));
+        assertTrue(s.contains("D"));
+        assertTrue(s.contains("E"));
+    }
+
+    /**
+     *  keySet.toArray returns contains all keys
+     */
+    public void testDescendingAscendingKeySetToArray() {
+        ConcurrentNavigableMap map = dmap5();
+        Set s = map.keySet();
+        Object[] ar = s.toArray();
+        assertTrue(s.containsAll(Arrays.asList(ar)));
+        assertEquals(5, ar.length);
+        ar[0] = m10;
+        assertFalse(s.containsAll(Arrays.asList(ar)));
+    }
+
+    /**
+     *  descendingkeySet.toArray returns contains all keys
+     */
+    public void testDescendingDescendingKeySetToArray() {
+        ConcurrentNavigableMap map = dmap5();
+        Set s = map.descendingKeySet();
+        Object[] ar = s.toArray();
+        assertEquals(5, ar.length);
+        assertTrue(s.containsAll(Arrays.asList(ar)));
+        ar[0] = m10;
+        assertFalse(s.containsAll(Arrays.asList(ar)));
+    }
+
+    /**
+     *  Values.toArray contains all values
+     */
+    public void testDescendingValuesToArray() {
+        ConcurrentNavigableMap map = dmap5();
+        Collection v = map.values();
+        Object[] ar = v.toArray();
+        ArrayList s = new ArrayList(Arrays.asList(ar));
+        assertEquals(5, ar.length);
+        assertTrue(s.contains("A"));
+        assertTrue(s.contains("B"));
+        assertTrue(s.contains("C"));
+        assertTrue(s.contains("D"));
+        assertTrue(s.contains("E"));
+    }
+
+
+    /**
+     * entrySet contains all pairs
+     */
+    public void testDescendingEntrySet() {
+        ConcurrentNavigableMap map = dmap5();
+        Set s = map.entrySet();
+        assertEquals(5, s.size());
+        Iterator it = s.iterator();
+        while (it.hasNext()) {
+            Map.Entry e = (Map.Entry) it.next();
+            assertTrue(
+                       (e.getKey().equals(m1) && e.getValue().equals("A")) ||
+                       (e.getKey().equals(m2) && e.getValue().equals("B")) ||
+                       (e.getKey().equals(m3) && e.getValue().equals("C")) ||
+                       (e.getKey().equals(m4) && e.getValue().equals("D")) ||
+                       (e.getKey().equals(m5) && e.getValue().equals("E")));
+        }
+    }
+
+    /**
+     *   putAll  adds all key-value pairs from the given map
+     */
+    public void testDescendingPutAll() {
+        ConcurrentNavigableMap empty = dmap0();
+        ConcurrentNavigableMap map = dmap5();
+        empty.putAll(map);
+        assertEquals(5, empty.size());
+        assertTrue(empty.containsKey(m1));
+        assertTrue(empty.containsKey(m2));
+        assertTrue(empty.containsKey(m3));
+        assertTrue(empty.containsKey(m4));
+        assertTrue(empty.containsKey(m5));
+    }
+
+    /**
+     *   putIfAbsent works when the given key is not present
+     */
+    public void testDescendingPutIfAbsent() {
+        ConcurrentNavigableMap map = dmap5();
+        map.putIfAbsent(six, "Z");
+        assertTrue(map.containsKey(six));
+    }
+
+    /**
+     *   putIfAbsent does not add the pair if the key is already present
+     */
+    public void testDescendingPutIfAbsent2() {
+        ConcurrentNavigableMap map = dmap5();
+        assertEquals("A", map.putIfAbsent(m1, "Z"));
+    }
+
+    /**
+     *   replace fails when the given key is not present
+     */
+    public void testDescendingReplace() {
+        ConcurrentNavigableMap map = dmap5();
+        assertNull(map.replace(six, "Z"));
+        assertFalse(map.containsKey(six));
+    }
+
+    /**
+     *   replace succeeds if the key is already present
+     */
+    public void testDescendingReplace2() {
+        ConcurrentNavigableMap map = dmap5();
+        assertNotNull(map.replace(m1, "Z"));
+        assertEquals("Z", map.get(m1));
+    }
+
+
+    /**
+     * replace value fails when the given key not mapped to expected value
+     */
+    public void testDescendingReplaceValue() {
+        ConcurrentNavigableMap map = dmap5();
+        assertEquals("A", map.get(m1));
+        assertFalse(map.replace(m1, "Z", "Z"));
+        assertEquals("A", map.get(m1));
+    }
+
+    /**
+     * replace value succeeds when the given key mapped to expected value
+     */
+    public void testDescendingReplaceValue2() {
+        ConcurrentNavigableMap map = dmap5();
+        assertEquals("A", map.get(m1));
+        assertTrue(map.replace(m1, "A", "Z"));
+        assertEquals("Z", map.get(m1));
+    }
+
+
+    /**
+     *   remove removes the correct key-value pair from the map
+     */
+    public void testDescendingRemove() {
+        ConcurrentNavigableMap map = dmap5();
+        map.remove(m5);
+        assertEquals(4, map.size());
+        assertFalse(map.containsKey(m5));
+    }
+
+    /**
+     * remove(key,value) removes only if pair present
+     */
+    public void testDescendingRemove2() {
+        ConcurrentNavigableMap map = dmap5();
+        assertTrue(map.containsKey(m5));
+        assertEquals("E", map.get(m5));
+        map.remove(m5, "E");
+        assertEquals(4, map.size());
+        assertFalse(map.containsKey(m5));
+        map.remove(m4, "A");
+        assertEquals(4, map.size());
+        assertTrue(map.containsKey(m4));
+
+    }
+
+    /**
+     * lowerEntry returns preceding entry.
+     */
+    public void testDescendingLowerEntry() {
+        ConcurrentNavigableMap map = dmap5();
+        Map.Entry e1 = map.lowerEntry(m3);
+        assertEquals(m2, e1.getKey());
+
+        Map.Entry e2 = map.lowerEntry(m6);
+        assertEquals(m5, e2.getKey());
+
+        Map.Entry e3 = map.lowerEntry(m1);
+        assertNull(e3);
+
+        Map.Entry e4 = map.lowerEntry(zero);
+        assertNull(e4);
+
+    }
+
+    /**
+     * higherEntry returns next entry.
+     */
+    public void testDescendingHigherEntry() {
+        ConcurrentNavigableMap map = dmap5();
+        Map.Entry e1 = map.higherEntry(m3);
+        assertEquals(m4, e1.getKey());
+
+        Map.Entry e2 = map.higherEntry(zero);
+        assertEquals(m1, e2.getKey());
+
+        Map.Entry e3 = map.higherEntry(m5);
+        assertNull(e3);
+
+        Map.Entry e4 = map.higherEntry(m6);
+        assertNull(e4);
+
+    }
+
+    /**
+     * floorEntry returns preceding entry.
+     */
+    public void testDescendingFloorEntry() {
+        ConcurrentNavigableMap map = dmap5();
+        Map.Entry e1 = map.floorEntry(m3);
+        assertEquals(m3, e1.getKey());
+
+        Map.Entry e2 = map.floorEntry(m6);
+        assertEquals(m5, e2.getKey());
+
+        Map.Entry e3 = map.floorEntry(m1);
+        assertEquals(m1, e3.getKey());
+
+        Map.Entry e4 = map.floorEntry(zero);
+        assertNull(e4);
+
+    }
+
+    /**
+     * ceilingEntry returns next entry.
+     */
+    public void testDescendingCeilingEntry() {
+        ConcurrentNavigableMap map = dmap5();
+        Map.Entry e1 = map.ceilingEntry(m3);
+        assertEquals(m3, e1.getKey());
+
+        Map.Entry e2 = map.ceilingEntry(zero);
+        assertEquals(m1, e2.getKey());
+
+        Map.Entry e3 = map.ceilingEntry(m5);
+        assertEquals(m5, e3.getKey());
+
+        Map.Entry e4 = map.ceilingEntry(m6);
+        assertNull(e4);
+
+    }
+
+    /**
+     * pollFirstEntry returns entries in order
+     */
+    public void testDescendingPollFirstEntry() {
+        ConcurrentNavigableMap map = dmap5();
+        Map.Entry e = map.pollFirstEntry();
+        assertEquals(m1, e.getKey());
+        assertEquals("A", e.getValue());
+        e = map.pollFirstEntry();
+        assertEquals(m2, e.getKey());
+        map.put(m1, "A");
+        e = map.pollFirstEntry();
+        assertEquals(m1, e.getKey());
+        assertEquals("A", e.getValue());
+        e = map.pollFirstEntry();
+        assertEquals(m3, e.getKey());
+        map.remove(m4);
+        e = map.pollFirstEntry();
+        assertEquals(m5, e.getKey());
+        try {
+            e.setValue("A");
+            shouldThrow();
+        } catch (Exception ok) {
+        }
+        e = map.pollFirstEntry();
+        assertNull(e);
+    }
+
+    /**
+     * pollLastEntry returns entries in order
+     */
+    public void testDescendingPollLastEntry() {
+        ConcurrentNavigableMap map = dmap5();
+        Map.Entry e = map.pollLastEntry();
+        assertEquals(m5, e.getKey());
+        assertEquals("E", e.getValue());
+        e = map.pollLastEntry();
+        assertEquals(m4, e.getKey());
+        map.put(m5, "E");
+        e = map.pollLastEntry();
+        assertEquals(m5, e.getKey());
+        assertEquals("E", e.getValue());
+        e = map.pollLastEntry();
+        assertEquals(m3, e.getKey());
+        map.remove(m2);
+        e = map.pollLastEntry();
+        assertEquals(m1, e.getKey());
+        try {
+            e.setValue("E");
+            shouldThrow();
+        } catch (Exception ok) {
+        }
+        e = map.pollLastEntry();
+        assertNull(e);
+    }
+
+    /**
+     *   size returns the correct values
+     */
+    public void testDescendingSize() {
+        ConcurrentNavigableMap map = dmap5();
+        ConcurrentNavigableMap empty = dmap0();
+        assertEquals(0, empty.size());
+        assertEquals(5, map.size());
+    }
+
+    /**
+     * toString contains toString of elements
+     */
+    public void testDescendingToString() {
+        ConcurrentNavigableMap map = dmap5();
+        String s = map.toString();
+        for (int i = 1; i <= 5; ++i) {
+            assertTrue(s.indexOf(String.valueOf(i)) >= 0);
+        }
+    }
+
+    // Exception testDescendings
+
+    /**
+     * get(null) of nm1mpty map throws NPE
+     */
+    public void testDescendingGet_NullPointerException() {
+        try {
+            ConcurrentNavigableMap c = dmap5();
+            c.get(null);
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * containsKey(null) of nm1mpty map throws NPE
+     */
+    public void testDescendingContainsKey_NullPointerException() {
+        try {
+            ConcurrentNavigableMap c = dmap5();
+            c.containsKey(null);
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * containsValue(null) throws NPE
+     */
+    public void testDescendingContainsValue_NullPointerException() {
+        try {
+            ConcurrentNavigableMap c = dmap0();
+            c.containsValue(null);
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+
+    /**
+     * put(null,x) throws NPE
+     */
+    public void testDescendingPut1_NullPointerException() {
+        try {
+            ConcurrentNavigableMap c = dmap5();
+            c.put(null, "whatever");
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * putIfAbsent(null, x) throws NPE
+     */
+    public void testDescendingPutIfAbsent1_NullPointerException() {
+        try {
+            ConcurrentNavigableMap c = dmap5();
+            c.putIfAbsent(null, "whatever");
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * replace(null, x) throws NPE
+     */
+    public void testDescendingReplace_NullPointerException() {
+        try {
+            ConcurrentNavigableMap c = dmap5();
+            c.replace(null, "whatever");
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * replace(null, x, y) throws NPE
+     */
+    public void testDescendingReplaceValue_NullPointerException() {
+        try {
+            ConcurrentNavigableMap c = dmap5();
+            c.replace(null, m1, "whatever");
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * remove(null) throws NPE
+     */
+    public void testDescendingRemove1_NullPointerException() {
+        try {
+            ConcurrentNavigableMap c = dmap5();
+            c.remove(null);
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * remove(null, x) throws NPE
+     */
+    public void testDescendingRemove2_NullPointerException() {
+        try {
+            ConcurrentNavigableMap c = dmap5();
+            c.remove(null, "whatever");
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * A deserialized map equals original
+     */
+    public void testDescendingSerialization() {
+        ConcurrentNavigableMap q = dmap5();
+
+        try {
+            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
+            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
+            out.writeObject(q);
+            out.close();
+
+            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
+            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
+            ConcurrentNavigableMap r = (ConcurrentNavigableMap)in.readObject();
+            assertEquals(q.size(), r.size());
+            assertTrue(q.equals(r));
+            assertTrue(r.equals(q));
+        } catch(Exception e){
+            e.printStackTrace();
+            unexpectedException();
+        }
+    }
+
+
+
+    /**
+     * subMap returns map with keys in requested range
+     */
+    public void testDescendingSubMapContents() {
+        ConcurrentNavigableMap map = dmap5();
+        SortedMap sm = map.subMap(m2, m4);
+        assertEquals(m2, sm.firstKey());
+        assertEquals(m3, sm.lastKey());
+        assertEquals(2, sm.size());
+        assertFalse(sm.containsKey(m1));
+        assertTrue(sm.containsKey(m2));
+        assertTrue(sm.containsKey(m3));
+        assertFalse(sm.containsKey(m4));
+        assertFalse(sm.containsKey(m5));
+        Iterator i = sm.keySet().iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(m2, k);
+        k = (Integer)(i.next());
+        assertEquals(m3, k);
+        assertFalse(i.hasNext());
+        Iterator j = sm.keySet().iterator();
+        j.next();
+        j.remove();
+        assertFalse(map.containsKey(m2));
+        assertEquals(4, map.size());
+        assertEquals(1, sm.size());
+        assertEquals(m3, sm.firstKey());
+        assertEquals(m3, sm.lastKey());
+        assertTrue(sm.remove(m3) != null);
+        assertTrue(sm.isEmpty());
+        assertEquals(3, map.size());
+    }
+
+    public void testDescendingSubMapContents2() {
+        ConcurrentNavigableMap map = dmap5();
+        SortedMap sm = map.subMap(m2, m3);
+        assertEquals(1, sm.size());
+        assertEquals(m2, sm.firstKey());
+        assertEquals(m2, sm.lastKey());
+        assertFalse(sm.containsKey(m1));
+        assertTrue(sm.containsKey(m2));
+        assertFalse(sm.containsKey(m3));
+        assertFalse(sm.containsKey(m4));
+        assertFalse(sm.containsKey(m5));
+        Iterator i = sm.keySet().iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(m2, k);
+        assertFalse(i.hasNext());
+        Iterator j = sm.keySet().iterator();
+        j.next();
+        j.remove();
+        assertFalse(map.containsKey(m2));
+        assertEquals(4, map.size());
+        assertEquals(0, sm.size());
+        assertTrue(sm.isEmpty());
+        assertTrue(sm.remove(m3) == null);
+        assertEquals(4, map.size());
+    }
+
+    /**
+     * headMap returns map with keys in requested range
+     */
+    public void testDescendingHeadMapContents() {
+        ConcurrentNavigableMap map = dmap5();
+        SortedMap sm = map.headMap(m4);
+        assertTrue(sm.containsKey(m1));
+        assertTrue(sm.containsKey(m2));
+        assertTrue(sm.containsKey(m3));
+        assertFalse(sm.containsKey(m4));
+        assertFalse(sm.containsKey(m5));
+        Iterator i = sm.keySet().iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(m1, k);
+        k = (Integer)(i.next());
+        assertEquals(m2, k);
+        k = (Integer)(i.next());
+        assertEquals(m3, k);
+        assertFalse(i.hasNext());
+        sm.clear();
+        assertTrue(sm.isEmpty());
+        assertEquals(2, map.size());
+        assertEquals(m4, map.firstKey());
+    }
+
+    /**
+     * headMap returns map with keys in requested range
+     */
+    public void testDescendingTailMapContents() {
+        ConcurrentNavigableMap map = dmap5();
+        SortedMap sm = map.tailMap(m2);
+        assertFalse(sm.containsKey(m1));
+        assertTrue(sm.containsKey(m2));
+        assertTrue(sm.containsKey(m3));
+        assertTrue(sm.containsKey(m4));
+        assertTrue(sm.containsKey(m5));
+        Iterator i = sm.keySet().iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(m2, k);
+        k = (Integer)(i.next());
+        assertEquals(m3, k);
+        k = (Integer)(i.next());
+        assertEquals(m4, k);
+        k = (Integer)(i.next());
+        assertEquals(m5, k);
+        assertFalse(i.hasNext());
+
+        Iterator ei = sm.entrySet().iterator();
+        Map.Entry e;
+        e = (Map.Entry)(ei.next());
+        assertEquals(m2, e.getKey());
+        assertEquals("B", e.getValue());
+        e = (Map.Entry)(ei.next());
+        assertEquals(m3, e.getKey());
+        assertEquals("C", e.getValue());
+        e = (Map.Entry)(ei.next());
+        assertEquals(m4, e.getKey());
+        assertEquals("D", e.getValue());
+        e = (Map.Entry)(ei.next());
+        assertEquals(m5, e.getKey());
+        assertEquals("E", e.getValue());
+        assertFalse(i.hasNext());
+
+        SortedMap ssm = sm.tailMap(m4);
+        assertEquals(m4, ssm.firstKey());
+        assertEquals(m5, ssm.lastKey());
+        assertTrue(ssm.remove(m4) != null);
+        assertEquals(1, ssm.size());
+        assertEquals(3, sm.size());
+        assertEquals(4, map.size());
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/ConcurrentSkipListSubSetTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/ConcurrentSkipListSubSetTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/ConcurrentSkipListSubSetTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,1157 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import java.io.*;
+import edu.emory.mathcs.backport.java.util.*;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.SortedSet;
+
+public class ConcurrentSkipListSubSetTest extends JSR166TestCase {
+    public static void main(String[] args) {
+        junit.textui.TestRunner.run (suite());
+    }
+    public static Test suite() {
+        return new TestSuite(ConcurrentSkipListSubSetTest.class);
+    }
+
+    static class MyReverseComparator implements Comparator {
+        public int compare(Object x, Object y) {
+            int i = ((Integer)x).intValue();
+            int j = ((Integer)y).intValue();
+            if (i < j) return 1;
+            if (i > j) return -1;
+            return 0;
+        }
+    }
+
+    /**
+     * Create a set of given size containing consecutive
+     * Integers 0 ... n.
+     */
+    private NavigableSet populatedSet(int n) {
+        ConcurrentSkipListSet q = new ConcurrentSkipListSet();
+        assertTrue(q.isEmpty());
+
+        for(int i = n-1; i >= 0; i-=2)
+            assertTrue(q.add(new Integer(i)));
+        for(int i = (n & 1); i < n; i+=2)
+            assertTrue(q.add(new Integer(i)));
+        assertTrue(q.add(new Integer(-n)));
+        assertTrue(q.add(new Integer(n)));
+        NavigableSet s = q.subSet(new Integer(0), true, new Integer(n), false);
+        assertFalse(s.isEmpty());
+        assertEquals(n, s.size());
+        return s;
+    }
+
+    /**
+     * Create set of first 5 ints
+     */
+    private NavigableSet set5() {
+        ConcurrentSkipListSet q = new ConcurrentSkipListSet();
+        assertTrue(q.isEmpty());
+        q.add(one);
+        q.add(two);
+        q.add(three);
+        q.add(four);
+        q.add(five);
+        q.add(zero);
+        q.add(seven);
+        NavigableSet s = q.subSet(one, true, seven, false);
+        assertEquals(5, s.size());
+        return s;
+    }
+
+    /**
+     * Create set of first 5 negative ints
+     */
+    private NavigableSet dset5() {
+        ConcurrentSkipListSet q = new ConcurrentSkipListSet();
+        assertTrue(q.isEmpty());
+        q.add(m1);
+        q.add(m2);
+        q.add(m3);
+        q.add(m4);
+        q.add(m5);
+        NavigableSet s = q.descendingSet();
+        assertEquals(5, s.size());
+        return s;
+    }
+
+    private static NavigableSet set0() {
+        ConcurrentSkipListSet set = new ConcurrentSkipListSet();
+        assertTrue(set.isEmpty());
+        return set.tailSet(m1, true);
+    }
+
+    private static NavigableSet dset0() {
+        ConcurrentSkipListSet set = new ConcurrentSkipListSet();
+        assertTrue(set.isEmpty());
+        return set;
+    }
+
+    /**
+     * A new set has unbounded capacity
+     */
+    public void testConstructor1() {
+        assertEquals(0, set0().size());
+    }
+
+
+    /**
+     * isEmpty is true before add, false after
+     */
+    public void testEmpty() {
+        NavigableSet q = set0();
+        assertTrue(q.isEmpty());
+        q.add(new Integer(1));
+        assertFalse(q.isEmpty());
+        q.add(new Integer(2));
+        q.pollFirst();
+        q.pollFirst();
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * size changes when elements added and removed
+     */
+    public void testSize() {
+        NavigableSet q = populatedSet(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(SIZE-i, q.size());
+            q.pollFirst();
+        }
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, q.size());
+            q.add(new Integer(i));
+        }
+    }
+
+    /**
+     * add(null) throws NPE
+     */
+    public void testAddNull() {
+        try {
+            NavigableSet q = set0();
+            q.add(null);
+            shouldThrow();
+        } catch (NullPointerException success) { }
+    }
+
+    /**
+     * Add of comparable element succeeds
+     */
+    public void testAdd() {
+        NavigableSet q = set0();
+        assertTrue(q.add(six));
+    }
+
+    /**
+     * Add of duplicate element fails
+     */
+    public void testAddDup() {
+        NavigableSet q = set0();
+        assertTrue(q.add(six));
+        assertFalse(q.add(six));
+    }
+
+    /**
+     * Add of non-Comparable throws CCE
+     */
+    public void testAddNonComparable() {
+        try {
+            NavigableSet q = set0();
+            q.add(new Object());
+            q.add(new Object());
+            q.add(new Object());
+            shouldThrow();
+        }
+        catch(ClassCastException success) {}
+    }
+
+
+    /**
+     * addAll(null) throws NPE
+     */
+    public void testAddAll1() {
+        try {
+            NavigableSet q = set0();
+            q.addAll(null);
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+    /**
+     * addAll of a collection with null elements throws NPE
+     */
+    public void testAddAll2() {
+        try {
+            NavigableSet q = set0();
+            Integer[] ints = new Integer[SIZE];
+            q.addAll(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+    /**
+     * addAll of a collection with any null elements throws NPE after
+     * possibly adding some elements
+     */
+    public void testAddAll3() {
+        try {
+            NavigableSet q = set0();
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE-1; ++i)
+                ints[i] = new Integer(i+SIZE);
+            q.addAll(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Set contains all elements of successful addAll
+     */
+    public void testAddAll5() {
+        try {
+            Integer[] empty = new Integer[0];
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE; ++i)
+                ints[i] = new Integer(SIZE-1- i);
+            NavigableSet q = set0();
+            assertFalse(q.addAll(Arrays.asList(empty)));
+            assertTrue(q.addAll(Arrays.asList(ints)));
+            for (int i = 0; i < SIZE; ++i)
+                assertEquals(new Integer(i), q.pollFirst());
+        }
+        finally {}
+    }
+
+    /**
+     * poll succeeds unless empty
+     */
+    public void testPoll() {
+        NavigableSet q = populatedSet(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.pollFirst()).intValue());
+        }
+        assertNull(q.pollFirst());
+    }
+
+    /**
+     * remove(x) removes x and returns true if present
+     */
+    public void testRemoveElement() {
+        NavigableSet q = populatedSet(SIZE);
+        for (int i = 1; i < SIZE; i+=2) {
+            assertTrue(q.remove(new Integer(i)));
+        }
+        for (int i = 0; i < SIZE; i+=2) {
+            assertTrue(q.remove(new Integer(i)));
+            assertFalse(q.remove(new Integer(i+1)));
+        }
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * contains(x) reports true when elements added but not yet removed
+     */
+    public void testContains() {
+        NavigableSet q = populatedSet(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(q.contains(new Integer(i)));
+            q.pollFirst();
+            assertFalse(q.contains(new Integer(i)));
+        }
+    }
+
+    /**
+     * clear removes all elements
+     */
+    public void testClear() {
+        NavigableSet q = populatedSet(SIZE);
+        q.clear();
+        assertTrue(q.isEmpty());
+        assertEquals(0, q.size());
+        q.add(new Integer(1));
+        assertFalse(q.isEmpty());
+        q.clear();
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * containsAll(c) is true when c contains a subset of elements
+     */
+    public void testContainsAll() {
+        NavigableSet q = populatedSet(SIZE);
+        NavigableSet p = set0();
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(q.containsAll(p));
+            assertFalse(p.containsAll(q));
+            p.add(new Integer(i));
+        }
+        assertTrue(p.containsAll(q));
+    }
+
+    /**
+     * retainAll(c) retains only those elements of c and reports true if changed
+     */
+    public void testRetainAll() {
+        NavigableSet q = populatedSet(SIZE);
+        NavigableSet p = populatedSet(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            boolean changed = q.retainAll(p);
+            if (i == 0)
+                assertFalse(changed);
+            else
+                assertTrue(changed);
+
+            assertTrue(q.containsAll(p));
+            assertEquals(SIZE-i, q.size());
+            p.pollFirst();
+        }
+    }
+
+    /**
+     * removeAll(c) removes only those elements of c and reports true if changed
+     */
+    public void testRemoveAll() {
+        for (int i = 1; i < SIZE; ++i) {
+            NavigableSet q = populatedSet(SIZE);
+            NavigableSet p = populatedSet(i);
+            assertTrue(q.removeAll(p));
+            assertEquals(SIZE-i, q.size());
+            for (int j = 0; j < i; ++j) {
+                Integer I = (Integer)(p.pollFirst());
+                assertFalse(q.contains(I));
+            }
+        }
+    }
+
+
+
+    /**
+     * lower returns preceding element
+     */
+    public void testLower() {
+        NavigableSet q = set5();
+        Object e1 = q.lower(three);
+        assertEquals(two, e1);
+
+        Object e2 = q.lower(six);
+        assertEquals(five, e2);
+
+        Object e3 = q.lower(one);
+        assertNull(e3);
+
+        Object e4 = q.lower(zero);
+        assertNull(e4);
+
+    }
+
+    /**
+     * higher returns next element
+     */
+    public void testHigher() {
+        NavigableSet q = set5();
+        Object e1 = q.higher(three);
+        assertEquals(four, e1);
+
+        Object e2 = q.higher(zero);
+        assertEquals(one, e2);
+
+        Object e3 = q.higher(five);
+        assertNull(e3);
+
+        Object e4 = q.higher(six);
+        assertNull(e4);
+
+    }
+
+    /**
+     * floor returns preceding element
+     */
+    public void testFloor() {
+        NavigableSet q = set5();
+        Object e1 = q.floor(three);
+        assertEquals(three, e1);
+
+        Object e2 = q.floor(six);
+        assertEquals(five, e2);
+
+        Object e3 = q.floor(one);
+        assertEquals(one, e3);
+
+        Object e4 = q.floor(zero);
+        assertNull(e4);
+
+    }
+
+    /**
+     * ceiling returns next element
+     */
+    public void testCeiling() {
+        NavigableSet q = set5();
+        Object e1 = q.ceiling(three);
+        assertEquals(three, e1);
+
+        Object e2 = q.ceiling(zero);
+        assertEquals(one, e2);
+
+        Object e3 = q.ceiling(five);
+        assertEquals(five, e3);
+
+        Object e4 = q.ceiling(six);
+        assertNull(e4);
+
+    }
+
+    /**
+     * toArray contains all elements
+     */
+    public void testToArray() {
+        NavigableSet q = populatedSet(SIZE);
+        Object[] o = q.toArray();
+        Arrays.sort(o);
+        for(int i = 0; i < o.length; i++)
+            assertEquals(o[i], q.pollFirst());
+    }
+
+    /**
+     * toArray(a) contains all elements
+     */
+    public void testToArray2() {
+        NavigableSet q = populatedSet(SIZE);
+        Integer[] ints = new Integer[SIZE];
+        ints = (Integer[])q.toArray(ints);
+        Arrays.sort(ints);
+        for(int i = 0; i < ints.length; i++)
+            assertEquals(ints[i], q.pollFirst());
+    }
+
+    /**
+     * iterator iterates through all elements
+     */
+    public void testIterator() {
+        NavigableSet q = populatedSet(SIZE);
+        int i = 0;
+        Iterator it = q.iterator();
+        while(it.hasNext()) {
+            assertTrue(q.contains(it.next()));
+            ++i;
+        }
+        assertEquals(i, SIZE);
+    }
+
+    /**
+     * iterator of empty set has no elements
+     */
+    public void testEmptyIterator() {
+        NavigableSet q = set0();
+        int i = 0;
+        Iterator it = q.iterator();
+        while(it.hasNext()) {
+            assertTrue(q.contains(it.next()));
+            ++i;
+        }
+        assertEquals(i, 0);
+    }
+
+    /**
+     * iterator.remove removes current element
+     */
+    public void testIteratorRemove () {
+        final NavigableSet q = set0();
+        q.add(new Integer(2));
+        q.add(new Integer(1));
+        q.add(new Integer(3));
+
+        Iterator it = q.iterator();
+        it.next();
+        it.remove();
+
+        it = q.iterator();
+        assertEquals(it.next(), new Integer(2));
+        assertEquals(it.next(), new Integer(3));
+        assertFalse(it.hasNext());
+    }
+
+
+    /**
+     * toString contains toStrings of elements
+     */
+    public void testToString() {
+        NavigableSet q = populatedSet(SIZE);
+        String s = q.toString();
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(s.indexOf(String.valueOf(i)) >= 0);
+        }
+    }
+
+    /**
+     * A deserialized serialized set has same elements
+     */
+    public void testSerialization() {
+        NavigableSet q = populatedSet(SIZE);
+        try {
+            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
+            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
+            out.writeObject(q);
+            out.close();
+
+            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
+            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
+            NavigableSet r = (NavigableSet)in.readObject();
+            assertEquals(q.size(), r.size());
+            while (!q.isEmpty())
+                assertEquals(q.pollFirst(), r.pollFirst());
+        } catch(Exception e){
+            e.printStackTrace();
+            unexpectedException();
+        }
+    }
+
+    /**
+     * subSet returns set with keys in requested range
+     */
+    public void testSubSetContents() {
+        NavigableSet set = set5();
+        SortedSet sm = set.subSet(two, four);
+        assertEquals(two, sm.first());
+        assertEquals(three, sm.last());
+        assertEquals(2, sm.size());
+        assertFalse(sm.contains(one));
+        assertTrue(sm.contains(two));
+        assertTrue(sm.contains(three));
+        assertFalse(sm.contains(four));
+        assertFalse(sm.contains(five));
+        Iterator i = sm.iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(two, k);
+        k = (Integer)(i.next());
+        assertEquals(three, k);
+        assertFalse(i.hasNext());
+        Iterator j = sm.iterator();
+        j.next();
+        j.remove();
+        assertFalse(set.contains(two));
+        assertEquals(4, set.size());
+        assertEquals(1, sm.size());
+        assertEquals(three, sm.first());
+        assertEquals(three, sm.last());
+        assertTrue(sm.remove(three));
+        assertTrue(sm.isEmpty());
+        assertEquals(3, set.size());
+    }
+
+    public void testSubSetContents2() {
+        NavigableSet set = set5();
+        SortedSet sm = set.subSet(two, three);
+        assertEquals(1, sm.size());
+        assertEquals(two, sm.first());
+        assertEquals(two, sm.last());
+        assertFalse(sm.contains(one));
+        assertTrue(sm.contains(two));
+        assertFalse(sm.contains(three));
+        assertFalse(sm.contains(four));
+        assertFalse(sm.contains(five));
+        Iterator i = sm.iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(two, k);
+        assertFalse(i.hasNext());
+        Iterator j = sm.iterator();
+        j.next();
+        j.remove();
+        assertFalse(set.contains(two));
+        assertEquals(4, set.size());
+        assertEquals(0, sm.size());
+        assertTrue(sm.isEmpty());
+        assertFalse(sm.remove(three));
+        assertEquals(4, set.size());
+    }
+
+    /**
+     * headSet returns set with keys in requested range
+     */
+    public void testHeadSetContents() {
+        NavigableSet set = set5();
+        SortedSet sm = set.headSet(four);
+        assertTrue(sm.contains(one));
+        assertTrue(sm.contains(two));
+        assertTrue(sm.contains(three));
+        assertFalse(sm.contains(four));
+        assertFalse(sm.contains(five));
+        Iterator i = sm.iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(one, k);
+        k = (Integer)(i.next());
+        assertEquals(two, k);
+        k = (Integer)(i.next());
+        assertEquals(three, k);
+        assertFalse(i.hasNext());
+        sm.clear();
+        assertTrue(sm.isEmpty());
+        assertEquals(2, set.size());
+        assertEquals(four, set.first());
+    }
+
+    /**
+     * tailSet returns set with keys in requested range
+     */
+    public void testTailSetContents() {
+        NavigableSet set = set5();
+        SortedSet sm = set.tailSet(two);
+        assertFalse(sm.contains(one));
+        assertTrue(sm.contains(two));
+        assertTrue(sm.contains(three));
+        assertTrue(sm.contains(four));
+        assertTrue(sm.contains(five));
+        Iterator i = sm.iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(two, k);
+        k = (Integer)(i.next());
+        assertEquals(three, k);
+        k = (Integer)(i.next());
+        assertEquals(four, k);
+        k = (Integer)(i.next());
+        assertEquals(five, k);
+        assertFalse(i.hasNext());
+
+        SortedSet ssm = sm.tailSet(four);
+        assertEquals(four, ssm.first());
+        assertEquals(five, ssm.last());
+        assertTrue(ssm.remove(four));
+        assertEquals(1, ssm.size());
+        assertEquals(3, sm.size());
+        assertEquals(4, set.size());
+    }
+
+    /**
+     * size changes when elements added and removed
+     */
+    public void testDescendingSize() {
+        NavigableSet q = populatedSet(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(SIZE-i, q.size());
+            q.pollFirst();
+        }
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, q.size());
+            q.add(new Integer(i));
+        }
+    }
+
+    /**
+     * add(null) throws NPE
+     */
+    public void testDescendingAddNull() {
+        try {
+            NavigableSet q = dset0();
+            q.add(null);
+            shouldThrow();
+        } catch (NullPointerException success) { }
+    }
+
+    /**
+     * Add of comparable element succeeds
+     */
+    public void testDescendingAdd() {
+        NavigableSet q = dset0();
+        assertTrue(q.add(m6));
+    }
+
+    /**
+     * Add of duplicate element fails
+     */
+    public void testDescendingAddDup() {
+        NavigableSet q = dset0();
+        assertTrue(q.add(m6));
+        assertFalse(q.add(m6));
+    }
+
+    /**
+     * Add of non-Comparable throws CCE
+     */
+    public void testDescendingAddNonComparable() {
+        try {
+            NavigableSet q = dset0();
+            q.add(new Object());
+            q.add(new Object());
+            q.add(new Object());
+            shouldThrow();
+        }
+        catch(ClassCastException success) {}
+    }
+
+
+    /**
+     * addAll(null) throws NPE
+     */
+    public void testDescendingAddAll1() {
+        try {
+            NavigableSet q = dset0();
+            q.addAll(null);
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+    /**
+     * addAll of a collection with null elements throws NPE
+     */
+    public void testDescendingAddAll2() {
+        try {
+            NavigableSet q = dset0();
+            Integer[] ints = new Integer[SIZE];
+            q.addAll(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+    /**
+     * addAll of a collection with any null elements throws NPE after
+     * possibly adding some elements
+     */
+    public void testDescendingAddAll3() {
+        try {
+            NavigableSet q = dset0();
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE-1; ++i)
+                ints[i] = new Integer(i+SIZE);
+            q.addAll(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Set contains all elements of successful addAll
+     */
+    public void testDescendingAddAll5() {
+        try {
+            Integer[] empty = new Integer[0];
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE; ++i)
+                ints[i] = new Integer(SIZE-1- i);
+            NavigableSet q = dset0();
+            assertFalse(q.addAll(Arrays.asList(empty)));
+            assertTrue(q.addAll(Arrays.asList(ints)));
+            for (int i = 0; i < SIZE; ++i)
+                assertEquals(new Integer(i), q.pollFirst());
+        }
+        finally {}
+    }
+
+    /**
+     * poll succeeds unless empty
+     */
+    public void testDescendingPoll() {
+        NavigableSet q = populatedSet(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.pollFirst()).intValue());
+        }
+        assertNull(q.pollFirst());
+    }
+
+    /**
+     * remove(x) removes x and returns true if present
+     */
+    public void testDescendingRemoveElement() {
+        NavigableSet q = populatedSet(SIZE);
+        for (int i = 1; i < SIZE; i+=2) {
+            assertTrue(q.remove(new Integer(i)));
+        }
+        for (int i = 0; i < SIZE; i+=2) {
+            assertTrue(q.remove(new Integer(i)));
+            assertFalse(q.remove(new Integer(i+1)));
+        }
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * contains(x) reports true when elements added but not yet removed
+     */
+    public void testDescendingContains() {
+        NavigableSet q = populatedSet(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(q.contains(new Integer(i)));
+            q.pollFirst();
+            assertFalse(q.contains(new Integer(i)));
+        }
+    }
+
+    /**
+     * clear removes all elements
+     */
+    public void testDescendingClear() {
+        NavigableSet q = populatedSet(SIZE);
+        q.clear();
+        assertTrue(q.isEmpty());
+        assertEquals(0, q.size());
+        q.add(new Integer(1));
+        assertFalse(q.isEmpty());
+        q.clear();
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * containsAll(c) is true when c contains a subset of elements
+     */
+    public void testDescendingContainsAll() {
+        NavigableSet q = populatedSet(SIZE);
+        NavigableSet p = dset0();
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(q.containsAll(p));
+            assertFalse(p.containsAll(q));
+            p.add(new Integer(i));
+        }
+        assertTrue(p.containsAll(q));
+    }
+
+    /**
+     * retainAll(c) retains only those elements of c and reports true if changed
+     */
+    public void testDescendingRetainAll() {
+        NavigableSet q = populatedSet(SIZE);
+        NavigableSet p = populatedSet(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            boolean changed = q.retainAll(p);
+            if (i == 0)
+                assertFalse(changed);
+            else
+                assertTrue(changed);
+
+            assertTrue(q.containsAll(p));
+            assertEquals(SIZE-i, q.size());
+            p.pollFirst();
+        }
+    }
+
+    /**
+     * removeAll(c) removes only those elements of c and reports true if changed
+     */
+    public void testDescendingRemoveAll() {
+        for (int i = 1; i < SIZE; ++i) {
+            NavigableSet q = populatedSet(SIZE);
+            NavigableSet p = populatedSet(i);
+            assertTrue(q.removeAll(p));
+            assertEquals(SIZE-i, q.size());
+            for (int j = 0; j < i; ++j) {
+                Integer I = (Integer)(p.pollFirst());
+                assertFalse(q.contains(I));
+            }
+        }
+    }
+
+
+
+    /**
+     * lower returns preceding element
+     */
+    public void testDescendingLower() {
+        NavigableSet q = dset5();
+        Object e1 = q.lower(m3);
+        assertEquals(m2, e1);
+
+        Object e2 = q.lower(m6);
+        assertEquals(m5, e2);
+
+        Object e3 = q.lower(m1);
+        assertNull(e3);
+
+        Object e4 = q.lower(zero);
+        assertNull(e4);
+
+    }
+
+    /**
+     * higher returns next element
+     */
+    public void testDescendingHigher() {
+        NavigableSet q = dset5();
+        Object e1 = q.higher(m3);
+        assertEquals(m4, e1);
+
+        Object e2 = q.higher(zero);
+        assertEquals(m1, e2);
+
+        Object e3 = q.higher(m5);
+        assertNull(e3);
+
+        Object e4 = q.higher(m6);
+        assertNull(e4);
+
+    }
+
+    /**
+     * floor returns preceding element
+     */
+    public void testDescendingFloor() {
+        NavigableSet q = dset5();
+        Object e1 = q.floor(m3);
+        assertEquals(m3, e1);
+
+        Object e2 = q.floor(m6);
+        assertEquals(m5, e2);
+
+        Object e3 = q.floor(m1);
+        assertEquals(m1, e3);
+
+        Object e4 = q.floor(zero);
+        assertNull(e4);
+
+    }
+
+    /**
+     * ceiling returns next element
+     */
+    public void testDescendingCeiling() {
+        NavigableSet q = dset5();
+        Object e1 = q.ceiling(m3);
+        assertEquals(m3, e1);
+
+        Object e2 = q.ceiling(zero);
+        assertEquals(m1, e2);
+
+        Object e3 = q.ceiling(m5);
+        assertEquals(m5, e3);
+
+        Object e4 = q.ceiling(m6);
+        assertNull(e4);
+
+    }
+
+    /**
+     * toArray contains all elements
+     */
+    public void testDescendingToArray() {
+        NavigableSet q = populatedSet(SIZE);
+        Object[] o = q.toArray();
+        Arrays.sort(o);
+        for(int i = 0; i < o.length; i++)
+            assertEquals(o[i], q.pollFirst());
+    }
+
+    /**
+     * toArray(a) contains all elements
+     */
+    public void testDescendingToArray2() {
+        NavigableSet q = populatedSet(SIZE);
+        Integer[] ints = new Integer[SIZE];
+        ints = (Integer[])q.toArray(ints);
+        Arrays.sort(ints);
+        for(int i = 0; i < ints.length; i++)
+            assertEquals(ints[i], q.pollFirst());
+    }
+
+    /**
+     * iterator iterates through all elements
+     */
+    public void testDescendingIterator() {
+        NavigableSet q = populatedSet(SIZE);
+        int i = 0;
+        Iterator it = q.iterator();
+        while(it.hasNext()) {
+            assertTrue(q.contains(it.next()));
+            ++i;
+        }
+        assertEquals(i, SIZE);
+    }
+
+    /**
+     * iterator of empty set has no elements
+     */
+    public void testDescendingEmptyIterator() {
+        NavigableSet q = dset0();
+        int i = 0;
+        Iterator it = q.iterator();
+        while(it.hasNext()) {
+            assertTrue(q.contains(it.next()));
+            ++i;
+        }
+        assertEquals(i, 0);
+    }
+
+    /**
+     * iterator.remove removes current element
+     */
+    public void testDescendingIteratorRemove () {
+        final NavigableSet q = dset0();
+        q.add(new Integer(2));
+        q.add(new Integer(1));
+        q.add(new Integer(3));
+
+        Iterator it = q.iterator();
+        it.next();
+        it.remove();
+
+        it = q.iterator();
+        assertEquals(it.next(), new Integer(2));
+        assertEquals(it.next(), new Integer(3));
+        assertFalse(it.hasNext());
+    }
+
+
+    /**
+     * toString contains toStrings of elements
+     */
+    public void testDescendingToString() {
+        NavigableSet q = populatedSet(SIZE);
+        String s = q.toString();
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(s.indexOf(String.valueOf(i)) >= 0);
+        }
+    }
+
+    /**
+     * A deserialized serialized set has same elements
+     */
+    public void testDescendingSerialization() {
+        NavigableSet q = populatedSet(SIZE);
+        try {
+            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
+            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
+            out.writeObject(q);
+            out.close();
+
+            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
+            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
+            NavigableSet r = (NavigableSet)in.readObject();
+            assertEquals(q.size(), r.size());
+            while (!q.isEmpty())
+                assertEquals(q.pollFirst(), r.pollFirst());
+        } catch(Exception e){
+            e.printStackTrace();
+            unexpectedException();
+        }
+    }
+
+    /**
+     * subSet returns set with keys in requested range
+     */
+    public void testDescendingSubSetContents() {
+        NavigableSet set = dset5();
+        SortedSet sm = set.subSet(m2, m4);
+        assertEquals(m2, sm.first());
+        assertEquals(m3, sm.last());
+        assertEquals(2, sm.size());
+        assertFalse(sm.contains(m1));
+        assertTrue(sm.contains(m2));
+        assertTrue(sm.contains(m3));
+        assertFalse(sm.contains(m4));
+        assertFalse(sm.contains(m5));
+        Iterator i = sm.iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(m2, k);
+        k = (Integer)(i.next());
+        assertEquals(m3, k);
+        assertFalse(i.hasNext());
+        Iterator j = sm.iterator();
+        j.next();
+        j.remove();
+        assertFalse(set.contains(m2));
+        assertEquals(4, set.size());
+        assertEquals(1, sm.size());
+        assertEquals(m3, sm.first());
+        assertEquals(m3, sm.last());
+        assertTrue(sm.remove(m3));
+        assertTrue(sm.isEmpty());
+        assertEquals(3, set.size());
+    }
+
+    public void testDescendingSubSetContents2() {
+        NavigableSet set = dset5();
+        SortedSet sm = set.subSet(m2, m3);
+        assertEquals(1, sm.size());
+        assertEquals(m2, sm.first());
+        assertEquals(m2, sm.last());
+        assertFalse(sm.contains(m1));
+        assertTrue(sm.contains(m2));
+        assertFalse(sm.contains(m3));
+        assertFalse(sm.contains(m4));
+        assertFalse(sm.contains(m5));
+        Iterator i = sm.iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(m2, k);
+        assertFalse(i.hasNext());
+        Iterator j = sm.iterator();
+        j.next();
+        j.remove();
+        assertFalse(set.contains(m2));
+        assertEquals(4, set.size());
+        assertEquals(0, sm.size());
+        assertTrue(sm.isEmpty());
+        assertFalse(sm.remove(m3));
+        assertEquals(4, set.size());
+    }
+
+    /**
+     * headSet returns set with keys in requested range
+     */
+    public void testDescendingHeadSetContents() {
+        NavigableSet set = dset5();
+        SortedSet sm = set.headSet(m4);
+        assertTrue(sm.contains(m1));
+        assertTrue(sm.contains(m2));
+        assertTrue(sm.contains(m3));
+        assertFalse(sm.contains(m4));
+        assertFalse(sm.contains(m5));
+        Iterator i = sm.iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(m1, k);
+        k = (Integer)(i.next());
+        assertEquals(m2, k);
+        k = (Integer)(i.next());
+        assertEquals(m3, k);
+        assertFalse(i.hasNext());
+        sm.clear();
+        assertTrue(sm.isEmpty());
+        assertEquals(2, set.size());
+        assertEquals(m4, set.first());
+    }
+
+    /**
+     * tailSet returns set with keys in requested range
+     */
+    public void testDescendingTailSetContents() {
+        NavigableSet set = dset5();
+        SortedSet sm = set.tailSet(m2);
+        assertFalse(sm.contains(m1));
+        assertTrue(sm.contains(m2));
+        assertTrue(sm.contains(m3));
+        assertTrue(sm.contains(m4));
+        assertTrue(sm.contains(m5));
+        Iterator i = sm.iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(m2, k);
+        k = (Integer)(i.next());
+        assertEquals(m3, k);
+        k = (Integer)(i.next());
+        assertEquals(m4, k);
+        k = (Integer)(i.next());
+        assertEquals(m5, k);
+        assertFalse(i.hasNext());
+
+        SortedSet ssm = sm.tailSet(m4);
+        assertEquals(m4, ssm.first());
+        assertEquals(m5, ssm.last());
+        assertTrue(ssm.remove(m4));
+        assertEquals(1, ssm.size());
+        assertEquals(3, sm.size());
+        assertEquals(4, set.size());
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/CopyOnWriteArrayListTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/CopyOnWriteArrayListTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/CopyOnWriteArrayListTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,626 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import java.io.*;
+import java.util.Arrays;
+import java.util.Vector;
+import java.util.Iterator;
+import java.util.ListIterator;
+import java.util.List;
+
+public class CopyOnWriteArrayListTest extends JSR166TestCase{
+
+    public static void main(String[] args) {
+        junit.textui.TestRunner.run (suite());
+    }
+
+    public static Test suite() {
+        return new TestSuite(CopyOnWriteArrayListTest.class);
+    }
+
+    static CopyOnWriteArrayList populatedArray(int n){
+        CopyOnWriteArrayList a = new CopyOnWriteArrayList();
+        assertTrue(a.isEmpty());
+        for (int i = 0; i < n; ++i)
+            a.add(new Integer(i));
+        assertFalse(a.isEmpty());
+        assertEquals(n, a.size());
+        return a;
+    }
+
+
+    /**
+     * a new list is empty
+     */
+    public void testConstructor() {
+        CopyOnWriteArrayList a = new CopyOnWriteArrayList();
+        assertTrue(a.isEmpty());
+    }
+
+    /**
+     * new list contains all elements of initializing array
+     */
+    public void testConstructor2() {
+        Integer[] ints = new Integer[SIZE];
+        for (int i = 0; i < SIZE-1; ++i)
+            ints[i] = new Integer(i);
+        CopyOnWriteArrayList a = new CopyOnWriteArrayList(ints);
+        for (int i = 0; i < SIZE; ++i)
+            assertEquals(ints[i], a.get(i));
+    }
+
+    /**
+     * new list contains all elements of initializing collection
+     */
+    public void testConstructor3() {
+        Integer[] ints = new Integer[SIZE];
+        for (int i = 0; i < SIZE-1; ++i)
+            ints[i] = new Integer(i);
+        CopyOnWriteArrayList a = new CopyOnWriteArrayList(Arrays.asList(ints));
+        for (int i = 0; i < SIZE; ++i)
+            assertEquals(ints[i], a.get(i));
+    }
+
+
+    /**
+     *   addAll  adds each element from the given collection
+     */
+    public void testAddAll() {
+        CopyOnWriteArrayList full = populatedArray(3);
+        Vector v = new Vector();
+        v.add(three);
+        v.add(four);
+        v.add(five);
+        full.addAll(v);
+        assertEquals(6, full.size());
+    }
+
+    /**
+     *   addAllAbsent adds each element from the given collection that did not
+     *  already exist in the List
+     */
+    public void testAddAllAbsent() {
+        CopyOnWriteArrayList full = populatedArray(3);
+        Vector v = new Vector();
+        v.add(three);
+        v.add(four);
+        v.add(one); // will not add this element
+        full.addAllAbsent(v);
+        assertEquals(5, full.size());
+    }
+
+    /**
+     *   addIfAbsent will not add the element if it already exists in the list
+     */
+    public void testAddIfAbsent() {
+        CopyOnWriteArrayList full = populatedArray(SIZE);
+        full.addIfAbsent(one);
+        assertEquals(SIZE, full.size());
+    }
+
+    /**
+     *   addIfAbsent adds the element when it does not exist in the list
+     */
+    public void testAddIfAbsent2() {
+        CopyOnWriteArrayList full = populatedArray(SIZE);
+        full.addIfAbsent(three);
+        assertTrue(full.contains(three));
+    }
+
+    /**
+     *   clear removes all elements from the list
+     */
+    public void testClear() {
+        CopyOnWriteArrayList full = populatedArray(SIZE);
+        full.clear();
+        assertEquals(0, full.size());
+    }
+
+
+    /**
+     *  Cloned list is equal
+     */
+    public void testClone() {
+        CopyOnWriteArrayList l1 = populatedArray(SIZE);
+        CopyOnWriteArrayList l2 = (CopyOnWriteArrayList)(l1.clone());
+        assertEquals(l1, l2);
+        l1.clear();
+        assertFalse(l1.equals(l2));
+    }
+
+    /**
+     *   contains is true for added elements
+     */
+    public void testContains() {
+        CopyOnWriteArrayList full = populatedArray(3);
+        assertTrue(full.contains(one));
+        assertFalse(full.contains(five));
+    }
+
+    /**
+     * adding at an index places it in the indicated index
+     */
+    public void testAddIndex() {
+        CopyOnWriteArrayList full = populatedArray(3);
+        full.add(0, m1);
+        assertEquals(4, full.size());
+        assertEquals(m1, full.get(0));
+        assertEquals(zero, full.get(1));
+
+        full.add(2, m2);
+        assertEquals(5, full.size());
+        assertEquals(m2, full.get(2));
+        assertEquals(two, full.get(4));
+    }
+
+    /**
+     * lists with same elements are equal and have same hashCode
+     */
+    public void testEquals() {
+        CopyOnWriteArrayList a = populatedArray(3);
+        CopyOnWriteArrayList b = populatedArray(3);
+        assertTrue(a.equals(b));
+        assertTrue(b.equals(a));
+        assertEquals(a.hashCode(), b.hashCode());
+        a.add(m1);
+        assertFalse(a.equals(b));
+        assertFalse(b.equals(a));
+        b.add(m1);
+        assertTrue(a.equals(b));
+        assertTrue(b.equals(a));
+        assertEquals(a.hashCode(), b.hashCode());
+    }
+
+
+    /**
+     *   containsAll returns true for collection with subset of elements
+     */
+    public void testContainsAll() {
+        CopyOnWriteArrayList full = populatedArray(3);
+        Vector v = new Vector();
+        v.add(one);
+        v.add(two);
+        assertTrue(full.containsAll(v));
+        v.add(six);
+        assertFalse(full.containsAll(v));
+    }
+
+    /**
+     *   get returns the  value at the given index
+     */
+    public void testGet() {
+        CopyOnWriteArrayList full = populatedArray(3);
+        assertEquals(0, ((Integer)full.get(0)).intValue());
+    }
+
+    /**
+     *   indexOf gives the index for the given object
+     */
+    public void testIndexOf() {
+        CopyOnWriteArrayList full = populatedArray(3);
+        assertEquals(1, full.indexOf(one));
+        assertEquals(-1, full.indexOf("puppies"));
+    }
+
+    /**
+     *   indexOf gives the index based on the given index
+     *  at which to start searching
+     */
+    public void testIndexOf2() {
+        CopyOnWriteArrayList full = populatedArray(3);
+        assertEquals(1, full.indexOf(one, 0));
+        assertEquals(-1, full.indexOf(one, 2));
+    }
+
+    /**
+     *   isEmpty returns true when empty, else false
+     */
+    public void testIsEmpty() {
+        CopyOnWriteArrayList empty = new CopyOnWriteArrayList();
+        CopyOnWriteArrayList full = populatedArray(SIZE);
+        assertTrue(empty.isEmpty());
+        assertFalse(full.isEmpty());
+    }
+
+    /**
+     *   iterator() returns an iterator containing the elements of the list
+     */
+    public void testIterator() {
+        CopyOnWriteArrayList full = populatedArray(SIZE);
+        Iterator i = full.iterator();
+        int j;
+        for(j = 0; i.hasNext(); j++)
+            assertEquals(j, ((Integer)i.next()).intValue());
+        assertEquals(SIZE, j);
+    }
+
+    /**
+     * iterator.remove throws UnsupportedOperationException
+     */
+    public void testIteratorRemove () {
+        CopyOnWriteArrayList full = populatedArray(SIZE);
+        Iterator it = full.iterator();
+        it.next();
+        try {
+            it.remove();
+            shouldThrow();
+        }
+        catch (UnsupportedOperationException success) {}
+    }
+
+    /**
+     * toString contains toString of elements
+     */
+    public void testToString() {
+        CopyOnWriteArrayList full = populatedArray(3);
+        String s = full.toString();
+        for (int i = 0; i < 3; ++i) {
+            assertTrue(s.indexOf(String.valueOf(i)) >= 0);
+        }
+    }
+
+    /**
+     *   lastIndexOf returns the index for the given object
+     */
+    public void testLastIndexOf1() {
+        CopyOnWriteArrayList full = populatedArray(3);
+        full.add(one);
+        full.add(three);
+        assertEquals(3, full.lastIndexOf(one));
+        assertEquals(-1, full.lastIndexOf(six));
+    }
+
+    /**
+     *   lastIndexOf returns the index from the given starting point
+     */
+    public void testlastIndexOf2() {
+        CopyOnWriteArrayList full = populatedArray(3);
+        full.add(one);
+        full.add(three);
+        assertEquals(3, full.lastIndexOf(one, 4));
+        assertEquals(-1, full.lastIndexOf(three, 3));
+    }
+
+    /**
+     *  listIterator traverses all elements
+     */
+    public void testListIterator1() {
+        CopyOnWriteArrayList full = populatedArray(SIZE);
+        ListIterator i = full.listIterator();
+        int j;
+        for(j = 0; i.hasNext(); j++)
+            assertEquals(j, ((Integer)i.next()).intValue());
+        assertEquals(SIZE, j);
+    }
+
+    /**
+     *  listIterator only returns those elements after the given index
+     */
+    public void testListIterator2() {
+        CopyOnWriteArrayList full = populatedArray(3);
+        ListIterator i = full.listIterator(1);
+        int j;
+        for(j = 0; i.hasNext(); j++)
+            assertEquals(j+1, ((Integer)i.next()).intValue());
+        assertEquals(2, j);
+    }
+
+    /**
+     *   remove  removes and returns the object at the given index
+     */
+    public void testRemove() {
+        CopyOnWriteArrayList full = populatedArray(3);
+        assertEquals(two, full.remove(2));
+        assertEquals(2, full.size());
+    }
+
+    /**
+     *   removeAll  removes all elements from the given collection
+     */
+    public void testRemoveAll() {
+        CopyOnWriteArrayList full = populatedArray(3);
+        Vector v = new Vector();
+        v.add(one);
+        v.add(two);
+        full.removeAll(v);
+        assertEquals(1, full.size());
+    }
+
+    /**
+     *   set  changes the element at the given index
+     */
+    public void testSet() {
+        CopyOnWriteArrayList full = populatedArray(3);
+        assertEquals(two, full.set(2, four));
+        assertEquals(4, ((Integer)full.get(2)).intValue());
+    }
+
+    /**
+     *   size returns the number of elements
+     */
+    public void testSize() {
+        CopyOnWriteArrayList empty = new CopyOnWriteArrayList();
+        CopyOnWriteArrayList full = populatedArray(SIZE);
+        assertEquals(SIZE, full.size());
+        assertEquals(0, empty.size());
+    }
+
+    /**
+     *   toArray returns an Object array containing all elements from the list
+     */
+    public void testToArray() {
+        CopyOnWriteArrayList full = populatedArray(3);
+        Object[] o = full.toArray();
+        assertEquals(3, o.length);
+        assertEquals(0, ((Integer)o[0]).intValue());
+        assertEquals(1, ((Integer)o[1]).intValue());
+        assertEquals(2, ((Integer)o[2]).intValue());
+    }
+
+    /**
+     *   toArray returns an Integer array containing all elements from
+     *   the list
+     */
+    public void testToArray2() {
+        CopyOnWriteArrayList full = populatedArray(3);
+        Integer[] i = new Integer[3];
+        i = (Integer[])full.toArray(i);
+        assertEquals(3, i.length);
+        assertEquals(0, i[0].intValue());
+        assertEquals(1, i[1].intValue());
+        assertEquals(2, i[2].intValue());
+    }
+
+
+    /**
+     * sublists contains elements at indexes offset from their base
+     */
+    public void testSubList() {
+        CopyOnWriteArrayList a = populatedArray(10);
+        assertTrue(a.subList(1,1).isEmpty());
+        for(int j = 0; j < 9; ++j) {
+            for(int i = j ; i < 10; ++i) {
+                List b = a.subList(j,i);
+                for(int k = j; k < i; ++k) {
+                    assertEquals(new Integer(k), b.get(k-j));
+                }
+            }
+        }
+
+        List s = a.subList(2, 5);
+        assertEquals(s.size(), 3);
+        s.set(2, m1);
+        assertEquals(a.get(4), m1);
+        s.clear();
+        assertEquals(a.size(), 7);
+    }
+
+    // Exception tests
+
+    /**
+     *   toArray throws an ArrayStoreException when the given array
+     *  can not store the objects inside the list
+     */
+    public void testToArray_ArrayStoreException() {
+        try {
+            CopyOnWriteArrayList c = new CopyOnWriteArrayList();
+            c.add("zfasdfsdf");
+            c.add("asdadasd");
+            c.toArray(new Long[5]);
+            shouldThrow();
+        } catch(ArrayStoreException e){}
+    }
+
+    /**
+     *   get throws an IndexOutOfBoundsException on a negative index
+     */
+    public void testGet1_IndexOutOfBoundsException() {
+        try {
+            CopyOnWriteArrayList c = new CopyOnWriteArrayList();
+            c.get(-1);
+            shouldThrow();
+        } catch(IndexOutOfBoundsException e){}
+    }
+
+    /**
+     *   get throws an IndexOutOfBoundsException on a too high index
+     */
+    public void testGet2_IndexOutOfBoundsException() {
+        try {
+            CopyOnWriteArrayList c = new CopyOnWriteArrayList();
+            c.add("asdasd");
+            c.add("asdad");
+            c.get(100);
+            shouldThrow();
+        } catch(IndexOutOfBoundsException e){}
+    }
+
+    /**
+     *   set throws an IndexOutOfBoundsException on a negative index
+     */
+    public void testSet1_IndexOutOfBoundsException() {
+        try {
+            CopyOnWriteArrayList c = new CopyOnWriteArrayList();
+            c.set(-1,"qwerty");
+            shouldThrow();
+        } catch(IndexOutOfBoundsException e){}
+    }
+
+    /**
+     *   set throws an IndexOutOfBoundsException on a too high index
+     */
+    public void testSet2() {
+        try {
+            CopyOnWriteArrayList c = new CopyOnWriteArrayList();
+            c.add("asdasd");
+            c.add("asdad");
+            c.set(100, "qwerty");
+            shouldThrow();
+        } catch(IndexOutOfBoundsException e){}
+    }
+
+    /**
+     *   add throws an IndexOutOfBoundsException on a negative index
+     */
+    public void testAdd1_IndexOutOfBoundsException() {
+        try {
+            CopyOnWriteArrayList c = new CopyOnWriteArrayList();
+            c.add(-1,"qwerty");
+            shouldThrow();
+        } catch(IndexOutOfBoundsException e){}
+    }
+
+    /**
+     *   add throws an IndexOutOfBoundsException on a too high index
+     */
+    public void testAdd2_IndexOutOfBoundsException() {
+        try {
+            CopyOnWriteArrayList c = new CopyOnWriteArrayList();
+            c.add("asdasd");
+            c.add("asdasdasd");
+            c.add(100, "qwerty");
+            shouldThrow();
+        } catch(IndexOutOfBoundsException e){}
+    }
+
+    /**
+     *   remove throws an IndexOutOfBoundsException on a negative index
+     */
+    public void testRemove1_IndexOutOfBounds() {
+        try {
+            CopyOnWriteArrayList c = new CopyOnWriteArrayList();
+            c.remove(-1);
+            shouldThrow();
+        } catch(IndexOutOfBoundsException e){}
+    }
+
+    /**
+     *   remove throws an IndexOutOfBoundsException on a too high index
+     */
+    public void testRemove2_IndexOutOfBounds() {
+        try {
+            CopyOnWriteArrayList c = new CopyOnWriteArrayList();
+            c.add("asdasd");
+            c.add("adasdasd");
+            c.remove(100);
+            shouldThrow();
+        } catch(IndexOutOfBoundsException e){}
+    }
+
+    /**
+     *   addAll throws an IndexOutOfBoundsException on a negative index
+     */
+    public void testAddAll1_IndexOutOfBoundsException() {
+        try {
+            CopyOnWriteArrayList c = new CopyOnWriteArrayList();
+            c.addAll(-1,new LinkedList());
+            shouldThrow();
+        } catch(IndexOutOfBoundsException e){}
+    }
+
+    /**
+     *   addAll throws an IndexOutOfBoundsException on a too high index
+     */
+    public void testAddAll2_IndexOutOfBoundsException() {
+        try {
+            CopyOnWriteArrayList c = new CopyOnWriteArrayList();
+            c.add("asdasd");
+            c.add("asdasdasd");
+            c.addAll(100, new LinkedList());
+            shouldThrow();
+        } catch(IndexOutOfBoundsException e){}
+    }
+
+    /**
+     *   listIterator throws an IndexOutOfBoundsException on a negative index
+     */
+    public void testListIterator1_IndexOutOfBoundsException() {
+        try {
+            CopyOnWriteArrayList c = new CopyOnWriteArrayList();
+            c.listIterator(-1);
+            shouldThrow();
+        } catch(IndexOutOfBoundsException e){}
+    }
+
+    /**
+     *   listIterator throws an IndexOutOfBoundsException on a too high index
+     */
+    public void testListIterator2_IndexOutOfBoundsException() {
+        try {
+            CopyOnWriteArrayList c = new CopyOnWriteArrayList();
+            c.add("adasd");
+            c.add("asdasdas");
+            c.listIterator(100);
+            shouldThrow();
+        } catch(IndexOutOfBoundsException e){}
+    }
+
+    /**
+     *   subList throws an IndexOutOfBoundsException on a negative index
+     */
+    public void testSubList1_IndexOutOfBoundsException() {
+        try {
+            CopyOnWriteArrayList c = new CopyOnWriteArrayList();
+            c.subList(-1,100);
+
+            shouldThrow();
+        } catch(IndexOutOfBoundsException e){}
+    }
+
+    /**
+     *   subList throws an IndexOutOfBoundsException on a too high index
+     */
+    public void testSubList2_IndexOutOfBoundsException() {
+        try {
+            CopyOnWriteArrayList c = new CopyOnWriteArrayList();
+            c.add("asdasd");
+            c.subList(1,100);
+            shouldThrow();
+        } catch(IndexOutOfBoundsException e){}
+    }
+
+    /**
+     *   subList throws IndexOutOfBoundsException when the second index
+     *  is lower then the first
+     */
+    public void testSubList3_IndexOutOfBoundsException() {
+        try {
+            CopyOnWriteArrayList c = new CopyOnWriteArrayList();
+            c.subList(3,1);
+
+            shouldThrow();
+        } catch(IndexOutOfBoundsException e){}
+    }
+
+    /**
+     * a deserialized serialiszed list is equal
+     */
+    public void testSerialization() {
+        CopyOnWriteArrayList q = populatedArray(SIZE);
+
+        try {
+            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
+            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
+            out.writeObject(q);
+            out.close();
+
+            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
+            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
+            CopyOnWriteArrayList r = (CopyOnWriteArrayList)in.readObject();
+            assertEquals(q.size(), r.size());
+            assertTrue(q.equals(r));
+            assertTrue(r.equals(q));
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/CopyOnWriteArraySetTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/CopyOnWriteArraySetTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/CopyOnWriteArraySetTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,296 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import java.io.*;
+import java.util.Vector;
+import java.util.Iterator;
+
+public class CopyOnWriteArraySetTest extends JSR166TestCase {
+    public static void main(String[] args) {
+	junit.textui.TestRunner.run (suite());
+    }
+    public static Test suite() {
+	return new TestSuite(CopyOnWriteArraySetTest.class);
+    }
+
+    static CopyOnWriteArraySet populatedSet(int n){
+	CopyOnWriteArraySet a = new CopyOnWriteArraySet();
+        assertTrue(a.isEmpty());
+        for (int i = 0; i < n; ++i)
+            a.add(new Integer(i));
+        assertFalse(a.isEmpty());
+        assertEquals(n, a.size());
+        return a;
+    }
+
+    /**
+     * Default-constructed set is empty
+     */
+    public void testConstructor() {
+	CopyOnWriteArraySet a = new CopyOnWriteArraySet();
+        assertTrue(a.isEmpty());
+    }
+
+    /**
+     * Collection-constructed set holds all of its elements
+     */
+    public void testConstructor3() {
+        Integer[] ints = new Integer[SIZE];
+        for (int i = 0; i < SIZE-1; ++i)
+            ints[i] = new Integer(i);
+	CopyOnWriteArraySet a = new CopyOnWriteArraySet(Arrays.asList(ints));
+        for (int i = 0; i < SIZE; ++i)
+            assertTrue(a.contains(ints[i]));
+    }
+
+
+    /**
+     *   addAll  adds each element from the given collection
+     */
+    public void testAddAll() {
+	CopyOnWriteArraySet full = populatedSet(3);
+	Vector v = new Vector();
+	v.add(three);
+	v.add(four);
+	v.add(five);
+	full.addAll(v);
+	assertEquals(6, full.size());
+    }
+
+    /**
+     *   addAll adds each element from the given collection that did not
+     *  already exist in the set
+     */
+    public void testAddAll2() {
+	CopyOnWriteArraySet full = populatedSet(3);
+	Vector v = new Vector();
+	v.add(three);
+	v.add(four);
+	v.add(one); // will not add this element
+	full.addAll(v);
+	assertEquals(5, full.size());
+    }
+
+    /**
+     *   add will not add the element if it already exists in the set
+     */
+    public void testAdd2() {
+	CopyOnWriteArraySet full = populatedSet(3);
+	full.add(one);
+	assertEquals(3, full.size());
+    }
+
+    /**
+     *   add  adds the element when it does not exist
+     *   in the set
+     */
+    public void testAdd3() {
+	CopyOnWriteArraySet full = populatedSet(3);
+        full.add(three);
+        assertTrue(full.contains(three));
+    }
+
+    /**
+     *   clear  removes all elements from the set
+     */
+    public void testClear() {
+	CopyOnWriteArraySet full = populatedSet(3);
+	full.clear();
+	assertEquals(0, full.size());
+    }
+
+    /**
+     *   contains returns true for added elements
+     */
+    public void testContains() {
+	CopyOnWriteArraySet full = populatedSet(3);
+	assertTrue(full.contains(one));
+	assertFalse(full.contains(five));
+    }
+
+    /**
+     * Sets with equal elements are equal
+     */
+    public void testEquals() {
+	CopyOnWriteArraySet a = populatedSet(3);
+	CopyOnWriteArraySet b = populatedSet(3);
+        assertTrue(a.equals(b));
+        assertTrue(b.equals(a));
+        assertEquals(a.hashCode(), b.hashCode());
+        a.add(m1);
+        assertFalse(a.equals(b));
+        assertFalse(b.equals(a));
+        b.add(m1);
+        assertTrue(a.equals(b));
+        assertTrue(b.equals(a));
+        assertEquals(a.hashCode(), b.hashCode());
+    }
+
+
+    /**
+     *   containsAll returns true for collections with subset of elements
+     */
+    public void testContainsAll() {
+	CopyOnWriteArraySet full = populatedSet(3);
+	Vector v = new Vector();
+	v.add(one);
+	v.add(two);
+	assertTrue(full.containsAll(v));
+	v.add(six);
+	assertFalse(full.containsAll(v));
+    }
+
+    /**
+     *   isEmpty is true when empty, else false
+     */
+    public void testIsEmpty() {
+	CopyOnWriteArraySet empty = new CopyOnWriteArraySet();
+	CopyOnWriteArraySet full = populatedSet(3);
+	assertTrue(empty.isEmpty());
+	assertFalse(full.isEmpty());
+    }
+
+    /**
+     *   iterator() returns an iterator containing the elements of the set
+     */
+    public void testIterator() {
+	CopyOnWriteArraySet full = populatedSet(3);
+	Iterator i = full.iterator();
+	int j;
+	for(j = 0; i.hasNext(); j++)
+	    assertEquals(j, ((Integer)i.next()).intValue());
+	assertEquals(3, j);
+    }
+
+    /**
+     * iterator remove is unsupported
+     */
+    public void testIteratorRemove () {
+	CopyOnWriteArraySet full = populatedSet(3);
+        Iterator it = full.iterator();
+        it.next();
+        try {
+            it.remove();
+            shouldThrow();
+        }
+        catch (UnsupportedOperationException success) {}
+    }
+
+    /**
+     * toString holds toString of elements
+     */
+    public void testToString() {
+	CopyOnWriteArraySet full = populatedSet(3);
+        String s = full.toString();
+        for (int i = 0; i < 3; ++i) {
+            assertTrue(s.indexOf(String.valueOf(i)) >= 0);
+        }
+    }
+
+
+    /**
+     *   removeAll  removes all elements from the given collection
+     */
+    public void testRemoveAll() {
+	CopyOnWriteArraySet full = populatedSet(3);
+	Vector v = new Vector();
+	v.add(one);
+	v.add(two);
+	full.removeAll(v);
+	assertEquals(1, full.size());
+    }
+
+
+    /**
+     * remove removes an element
+     */
+    public void testRemove() {
+	CopyOnWriteArraySet full = populatedSet(3);
+	full.remove(one);
+        assertFalse(full.contains(one));
+	assertEquals(2, full.size());
+    }
+
+    /**
+     *   size returns the number of elements
+     */
+    public void testSize() {
+	CopyOnWriteArraySet empty = new CopyOnWriteArraySet();
+	CopyOnWriteArraySet full = populatedSet(3);
+	assertEquals(3, full.size());
+	assertEquals(0, empty.size());
+    }
+
+    /**
+     *   toArray returns an Object array containing all elements from the set
+     */
+    public void testToArray() {
+	CopyOnWriteArraySet full = populatedSet(3);
+	Object[] o = full.toArray();
+	assertEquals(3, o.length);
+	assertEquals(0, ((Integer)o[0]).intValue());
+	assertEquals(1, ((Integer)o[1]).intValue());
+	assertEquals(2, ((Integer)o[2]).intValue());
+    }
+
+    /**
+     *   toArray returns an Integer array containing all elements from
+     *   the set
+     */
+    public void testToArray2() {
+	CopyOnWriteArraySet full = populatedSet(3);
+	Integer[] i = new Integer[3];
+	i = (Integer[])full.toArray(i);
+	assertEquals(3, i.length);
+	assertEquals(0, i[0].intValue());
+	assertEquals(1, i[1].intValue());
+	assertEquals(2, i[2].intValue());
+    }
+
+
+    /**
+     *  toArray throws an ArrayStoreException when the given array can
+     *  not store the objects inside the set
+     */
+    public void testToArray_ArrayStoreException() {
+        try {
+            CopyOnWriteArraySet c = new CopyOnWriteArraySet();
+            c.add("zfasdfsdf");
+            c.add("asdadasd");
+            c.toArray(new Long[5]);
+	    shouldThrow();
+        } catch(ArrayStoreException e){}
+    }
+
+    /**
+     * A deserialized serialized set is equal
+     */
+    public void testSerialization() {
+        CopyOnWriteArraySet q = populatedSet(SIZE);
+
+        try {
+            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
+            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
+            out.writeObject(q);
+            out.close();
+
+            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
+            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
+            CopyOnWriteArraySet r = (CopyOnWriteArraySet)in.readObject();
+            assertEquals(q.size(), r.size());
+            assertTrue(q.equals(r));
+            assertTrue(r.equals(q));
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/CountDownLatchTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/CountDownLatchTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/CountDownLatchTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,205 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+
+public class CountDownLatchTest extends JSR166TestCase {
+    public static void main(String[] args) {
+        junit.textui.TestRunner.run (suite());
+    }
+    public static Test suite() {
+        return new TestSuite(CountDownLatchTest.class);
+    }
+
+    /**
+     * negative constructor argument throws IAE
+     */
+    public void testConstructor() {
+        try {
+            new CountDownLatch(-1);
+            shouldThrow();
+        } catch(IllegalArgumentException success){}
+    }
+
+    /**
+     * getCount returns initial count and decreases after countDown
+     */
+    public void testGetCount() {
+        final CountDownLatch l = new CountDownLatch(2);
+        assertEquals(2, l.getCount());
+        l.countDown();
+        assertEquals(1, l.getCount());
+    }
+
+    /**
+     * countDown decrements count when positive and has no effect when zero
+     */
+    public void testCountDown() {
+        final CountDownLatch l = new CountDownLatch(1);
+        assertEquals(1, l.getCount());
+        l.countDown();
+        assertEquals(0, l.getCount());
+        l.countDown();
+        assertEquals(0, l.getCount());
+    }
+
+    /**
+     * await returns after countDown to zero, but not before
+     */
+    public void testAwait() {
+        final CountDownLatch l = new CountDownLatch(2);
+
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        threadAssertTrue(l.getCount() > 0);
+                        l.await();
+                        threadAssertTrue(l.getCount() == 0);
+                    } catch(InterruptedException e){
+                        e.printStackTrace();
+                        threadUnexpectedException();
+                    }
+                }
+            });
+        t.start();
+        try {
+            assertEquals(l.getCount(), 2);
+            Thread.sleep(SHORT_DELAY_MS);
+            l.countDown();
+            assertEquals(l.getCount(), 1);
+            l.countDown();
+            assertEquals(l.getCount(), 0);
+            t.join();
+        } catch (InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * timed await returns after countDown to zero
+     */
+    public void testTimedAwait() {
+        final CountDownLatch l = new CountDownLatch(2);
+
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        threadAssertTrue(l.getCount() > 0);
+                        threadAssertTrue(l.await(SMALL_DELAY_MS, TimeUnit.MILLISECONDS));
+                    } catch(InterruptedException e){
+                        threadUnexpectedException();
+                    }
+                }
+            });
+        t.start();
+        try {
+            assertEquals(l.getCount(), 2);
+            Thread.sleep(SHORT_DELAY_MS);
+            l.countDown();
+            assertEquals(l.getCount(), 1);
+            l.countDown();
+            assertEquals(l.getCount(), 0);
+            t.join();
+        } catch (InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * await throws IE if interrupted before counted down
+     */
+    public void testAwait_InterruptedException() {
+        final CountDownLatch l = new CountDownLatch(1);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        threadAssertTrue(l.getCount() > 0);
+                        l.await();
+                        threadShouldThrow();
+                    } catch(InterruptedException success){}
+                }
+            });
+        t.start();
+        try {
+            assertEquals(l.getCount(), 1);
+            t.interrupt();
+            t.join();
+        } catch (InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * timed await throws IE if interrupted before counted down
+     */
+    public void testTimedAwait_InterruptedException() {
+        final CountDownLatch l = new CountDownLatch(1);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        threadAssertTrue(l.getCount() > 0);
+                        l.await(MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+                        threadShouldThrow();
+                    } catch(InterruptedException success){}
+                }
+            });
+        t.start();
+        try {
+            Thread.sleep(SHORT_DELAY_MS);
+            assertEquals(l.getCount(), 1);
+            t.interrupt();
+            t.join();
+        } catch (InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * timed await times out if not counted down before timeout
+     */
+    public void testAwaitTimeout() {
+        final CountDownLatch l = new CountDownLatch(1);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        threadAssertTrue(l.getCount() > 0);
+                        threadAssertFalse(l.await(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+                        threadAssertTrue(l.getCount() > 0);
+                    } catch(InterruptedException ie){
+                        threadUnexpectedException();
+                    }
+                }
+            });
+        t.start();
+        try {
+            assertEquals(l.getCount(), 1);
+            t.join();
+        } catch (InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * toString indicates current count
+     */
+    public void testToString() {
+        CountDownLatch s = new CountDownLatch(2);
+        String us = s.toString();
+        assertTrue(us.indexOf("Count = 2") >= 0);
+        s.countDown();
+        String s1 = s.toString();
+        assertTrue(s1.indexOf("Count = 1") >= 0);
+        s.countDown();
+        String s2 = s.toString();
+        assertTrue(s2.indexOf("Count = 0") >= 0);
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/CyclicBarrierTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/CyclicBarrierTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/CyclicBarrierTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,623 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.atomic.*;
+
+public class CyclicBarrierTest extends JSR166TestCase{
+    public static void main(String[] args) {
+        junit.textui.TestRunner.run (suite());
+    }
+    public static Test suite() {
+        return new TestSuite(CyclicBarrierTest.class);
+    }
+
+    private volatile int countAction;
+    private class MyAction implements Runnable {
+        public void run() { ++countAction; }
+    }
+
+    /**
+     * Creating with negative parties throws IAE
+     */
+    public void testConstructor1() {
+        try {
+            new CyclicBarrier(-1, (Runnable)null);
+            shouldThrow();
+        } catch(IllegalArgumentException e){}
+    }
+
+    /**
+     * Creating with negative parties and no action throws IAE
+     */
+    public void testConstructor2() {
+        try {
+            new CyclicBarrier(-1);
+            shouldThrow();
+        } catch(IllegalArgumentException e){}
+    }
+
+    /**
+     * getParties returns the number of parties given in constructor
+     */
+    public void testGetParties() {
+        CyclicBarrier b = new CyclicBarrier(2);
+        assertEquals(2, b.getParties());
+        assertEquals(0, b.getNumberWaiting());
+    }
+
+    /**
+     * A 1-party barrier triggers after single await
+     */
+    public void testSingleParty() {
+        try {
+            CyclicBarrier b = new CyclicBarrier(1);
+            assertEquals(1, b.getParties());
+            assertEquals(0, b.getNumberWaiting());
+            b.await();
+            b.await();
+            assertEquals(0, b.getNumberWaiting());
+        }
+        catch(Exception e) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * The supplied barrier action is run at barrier
+     */
+    public void testBarrierAction() {
+        try {
+            countAction = 0;
+            CyclicBarrier b = new CyclicBarrier(1, new MyAction());
+            assertEquals(1, b.getParties());
+            assertEquals(0, b.getNumberWaiting());
+            b.await();
+            b.await();
+            assertEquals(0, b.getNumberWaiting());
+            assertEquals(countAction, 2);
+        }
+        catch(Exception e) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * A 2-party/thread barrier triggers after both threads invoke await
+     */
+    public void testTwoParties() {
+        final CyclicBarrier b = new CyclicBarrier(2);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        b.await();
+                        b.await();
+                        b.await();
+                        b.await();
+                    } catch(Exception e){
+                        threadUnexpectedException();
+                    }}});
+
+        try {
+            t.start();
+            b.await();
+            b.await();
+            b.await();
+            b.await();
+            t.join();
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * An interruption in one party causes others waiting in await to
+     * throw BrokenBarrierException
+     */
+    public void testAwait1_Interrupted_BrokenBarrier() {
+        final CyclicBarrier c = new CyclicBarrier(3);
+        Thread t1 = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        c.await();
+                        threadShouldThrow();
+                    } catch(InterruptedException success){}
+                    catch(Exception b){
+                        threadUnexpectedException();
+                    }
+                }
+            });
+        Thread t2 = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        c.await();
+                        threadShouldThrow();
+                    } catch(BrokenBarrierException success){
+                    } catch(Exception i){
+                        threadUnexpectedException();
+                    }
+                }
+            });
+        try {
+            t1.start();
+            t2.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            t1.interrupt();
+            t1.join();
+            t2.join();
+        } catch(InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * An interruption in one party causes others waiting in timed await to
+     * throw BrokenBarrierException
+     */
+    public void testAwait2_Interrupted_BrokenBarrier() {
+        final CyclicBarrier c = new CyclicBarrier(3);
+        Thread t1 = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        c.await(LONG_DELAY_MS, TimeUnit.MILLISECONDS);
+                        threadShouldThrow();
+                    } catch(InterruptedException success){
+                    } catch(Exception b){
+                        threadUnexpectedException();
+                    }
+                }
+            });
+        Thread t2 = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        c.await(LONG_DELAY_MS, TimeUnit.MILLISECONDS);
+                        threadShouldThrow();
+                    } catch(BrokenBarrierException success){
+                    } catch(Exception i){
+                        threadUnexpectedException();
+                    }
+                }
+            });
+        try {
+            t1.start();
+            t2.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            t1.interrupt();
+            t1.join();
+            t2.join();
+        } catch(InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * A timeout in timed await throws TimeoutException
+     */
+    public void testAwait3_TimeOutException() {
+        final CyclicBarrier c = new CyclicBarrier(2);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        c.await(SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
+                        threadShouldThrow();
+                    } catch(TimeoutException success){
+                    } catch(Exception b){
+                        threadUnexpectedException();
+
+                    }
+                }
+            });
+        try {
+            t.start();
+            t.join();
+        } catch(InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * A timeout in one party causes others waiting in timed await to
+     * throw BrokenBarrierException
+     */
+    public void testAwait4_Timeout_BrokenBarrier() {
+        final CyclicBarrier c = new CyclicBarrier(3);
+        Thread t1 = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        c.await(SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
+                        threadShouldThrow();
+                    } catch(TimeoutException success){
+                    } catch(Exception b){
+                        threadUnexpectedException();
+                    }
+                }
+            });
+        Thread t2 = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        c.await(MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+                        threadShouldThrow();
+                    } catch(BrokenBarrierException success){
+                    } catch(Exception i){
+                        threadUnexpectedException();
+                    }
+                }
+            });
+        try {
+            t1.start();
+            t2.start();
+            t1.join();
+            t2.join();
+        } catch(InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * A timeout in one party causes others waiting in await to
+     * throw BrokenBarrierException
+     */
+    public void testAwait5_Timeout_BrokenBarrier() {
+        final CyclicBarrier c = new CyclicBarrier(3);
+        Thread t1 = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        c.await(SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
+                        threadShouldThrow();
+                    } catch(TimeoutException success){
+                    } catch(Exception b){
+                        threadUnexpectedException();
+                    }
+                }
+            });
+        Thread t2 = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        c.await();
+                        threadShouldThrow();
+                    } catch(BrokenBarrierException success){
+                    } catch(Exception i){
+                        threadUnexpectedException();
+                    }
+                }
+            });
+        try {
+            t1.start();
+            t2.start();
+            t1.join();
+            t2.join();
+        } catch(InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * A reset of an active barrier causes waiting threads to throw
+     * BrokenBarrierException
+     */
+    public void testReset_BrokenBarrier() {
+        final CyclicBarrier c = new CyclicBarrier(3);
+        Thread t1 = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        c.await();
+                        threadShouldThrow();
+                    } catch(BrokenBarrierException success){}
+                    catch(Exception b){
+                        threadUnexpectedException();
+                    }
+                }
+            });
+        Thread t2 = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        c.await();
+                        threadShouldThrow();
+                    } catch(BrokenBarrierException success){
+                    } catch(Exception i){
+                        threadUnexpectedException();
+                    }
+                }
+            });
+        try {
+            t1.start();
+            t2.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            c.reset();
+            t1.join();
+            t2.join();
+        } catch(InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * A reset before threads enter barrier does not throw
+     * BrokenBarrierException
+     */
+    public void testReset_NoBrokenBarrier() {
+        final CyclicBarrier c = new CyclicBarrier(3);
+        Thread t1 = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        c.await();
+                    } catch(Exception b){
+                        threadUnexpectedException();
+                    }
+                }
+            });
+        Thread t2 = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        c.await();
+                    } catch(Exception i){
+                        threadUnexpectedException();
+                    }
+                }
+            });
+        try {
+            c.reset();
+            t1.start();
+            t2.start();
+            c.await();
+            t1.join();
+            t2.join();
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * All threads block while a barrier is broken.
+     */
+    public void testReset_Leakage() {
+        try {
+            final CyclicBarrier c = new CyclicBarrier(2);
+            final AtomicBoolean done = new AtomicBoolean();
+            Thread t = new Thread() {
+                    public void run() {
+                        while (!done.get()) {
+                            try {
+                                while (c.isBroken())
+                                    c.reset();
+
+                                c.await();
+                                threadFail("await should not return");
+                            }
+                            catch (BrokenBarrierException e) {
+                            }
+                            catch (InterruptedException ie) {
+                            }
+                        }
+                    }
+                };
+
+            t.start();
+            for( int i = 0; i < 4; i++) {
+                Thread.sleep(SHORT_DELAY_MS);
+                t.interrupt();
+            }
+            done.set(true);
+            t.interrupt();
+        }
+        catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * Reset of a non-broken barrier does not break barrier
+     */
+    public void testResetWithoutBreakage() {
+        try {
+            final CyclicBarrier start = new CyclicBarrier(3);
+            final CyclicBarrier barrier = new CyclicBarrier(3);
+            for (int i = 0; i < 3; i++) {
+                Thread t1 = new Thread(new Runnable() {
+                        public void run() {
+                            try { start.await(); }
+                            catch (Exception ie) {
+                                threadFail("start barrier");
+                            }
+                            try { barrier.await(); }
+                            catch (Throwable thrown) {
+                                unexpectedException();
+                            }}});
+
+                Thread t2 = new Thread(new Runnable() {
+                        public void run() {
+                            try { start.await(); }
+                            catch (Exception ie) {
+                                threadFail("start barrier");
+                            }
+                            try { barrier.await(); }
+                            catch (Throwable thrown) {
+                                unexpectedException();
+                            }}});
+
+
+                t1.start();
+                t2.start();
+                try { start.await(); }
+                catch (Exception ie) { threadFail("start barrier"); }
+                barrier.await();
+                t1.join();
+                t2.join();
+                assertFalse(barrier.isBroken());
+                assertEquals(0, barrier.getNumberWaiting());
+                if (i == 1) barrier.reset();
+                assertFalse(barrier.isBroken());
+                assertEquals(0, barrier.getNumberWaiting());
+            }
+        }
+        catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * Reset of a barrier after interruption reinitializes it.
+     */
+    public void testResetAfterInterrupt() {
+        try {
+            final CyclicBarrier start = new CyclicBarrier(3);
+            final CyclicBarrier barrier = new CyclicBarrier(3);
+            for (int i = 0; i < 2; i++) {
+                Thread t1 = new Thread(new Runnable() {
+                        public void run() {
+                            try { start.await(); }
+                            catch (Exception ie) {
+                                threadFail("start barrier");
+                            }
+                            try { barrier.await(); }
+                            catch(InterruptedException ok) {}
+                            catch (Throwable thrown) {
+                                unexpectedException();
+                            }}});
+
+                Thread t2 = new Thread(new Runnable() {
+                        public void run() {
+                            try { start.await(); }
+                            catch (Exception ie) {
+                                threadFail("start barrier");
+                            }
+                            try { barrier.await(); }
+                            catch(BrokenBarrierException ok) {}
+                            catch (Throwable thrown) {
+                                unexpectedException();
+                            }}});
+
+                t1.start();
+                t2.start();
+                try { start.await(); }
+                catch (Exception ie) { threadFail("start barrier"); }
+                t1.interrupt();
+                t1.join();
+                t2.join();
+                assertTrue(barrier.isBroken());
+                assertEquals(0, barrier.getNumberWaiting());
+                barrier.reset();
+                assertFalse(barrier.isBroken());
+                assertEquals(0, barrier.getNumberWaiting());
+            }
+        }
+        catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * Reset of a barrier after timeout reinitializes it.
+     */
+    public void testResetAfterTimeout() {
+        try {
+            final CyclicBarrier start = new CyclicBarrier(3);
+            final CyclicBarrier barrier = new CyclicBarrier(3);
+            for (int i = 0; i < 2; i++) {
+                Thread t1 = new Thread(new Runnable() {
+                        public void run() {
+                            try { start.await(); }
+                            catch (Exception ie) {
+                                threadFail("start barrier");
+                            }
+                            try { barrier.await(MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS); }
+                            catch(TimeoutException ok) {}
+                            catch (Throwable thrown) {
+                                unexpectedException();
+                            }}});
+
+                Thread t2 = new Thread(new Runnable() {
+                        public void run() {
+                            try { start.await(); }
+                            catch (Exception ie) {
+                                threadFail("start barrier");
+                            }
+                            try { barrier.await(); }
+                            catch(BrokenBarrierException ok) {}
+                            catch (Throwable thrown) {
+                                unexpectedException();
+                            }}});
+
+                t1.start();
+                t2.start();
+                try { start.await(); }
+                catch (Exception ie) { threadFail("start barrier"); }
+                t1.join();
+                t2.join();
+                assertTrue(barrier.isBroken());
+                assertEquals(0, barrier.getNumberWaiting());
+                barrier.reset();
+                assertFalse(barrier.isBroken());
+                assertEquals(0, barrier.getNumberWaiting());
+            }
+        }
+        catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * Reset of a barrier after a failed command reinitializes it.
+     */
+    public void testResetAfterCommandException() {
+        try {
+            final CyclicBarrier start = new CyclicBarrier(3);
+            final CyclicBarrier barrier =
+                new CyclicBarrier(3, new Runnable() {
+                        public void run() {
+                            throw new NullPointerException(); }});
+            for (int i = 0; i < 2; i++) {
+                Thread t1 = new Thread(new Runnable() {
+                        public void run() {
+                            try { start.await(); }
+                            catch (Exception ie) {
+                                threadFail("start barrier");
+                            }
+                            try { barrier.await(); }
+                            catch(BrokenBarrierException ok) {}
+                            catch (Throwable thrown) {
+                                unexpectedException();
+                            }}});
+
+                Thread t2 = new Thread(new Runnable() {
+                        public void run() {
+                            try { start.await(); }
+                            catch (Exception ie) {
+                                threadFail("start barrier");
+                            }
+                            try { barrier.await(); }
+                            catch(BrokenBarrierException ok) {}
+                            catch (Throwable thrown) {
+                                unexpectedException();
+                            }}});
+
+                t1.start();
+                t2.start();
+                try { start.await(); }
+                catch (Exception ie) { threadFail("start barrier"); }
+                while (barrier.getNumberWaiting() < 2) { Thread.yield(); }
+                try { barrier.await(); }
+                catch (Exception ok) { }
+                t1.join();
+                t2.join();
+                assertTrue(barrier.isBroken());
+                assertEquals(0, barrier.getNumberWaiting());
+                barrier.reset();
+                assertFalse(barrier.isBroken());
+                assertEquals(0, barrier.getNumberWaiting());
+            }
+        }
+        catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/DelayQueueTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/DelayQueueTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/DelayQueueTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,1036 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.*;
+import java.util.NoSuchElementException;
+import java.util.Iterator;
+import java.util.ArrayList;
+
+public class DelayQueueTest extends JSR166TestCase {
+    public static void main(String[] args) {
+        junit.textui.TestRunner.run (suite());
+    }
+
+    public static Test suite() {
+        return new TestSuite(DelayQueueTest.class);
+    }
+
+    private static final int NOCAP = Integer.MAX_VALUE;
+
+    /**
+     * A delayed implementation for testing.
+     * Most  tests use Pseudodelays, where delays are all elapsed
+     * (so, no blocking solely for delays) but are still ordered
+     */
+    static class PDelay implements Delayed {
+        int pseudodelay;
+        PDelay(int i) { pseudodelay = Integer.MIN_VALUE + i; }
+        public int compareTo(Object y) {
+            int i = pseudodelay;
+            int j = ((PDelay)y).pseudodelay;
+            if (i < j) return -1;
+            if (i > j) return 1;
+            return 0;
+        }
+
+        public int compareTo(Delayed y) {
+            int i = pseudodelay;
+            int j = ((PDelay)y).pseudodelay;
+            if (i < j) return -1;
+            if (i > j) return 1;
+            return 0;
+        }
+
+        public boolean equals(Object other) {
+            return ((PDelay)other).pseudodelay == pseudodelay;
+        }
+        public boolean equals(PDelay other) {
+            return ((PDelay)other).pseudodelay == pseudodelay;
+        }
+
+
+        public long getDelay(TimeUnit ignore) {
+            return pseudodelay;
+        }
+        public int intValue() {
+            return pseudodelay;
+        }
+
+        public String toString() {
+            return String.valueOf(pseudodelay);
+        }
+    }
+
+
+    /**
+     * Delayed implementation that actually delays
+     */
+    static class NanoDelay implements Delayed {
+        long trigger;
+        NanoDelay(long i) {
+            trigger = Utils.nanoTime() + i;
+        }
+        public int compareTo(Object y) {
+            long i = trigger;
+            long j = ((NanoDelay)y).trigger;
+            if (i < j) return -1;
+            if (i > j) return 1;
+            return 0;
+        }
+
+        public int compareTo(Delayed y) {
+            long i = trigger;
+            long j = ((NanoDelay)y).trigger;
+            if (i < j) return -1;
+            if (i > j) return 1;
+            return 0;
+        }
+
+        public boolean equals(Object other) {
+            return ((NanoDelay)other).trigger == trigger;
+        }
+        public boolean equals(NanoDelay other) {
+            return ((NanoDelay)other).trigger == trigger;
+        }
+
+        public long getDelay(TimeUnit unit) {
+            long n = trigger - Utils.nanoTime();
+            return unit.convert(n, TimeUnit.NANOSECONDS);
+        }
+
+        public long getTriggerTime() {
+            return trigger;
+        }
+
+        public String toString() {
+            return String.valueOf(trigger);
+        }
+    }
+
+
+    /**
+     * Create a queue of given size containing consecutive
+     * PDelays 0 ... n.
+     */
+    private DelayQueue populatedQueue(int n) {
+        DelayQueue q = new DelayQueue();
+        assertTrue(q.isEmpty());
+        for(int i = n-1; i >= 0; i-=2)
+            assertTrue(q.offer(new PDelay(i)));
+        for(int i = (n & 1); i < n; i+=2)
+            assertTrue(q.offer(new PDelay(i)));
+        assertFalse(q.isEmpty());
+        assertEquals(NOCAP, q.remainingCapacity());
+        assertEquals(n, q.size());
+        return q;
+    }
+
+    /**
+     * A new queue has unbounded capacity
+     */
+    public void testConstructor1() {
+        assertEquals(NOCAP, new DelayQueue().remainingCapacity());
+    }
+
+    /**
+     * Initializing from null Collection throws NPE
+     */
+    public void testConstructor3() {
+        try {
+            DelayQueue q = new DelayQueue(null);
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Initializing from Collection of null elements throws NPE
+     */
+    public void testConstructor4() {
+        try {
+            PDelay[] ints = new PDelay[SIZE];
+            DelayQueue q = new DelayQueue(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Initializing from Collection with some null elements throws NPE
+     */
+    public void testConstructor5() {
+        try {
+            PDelay[] ints = new PDelay[SIZE];
+            for (int i = 0; i < SIZE-1; ++i)
+                ints[i] = new PDelay(i);
+            DelayQueue q = new DelayQueue(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Queue contains all elements of collection used to initialize
+     */
+    public void testConstructor6() {
+        try {
+            PDelay[] ints = new PDelay[SIZE];
+            for (int i = 0; i < SIZE; ++i)
+                ints[i] = new PDelay(i);
+            DelayQueue q = new DelayQueue(Arrays.asList(ints));
+            for (int i = 0; i < SIZE; ++i)
+                assertEquals(ints[i], q.poll());
+        }
+        finally {}
+    }
+
+    /**
+     * isEmpty is true before add, false after
+     */
+    public void testEmpty() {
+        DelayQueue q = new DelayQueue();
+        assertTrue(q.isEmpty());
+        assertEquals(NOCAP, q.remainingCapacity());
+        q.add(new PDelay(1));
+        assertFalse(q.isEmpty());
+        q.add(new PDelay(2));
+        q.remove();
+        q.remove();
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * remainingCapacity does not change when elementa added or removed,
+     * but size does
+     */
+    public void testRemainingCapacity() {
+        DelayQueue q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(NOCAP, q.remainingCapacity());
+            assertEquals(SIZE-i, q.size());
+            q.remove();
+        }
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(NOCAP, q.remainingCapacity());
+            assertEquals(i, q.size());
+            q.add(new PDelay(i));
+        }
+    }
+
+    /**
+     * offer(null) throws NPE
+     */
+    public void testOfferNull() {
+        try {
+            DelayQueue q = new DelayQueue();
+            q.offer(null);
+            shouldThrow();
+        } catch (NullPointerException success) { }
+    }
+
+    /**
+     * add(null) throws NPE
+     */
+    public void testAddNull() {
+        try {
+            DelayQueue q = new DelayQueue();
+            q.add(null);
+            shouldThrow();
+        } catch (NullPointerException success) { }
+    }
+
+    /**
+     * offer non-null succeeds
+     */
+    public void testOffer() {
+        DelayQueue q = new DelayQueue();
+        assertTrue(q.offer(new PDelay(0)));
+        assertTrue(q.offer(new PDelay(1)));
+    }
+
+    /**
+     * add succeeds
+     */
+    public void testAdd() {
+        DelayQueue q = new DelayQueue();
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, q.size());
+            assertTrue(q.add(new PDelay(i)));
+        }
+    }
+
+    /**
+     * addAll(null) throws NPE
+     */
+    public void testAddAll1() {
+        try {
+            DelayQueue q = new DelayQueue();
+            q.addAll(null);
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+
+    /**
+     * addAll(this) throws IAE
+     */
+    public void testAddAllSelf() {
+        try {
+            DelayQueue q = populatedQueue(SIZE);
+            q.addAll(q);
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success) {}
+    }
+
+    /**
+     * addAll of a collection with null elements throws NPE
+     */
+    public void testAddAll2() {
+        try {
+            DelayQueue q = new DelayQueue();
+            PDelay[] ints = new PDelay[SIZE];
+            q.addAll(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+    /**
+     * addAll of a collection with any null elements throws NPE after
+     * possibly adding some elements
+     */
+    public void testAddAll3() {
+        try {
+            DelayQueue q = new DelayQueue();
+            PDelay[] ints = new PDelay[SIZE];
+            for (int i = 0; i < SIZE-1; ++i)
+                ints[i] = new PDelay(i);
+            q.addAll(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Queue contains all elements of successful addAll
+     */
+    public void testAddAll5() {
+        try {
+            PDelay[] empty = new PDelay[0];
+            PDelay[] ints = new PDelay[SIZE];
+            for (int i = SIZE-1; i >= 0; --i)
+                ints[i] = new PDelay(i);
+            DelayQueue q = new DelayQueue();
+            assertFalse(q.addAll(Arrays.asList(empty)));
+            assertTrue(q.addAll(Arrays.asList(ints)));
+            for (int i = 0; i < SIZE; ++i)
+                assertEquals(ints[i], q.poll());
+        }
+        finally {}
+    }
+
+    /**
+     * put(null) throws NPE
+     */
+     public void testPutNull() {
+        try {
+            DelayQueue q = new DelayQueue();
+            q.put(null);
+            shouldThrow();
+        }
+        catch (NullPointerException success){
+        }
+     }
+
+    /**
+     * all elements successfully put are contained
+     */
+     public void testPut() {
+         try {
+             DelayQueue q = new DelayQueue();
+             for (int i = 0; i < SIZE; ++i) {
+                 PDelay I = new PDelay(i);
+                 q.put(I);
+                 assertTrue(q.contains(I));
+             }
+             assertEquals(SIZE, q.size());
+         }
+         finally {
+        }
+    }
+
+    /**
+     * put doesn't block waiting for take
+     */
+    public void testPutWithTake() {
+        final DelayQueue q = new DelayQueue();
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    int added = 0;
+                    try {
+                        q.put(new PDelay(0));
+                        ++added;
+                        q.put(new PDelay(0));
+                        ++added;
+                        q.put(new PDelay(0));
+                        ++added;
+                        q.put(new PDelay(0));
+                        ++added;
+                        threadAssertTrue(added == 4);
+                    } finally {
+                    }
+                }
+            });
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            q.take();
+            t.interrupt();
+            t.join();
+        } catch (Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * timed offer does not time out
+     */
+    public void testTimedOffer() {
+        final DelayQueue q = new DelayQueue();
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        q.put(new PDelay(0));
+                        q.put(new PDelay(0));
+                        threadAssertTrue(q.offer(new PDelay(0), SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+                        threadAssertTrue(q.offer(new PDelay(0), LONG_DELAY_MS, TimeUnit.MILLISECONDS));
+                    } finally { }
+                }
+            });
+
+        try {
+            t.start();
+            Thread.sleep(SMALL_DELAY_MS);
+            t.interrupt();
+            t.join();
+        } catch (Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * take retrieves elements in priority order
+     */
+    public void testTake() {
+        try {
+            DelayQueue q = populatedQueue(SIZE);
+            for (int i = 0; i < SIZE; ++i) {
+                assertEquals(new PDelay(i), ((PDelay)q.take()));
+            }
+        } catch (InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * take blocks interruptibly when empty
+     */
+    public void testTakeFromEmpty() {
+        final DelayQueue q = new DelayQueue();
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        q.take();
+                        threadShouldThrow();
+                    } catch (InterruptedException success){ }
+                }
+            });
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            t.interrupt();
+            t.join();
+        } catch (Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * Take removes existing elements until empty, then blocks interruptibly
+     */
+    public void testBlockingTake() {
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        DelayQueue q = populatedQueue(SIZE);
+                        for (int i = 0; i < SIZE; ++i) {
+                            threadAssertEquals(new PDelay(i), ((PDelay)q.take()));
+                        }
+                        q.take();
+                        threadShouldThrow();
+                    } catch (InterruptedException success){
+                    }
+                }});
+        t.start();
+        try {
+           Thread.sleep(SHORT_DELAY_MS);
+           t.interrupt();
+           t.join();
+        }
+        catch (InterruptedException ie) {
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * poll succeeds unless empty
+     */
+    public void testPoll() {
+        DelayQueue q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(new PDelay(i), ((PDelay)q.poll()));
+        }
+        assertNull(q.poll());
+    }
+
+    /**
+     * timed pool with zero timeout succeeds when non-empty, else times out
+     */
+    public void testTimedPoll0() {
+        try {
+            DelayQueue q = populatedQueue(SIZE);
+            for (int i = 0; i < SIZE; ++i) {
+                assertEquals(new PDelay(i), ((PDelay)q.poll(0, TimeUnit.MILLISECONDS)));
+            }
+            assertNull(q.poll(0, TimeUnit.MILLISECONDS));
+        } catch (InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * timed pool with nonzero timeout succeeds when non-empty, else times out
+     */
+    public void testTimedPoll() {
+        try {
+            DelayQueue q = populatedQueue(SIZE);
+            for (int i = 0; i < SIZE; ++i) {
+                assertEquals(new PDelay(i), ((PDelay)q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS)));
+            }
+            assertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+        } catch (InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * Interrupted timed poll throws InterruptedException instead of
+     * returning timeout status
+     */
+    public void testInterruptedTimedPoll() {
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        DelayQueue q = populatedQueue(SIZE);
+                        for (int i = 0; i < SIZE; ++i) {
+                            threadAssertEquals(new PDelay(i), ((PDelay)q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS)));
+                        }
+                        threadAssertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+                    } catch (InterruptedException success){
+                    }
+                }});
+        t.start();
+        try {
+           Thread.sleep(SHORT_DELAY_MS);
+           t.interrupt();
+           t.join();
+        }
+        catch (InterruptedException ie) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     *  timed poll before a delayed offer fails; after offer succeeds;
+     *  on interruption throws
+     */
+    public void testTimedPollWithOffer() {
+        final DelayQueue q = new DelayQueue();
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        threadAssertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+                        q.poll(LONG_DELAY_MS, TimeUnit.MILLISECONDS);
+                        q.poll(LONG_DELAY_MS, TimeUnit.MILLISECONDS);
+                        threadFail("Should block");
+                    } catch (InterruptedException success) { }
+                }
+            });
+        try {
+            t.start();
+            Thread.sleep(SMALL_DELAY_MS);
+            assertTrue(q.offer(new PDelay(0), SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+            t.interrupt();
+            t.join();
+        } catch (Exception e){
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * peek returns next element, or null if empty
+     */
+    public void testPeek() {
+        DelayQueue q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(new PDelay(i), ((PDelay)q.peek()));
+            q.poll();
+            if (q.isEmpty())
+                assertNull(q.peek());
+            else
+                assertTrue(i != ((PDelay)q.peek()).intValue());
+        }
+        assertNull(q.peek());
+    }
+
+    /**
+     * element returns next element, or throws NSEE if empty
+     */
+    public void testElement() {
+        DelayQueue q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(new PDelay(i), ((PDelay)q.element()));
+            q.poll();
+        }
+        try {
+            q.element();
+            shouldThrow();
+        }
+        catch (NoSuchElementException success) {}
+    }
+
+    /**
+     * remove removes next element, or throws NSEE if empty
+     */
+    public void testRemove() {
+        DelayQueue q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(new PDelay(i), ((PDelay)q.remove()));
+        }
+        try {
+            q.remove();
+            shouldThrow();
+        } catch (NoSuchElementException success){
+        }
+    }
+
+    /**
+     * remove(x) removes x and returns true if present
+     */
+    public void testRemoveElement() {
+        DelayQueue q = populatedQueue(SIZE);
+        for (int i = 1; i < SIZE; i+=2) {
+            assertTrue(q.remove(new PDelay(i)));
+        }
+        for (int i = 0; i < SIZE; i+=2) {
+            assertTrue(q.remove(new PDelay(i)));
+            assertFalse(q.remove(new PDelay(i+1)));
+        }
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * contains(x) reports true when elements added but not yet removed
+     */
+    public void testContains() {
+        DelayQueue q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(q.contains(new PDelay(i)));
+            q.poll();
+            assertFalse(q.contains(new PDelay(i)));
+        }
+    }
+
+    /**
+     * clear removes all elements
+     */
+    public void testClear() {
+        DelayQueue q = populatedQueue(SIZE);
+        q.clear();
+        assertTrue(q.isEmpty());
+        assertEquals(0, q.size());
+        assertEquals(NOCAP, q.remainingCapacity());
+        PDelay x = new PDelay(1);
+        q.add(x);
+        assertFalse(q.isEmpty());
+        assertTrue(q.contains(x));
+        q.clear();
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * containsAll(c) is true when c contains a subset of elements
+     */
+    public void testContainsAll() {
+        DelayQueue q = populatedQueue(SIZE);
+        DelayQueue p = new DelayQueue();
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(q.containsAll(p));
+            assertFalse(p.containsAll(q));
+            p.add(new PDelay(i));
+        }
+        assertTrue(p.containsAll(q));
+    }
+
+    /**
+     * retainAll(c) retains only those elements of c and reports true if changed
+     */
+    public void testRetainAll() {
+        DelayQueue q = populatedQueue(SIZE);
+        DelayQueue p = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            boolean changed = q.retainAll(p);
+            if (i == 0)
+                assertFalse(changed);
+            else
+                assertTrue(changed);
+
+            assertTrue(q.containsAll(p));
+            assertEquals(SIZE-i, q.size());
+            p.remove();
+        }
+    }
+
+    /**
+     * removeAll(c) removes only those elements of c and reports true if changed
+     */
+    public void testRemoveAll() {
+        for (int i = 1; i < SIZE; ++i) {
+            DelayQueue q = populatedQueue(SIZE);
+            DelayQueue p = populatedQueue(i);
+            assertTrue(q.removeAll(p));
+            assertEquals(SIZE-i, q.size());
+            for (int j = 0; j < i; ++j) {
+                PDelay I = (PDelay)(p.remove());
+                assertFalse(q.contains(I));
+            }
+        }
+    }
+
+    /**
+     * toArray contains all elements
+     */
+    public void testToArray() {
+        DelayQueue q = populatedQueue(SIZE);
+        Object[] o = q.toArray();
+        Arrays.sort(o);
+        try {
+        for(int i = 0; i < o.length; i++)
+            assertEquals(o[i], q.take());
+        } catch (InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * toArray(a) contains all elements
+     */
+    public void testToArray2() {
+        DelayQueue q = populatedQueue(SIZE);
+        PDelay[] ints = new PDelay[SIZE];
+        ints = (PDelay[])q.toArray(ints);
+        Arrays.sort(ints);
+        try {
+            for(int i = 0; i < ints.length; i++)
+                assertEquals(ints[i], q.take());
+        } catch (InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * toArray(null) throws NPE
+     */
+    public void testToArray_BadArg() {
+        try {
+            DelayQueue q = populatedQueue(SIZE);
+            Object o[] = q.toArray(null);
+            shouldThrow();
+        } catch(NullPointerException success){}
+    }
+
+    /**
+     * toArray with incompatible array type throws CCE
+     */
+    public void testToArray1_BadArg() {
+        try {
+            DelayQueue q = populatedQueue(SIZE);
+            Object o[] = q.toArray(new String[10] );
+            shouldThrow();
+        } catch(ArrayStoreException  success){}
+    }
+
+    /**
+     * iterator iterates through all elements
+     */
+    public void testIterator() {
+        DelayQueue q = populatedQueue(SIZE);
+        int i = 0;
+        Iterator it = q.iterator();
+        while(it.hasNext()) {
+            assertTrue(q.contains(it.next()));
+            ++i;
+        }
+        assertEquals(i, SIZE);
+    }
+
+    /**
+     * iterator.remove removes current element
+     */
+    public void testIteratorRemove () {
+        final DelayQueue q = new DelayQueue();
+        q.add(new PDelay(2));
+        q.add(new PDelay(1));
+        q.add(new PDelay(3));
+        Iterator it = q.iterator();
+        it.next();
+        it.remove();
+        it = q.iterator();
+        assertEquals(it.next(), new PDelay(2));
+        assertEquals(it.next(), new PDelay(3));
+        assertFalse(it.hasNext());
+    }
+
+
+    /**
+     * toString contains toStrings of elements
+     */
+    public void testToString() {
+        DelayQueue q = populatedQueue(SIZE);
+        String s = q.toString();
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(s.indexOf(String.valueOf(Integer.MIN_VALUE+i)) >= 0);
+        }
+    }
+
+    /**
+     * offer transfers elements across Executor tasks
+     */
+    public void testPollInExecutor() {
+        final DelayQueue q = new DelayQueue();
+        ExecutorService executor = Executors.newFixedThreadPool(2);
+        executor.execute(new Runnable() {
+            public void run() {
+                threadAssertNull(q.poll());
+                try {
+                    threadAssertTrue(null != q.poll(MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS));
+                    threadAssertTrue(q.isEmpty());
+                }
+                catch (InterruptedException e) {
+                    threadUnexpectedException();
+                }
+            }
+        });
+
+        executor.execute(new Runnable() {
+            public void run() {
+                try {
+                    Thread.sleep(SHORT_DELAY_MS);
+                    q.put(new PDelay(1));
+                }
+                catch (InterruptedException e) {
+                    threadUnexpectedException();
+                }
+            }
+        });
+        joinPool(executor);
+
+    }
+
+
+    /**
+     * Delayed actions do not occur until their delay elapses
+     */
+    public void testDelay() {
+        DelayQueue q = new DelayQueue();
+        NanoDelay[] elements = new NanoDelay[SIZE];
+        for (int i = 0; i < SIZE; ++i) {
+            elements[i] = new NanoDelay(1000000000L + 1000000L * (SIZE - i));
+        }
+        for (int i = 0; i < SIZE; ++i) {
+            q.add(elements[i]);
+        }
+
+        try {
+            long last = 0;
+            for (int i = 0; i < SIZE; ++i) {
+                NanoDelay e = (NanoDelay)(q.take());
+                long tt = e.getTriggerTime();
+                assertTrue(tt <= Utils.nanoTime());
+                if (i != 0)
+                    assertTrue(tt >= last);
+                last = tt;
+            }
+        }
+        catch(InterruptedException ie) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * peek of a non-empty queue returns non-null even if not expired
+     */
+    public void testPeekDelayed() {
+        DelayQueue q = new DelayQueue();
+        q.add(new NanoDelay(Long.MAX_VALUE));
+        assert(q.peek() != null);
+    }
+
+    /**
+     * poll of a non-empty queue returns null if no expired elements.
+     */
+    public void testPollDelayed() {
+        DelayQueue q = new DelayQueue();
+        q.add(new NanoDelay(Long.MAX_VALUE));
+        assertNull(q.poll());
+    }
+
+    /**
+      * timed poll of a non-empty queue returns null if no expired elements.
+      */
+     public void testTimedPollDelayed() {
+         DelayQueue q = new DelayQueue();
+         q.add(new NanoDelay(LONG_DELAY_MS * 1000000L));
+         try {
+             assertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+         } catch (Exception ex) {
+             unexpectedException();
+         }
+     }
+
+     /**
+     * drainTo(null) throws NPE
+     */
+    public void testDrainToNull() {
+        DelayQueue q = populatedQueue(SIZE);
+        try {
+            q.drainTo(null);
+            shouldThrow();
+        } catch(NullPointerException success) {
+        }
+    }
+
+    /**
+     * drainTo(this) throws IAE
+     */
+    public void testDrainToSelf() {
+        DelayQueue q = populatedQueue(SIZE);
+        try {
+            q.drainTo(q);
+            shouldThrow();
+        } catch(IllegalArgumentException success) {
+        }
+    }
+
+    /**
+     * drainTo(c) empties queue into another collection c
+     */
+    public void testDrainTo() {
+        DelayQueue q = new DelayQueue();
+        PDelay[] elems = new PDelay[SIZE];
+        for (int i = 0; i < SIZE; ++i) {
+            elems[i] = new PDelay(i);
+            q.add(elems[i]);
+        }
+        ArrayList l = new ArrayList();
+        q.drainTo(l);
+        assertEquals(q.size(), 0);
+        for (int i = 0; i < SIZE; ++i)
+            assertEquals(l.get(i), elems[i]);
+        q.add(elems[0]);
+        q.add(elems[1]);
+        assertFalse(q.isEmpty());
+        assertTrue(q.contains(elems[0]));
+        assertTrue(q.contains(elems[1]));
+        l.clear();
+        q.drainTo(l);
+        assertEquals(q.size(), 0);
+        assertEquals(l.size(), 2);
+        for (int i = 0; i < 2; ++i)
+            assertEquals(l.get(i), elems[i]);
+    }
+
+    /**
+     * drainTo empties queue
+     */
+    public void testDrainToWithActivePut() {
+        final DelayQueue q = populatedQueue(SIZE);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    q.put(new PDelay(SIZE+1));
+                }
+            });
+        try {
+            t.start();
+            ArrayList l = new ArrayList();
+            q.drainTo(l);
+            assertTrue(l.size() >= SIZE);
+            t.join();
+            assertTrue(q.size() + l.size() >= SIZE);
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * drainTo(null, n) throws NPE
+     */
+    public void testDrainToNullN() {
+        DelayQueue q = populatedQueue(SIZE);
+        try {
+            q.drainTo(null, 0);
+            shouldThrow();
+        } catch(NullPointerException success) {
+        }
+    }
+
+    /**
+     * drainTo(this, n) throws IAE
+     */
+    public void testDrainToSelfN() {
+        DelayQueue q = populatedQueue(SIZE);
+        try {
+            q.drainTo(q, 0);
+            shouldThrow();
+        } catch(IllegalArgumentException success) {
+        }
+    }
+
+    /**
+     * drainTo(c, n) empties first max {n, size} elements of queue into c
+     */
+    public void testDrainToN() {
+        for (int i = 0; i < SIZE + 2; ++i) {
+            DelayQueue q = populatedQueue(SIZE);
+            ArrayList l = new ArrayList();
+            q.drainTo(l, i);
+            int k = (i < SIZE)? i : SIZE;
+            assertEquals(q.size(), SIZE-k);
+            assertEquals(l.size(), k);
+        }
+    }
+
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/EntryTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/EntryTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/EntryTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,131 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+import junit.framework.*;
+import java.util.Map;
+import edu.emory.mathcs.backport.java.util.AbstractMap;
+
+public class EntryTest extends JSR166TestCase {
+    public static void main(String[] args) {
+	junit.textui.TestRunner.run (suite());
+    }
+    public static Test suite() {
+	return new TestSuite(EntryTest.class);
+    }
+
+    static final String k1 = "1";
+    static final String v1 = "a";
+    static final String k2 = "2";
+    static final String v2 = "b";
+
+
+    /**
+     * A new SimpleEntry(k, v) holds k, v.
+     */
+    public void testConstructor1() {
+        Map.Entry e = new AbstractMap.SimpleEntry(k1, v1);
+        assertEquals(k1, e.getKey());
+        assertEquals(v1, e.getValue());
+    }
+
+    /**
+     * A new SimpleImmutableEntry(k, v) holds k, v.
+     */
+    public void testConstructor2() {
+        Map.Entry s = new AbstractMap.SimpleImmutableEntry(k1, v1);
+        assertEquals(k1, s.getKey());
+        assertEquals(v1, s.getValue());
+    }
+
+
+    /**
+     * A new SimpleEntry(entry(k, v)) holds k, v.
+     */
+    public void testConstructor3() {
+        Map.Entry e2 = new AbstractMap.SimpleEntry(k1, v1);
+        Map.Entry e = new AbstractMap.SimpleEntry(e2);
+        assertEquals(k1, e.getKey());
+        assertEquals(v1, e.getValue());
+    }
+
+    /**
+     * A new SimpleImmutableEntry(entry(k, v)) holds k, v.
+     */
+    public void testConstructor4() {
+        Map.Entry s2 = new AbstractMap.SimpleImmutableEntry(k1, v1);
+        Map.Entry s = new AbstractMap.SimpleImmutableEntry(s2);
+        assertEquals(k1, s.getKey());
+        assertEquals(v1, s.getValue());
+    }
+
+    /**
+     * Entries with same key-value pairs are equal and have same
+     * hashcodes
+     */
+    public void testEquals() {
+        Map.Entry e2 = new AbstractMap.SimpleEntry(k1, v1);
+        Map.Entry e = new AbstractMap.SimpleEntry(e2);
+        Map.Entry s2 = new AbstractMap.SimpleImmutableEntry(k1, v1);
+        Map.Entry s = new AbstractMap.SimpleImmutableEntry(s2);
+        assertEquals(e2, e);
+        assertEquals(e2.hashCode(), e.hashCode());
+        assertEquals(s2, s);
+        assertEquals(s2.hashCode(), s.hashCode());
+        assertEquals(e2, s2);
+        assertEquals(e2.hashCode(), s2.hashCode());
+        assertEquals(e, s);
+        assertEquals(e.hashCode(), s.hashCode());
+    }
+
+    /**
+     * Entries with different key-value pairs are not equal
+     */
+    public void testNotEquals() {
+        Map.Entry e2 = new AbstractMap.SimpleEntry(k1, v1);
+        Map.Entry e = new AbstractMap.SimpleEntry(k2, v1);
+        assertFalse(e2.equals( e));
+        e = new AbstractMap.SimpleEntry(k1, v2);
+        assertFalse(e2.equals( e));
+        e = new AbstractMap.SimpleEntry(k2, v2);
+        assertFalse(e2.equals( e));
+
+        Map.Entry s2 = new AbstractMap.SimpleImmutableEntry(k1, v1);
+        Map.Entry s = new AbstractMap.SimpleImmutableEntry(k2, v1);
+        assertFalse(s2.equals( s));
+        s = new AbstractMap.SimpleImmutableEntry(k1, v2);
+        assertFalse(s2.equals( s));
+        s = new AbstractMap.SimpleImmutableEntry(k2, v2);
+        assertFalse(s2.equals( s));
+    }
+
+
+    /**
+     * getValue returns last setValue for SimpleEntry
+     */
+    public void testSetValue1() {
+        Map.Entry e2 = new AbstractMap.SimpleEntry(k1, v1);
+        Map.Entry e = new AbstractMap.SimpleEntry(e2);
+        assertEquals(k1, e.getKey());
+        assertEquals(v1, e.getValue());
+        e.setValue(k2);
+        assertEquals(k2, e.getValue());
+        assertFalse(e2.equals( e));
+    }
+
+    /**
+     * setValue for SimpleImmutableEntry throws UnsupportedOperationException
+     */
+    public void testsetValue2() {
+        Map.Entry s2 = new AbstractMap.SimpleImmutableEntry(k1, v1);
+        Map.Entry s = new AbstractMap.SimpleImmutableEntry(s2);
+        assertEquals(k1, s.getKey());
+        assertEquals(v1, s.getValue());
+        try {
+            s.setValue(k2);
+            fail();
+        } catch (UnsupportedOperationException success) {}
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/ExchangerTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/ExchangerTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/ExchangerTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,232 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+
+public class ExchangerTest extends JSR166TestCase {
+
+    public static void main(String[] args) {
+	junit.textui.TestRunner.run (suite());
+    }
+    public static Test suite() {
+	return new TestSuite(ExchangerTest.class);
+    }
+
+    /**
+     * exchange exchanges objects across two threads
+     */
+    public void testExchange() {
+        final Exchanger e = new Exchanger();
+	Thread t1 = new Thread(new Runnable(){
+		public void run(){
+		    try {
+			Object v = e.exchange(one);
+                        threadAssertEquals(v, two);
+                        Object w = e.exchange(v);
+                        threadAssertEquals(w, one);
+		    } catch(InterruptedException e){
+                        threadUnexpectedException();
+                    }
+		}
+	    });
+	Thread t2 = new Thread(new Runnable(){
+		public void run(){
+		    try {
+			Object v = e.exchange(two);
+                        threadAssertEquals(v, one);
+                        Object w = e.exchange(v);
+                        threadAssertEquals(w, two);
+		    } catch(InterruptedException e){
+                        threadUnexpectedException();
+                    }
+		}
+	    });
+        try {
+            t1.start();
+            t2.start();
+            t1.join();
+            t2.join();
+        } catch(InterruptedException ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * timed exchange exchanges objects across two threads
+     */
+    public void testTimedExchange() {
+        final Exchanger e = new Exchanger();
+	Thread t1 = new Thread(new Runnable(){
+		public void run(){
+		    try {
+			Object v = e.exchange(one, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
+                        threadAssertEquals(v, two);
+                        Object w = e.exchange(v, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
+                        threadAssertEquals(w, one);
+		    } catch(InterruptedException e){
+                        threadUnexpectedException();
+                    } catch(TimeoutException toe) {
+                        threadUnexpectedException();
+                    }
+		}
+	    });
+	Thread t2 = new Thread(new Runnable(){
+		public void run(){
+		    try {
+			Object v = e.exchange(two, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
+                        threadAssertEquals(v, one);
+                        Object w = e.exchange(v, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
+                        threadAssertEquals(w, two);
+		    } catch(InterruptedException e){
+                        threadUnexpectedException();
+                    } catch(TimeoutException toe) {
+                        threadUnexpectedException();
+                    }
+		}
+	    });
+        try {
+            t1.start();
+            t2.start();
+            t1.join();
+            t2.join();
+        } catch(InterruptedException ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * interrupt during wait for exchange throws IE
+     */
+    public void testExchange_InterruptedException(){
+        final Exchanger e = new Exchanger();
+        Thread t = new Thread(new Runnable() {
+                public void run(){
+                    try {
+                        e.exchange(one);
+                        threadShouldThrow();
+                    } catch(InterruptedException success){
+                    }
+                }
+            });
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            t.interrupt();
+            t.join();
+        } catch(InterruptedException ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * interrupt during wait for timed exchange throws IE
+     */
+    public void testTimedExchange_InterruptedException(){
+        final Exchanger e = new Exchanger();
+        Thread t = new Thread(new Runnable() {
+                public void run(){
+                    try {
+                        e.exchange(null, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+                        threadShouldThrow();
+                    } catch(InterruptedException success){
+                    } catch(Exception e2){
+                        threadFail("should throw IE");
+                    }
+                }
+            });
+        try {
+            t.start();
+            t.interrupt();
+            t.join();
+        } catch(InterruptedException ex){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * timeout during wait for timed exchange throws TOE
+     */
+    public void testExchange_TimeOutException(){
+        final Exchanger e = new Exchanger();
+        Thread t = new Thread(new Runnable() {
+                public void run(){
+                    try {
+                        e.exchange(null, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
+                        threadShouldThrow();
+                    } catch(TimeoutException success){
+                    } catch(InterruptedException e2){
+                        threadFail("should throw TOE");
+                    }
+                }
+            });
+        try {
+            t.start();
+            t.join();
+        } catch(InterruptedException ex){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * If one exchanging thread is interrupted, another succeeds.
+     */
+    public void testReplacementAfterExchange() {
+        final Exchanger e = new Exchanger();
+	Thread t1 = new Thread(new Runnable(){
+		public void run(){
+		    try {
+			Object v = e.exchange(one);
+                        threadAssertEquals(v, two);
+                        Object w = e.exchange(v);
+                        threadShouldThrow();
+		    } catch(InterruptedException success){
+                    }
+		}
+	    });
+	Thread t2 = new Thread(new Runnable(){
+		public void run(){
+		    try {
+			Object v = e.exchange(two);
+                        threadAssertEquals(v, one);
+                        Thread.sleep(SMALL_DELAY_MS);
+                        Object w = e.exchange(v);
+                        threadAssertEquals(w, three);
+		    } catch(InterruptedException e){
+                        threadUnexpectedException();
+                    }
+		}
+	    });
+	Thread t3 = new Thread(new Runnable(){
+		public void run(){
+		    try {
+                        Thread.sleep(SMALL_DELAY_MS);
+                        Object w = e.exchange(three);
+                        threadAssertEquals(w, one);
+		    } catch(InterruptedException e){
+                        threadUnexpectedException();
+                    }
+		}
+	    });
+
+        try {
+            t1.start();
+            t2.start();
+            t3.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            t1.interrupt();
+            t1.join();
+            t2.join();
+            t3.join();
+        } catch(InterruptedException ex) {
+            unexpectedException();
+        }
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/ExecutorCompletionServiceTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/ExecutorCompletionServiceTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/ExecutorCompletionServiceTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,230 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.atomic.*;
+
+public class ExecutorCompletionServiceTest extends JSR166TestCase{
+    public static void main(String[] args) {
+        junit.textui.TestRunner.run (suite());
+    }
+    public static Test suite() {
+        return new TestSuite(ExecutorCompletionServiceTest.class);
+    }
+
+
+    /**
+     * Creating a new ECS with null Executor throw NPE
+     */
+    public void testConstructorNPE() {
+        try {
+            ExecutorCompletionService ecs = new ExecutorCompletionService(null);
+            shouldThrow();
+        } catch (NullPointerException success) {
+        }
+    }
+
+    /**
+     * Creating a new ECS with null queue throw NPE
+     */
+    public void testConstructorNPE2() {
+        try {
+            ExecutorService e = Executors.newCachedThreadPool();
+            ExecutorCompletionService ecs = new ExecutorCompletionService(e, null);
+            shouldThrow();
+        } catch (NullPointerException success) {
+        }
+    }
+
+    /**
+     * Submitting a null callable throws NPE
+     */
+    public void testSubmitNPE() {
+        ExecutorService e = Executors.newCachedThreadPool();
+        ExecutorCompletionService ecs = new ExecutorCompletionService(e);
+        try {
+            Callable c = null;
+            ecs.submit(c);
+            shouldThrow();
+        } catch (NullPointerException success) {
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * Submitting a null runnable throws NPE
+     */
+    public void testSubmitNPE2() {
+        ExecutorService e = Executors.newCachedThreadPool();
+        ExecutorCompletionService ecs = new ExecutorCompletionService(e);
+        try {
+            Runnable r = null;
+            ecs.submit(r, Boolean.TRUE);
+            shouldThrow();
+        } catch (NullPointerException success) {
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * A taken submitted task is completed
+     */
+    public void testTake() {
+        ExecutorService e = Executors.newCachedThreadPool();
+        ExecutorCompletionService ecs = new ExecutorCompletionService(e);
+        try {
+            Callable c = new StringTask();
+            ecs.submit(c);
+            Future f = ecs.take();
+            assertTrue(f.isDone());
+        } catch (Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * Take returns the same future object returned by submit
+     */
+    public void testTake2() {
+        ExecutorService e = Executors.newCachedThreadPool();
+        ExecutorCompletionService ecs = new ExecutorCompletionService(e);
+        try {
+            Callable c = new StringTask();
+            Future f1 = ecs.submit(c);
+            Future f2 = ecs.take();
+            assertSame(f1, f2);
+        } catch (Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * If poll returns non-null, the returned task is completed
+     */
+    public void testPoll1() {
+        ExecutorService e = Executors.newCachedThreadPool();
+        ExecutorCompletionService ecs = new ExecutorCompletionService(e);
+        try {
+            assertNull(ecs.poll());
+            Callable c = new StringTask();
+            ecs.submit(c);
+            Thread.sleep(SHORT_DELAY_MS);
+            for (;;) {
+                Future f = ecs.poll();
+                if (f != null) {
+                    assertTrue(f.isDone());
+                    break;
+                }
+            }
+        } catch (Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * If timed poll returns non-null, the returned task is completed
+     */
+    public void testPoll2() {
+        ExecutorService e = Executors.newCachedThreadPool();
+        ExecutorCompletionService ecs = new ExecutorCompletionService(e);
+        try {
+            assertNull(ecs.poll());
+            Callable c = new StringTask();
+            ecs.submit(c);
+            Future f = ecs.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
+            if (f != null)
+                assertTrue(f.isDone());
+        } catch (Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+     /**
+      * Submitting to underlying AES that overrides newTaskFor(Callable)
+      * returns and eventually runs Future returned by newTaskFor.
+      */
+     public void testNewTaskForCallable() {
+         final AtomicBoolean done = new AtomicBoolean(false);
+         class MyCallableFuture extends FutureTask {
+             MyCallableFuture(Callable c) { super(c); }
+             protected void done() { done.set(true); }
+         }
+         ExecutorService e = new ThreadPoolExecutor(
+                                 1, 1, 30L, TimeUnit.SECONDS,
+                                 new ArrayBlockingQueue(1)) {
+             protected RunnableFuture newTaskFor(Callable c) {
+                 return new MyCallableFuture(c);
+             }
+         };
+         ExecutorCompletionService ecs =
+             new ExecutorCompletionService(e);
+         try {
+             assertNull(ecs.poll());
+             Callable c = new StringTask();
+             Future f1 = ecs.submit(c);
+             assertTrue("submit must return MyCallableFuture",
+                        f1 instanceof MyCallableFuture);
+             Future f2 = ecs.take();
+             assertSame("submit and take must return same objects", f1, f2);
+             assertTrue("completed task must have set done", done.get());
+         } catch (Exception ex) {
+             unexpectedException();
+         } finally {
+             joinPool(e);
+         }
+     }
+
+     /**
+      * Submitting to underlying AES that overrides newTaskFor(Runnable,T)
+      * returns and eventually runs Future returned by newTaskFor.
+      */
+     public void testNewTaskForRunnable() {
+         final AtomicBoolean done = new AtomicBoolean(false);
+         class MyRunnableFuture extends FutureTask {
+             MyRunnableFuture(Runnable t, Object r) { super(t, r); }
+             protected void done() { done.set(true); }
+         }
+         ExecutorService e = new ThreadPoolExecutor(
+                                 1, 1, 30L, TimeUnit.SECONDS,
+                                 new ArrayBlockingQueue(1)) {
+             protected RunnableFuture newTaskFor(Runnable t, Object r) {
+                 return new MyRunnableFuture(t, r);
+             }
+         };
+         ExecutorCompletionService ecs =
+             new ExecutorCompletionService(e);
+         try {
+             assertNull(ecs.poll());
+             Runnable r = new NoOpRunnable();
+             Future f1 = ecs.submit(r, null);
+             assertTrue("submit must return MyRunnableFuture",
+                        f1 instanceof MyRunnableFuture);
+             Future f2 = ecs.take();
+             assertSame("submit and take must return same objects", f1, f2);
+             assertTrue("completed task must have set done", done.get());
+         } catch (Exception ex) {
+             unexpectedException();
+         } finally {
+             joinPool(e);
+         }
+     }
+
+
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/ExecutorsTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/ExecutorsTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/ExecutorsTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,668 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import java.math.BigInteger;
+import java.security.*;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+public class ExecutorsTest extends JSR166TestCase{
+    public static void main(String[] args) {
+        junit.textui.TestRunner.run (suite());
+    }
+    public static Test suite() {
+        return new TestSuite(ExecutorsTest.class);
+    }
+
+    static class TimedCallable implements Callable {
+        private final ExecutorService exec;
+        private final Callable func;
+        private final long msecs;
+
+        TimedCallable(ExecutorService exec, Callable func, long msecs) {
+            this.exec = exec;
+            this.func = func;
+            this.msecs = msecs;
+        }
+
+        public Object call() throws Exception {
+            Future ftask = exec.submit(func);
+            try {
+                return ftask.get(msecs, TimeUnit.MILLISECONDS);
+            } finally {
+                ftask.cancel(true);
+            }
+        }
+    }
+
+
+    private static class Fib implements Callable {
+        private final BigInteger n;
+        Fib(long n) {
+            if (n < 0) throw new IllegalArgumentException("need non-negative arg, but got " + n);
+            this.n = BigInteger.valueOf(n);
+        }
+        public Object call() {
+            BigInteger f1 = BigInteger.ONE;
+            BigInteger f2 = f1;
+            for (BigInteger i = BigInteger.ZERO; i.compareTo(n) < 0; i = i.add(BigInteger.ONE)) {
+                BigInteger t = f1.add(f2);
+                f1 = f2;
+                f2 = t;
+            }
+            return f1;
+        }
+    };
+
+    /**
+     * A newCachedThreadPool can execute runnables
+     */
+    public void testNewCachedThreadPool1() {
+        ExecutorService e = Executors.newCachedThreadPool();
+        e.execute(new NoOpRunnable());
+        e.execute(new NoOpRunnable());
+        e.execute(new NoOpRunnable());
+        joinPool(e);
+    }
+
+    /**
+     * A newCachedThreadPool with given ThreadFactory can execute runnables
+     */
+    public void testNewCachedThreadPool2() {
+        ExecutorService e = Executors.newCachedThreadPool(new SimpleThreadFactory());
+        e.execute(new NoOpRunnable());
+        e.execute(new NoOpRunnable());
+        e.execute(new NoOpRunnable());
+        joinPool(e);
+    }
+
+    /**
+     * A newCachedThreadPool with null ThreadFactory throws NPE
+     */
+    public void testNewCachedThreadPool3() {
+        try {
+            ExecutorService e = Executors.newCachedThreadPool(null);
+            shouldThrow();
+        }
+        catch(NullPointerException success) {
+        }
+    }
+
+
+    /**
+     * A new SingleThreadExecutor can execute runnables
+     */
+    public void testNewSingleThreadExecutor1() {
+        ExecutorService e = Executors.newSingleThreadExecutor();
+        e.execute(new NoOpRunnable());
+        e.execute(new NoOpRunnable());
+        e.execute(new NoOpRunnable());
+        joinPool(e);
+    }
+
+    /**
+     * A new SingleThreadExecutor with given ThreadFactory can execute runnables
+     */
+    public void testNewSingleThreadExecutor2() {
+        ExecutorService e = Executors.newSingleThreadExecutor(new SimpleThreadFactory());
+        e.execute(new NoOpRunnable());
+        e.execute(new NoOpRunnable());
+        e.execute(new NoOpRunnable());
+        joinPool(e);
+    }
+
+    /**
+     * A new SingleThreadExecutor with null ThreadFactory throws NPE
+     */
+    public void testNewSingleThreadExecutor3() {
+        try {
+            ExecutorService e = Executors.newSingleThreadExecutor(null);
+            shouldThrow();
+        }
+        catch(NullPointerException success) {
+        }
+    }
+
+    /**
+     * A new SingleThreadExecutor cannot be casted to concrete implementation
+     */
+    public void testCastNewSingleThreadExecutor() {
+        ExecutorService e = Executors.newSingleThreadExecutor();
+        try {
+            ThreadPoolExecutor tpe = (ThreadPoolExecutor)e;
+        } catch (ClassCastException success) {
+        } finally {
+            joinPool(e);
+        }
+    }
+
+
+    /**
+     * A new newFixedThreadPool can execute runnables
+     */
+    public void testNewFixedThreadPool1() {
+        ExecutorService e = Executors.newFixedThreadPool(2);
+        e.execute(new NoOpRunnable());
+        e.execute(new NoOpRunnable());
+        e.execute(new NoOpRunnable());
+        joinPool(e);
+    }
+
+    /**
+     * A new newFixedThreadPool with given ThreadFactory can execute runnables
+     */
+    public void testNewFixedThreadPool2() {
+        ExecutorService e = Executors.newFixedThreadPool(2, new SimpleThreadFactory());
+        e.execute(new NoOpRunnable());
+        e.execute(new NoOpRunnable());
+        e.execute(new NoOpRunnable());
+        joinPool(e);
+    }
+
+    /**
+     * A new newFixedThreadPool with null ThreadFactory throws NPE
+     */
+    public void testNewFixedThreadPool3() {
+        try {
+            ExecutorService e = Executors.newFixedThreadPool(2, null);
+            shouldThrow();
+        }
+        catch(NullPointerException success) {
+        }
+    }
+
+    /**
+     * A new newFixedThreadPool with 0 threads throws IAE
+     */
+    public void testNewFixedThreadPool4() {
+        try {
+            ExecutorService e = Executors.newFixedThreadPool(0);
+            shouldThrow();
+        }
+        catch(IllegalArgumentException success) {
+        }
+    }
+
+
+    /**
+     * An unconfigurable newFixedThreadPool can execute runnables
+     */
+    public void testunconfigurableExecutorService() {
+        ExecutorService e = Executors.unconfigurableExecutorService(Executors.newFixedThreadPool(2));
+        e.execute(new NoOpRunnable());
+        e.execute(new NoOpRunnable());
+        e.execute(new NoOpRunnable());
+        joinPool(e);
+    }
+
+    /**
+     * unconfigurableExecutorService(null) throws NPE
+     */
+    public void testunconfigurableExecutorServiceNPE() {
+        try {
+            ExecutorService e = Executors.unconfigurableExecutorService(null);
+        }
+        catch (NullPointerException success) {
+        }
+    }
+
+    /**
+     * unconfigurableScheduledExecutorService(null) throws NPE
+     */
+    public void testunconfigurableScheduledExecutorServiceNPE() {
+        try {
+            ExecutorService e = Executors.unconfigurableScheduledExecutorService(null);
+        }
+        catch (NullPointerException success) {
+        }
+    }
+
+
+    /**
+     * a newSingleThreadScheduledExecutor successfully runs delayed task
+     */
+    public void testNewSingleThreadScheduledExecutor() {
+	try {
+            TrackedCallable callable = new TrackedCallable();
+            ScheduledExecutorService p1 = Executors.newSingleThreadScheduledExecutor();
+	    Future f = p1.schedule(callable, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
+	    assertFalse(callable.done);
+	    Thread.sleep(MEDIUM_DELAY_MS);
+	    assertTrue(callable.done);
+	    assertEquals(Boolean.TRUE, f.get());
+            joinPool(p1);
+	} catch(RejectedExecutionException e){}
+	catch(Exception e){
+            e.printStackTrace();
+            unexpectedException();
+        }
+    }
+
+    /**
+     * a newScheduledThreadPool successfully runs delayed task
+     */
+    public void testnewScheduledThreadPool() {
+	try {
+            TrackedCallable callable = new TrackedCallable();
+            ScheduledExecutorService p1 = Executors.newScheduledThreadPool(2);
+	    Future f = p1.schedule(callable, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
+	    assertFalse(callable.done);
+	    Thread.sleep(MEDIUM_DELAY_MS);
+	    assertTrue(callable.done);
+	    assertEquals(Boolean.TRUE, f.get());
+            joinPool(p1);
+	} catch(RejectedExecutionException e){}
+	catch(Exception e){
+            e.printStackTrace();
+            unexpectedException();
+        }
+    }
+
+    /**
+     * an unconfigurable  newScheduledThreadPool successfully runs delayed task
+     */
+    public void testunconfigurableScheduledExecutorService() {
+	try {
+            TrackedCallable callable = new TrackedCallable();
+            ScheduledExecutorService p1 = Executors.unconfigurableScheduledExecutorService(Executors.newScheduledThreadPool(2));
+	    Future f = p1.schedule(callable, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
+	    assertFalse(callable.done);
+	    Thread.sleep(MEDIUM_DELAY_MS);
+	    assertTrue(callable.done);
+	    assertEquals(Boolean.TRUE, f.get());
+            joinPool(p1);
+	} catch(RejectedExecutionException e){}
+	catch(Exception e){
+            e.printStackTrace();
+            unexpectedException();
+        }
+    }
+
+    /**
+     *  timeouts from execute will time out if they compute too long.
+     */
+    public void testTimedCallable() {
+        int N = 10000;
+        ExecutorService executor = Executors.newSingleThreadExecutor();
+        List tasks = new ArrayList(N);
+        try {
+            long startTime = System.currentTimeMillis();
+
+            long i = 0;
+            while (tasks.size() < N) {
+                tasks.add(new TimedCallable(executor, new Fib(i), 1));
+                i += 10;
+            }
+
+            int iters = 0;
+            BigInteger sum = BigInteger.ZERO;
+            for (Iterator it = tasks.iterator(); it.hasNext();) {
+                try {
+                    ++iters;
+                    sum = sum.add((BigInteger)((Callable)it.next()).call());
+                }
+                catch (TimeoutException success) {
+                    assertTrue(iters > 0);
+                    return;
+                }
+                catch (Exception e) {
+                    unexpectedException();
+                }
+            }
+            // if by chance we didn't ever time out, total time must be small
+            long elapsed = System.currentTimeMillis() - startTime;
+            assertTrue(elapsed < N);
+        }
+        finally {
+            joinPool(executor);
+        }
+    }
+
+
+    /**
+     * ThreadPoolExecutor using defaultThreadFactory has
+     * specified group, priority, daemon status, and name
+     */
+    public void testDefaultThreadFactory() {
+        final ThreadGroup egroup = Thread.currentThread().getThreadGroup();
+        Runnable r = new Runnable() {
+                public void run() {
+		    try {
+			Thread current = Thread.currentThread();
+			threadAssertTrue(!current.isDaemon());
+			threadAssertTrue(current.getPriority() <= Thread.NORM_PRIORITY);
+			ThreadGroup g = current.getThreadGroup();
+			SecurityManager s = System.getSecurityManager();
+			if (s != null)
+			    threadAssertTrue(g == s.getThreadGroup());
+			else
+			    threadAssertTrue(g == egroup);
+			String name = current.getName();
+			threadAssertTrue(name.endsWith("thread-1"));
+		    } catch (SecurityException ok) {
+			// Also pass if not allowed to change setting
+		    }
+                }
+            };
+        ExecutorService e = Executors.newSingleThreadExecutor(Executors.defaultThreadFactory());
+
+        e.execute(r);
+        try {
+            e.shutdown();
+        } catch(SecurityException ok) {
+        }
+
+        try {
+            Thread.sleep(SHORT_DELAY_MS);
+        } catch (Exception eX) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * ThreadPoolExecutor using privilegedThreadFactory has
+     * specified group, priority, daemon status, name,
+     * access control context and context class loader
+     */
+    public void testPrivilegedThreadFactory() {
+        Policy savedPolicy = null;
+        try {
+            savedPolicy = Policy.getPolicy();
+            AdjustablePolicy policy = new AdjustablePolicy();
+            policy.addPermission(new RuntimePermission("getContextClassLoader"));
+            policy.addPermission(new RuntimePermission("setContextClassLoader"));
+            Policy.setPolicy(policy);
+        } catch (AccessControlException ok) {
+            return;
+        }
+        final ThreadGroup egroup = Thread.currentThread().getThreadGroup();
+        final ClassLoader thisccl = Thread.currentThread().getContextClassLoader();
+        final AccessControlContext thisacc = AccessController.getContext();
+        Runnable r = new Runnable() {
+                public void run() {
+		    try {
+			Thread current = Thread.currentThread();
+			threadAssertTrue(!current.isDaemon());
+			threadAssertTrue(current.getPriority() <= Thread.NORM_PRIORITY);
+			ThreadGroup g = current.getThreadGroup();
+			SecurityManager s = System.getSecurityManager();
+			if (s != null)
+			    threadAssertTrue(g == s.getThreadGroup());
+			else
+			    threadAssertTrue(g == egroup);
+			String name = current.getName();
+			threadAssertTrue(name.endsWith("thread-1"));
+			threadAssertTrue(thisccl == current.getContextClassLoader());
+			threadAssertTrue(thisacc.equals(AccessController.getContext()));
+		    } catch(SecurityException ok) {
+			// Also pass if not allowed to change settings
+		    }
+                }
+            };
+        ExecutorService e = Executors.newSingleThreadExecutor(Executors.privilegedThreadFactory());
+
+        Policy.setPolicy(savedPolicy);
+        e.execute(r);
+        try {
+            e.shutdown();
+        } catch(SecurityException ok) {
+        }
+        try {
+            Thread.sleep(SHORT_DELAY_MS);
+        } catch (Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+
+    }
+
+    void checkCCL() {
+            AccessController.getContext().checkPermission(new RuntimePermission("getContextClassLoader"));
+    }
+
+    class CheckCCL implements Callable {
+        public Object call() {
+            checkCCL();
+            return null;
+        }
+    }
+
+
+    /**
+     * Without class loader permissions, creating
+     * privilegedCallableUsingCurrentClassLoader throws ACE
+     */
+    public void testCreatePrivilegedCallableUsingCCLWithNoPrivs() {
+	Policy savedPolicy = null;
+        try {
+            savedPolicy = Policy.getPolicy();
+            AdjustablePolicy policy = new AdjustablePolicy();
+            Policy.setPolicy(policy);
+        } catch (AccessControlException ok) {
+            return;
+        }
+
+        // Check if program still has too many permissions to run test
+        try {
+            checkCCL();
+            // too many privileges to test; so return
+            Policy.setPolicy(savedPolicy);
+            return;
+        } catch(AccessControlException ok) {
+        }
+
+        try {
+            Callable task = Executors.privilegedCallableUsingCurrentClassLoader(new NoOpCallable());
+            shouldThrow();
+        } catch(AccessControlException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        }
+        finally {
+            Policy.setPolicy(savedPolicy);
+        }
+    }
+
+    /**
+     * With class loader permissions, calling
+     * privilegedCallableUsingCurrentClassLoader does not throw ACE
+     */
+    public void testprivilegedCallableUsingCCLWithPrivs() {
+	Policy savedPolicy = null;
+        try {
+            savedPolicy = Policy.getPolicy();
+            AdjustablePolicy policy = new AdjustablePolicy();
+            policy.addPermission(new RuntimePermission("getContextClassLoader"));
+            policy.addPermission(new RuntimePermission("setContextClassLoader"));
+            Policy.setPolicy(policy);
+        } catch (AccessControlException ok) {
+            return;
+        }
+
+        try {
+            Callable task = Executors.privilegedCallableUsingCurrentClassLoader(new NoOpCallable());
+            task.call();
+        } catch(Exception ex) {
+            unexpectedException();
+        }
+        finally {
+            Policy.setPolicy(savedPolicy);
+        }
+    }
+
+    /**
+     * Without permissions, calling privilegedCallable throws ACE
+     */
+    public void testprivilegedCallableWithNoPrivs() {
+        Callable task;
+        Policy savedPolicy = null;
+        AdjustablePolicy policy = null;
+        AccessControlContext noprivAcc = null;
+        try {
+            savedPolicy = Policy.getPolicy();
+            policy = new AdjustablePolicy();
+            Policy.setPolicy(policy);
+            noprivAcc = AccessController.getContext();
+            task = Executors.privilegedCallable(new CheckCCL());
+            Policy.setPolicy(savedPolicy);
+        } catch (AccessControlException ok) {
+            return; // program has too few permissions to set up test
+        }
+
+        // Make sure that program doesn't have too many permissions
+        try {
+            AccessController.doPrivileged(new PrivilegedAction() {
+                    public Object run() {
+                        checkCCL();
+                        return null;
+                    }}, noprivAcc);
+            // too many permssions; skip test
+            return;
+        } catch(AccessControlException ok) {
+        }
+
+        try {
+            task.call();
+            shouldThrow();
+        } catch(AccessControlException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * With permissions, calling privilegedCallable succeeds
+     */
+    public void testprivilegedCallableWithPrivs() {
+	Policy savedPolicy = null;
+        try {
+            savedPolicy = Policy.getPolicy();
+            AdjustablePolicy policy = new AdjustablePolicy();
+            policy.addPermission(new RuntimePermission("getContextClassLoader"));
+            policy.addPermission(new RuntimePermission("setContextClassLoader"));
+            Policy.setPolicy(policy);
+        } catch (AccessControlException ok) {
+            return;
+        }
+
+        Callable task = Executors.privilegedCallable(new CheckCCL());
+        try {
+            task.call();
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            Policy.setPolicy(savedPolicy);
+        }
+    }
+
+    /**
+     * callable(Runnable) returns null when called
+     */
+    public void testCallable1() {
+        try {
+            Callable c = Executors.callable(new NoOpRunnable());
+            assertNull(c.call());
+        } catch(Exception ex) {
+            unexpectedException();
+        }
+
+    }
+
+    /**
+     * callable(Runnable, result) returns result when called
+     */
+    public void testCallable2() {
+        try {
+            Callable c = Executors.callable(new NoOpRunnable(), one);
+            assertEquals(one, c.call());
+        } catch(Exception ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * callable(PrivilegedAction) returns its result when called
+     */
+    public void testCallable3() {
+        try {
+            Callable c = Executors.callable(new PrivilegedAction() {
+                    public Object run() { return one; }});
+        assertEquals(one, c.call());
+        } catch(Exception ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * callable(PrivilegedExceptionAction) returns its result when called
+     */
+    public void testCallable4() {
+        try {
+            Callable c = Executors.callable(new PrivilegedExceptionAction() {
+                    public Object run() { return one; }});
+            assertEquals(one, c.call());
+        } catch(Exception ex) {
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * callable(null Runnable) throws NPE
+     */
+    public void testCallableNPE1() {
+        try {
+            Runnable r = null;
+            Callable c = Executors.callable(r);
+        } catch (NullPointerException success) {
+        }
+    }
+
+    /**
+     * callable(null, result) throws NPE
+     */
+    public void testCallableNPE2() {
+        try {
+            Runnable r = null;
+            Callable c = Executors.callable(r, one);
+        } catch (NullPointerException success) {
+        }
+    }
+
+    /**
+     * callable(null PrivilegedAction) throws NPE
+     */
+    public void testCallableNPE3() {
+        try {
+            PrivilegedAction r = null;
+            Callable c = Executors.callable(r);
+        } catch (NullPointerException success) {
+        }
+    }
+
+    /**
+     * callable(null PrivilegedExceptionAction) throws NPE
+     */
+    public void testCallableNPE4() {
+        try {
+            PrivilegedExceptionAction r = null;
+            Callable c = Executors.callable(r);
+        } catch (NullPointerException success) {
+        }
+    }
+
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/FutureTaskTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/FutureTaskTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/FutureTaskTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,476 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.*;
+import java.util.NoSuchElementException;
+
+public class FutureTaskTest extends JSR166TestCase {
+
+    public static void main(String[] args) {
+	junit.textui.TestRunner.run (suite());
+    }
+    public static Test suite() {
+	return new TestSuite(FutureTaskTest.class);
+    }
+
+    /**
+     * Subclass to expose protected methods
+     */
+    static class PublicFutureTask extends FutureTask {
+        public PublicFutureTask(Callable r) { super(r); }
+        public boolean runAndReset() { return super.runAndReset(); }
+        public void set(Object x) { super.set(x); }
+        public void setException(Throwable t) { super.setException(t); }
+    }
+
+    /**
+     * Creating a future with a null callable throws NPE
+     */
+    public void testConstructor() {
+        try {
+            FutureTask task = new FutureTask(null);
+            shouldThrow();
+        }
+        catch(NullPointerException success) {
+        }
+    }
+
+    /**
+     * creating a future with null runnable fails
+     */
+    public void testConstructor2() {
+        try {
+            FutureTask task = new FutureTask(null, Boolean.TRUE);
+            shouldThrow();
+        }
+        catch(NullPointerException success) {
+        }
+    }
+
+    /**
+     * isDone is true when a task completes
+     */
+    public void testIsDone() {
+        FutureTask task = new FutureTask( new NoOpCallable());
+	task.run();
+	assertTrue(task.isDone());
+	assertFalse(task.isCancelled());
+    }
+
+    /**
+     * runAndReset of a non-cancelled task succeeds
+     */
+    public void testRunAndReset() {
+        PublicFutureTask task = new PublicFutureTask(new NoOpCallable());
+	assertTrue(task.runAndReset());
+        assertFalse(task.isDone());
+    }
+
+    /**
+     * runAndReset after cancellation fails
+     */
+    public void testResetAfterCancel() {
+        PublicFutureTask task = new PublicFutureTask(new NoOpCallable());
+        assertTrue(task.cancel(false));
+	assertFalse(task.runAndReset());
+	assertTrue(task.isDone());
+	assertTrue(task.isCancelled());
+    }
+
+
+
+    /**
+     * setting value causes get to return it
+     */
+    public void testSet() {
+        PublicFutureTask task = new PublicFutureTask(new NoOpCallable());
+        task.set(one);
+        try {
+            assertEquals(task.get(), one);
+        }
+        catch(Exception e) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * setException causes get to throw ExecutionException
+     */
+    public void testSetException() {
+        Exception nse = new NoSuchElementException();
+        PublicFutureTask task = new PublicFutureTask(new NoOpCallable());
+        task.setException(nse);
+        try {
+            Object x = task.get();
+            shouldThrow();
+        }
+        catch(ExecutionException ee) {
+            Throwable cause = ee.getCause();
+            assertEquals(cause, nse);
+        }
+        catch(Exception e) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     *  Cancelling before running succeeds
+     */
+    public void testCancelBeforeRun() {
+        FutureTask task = new FutureTask( new NoOpCallable());
+        assertTrue(task.cancel(false));
+	task.run();
+	assertTrue(task.isDone());
+	assertTrue(task.isCancelled());
+    }
+
+    /**
+     * Cancel(true) before run succeeds
+     */
+    public void testCancelBeforeRun2() {
+        FutureTask task = new FutureTask( new NoOpCallable());
+        assertTrue(task.cancel(true));
+	task.run();
+	assertTrue(task.isDone());
+	assertTrue(task.isCancelled());
+    }
+
+    /**
+     * cancel of a completed task fails
+     */
+    public void testCancelAfterRun() {
+        FutureTask task = new FutureTask( new NoOpCallable());
+	task.run();
+        assertFalse(task.cancel(false));
+	assertTrue(task.isDone());
+	assertFalse(task.isCancelled());
+    }
+
+    /**
+     * cancel(true) interrupts a running task
+     */
+    public void testCancelInterrupt() {
+        FutureTask task = new FutureTask( new Callable() {
+                public Object call() {
+                    try {
+                        Thread.sleep(MEDIUM_DELAY_MS);
+                        threadShouldThrow();
+                    }
+                    catch (InterruptedException success) {}
+                    return Boolean.TRUE;
+                } });
+        Thread t = new  Thread(task);
+        t.start();
+
+        try {
+            Thread.sleep(SHORT_DELAY_MS);
+            assertTrue(task.cancel(true));
+            t.join();
+            assertTrue(task.isDone());
+            assertTrue(task.isCancelled());
+        } catch(InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * cancel(false) does not interrupt a running task
+     */
+    public void testCancelNoInterrupt() {
+        FutureTask task = new FutureTask( new Callable() {
+                public Object call() {
+                    try {
+                        Thread.sleep(MEDIUM_DELAY_MS);
+                    }
+                    catch (InterruptedException success) {
+                        threadFail("should not interrupt");
+                    }
+                    return Boolean.TRUE;
+                } });
+        Thread t = new  Thread(task);
+        t.start();
+
+        try {
+            Thread.sleep(SHORT_DELAY_MS);
+            assertTrue(task.cancel(false));
+            t.join();
+            assertTrue(task.isDone());
+            assertTrue(task.isCancelled());
+        } catch(InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * set in one thread causes get in another thread to retrieve value
+     */
+    public void testGet1() {
+	final FutureTask ft = new FutureTask(new Callable() {
+		public Object call() {
+		    try {
+			Thread.sleep(MEDIUM_DELAY_MS);
+		    } catch(InterruptedException e){
+                        threadUnexpectedException();
+                    }
+                    return Boolean.TRUE;
+		}
+	});
+	Thread t = new Thread(new Runnable() {
+		public void run() {
+		    try {
+			ft.get();
+		    } catch(Exception e){
+                        threadUnexpectedException();
+                    }
+		}
+	    });
+	try {
+            assertFalse(ft.isDone());
+            assertFalse(ft.isCancelled());
+            t.start();
+	    Thread.sleep(SHORT_DELAY_MS);
+	    ft.run();
+	    t.join();
+	    assertTrue(ft.isDone());
+            assertFalse(ft.isCancelled());
+	} catch(InterruptedException e){
+            unexpectedException();
+
+        }
+    }
+
+    /**
+     * set in one thread causes timed get in another thread to retrieve value
+     */
+    public void testTimedGet1() {
+	final FutureTask ft = new FutureTask(new Callable() {
+		public Object call() {
+		    try {
+			Thread.sleep(MEDIUM_DELAY_MS);
+		    } catch(InterruptedException e){
+                        threadUnexpectedException();
+                    }
+                    return Boolean.TRUE;
+		}
+            });
+	Thread t = new Thread(new Runnable() {
+		public void run() {
+		    try {
+			ft.get(SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
+		    } catch(TimeoutException success) {
+                    } catch(Exception e){
+                        threadUnexpectedException();
+                    }
+		}
+	    });
+	try {
+            assertFalse(ft.isDone());
+            assertFalse(ft.isCancelled());
+            t.start();
+	    ft.run();
+	    t.join();
+	    assertTrue(ft.isDone());
+            assertFalse(ft.isCancelled());
+	} catch(InterruptedException e){
+            unexpectedException();
+
+        }
+    }
+
+    /**
+     *  Cancelling a task causes timed get in another thread to throw CancellationException
+     */
+    public void testTimedGet_Cancellation() {
+	final FutureTask ft = new FutureTask(new Callable() {
+		public Object call() {
+		    try {
+			Thread.sleep(SMALL_DELAY_MS);
+                        threadShouldThrow();
+		    } catch(InterruptedException e) {
+                    }
+		    return Boolean.TRUE;
+		}
+	    });
+	try {
+	    Thread t1 = new Thread(new Runnable() {
+		    public void run() {
+			try {
+			    ft.get(MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+			    threadShouldThrow();
+			} catch(CancellationException success) {}
+			catch(Exception e){
+                            e.printStackTrace();
+                            threadUnexpectedException();
+			}
+		    }
+		});
+            Thread t2 = new Thread(ft);
+            t1.start();
+            t2.start();
+            Thread.sleep(SHORT_DELAY_MS);
+	    ft.cancel(true);
+	    t1.join();
+	    t2.join();
+	} catch(InterruptedException ie){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * Cancelling a task causes get in another thread to throw CancellationException
+     */
+    public void testGet_Cancellation() {
+	final FutureTask ft = new FutureTask(new Callable() {
+		public Object call() {
+		    try {
+			Thread.sleep(MEDIUM_DELAY_MS);
+                        threadShouldThrow();
+		    } catch(InterruptedException e){
+                    }
+                    return Boolean.TRUE;
+		}
+	    });
+	try {
+	    Thread t1 = new Thread(new Runnable() {
+		    public void run() {
+			try {
+			    ft.get();
+			    threadShouldThrow();
+			} catch(CancellationException success){
+                        }
+			catch(Exception e){
+                            threadUnexpectedException();
+                        }
+		    }
+		});
+            Thread t2 = new Thread(ft);
+            t1.start();
+            t2.start();
+            Thread.sleep(SHORT_DELAY_MS);
+	    ft.cancel(true);
+	    t1.join();
+	    t2.join();
+	} catch(InterruptedException success){
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * A runtime exception in task causes get to throw ExecutionException
+     */
+    public void testGet_ExecutionException() {
+	final FutureTask ft = new FutureTask(new Callable() {
+		public Object call() {
+		    int i = 5/0;
+		    return Boolean.TRUE;
+		}
+	    });
+	try {
+	    ft.run();
+	    ft.get();
+	    shouldThrow();
+	} catch(ExecutionException success){
+        }
+	catch(Exception e){
+            unexpectedException();
+	}
+    }
+
+    /**
+     *  A runtime exception in task causes timed get to throw ExecutionException
+     */
+    public void testTimedGet_ExecutionException2() {
+	final FutureTask ft = new FutureTask(new Callable() {
+		public Object call() {
+		    int i = 5/0;
+		    return Boolean.TRUE;
+		}
+	    });
+	try {
+	    ft.run();
+	    ft.get(SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
+	    shouldThrow();
+	} catch(ExecutionException success) {
+        } catch(TimeoutException success) { } // unlikely but OK
+	catch(Exception e){
+            unexpectedException();
+	}
+    }
+
+
+    /**
+     * Interrupting a waiting get causes it to throw InterruptedException
+     */
+    public void testGet_InterruptedException() {
+	final FutureTask ft = new FutureTask(new NoOpCallable());
+	Thread t = new Thread(new Runnable() {
+		public void run() {
+		    try {
+			ft.get();
+			threadShouldThrow();
+		    } catch(InterruptedException success){
+                    } catch(Exception e){
+                        threadUnexpectedException();
+                    }
+		}
+	    });
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            t.interrupt();
+            t.join();
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     *  Interrupting a waiting timed get causes it to throw InterruptedException
+     */
+    public void testTimedGet_InterruptedException2() {
+	final FutureTask ft = new FutureTask(new NoOpCallable());
+	Thread t = new Thread(new Runnable() {
+	 	public void run() {
+		    try {
+			ft.get(LONG_DELAY_MS,TimeUnit.MILLISECONDS);
+			threadShouldThrow();
+		    } catch(InterruptedException success){}
+		    catch(Exception e){
+                        threadUnexpectedException();
+		    }
+		}
+	    });
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            t.interrupt();
+            t.join();
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * A timed out timed get throws TimeoutException
+     */
+    public void testGet_TimeoutException() {
+	try {
+            FutureTask ft = new FutureTask(new NoOpCallable());
+	    ft.get(1,TimeUnit.MILLISECONDS);
+	    shouldThrow();
+	} catch(TimeoutException success){}
+	catch(Exception success){
+	    unexpectedException();
+	}
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/JSR166TestCase.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/JSR166TestCase.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/JSR166TestCase.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,589 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import java.io.*;
+import java.security.*;
+import junit.textui.*;
+
+/**
+ * Base class for JSR166 Junit TCK tests.  Defines some constants,
+ * utility methods and classes, as well as a simple framework for
+ * helping to make sure that assertions failing in generated threads
+ * cause the associated test that generated them to itself fail (which
+ * JUnit does not otherwise arrange).  The rules for creating such
+ * tests are:
+ *
+ * <ol>
+ *
+ * <li> All assertions in code running in generated threads must use
+ * the forms {@link #threadFail}, {@link #threadAssertTrue}, {@link
+ * #threadAssertEquals}, or {@link #threadAssertNull}, (not
+ * <tt>fail</tt>, <tt>assertTrue</tt>, etc.) It is OK (but not
+ * particularly recommended) for other code to use these forms too.
+ * Only the most typically used JUnit assertion methods are defined
+ * this way, but enough to live with.</li>
+ *
+ * <li> If you override {@link #setUp} or {@link #tearDown}, make sure
+ * to invoke <tt>super.setUp</tt> and <tt>super.tearDown</tt> within
+ * them. These methods are used to clear and check for thread
+ * assertion failures.</li>
+ *
+ * <li>All delays and timeouts must use one of the constants <tt>
+ * SHORT_DELAY_MS</tt>, <tt> SMALL_DELAY_MS</tt>, <tt> MEDIUM_DELAY_MS</tt>,
+ * <tt> LONG_DELAY_MS</tt>. The idea here is that a SHORT is always
+ * discriminable from zero time, and always allows enough time for the
+ * small amounts of computation (creating a thread, calling a few
+ * methods, etc) needed to reach a timeout point. Similarly, a SMALL
+ * is always discriminable as larger than SHORT and smaller than
+ * MEDIUM.  And so on. These constants are set to conservative values,
+ * but even so, if there is ever any doubt, they can all be increased
+ * in one spot to rerun tests on slower platforms.</li>
+ *
+ * <li> All threads generated must be joined inside each test case
+ * method (or <tt>fail</tt> to do so) before returning from the
+ * method. The <tt> joinPool</tt> method can be used to do this when
+ * using Executors.</li>
+ *
+ * </ol>
+ *
+ * <p> <b>Other notes</b>
+ * <ul>
+ *
+ * <li> Usually, there is one testcase method per JSR166 method
+ * covering "normal" operation, and then as many exception-testing
+ * methods as there are exceptions the method can throw. Sometimes
+ * there are multiple tests per JSR166 method when the different
+ * "normal" behaviors differ significantly. And sometimes testcases
+ * cover multiple methods when they cannot be tested in
+ * isolation.</li>
+ *
+ * <li> The documentation style for testcases is to provide as javadoc
+ * a simple sentence or two describing the property that the testcase
+ * method purports to test. The javadocs do not say anything about how
+ * the property is tested. To find out, read the code.</li>
+ *
+ * <li> These tests are "conformance tests", and do not attempt to
+ * test throughput, latency, scalability or other performance factors
+ * (see the separate "jtreg" tests for a set intended to check these
+ * for the most central aspects of functionality.) So, most tests use
+ * the smallest sensible numbers of threads, collection sizes, etc
+ * needed to check basic conformance.</li>
+ *
+ * <li>The test classes currently do not declare inclusion in
+ * any particular package to simplify things for people integrating
+ * them in TCK test suites.</li>
+ *
+ * <li> As a convenience, the <tt>main</tt> of this class (JSR166TestCase)
+ * runs all JSR166 unit tests.</li>
+ *
+ * </ul>
+ */
+public class JSR166TestCase extends TestCase {
+    /**
+     * Runs all JSR166 unit tests using junit.textui.TestRunner
+     */
+    public static void main (String[] args) {
+        int iters = 1;
+        if (args.length > 0)
+            iters = Integer.parseInt(args[0]);
+        Test s = suite();
+        for (int i = 0; i < iters; ++i) {
+            TestRunner.run(s);
+            System.gc();
+            System.runFinalization();
+        }
+        System.exit(0);
+    }
+
+//    private static class Printer extends ResultPrinter {
+//        Printer() {
+//            super(System.out);
+//        }
+//        public void startTest(Test test) {
+//            getWriter().println(test.getClass().getName());
+//            new Exception("Stack trace").printStackTrace(getWriter());
+//        }
+//    }
+//
+
+    /**
+     * Collects all JSR166 unit tests as one suite
+     */
+    public static Test suite ( ) {
+        TestSuite suite = new TestSuite("JSR166 Unit Tests");
+
+        suite.addTest(new TestSuite(AbstractExecutorServiceTest.class));
+ //        suite.addTest(new TestSuite(AbstractQueuedLongSynchronizerTest.class));
+        suite.addTest(new TestSuite(AbstractQueueTest.class));
+ //        suite.addTest(new TestSuite(AbstractQueuedSynchronizerTest.class));
+        suite.addTest(new TestSuite(ArrayBlockingQueueTest.class));
+        suite.addTest(new TestSuite(ArrayDequeTest.class));
+        suite.addTest(new TestSuite(AtomicBooleanTest.class));
+        suite.addTest(new TestSuite(AtomicIntegerArrayTest.class));
+ //        suite.addTest(new TestSuite(AtomicIntegerFieldUpdaterTest.class));
+        suite.addTest(new TestSuite(AtomicIntegerTest.class));
+        suite.addTest(new TestSuite(AtomicLongArrayTest.class));
+ //        suite.addTest(new TestSuite(AtomicLongFieldUpdaterTest.class));
+        suite.addTest(new TestSuite(AtomicLongTest.class));
+        suite.addTest(new TestSuite(AtomicMarkableReferenceTest.class));
+        suite.addTest(new TestSuite(AtomicReferenceArrayTest.class));
+ //        suite.addTest(new TestSuite(AtomicReferenceFieldUpdaterTest.class));
+        suite.addTest(new TestSuite(AtomicReferenceTest.class));
+        suite.addTest(new TestSuite(AtomicStampedReferenceTest.class));
+        suite.addTest(new TestSuite(ConcurrentHashMapTest.class));
+        suite.addTest(new TestSuite(ConcurrentLinkedQueueTest.class));
+        suite.addTest(new TestSuite(ConcurrentSkipListMapTest.class));
+        suite.addTest(new TestSuite(ConcurrentSkipListSubMapTest.class));
+        suite.addTest(new TestSuite(ConcurrentSkipListSetTest.class));
+        suite.addTest(new TestSuite(ConcurrentSkipListSubSetTest.class));
+        suite.addTest(new TestSuite(CopyOnWriteArrayListTest.class));
+        suite.addTest(new TestSuite(CopyOnWriteArraySetTest.class));
+        suite.addTest(new TestSuite(CountDownLatchTest.class));
+        suite.addTest(new TestSuite(CyclicBarrierTest.class));
+        suite.addTest(new TestSuite(DelayQueueTest.class));
+        suite.addTest(new TestSuite(EntryTest.class));
+        suite.addTest(new TestSuite(ExchangerTest.class));
+        suite.addTest(new TestSuite(ExecutorsTest.class));
+        suite.addTest(new TestSuite(ExecutorCompletionServiceTest.class));
+        suite.addTest(new TestSuite(FutureTaskTest.class));
+        suite.addTest(new TestSuite(LinkedBlockingDequeTest.class));
+        suite.addTest(new TestSuite(LinkedBlockingQueueTest.class));
+        suite.addTest(new TestSuite(LinkedListTest.class));
+ //        suite.addTest(new TestSuite(LockSupportTest.class));
+        suite.addTest(new TestSuite(PriorityBlockingQueueTest.class));
+        suite.addTest(new TestSuite(PriorityQueueTest.class));
+        suite.addTest(new TestSuite(ReentrantLockTest.class));
+        suite.addTest(new TestSuite(ReentrantReadWriteLockTest.class));
+        suite.addTest(new TestSuite(ScheduledExecutorTest.class));
+        suite.addTest(new TestSuite(ScheduledExecutorSubclassTest.class));
+        suite.addTest(new TestSuite(SemaphoreTest.class));
+        suite.addTest(new TestSuite(SynchronousQueueTest.class));
+        suite.addTest(new TestSuite(SystemTest.class));
+        suite.addTest(new TestSuite(ThreadLocalTest.class));
+        suite.addTest(new TestSuite(ThreadPoolExecutorTest.class));
+        suite.addTest(new TestSuite(ThreadPoolExecutorSubclassTest.class));
+ //        suite.addTest(new TestSuite(ThreadTest.class));
+        suite.addTest(new TestSuite(TimeUnitTest.class));
+        suite.addTest(new TestSuite(TreeMapTest.class));
+        suite.addTest(new TestSuite(TreeSubMapTest.class));
+        suite.addTest(new TestSuite(TreeSetTest.class));
+        suite.addTest(new TestSuite(TreeSubSetTest.class));
+
+        return suite;
+    }
+
+
+    public static long SHORT_DELAY_MS;
+    public static long SMALL_DELAY_MS;
+    public static long MEDIUM_DELAY_MS;
+    public static long LONG_DELAY_MS;
+
+
+    /**
+     * Returns the shortest timed delay.
+     */
+    protected long getShortDelay() {
+        return Long.getLong("tck.shortDelay", 300).longValue();
+    }
+
+
+    /**
+     * Sets delays as multiples of SHORT_DELAY.
+     */
+    protected  void setDelays() {
+        SHORT_DELAY_MS = getShortDelay();
+        SMALL_DELAY_MS = SHORT_DELAY_MS * 5;
+        MEDIUM_DELAY_MS = SHORT_DELAY_MS * 10;
+        LONG_DELAY_MS = SHORT_DELAY_MS * 50;
+    }
+
+    /**
+     * Flag set true if any threadAssert methods fail
+     */
+    volatile boolean threadFailed;
+
+    /**
+     * Initializes test to indicate that no thread assertions have failed
+     */
+    public void setUp() {
+        setDelays();
+        threadFailed = false;
+    }
+
+    /**
+     * Triggers test case failure if any thread assertions have failed
+     */
+    public void tearDown() {
+        assertFalse(threadFailed);
+    }
+
+    /**
+     * Fail, also setting status to indicate current testcase should fail
+     */
+    public void threadFail(String reason) {
+        threadFailed = true;
+        fail(reason);
+    }
+
+    /**
+     * If expression not true, set status to indicate current testcase
+     * should fail
+     */
+    public void threadAssertTrue(boolean b) {
+        if (!b) {
+            threadFailed = true;
+            assertTrue(b);
+        }
+    }
+
+    /**
+     * If expression not false, set status to indicate current testcase
+     * should fail
+     */
+    public void threadAssertFalse(boolean b) {
+        if (b) {
+            threadFailed = true;
+            assertFalse(b);
+        }
+    }
+
+    /**
+     * If argument not null, set status to indicate current testcase
+     * should fail
+     */
+    public void threadAssertNull(Object x) {
+        if (x != null) {
+            threadFailed = true;
+            assertNull(x);
+        }
+    }
+
+    /**
+     * If arguments not equal, set status to indicate current testcase
+     * should fail
+     */
+    public void threadAssertEquals(long x, long y) {
+        if (x != y) {
+            threadFailed = true;
+            assertEquals(x, y);
+        }
+    }
+
+    /**
+     * If arguments not equal, set status to indicate current testcase
+     * should fail
+     */
+    public void threadAssertEquals(Object x, Object y) {
+        if (x != y && (x == null || !x.equals(y))) {
+            threadFailed = true;
+            assertEquals(x, y);
+        }
+    }
+
+    /**
+     * threadFail with message "should throw exception"
+     */
+    public void threadShouldThrow() {
+        threadFailed = true;
+        fail("should throw exception");
+    }
+
+    /**
+     * threadFail with message "Unexpected exception"
+     */
+    public void threadUnexpectedException() {
+        threadFailed = true;
+        fail("Unexpected exception");
+    }
+
+
+    /**
+     * Wait out termination of a thread pool or fail doing so
+     */
+    public void joinPool(ExecutorService exec) {
+        try {
+            exec.shutdown();
+            assertTrue(exec.awaitTermination(LONG_DELAY_MS, TimeUnit.MILLISECONDS));
+        } catch(SecurityException ok) {
+            // Allowed in case test doesn't have privs
+        } catch(InterruptedException ie) {
+            fail("Unexpected exception");
+        }
+    }
+
+
+    /**
+     * fail with message "should throw exception"
+     */
+    public void shouldThrow() {
+        fail("Should throw exception");
+    }
+
+    /**
+     * fail with message "Unexpected exception"
+     */
+    public void unexpectedException() {
+        fail("Unexpected exception");
+    }
+
+
+    /**
+     * The number of elements to place in collections, arrays, etc.
+     */
+    static final int SIZE = 20;
+
+    // Some convenient Integer constants
+
+    static final Integer zero = new Integer(0);
+    static final Integer one = new Integer(1);
+    static final Integer two = new Integer(2);
+    static final Integer three  = new Integer(3);
+    static final Integer four  = new Integer(4);
+    static final Integer five  = new Integer(5);
+    static final Integer six = new Integer(6);
+    static final Integer seven = new Integer(7);
+    static final Integer eight = new Integer(8);
+    static final Integer nine = new Integer(9);
+    static final Integer m1  = new Integer(-1);
+    static final Integer m2  = new Integer(-2);
+    static final Integer m3  = new Integer(-3);
+    static final Integer m4 = new Integer(-4);
+    static final Integer m5 = new Integer(-5);
+    static final Integer m6 = new Integer(-6);
+    static final Integer m10 = new Integer(-10);
+
+
+    /**
+     * A security policy where new permissions can be dynamically added
+     * or all cleared.
+     */
+    static class AdjustablePolicy extends java.security.Policy {
+        Permissions perms = new Permissions();
+        AdjustablePolicy() { }
+        void addPermission(Permission perm) { perms.add(perm); }
+        void clearPermissions() { perms = new Permissions(); }
+        public PermissionCollection getPermissions(CodeSource cs) {
+            return perms;
+        }
+        public PermissionCollection getPermissions(ProtectionDomain pd) {
+            return perms;
+        }
+        public boolean implies(ProtectionDomain pd, Permission p) {
+            return perms.implies(p);
+        }
+        public void refresh() {}
+    }
+
+
+    // Some convenient Runnable classes
+
+    static class NoOpRunnable implements Runnable {
+        public void run() {}
+    }
+
+    static class NoOpCallable implements Callable {
+        public Object call() { return Boolean.TRUE; }
+    }
+
+    static final String TEST_STRING = "a test string";
+
+    static class StringTask implements Callable {
+        public Object call() { return TEST_STRING; }
+    }
+
+    static class NPETask implements Callable {
+        public Object call() { throw new NullPointerException(); }
+    }
+
+    static class CallableOne implements Callable {
+        public Object call() { return one; }
+    }
+
+    class ShortRunnable implements Runnable {
+        public void run() {
+            try {
+                Thread.sleep(SHORT_DELAY_MS);
+            }
+            catch(Exception e) {
+                threadUnexpectedException();
+            }
+        }
+    }
+
+    class ShortInterruptedRunnable implements Runnable {
+        public void run() {
+            try {
+                Thread.sleep(SHORT_DELAY_MS);
+                threadShouldThrow();
+            }
+            catch(InterruptedException success) {
+            }
+        }
+    }
+
+    class SmallRunnable implements Runnable {
+        public void run() {
+            try {
+                Thread.sleep(SMALL_DELAY_MS);
+            }
+            catch(Exception e) {
+                threadUnexpectedException();
+            }
+        }
+    }
+
+    class SmallPossiblyInterruptedRunnable implements Runnable {
+        public void run() {
+            try {
+                Thread.sleep(SMALL_DELAY_MS);
+            }
+            catch(Exception e) {
+            }
+        }
+    }
+
+    class SmallCallable implements Callable {
+        public Object call() {
+            try {
+                Thread.sleep(SMALL_DELAY_MS);
+            }
+            catch(Exception e) {
+                threadUnexpectedException();
+            }
+            return Boolean.TRUE;
+        }
+    }
+
+    class SmallInterruptedRunnable implements Runnable {
+        public void run() {
+            try {
+                Thread.sleep(SMALL_DELAY_MS);
+                threadShouldThrow();
+            }
+            catch(InterruptedException success) {
+            }
+        }
+    }
+
+
+    class MediumRunnable implements Runnable {
+        public void run() {
+            try {
+                Thread.sleep(MEDIUM_DELAY_MS);
+            }
+            catch(Exception e) {
+                threadUnexpectedException();
+            }
+        }
+    }
+
+    class MediumInterruptedRunnable implements Runnable {
+        public void run() {
+            try {
+                Thread.sleep(MEDIUM_DELAY_MS);
+                threadShouldThrow();
+            }
+            catch(InterruptedException success) {
+            }
+        }
+    }
+
+    class MediumPossiblyInterruptedRunnable implements Runnable {
+        public void run() {
+            try {
+                Thread.sleep(MEDIUM_DELAY_MS);
+            }
+            catch(InterruptedException success) {
+            }
+        }
+    }
+
+    class LongPossiblyInterruptedRunnable implements Runnable {
+        public void run() {
+            try {
+                Thread.sleep(LONG_DELAY_MS);
+            }
+            catch(InterruptedException success) {
+            }
+        }
+    }
+
+    /**
+     * For use as ThreadFactory in constructors
+     */
+    static class SimpleThreadFactory implements ThreadFactory{
+        public Thread newThread(Runnable r){
+            return new Thread(r);
+        }
+    }
+
+    static class TrackedShortRunnable implements Runnable {
+        volatile boolean done = false;
+        public void run() {
+            try {
+                Thread.sleep(SMALL_DELAY_MS);
+                done = true;
+            } catch(Exception e){
+            }
+        }
+    }
+
+    static class TrackedMediumRunnable implements Runnable {
+        volatile boolean done = false;
+        public void run() {
+            try {
+                Thread.sleep(MEDIUM_DELAY_MS);
+                done = true;
+            } catch(Exception e){
+            }
+        }
+    }
+
+    static class TrackedLongRunnable implements Runnable {
+        volatile boolean done = false;
+        public void run() {
+            try {
+                Thread.sleep(LONG_DELAY_MS);
+                done = true;
+            } catch(Exception e){
+            }
+        }
+    }
+
+    static class TrackedNoOpRunnable implements Runnable {
+        volatile boolean done = false;
+        public void run() {
+            done = true;
+        }
+    }
+
+    static class TrackedCallable implements Callable {
+        volatile boolean done = false;
+        public Object call() {
+            try {
+                Thread.sleep(SMALL_DELAY_MS);
+                done = true;
+            } catch(Exception e){
+            }
+            return Boolean.TRUE;
+        }
+    }
+
+
+    /**
+     * For use as RejectedExecutionHandler in constructors
+     */
+    static class NoOpREHandler implements RejectedExecutionHandler{
+        public void rejectedExecution(Runnable r, ThreadPoolExecutor executor){}
+    }
+
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/LinkedBlockingDequeTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/LinkedBlockingDequeTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/LinkedBlockingDequeTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,1922 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import java.io.*;
+import java.util.NoSuchElementException;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.ConcurrentModificationException;
+import java.util.ArrayList;
+
+public class LinkedBlockingDequeTest extends JSR166TestCase {
+    public static void main(String[] args) {
+	junit.textui.TestRunner.run (suite());
+    }
+
+    public static Test suite() {
+	return new TestSuite(LinkedBlockingDequeTest.class);
+    }
+
+    /**
+     * Create a deque of given size containing consecutive
+     * Integers 0 ... n.
+     */
+    private LinkedBlockingDeque populatedDeque(int n) {
+        LinkedBlockingDeque q = new LinkedBlockingDeque(n);
+        assertTrue(q.isEmpty());
+	for(int i = 0; i < n; i++)
+	    assertTrue(q.offer(new Integer(i)));
+        assertFalse(q.isEmpty());
+        assertEquals(0, q.remainingCapacity());
+	assertEquals(n, q.size());
+        return q;
+    }
+
+    /**
+     * isEmpty is true before add, false after
+     */
+    public void testEmpty() {
+        LinkedBlockingDeque q = new LinkedBlockingDeque();
+        assertTrue(q.isEmpty());
+        q.add(new Integer(1));
+        assertFalse(q.isEmpty());
+        q.add(new Integer(2));
+        q.removeFirst();
+        q.removeFirst();
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * size changes when elements added and removed
+     */
+    public void testSize() {
+        LinkedBlockingDeque q = populatedDeque(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(SIZE-i, q.size());
+            q.removeFirst();
+        }
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, q.size());
+            q.add(new Integer(i));
+        }
+    }
+
+    /**
+     * offer(null) throws NPE
+     */
+    public void testOfferFirstNull() {
+	try {
+            LinkedBlockingDeque q = new LinkedBlockingDeque();
+            q.offerFirst(null);
+            shouldThrow();
+        } catch (NullPointerException success) {
+        }
+    }
+
+    /**
+     * OfferFirst succeeds
+     */
+    public void testOfferFirst() {
+        LinkedBlockingDeque q = new LinkedBlockingDeque();
+        assertTrue(q.offerFirst(new Integer(0)));
+        assertTrue(q.offerFirst(new Integer(1)));
+    }
+
+    /**
+     * OfferLast succeeds
+     */
+    public void testOfferLast() {
+        LinkedBlockingDeque q = new LinkedBlockingDeque();
+        assertTrue(q.offerLast(new Integer(0)));
+        assertTrue(q.offerLast(new Integer(1)));
+    }
+
+    /**
+     *  pollFirst succeeds unless empty
+     */
+    public void testPollFirst() {
+        LinkedBlockingDeque q = populatedDeque(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.pollFirst()).intValue());
+        }
+	assertNull(q.pollFirst());
+    }
+
+    /**
+     *  pollLast succeeds unless empty
+     */
+    public void testPollLast() {
+        LinkedBlockingDeque q = populatedDeque(SIZE);
+        for (int i = SIZE-1; i >= 0; --i) {
+            assertEquals(i, ((Integer)q.pollLast()).intValue());
+        }
+	assertNull(q.pollLast());
+    }
+
+    /**
+     *  peekFirst returns next element, or null if empty
+     */
+    public void testPeekFirst() {
+        LinkedBlockingDeque q = populatedDeque(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.peekFirst()).intValue());
+            q.pollFirst();
+            assertTrue(q.peekFirst() == null ||
+                       i != ((Integer)q.peekFirst()).intValue());
+        }
+	assertNull(q.peekFirst());
+    }
+
+    /**
+     *  peek returns next element, or null if empty
+     */
+    public void testPeek() {
+        LinkedBlockingDeque q = populatedDeque(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.peek()).intValue());
+            q.pollFirst();
+            assertTrue(q.peek() == null ||
+                       i != ((Integer)q.peek()).intValue());
+        }
+	assertNull(q.peek());
+    }
+
+    /**
+     *  peekLast returns next element, or null if empty
+     */
+    public void testPeekLast() {
+        LinkedBlockingDeque q = populatedDeque(SIZE);
+        for (int i = SIZE-1; i >= 0; --i) {
+            assertEquals(i, ((Integer)q.peekLast()).intValue());
+            q.pollLast();
+            assertTrue(q.peekLast() == null ||
+                       i != ((Integer)q.peekLast()).intValue());
+        }
+	assertNull(q.peekLast());
+    }
+
+    /**
+     * getFirst returns next getFirst, or throws NSEE if empty
+     */
+    public void testFirstElement() {
+        LinkedBlockingDeque q = populatedDeque(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.getFirst()).intValue());
+            q.pollFirst();
+        }
+        try {
+            q.getFirst();
+            shouldThrow();
+        }
+        catch (NoSuchElementException success) {}
+    }
+
+    /**
+     *  getLast returns next element, or throws NSEE if empty
+     */
+    public void testLastElement() {
+        LinkedBlockingDeque q = populatedDeque(SIZE);
+        for (int i = SIZE-1; i >= 0; --i) {
+            assertEquals(i, ((Integer)q.getLast()).intValue());
+            q.pollLast();
+        }
+        try {
+            q.getLast();
+            shouldThrow();
+        }
+        catch (NoSuchElementException success) {}
+	assertNull(q.peekLast());
+    }
+
+    /**
+     *  removeFirst removes next element, or throws NSEE if empty
+     */
+    public void testRemoveFirst() {
+        LinkedBlockingDeque q = populatedDeque(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.removeFirst()).intValue());
+        }
+        try {
+            q.removeFirst();
+            shouldThrow();
+        } catch (NoSuchElementException success){
+	}
+    }
+
+    /**
+     *  remove removes next element, or throws NSEE if empty
+     */
+    public void testRemove() {
+        LinkedBlockingDeque q = populatedDeque(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.remove()).intValue());
+        }
+        try {
+            q.remove();
+            shouldThrow();
+        } catch (NoSuchElementException success){
+	}
+    }
+
+    /**
+     * removeFirstOccurrence(x) removes x and returns true if present
+     */
+    public void testRemoveFirstOccurrence() {
+        LinkedBlockingDeque q = populatedDeque(SIZE);
+        for (int i = 1; i < SIZE; i+=2) {
+            assertTrue(q.removeFirstOccurrence(new Integer(i)));
+        }
+        for (int i = 0; i < SIZE; i+=2) {
+            assertTrue(q.removeFirstOccurrence(new Integer(i)));
+            assertFalse(q.removeFirstOccurrence(new Integer(i+1)));
+        }
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * removeLastOccurrence(x) removes x and returns true if present
+     */
+    public void testRemoveLastOccurrence() {
+        LinkedBlockingDeque q = populatedDeque(SIZE);
+        for (int i = 1; i < SIZE; i+=2) {
+            assertTrue(q.removeLastOccurrence(new Integer(i)));
+        }
+        for (int i = 0; i < SIZE; i+=2) {
+            assertTrue(q.removeLastOccurrence(new Integer(i)));
+            assertFalse(q.removeLastOccurrence(new Integer(i+1)));
+        }
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * peekFirst returns element inserted with addFirst
+     */
+    public void testAddFirst() {
+        LinkedBlockingDeque q = populatedDeque(3);
+        q.pollLast();
+	q.addFirst(four);
+	assertEquals(four,q.peekFirst());
+    }
+
+    /**
+     * peekLast returns element inserted with addLast
+     */
+    public void testAddLast() {
+        LinkedBlockingDeque q = populatedDeque(3);
+        q.pollLast();
+	q.addLast(four);
+	assertEquals(four,q.peekLast());
+    }
+
+
+    /**
+     * A new deque has the indicated capacity, or Integer.MAX_VALUE if
+     * none given
+     */
+    public void testConstructor1() {
+        assertEquals(SIZE, new LinkedBlockingDeque(SIZE).remainingCapacity());
+        assertEquals(Integer.MAX_VALUE, new LinkedBlockingDeque().remainingCapacity());
+    }
+
+    /**
+     * Constructor throws IAE if  capacity argument nonpositive
+     */
+    public void testConstructor2() {
+        try {
+            LinkedBlockingDeque q = new LinkedBlockingDeque(0);
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success) {}
+    }
+
+    /**
+     * Initializing from null Collection throws NPE
+     */
+    public void testConstructor3() {
+        try {
+            LinkedBlockingDeque q = new LinkedBlockingDeque(null);
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Initializing from Collection of null elements throws NPE
+     */
+    public void testConstructor4() {
+        try {
+            Integer[] ints = new Integer[SIZE];
+            LinkedBlockingDeque q = new LinkedBlockingDeque(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Initializing from Collection with some null elements throws NPE
+     */
+    public void testConstructor5() {
+        try {
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE-1; ++i)
+                ints[i] = new Integer(i);
+            LinkedBlockingDeque q = new LinkedBlockingDeque(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Deque contains all elements of collection used to initialize
+     */
+    public void testConstructor6() {
+        try {
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE; ++i)
+                ints[i] = new Integer(i);
+            LinkedBlockingDeque q = new LinkedBlockingDeque(Arrays.asList(ints));
+            for (int i = 0; i < SIZE; ++i)
+                assertEquals(ints[i], q.poll());
+        }
+        finally {}
+    }
+
+    /**
+     * Deque transitions from empty to full when elements added
+     */
+    public void testEmptyFull() {
+        LinkedBlockingDeque q = new LinkedBlockingDeque(2);
+        assertTrue(q.isEmpty());
+        assertEquals("should have room for 2", 2, q.remainingCapacity());
+        q.add(one);
+        assertFalse(q.isEmpty());
+        q.add(two);
+        assertFalse(q.isEmpty());
+        assertEquals(0, q.remainingCapacity());
+        assertFalse(q.offer(three));
+    }
+
+    /**
+     * remainingCapacity decreases on add, increases on remove
+     */
+    public void testRemainingCapacity() {
+        LinkedBlockingDeque q = populatedDeque(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, q.remainingCapacity());
+            assertEquals(SIZE-i, q.size());
+            q.remove();
+        }
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(SIZE-i, q.remainingCapacity());
+            assertEquals(i, q.size());
+            q.add(new Integer(i));
+        }
+    }
+
+    /**
+     * offer(null) throws NPE
+     */
+    public void testOfferNull() {
+	try {
+            LinkedBlockingDeque q = new LinkedBlockingDeque(1);
+            q.offer(null);
+            shouldThrow();
+        } catch (NullPointerException success) { }
+    }
+
+    /**
+     * add(null) throws NPE
+     */
+    public void testAddNull() {
+	try {
+            LinkedBlockingDeque q = new LinkedBlockingDeque(1);
+            q.add(null);
+            shouldThrow();
+        } catch (NullPointerException success) { }
+    }
+
+    /**
+     * push(null) throws NPE
+     */
+    public void testPushNull() {
+	try {
+            LinkedBlockingDeque q = new LinkedBlockingDeque(1);
+            q.push(null);
+            shouldThrow();
+        } catch (NullPointerException success) { }
+    }
+
+    /**
+     * push succeeds if not full; throws ISE if full
+     */
+    public void testPush() {
+	try {
+            LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
+            for (int i = 0; i < SIZE; ++i) {
+                Integer I = new Integer(i);
+                q.push(I);
+                assertEquals(I, q.peek());
+            }
+            assertEquals(0, q.remainingCapacity());
+            q.push(new Integer(SIZE));
+        } catch (IllegalStateException success){
+	}
+    }
+
+    /**
+     * peekFirst returns element inserted with push
+     */
+    public void testPushWithPeek() {
+        LinkedBlockingDeque q = populatedDeque(3);
+        q.pollLast();
+	q.push(four);
+	assertEquals(four,q.peekFirst());
+    }
+
+
+    /**
+     *  pop removes next element, or throws NSEE if empty
+     */
+    public void testPop() {
+        LinkedBlockingDeque q = populatedDeque(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.pop()).intValue());
+        }
+        try {
+            q.pop();
+            shouldThrow();
+        } catch (NoSuchElementException success){
+	}
+    }
+
+
+    /**
+     * Offer succeeds if not full; fails if full
+     */
+    public void testOffer() {
+        LinkedBlockingDeque q = new LinkedBlockingDeque(1);
+        assertTrue(q.offer(zero));
+        assertFalse(q.offer(one));
+    }
+
+    /**
+     * add succeeds if not full; throws ISE if full
+     */
+    public void testAdd() {
+	try {
+            LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
+            for (int i = 0; i < SIZE; ++i) {
+                assertTrue(q.add(new Integer(i)));
+            }
+            assertEquals(0, q.remainingCapacity());
+            q.add(new Integer(SIZE));
+        } catch (IllegalStateException success){
+	}
+    }
+
+    /**
+     * addAll(null) throws NPE
+     */
+    public void testAddAll1() {
+        try {
+            LinkedBlockingDeque q = new LinkedBlockingDeque(1);
+            q.addAll(null);
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * addAll(this) throws IAE
+     */
+    public void testAddAllSelf() {
+        try {
+            LinkedBlockingDeque q = populatedDeque(SIZE);
+            q.addAll(q);
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success) {}
+    }
+
+    /**
+     * addAll of a collection with null elements throws NPE
+     */
+    public void testAddAll2() {
+        try {
+            LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
+            Integer[] ints = new Integer[SIZE];
+            q.addAll(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+    /**
+     * addAll of a collection with any null elements throws NPE after
+     * possibly adding some elements
+     */
+    public void testAddAll3() {
+        try {
+            LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE-1; ++i)
+                ints[i] = new Integer(i);
+            q.addAll(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+    /**
+     * addAll throws ISE if not enough room
+     */
+    public void testAddAll4() {
+        try {
+            LinkedBlockingDeque q = new LinkedBlockingDeque(1);
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE; ++i)
+                ints[i] = new Integer(i);
+            q.addAll(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (IllegalStateException success) {}
+    }
+    /**
+     * Deque contains all elements, in traversal order, of successful addAll
+     */
+    public void testAddAll5() {
+        try {
+            Integer[] empty = new Integer[0];
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE; ++i)
+                ints[i] = new Integer(i);
+            LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
+            assertFalse(q.addAll(Arrays.asList(empty)));
+            assertTrue(q.addAll(Arrays.asList(ints)));
+            for (int i = 0; i < SIZE; ++i)
+                assertEquals(ints[i], q.poll());
+        }
+        finally {}
+    }
+
+
+    /**
+     * put(null) throws NPE
+     */
+     public void testPutNull() {
+	try {
+            LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
+            q.put(null);
+            shouldThrow();
+        }
+        catch (NullPointerException success){
+	}
+        catch (InterruptedException ie) {
+	    unexpectedException();
+        }
+     }
+
+    /**
+     * all elements successfully put are contained
+     */
+     public void testPut() {
+         try {
+             LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
+             for (int i = 0; i < SIZE; ++i) {
+                 Integer I = new Integer(i);
+                 q.put(I);
+                 assertTrue(q.contains(I));
+             }
+             assertEquals(0, q.remainingCapacity());
+         }
+        catch (InterruptedException ie) {
+	    unexpectedException();
+        }
+    }
+
+    /**
+     * put blocks interruptibly if full
+     */
+    public void testBlockingPut() {
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    int added = 0;
+                    try {
+                        LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
+                        for (int i = 0; i < SIZE; ++i) {
+                            q.put(new Integer(i));
+                            ++added;
+                        }
+                        q.put(new Integer(SIZE));
+                        threadShouldThrow();
+                    } catch (InterruptedException ie){
+                        threadAssertEquals(added, SIZE);
+                    }
+                }});
+        t.start();
+        try {
+           Thread.sleep(SHORT_DELAY_MS);
+           t.interrupt();
+           t.join();
+        }
+        catch (InterruptedException ie) {
+	    unexpectedException();
+        }
+    }
+
+    /**
+     * put blocks waiting for take when full
+     */
+    public void testPutWithTake() {
+        final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    int added = 0;
+                    try {
+                        q.put(new Object());
+                        ++added;
+                        q.put(new Object());
+                        ++added;
+                        q.put(new Object());
+                        ++added;
+                        q.put(new Object());
+                        ++added;
+			threadShouldThrow();
+                    } catch (InterruptedException e){
+                        threadAssertTrue(added >= 2);
+                    }
+                }
+            });
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            q.take();
+            t.interrupt();
+            t.join();
+        } catch (Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * timed offer times out if full and elements not taken
+     */
+    public void testTimedOffer() {
+        final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        q.put(new Object());
+                        q.put(new Object());
+                        threadAssertFalse(q.offer(new Object(), SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+                        q.offer(new Object(), LONG_DELAY_MS, TimeUnit.MILLISECONDS);
+			threadShouldThrow();
+                    } catch (InterruptedException success){}
+                }
+            });
+
+        try {
+            t.start();
+            Thread.sleep(SMALL_DELAY_MS);
+            t.interrupt();
+            t.join();
+        } catch (Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * take retrieves elements in FIFO order
+     */
+    public void testTake() {
+	try {
+            LinkedBlockingDeque q = populatedDeque(SIZE);
+            for (int i = 0; i < SIZE; ++i) {
+                assertEquals(i, ((Integer)q.take()).intValue());
+            }
+        } catch (InterruptedException e){
+	    unexpectedException();
+	}
+    }
+
+    /**
+     * take blocks interruptibly when empty
+     */
+    public void testTakeFromEmpty() {
+        final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        q.take();
+			threadShouldThrow();
+                    } catch (InterruptedException success){ }
+                }
+            });
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            t.interrupt();
+            t.join();
+        } catch (Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * Take removes existing elements until empty, then blocks interruptibly
+     */
+    public void testBlockingTake() {
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        LinkedBlockingDeque q = populatedDeque(SIZE);
+                        for (int i = 0; i < SIZE; ++i) {
+                            assertEquals(i, ((Integer)q.take()).intValue());
+                        }
+                        q.take();
+                        threadShouldThrow();
+                    } catch (InterruptedException success){
+                    }
+                }});
+        t.start();
+        try {
+           Thread.sleep(SHORT_DELAY_MS);
+           t.interrupt();
+           t.join();
+        }
+        catch (InterruptedException ie) {
+	    unexpectedException();
+        }
+    }
+
+
+    /**
+     * poll succeeds unless empty
+     */
+    public void testPoll() {
+        LinkedBlockingDeque q = populatedDeque(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.poll()).intValue());
+        }
+	assertNull(q.poll());
+    }
+
+    /**
+     * timed poll with zero timeout succeeds when non-empty, else times out
+     */
+    public void testTimedPoll0() {
+        try {
+            LinkedBlockingDeque q = populatedDeque(SIZE);
+            for (int i = 0; i < SIZE; ++i) {
+                assertEquals(i, ((Integer)q.poll(0, TimeUnit.MILLISECONDS)).intValue());
+            }
+            assertNull(q.poll(0, TimeUnit.MILLISECONDS));
+        } catch (InterruptedException e){
+	    unexpectedException();
+	}
+    }
+
+    /**
+     * timed poll with nonzero timeout succeeds when non-empty, else times out
+     */
+    public void testTimedPoll() {
+        try {
+            LinkedBlockingDeque q = populatedDeque(SIZE);
+            for (int i = 0; i < SIZE; ++i) {
+                assertEquals(i, ((Integer)q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS)).intValue());
+            }
+            assertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+        } catch (InterruptedException e){
+	    unexpectedException();
+	}
+    }
+
+    /**
+     * Interrupted timed poll throws InterruptedException instead of
+     * returning timeout status
+     */
+    public void testInterruptedTimedPoll() {
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        LinkedBlockingDeque q = populatedDeque(SIZE);
+                        for (int i = 0; i < SIZE; ++i) {
+                            threadAssertEquals(i, ((Integer)q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS)).intValue());
+                        }
+                        threadAssertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+                    } catch (InterruptedException success){
+                    }
+                }});
+        t.start();
+        try {
+           Thread.sleep(SHORT_DELAY_MS);
+           t.interrupt();
+           t.join();
+        }
+        catch (InterruptedException ie) {
+	    unexpectedException();
+        }
+    }
+
+    /**
+     *  timed poll before a delayed offer fails; after offer succeeds;
+     *  on interruption throws
+     */
+    public void testTimedPollWithOffer() {
+        final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        threadAssertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+                        q.poll(LONG_DELAY_MS, TimeUnit.MILLISECONDS);
+                        q.poll(LONG_DELAY_MS, TimeUnit.MILLISECONDS);
+			threadShouldThrow();
+                    } catch (InterruptedException success) { }
+                }
+            });
+        try {
+            t.start();
+            Thread.sleep(SMALL_DELAY_MS);
+            assertTrue(q.offer(zero, SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+            t.interrupt();
+            t.join();
+        } catch (Exception e){
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * putFirst(null) throws NPE
+     */
+     public void testPutFirstNull() {
+	try {
+            LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
+            q.putFirst(null);
+            shouldThrow();
+        }
+        catch (NullPointerException success){
+	}
+        catch (InterruptedException ie) {
+	    unexpectedException();
+        }
+     }
+
+    /**
+     * all elements successfully putFirst are contained
+     */
+     public void testPutFirst() {
+         try {
+             LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
+             for (int i = 0; i < SIZE; ++i) {
+                 Integer I = new Integer(i);
+                 q.putFirst(I);
+                 assertTrue(q.contains(I));
+             }
+             assertEquals(0, q.remainingCapacity());
+         }
+        catch (InterruptedException ie) {
+	    unexpectedException();
+        }
+    }
+
+    /**
+     * putFirst blocks interruptibly if full
+     */
+    public void testBlockingPutFirst() {
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    int added = 0;
+                    try {
+                        LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
+                        for (int i = 0; i < SIZE; ++i) {
+                            q.putFirst(new Integer(i));
+                            ++added;
+                        }
+                        q.putFirst(new Integer(SIZE));
+                        threadShouldThrow();
+                    } catch (InterruptedException ie){
+                        threadAssertEquals(added, SIZE);
+                    }
+                }});
+        t.start();
+        try {
+           Thread.sleep(SHORT_DELAY_MS);
+           t.interrupt();
+           t.join();
+        }
+        catch (InterruptedException ie) {
+	    unexpectedException();
+        }
+    }
+
+    /**
+     * putFirst blocks waiting for take when full
+     */
+    public void testPutFirstWithTake() {
+        final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    int added = 0;
+                    try {
+                        q.putFirst(new Object());
+                        ++added;
+                        q.putFirst(new Object());
+                        ++added;
+                        q.putFirst(new Object());
+                        ++added;
+                        q.putFirst(new Object());
+                        ++added;
+			threadShouldThrow();
+                    } catch (InterruptedException e){
+                        threadAssertTrue(added >= 2);
+                    }
+                }
+            });
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            q.take();
+            t.interrupt();
+            t.join();
+        } catch (Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * timed offerFirst times out if full and elements not taken
+     */
+    public void testTimedOfferFirst() {
+        final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        q.putFirst(new Object());
+                        q.putFirst(new Object());
+                        threadAssertFalse(q.offerFirst(new Object(), SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+                        q.offerFirst(new Object(), LONG_DELAY_MS, TimeUnit.MILLISECONDS);
+			threadShouldThrow();
+                    } catch (InterruptedException success){}
+                }
+            });
+
+        try {
+            t.start();
+            Thread.sleep(SMALL_DELAY_MS);
+            t.interrupt();
+            t.join();
+        } catch (Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * take retrieves elements in FIFO order
+     */
+    public void testTakeFirst() {
+	try {
+            LinkedBlockingDeque q = populatedDeque(SIZE);
+            for (int i = 0; i < SIZE; ++i) {
+                assertEquals(i, ((Integer)q.takeFirst()).intValue());
+            }
+        } catch (InterruptedException e){
+	    unexpectedException();
+	}
+    }
+
+    /**
+     * takeFirst blocks interruptibly when empty
+     */
+    public void testTakeFirstFromEmpty() {
+        final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        q.takeFirst();
+			threadShouldThrow();
+                    } catch (InterruptedException success){ }
+                }
+            });
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            t.interrupt();
+            t.join();
+        } catch (Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * TakeFirst removes existing elements until empty, then blocks interruptibly
+     */
+    public void testBlockingTakeFirst() {
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        LinkedBlockingDeque q = populatedDeque(SIZE);
+                        for (int i = 0; i < SIZE; ++i) {
+                            assertEquals(i, ((Integer)q.takeFirst()).intValue());
+                        }
+                        q.takeFirst();
+                        threadShouldThrow();
+                    } catch (InterruptedException success){
+                    }
+                }});
+        t.start();
+        try {
+           Thread.sleep(SHORT_DELAY_MS);
+           t.interrupt();
+           t.join();
+        }
+        catch (InterruptedException ie) {
+	    unexpectedException();
+        }
+    }
+
+
+    /**
+     * timed pollFirst with zero timeout succeeds when non-empty, else times out
+     */
+    public void testTimedPollFirst0() {
+        try {
+            LinkedBlockingDeque q = populatedDeque(SIZE);
+            for (int i = 0; i < SIZE; ++i) {
+                assertEquals(i, ((Integer)q.pollFirst(0, TimeUnit.MILLISECONDS)).intValue());
+            }
+            assertNull(q.pollFirst(0, TimeUnit.MILLISECONDS));
+        } catch (InterruptedException e){
+	    unexpectedException();
+	}
+    }
+
+    /**
+     * timed pollFirst with nonzero timeout succeeds when non-empty, else times out
+     */
+    public void testTimedPollFirst() {
+        try {
+            LinkedBlockingDeque q = populatedDeque(SIZE);
+            for (int i = 0; i < SIZE; ++i) {
+                assertEquals(i, ((Integer)q.pollFirst(SHORT_DELAY_MS, TimeUnit.MILLISECONDS)).intValue());
+            }
+            assertNull(q.pollFirst(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+        } catch (InterruptedException e){
+	    unexpectedException();
+	}
+    }
+
+    /**
+     * Interrupted timed pollFirst throws InterruptedException instead of
+     * returning timeout status
+     */
+    public void testInterruptedTimedPollFirst() {
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        LinkedBlockingDeque q = populatedDeque(SIZE);
+                        for (int i = 0; i < SIZE; ++i) {
+                            threadAssertEquals(i, ((Integer)q.pollFirst(SHORT_DELAY_MS, TimeUnit.MILLISECONDS)).intValue());
+                        }
+                        threadAssertNull(q.pollFirst(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+                    } catch (InterruptedException success){
+                    }
+                }});
+        t.start();
+        try {
+           Thread.sleep(SHORT_DELAY_MS);
+           t.interrupt();
+           t.join();
+        }
+        catch (InterruptedException ie) {
+	    unexpectedException();
+        }
+    }
+
+    /**
+     *  timed pollFirst before a delayed offerFirst fails; after offerFirst succeeds;
+     *  on interruption throws
+     */
+    public void testTimedPollFirstWithOfferFirst() {
+        final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        threadAssertNull(q.pollFirst(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+                        q.pollFirst(LONG_DELAY_MS, TimeUnit.MILLISECONDS);
+                        q.pollFirst(LONG_DELAY_MS, TimeUnit.MILLISECONDS);
+			threadShouldThrow();
+                    } catch (InterruptedException success) { }
+                }
+            });
+        try {
+            t.start();
+            Thread.sleep(SMALL_DELAY_MS);
+            assertTrue(q.offerFirst(zero, SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+            t.interrupt();
+            t.join();
+        } catch (Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * putLast(null) throws NPE
+     */
+     public void testPutLastNull() {
+	try {
+            LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
+            q.putLast(null);
+            shouldThrow();
+        }
+        catch (NullPointerException success){
+	}
+        catch (InterruptedException ie) {
+	    unexpectedException();
+        }
+     }
+
+    /**
+     * all elements successfully putLast are contained
+     */
+     public void testPutLast() {
+         try {
+             LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
+             for (int i = 0; i < SIZE; ++i) {
+                 Integer I = new Integer(i);
+                 q.putLast(I);
+                 assertTrue(q.contains(I));
+             }
+             assertEquals(0, q.remainingCapacity());
+         }
+        catch (InterruptedException ie) {
+	    unexpectedException();
+        }
+    }
+
+    /**
+     * putLast blocks interruptibly if full
+     */
+    public void testBlockingPutLast() {
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    int added = 0;
+                    try {
+                        LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
+                        for (int i = 0; i < SIZE; ++i) {
+                            q.putLast(new Integer(i));
+                            ++added;
+                        }
+                        q.putLast(new Integer(SIZE));
+                        threadShouldThrow();
+                    } catch (InterruptedException ie){
+                        threadAssertEquals(added, SIZE);
+                    }
+                }});
+        t.start();
+        try {
+           Thread.sleep(SHORT_DELAY_MS);
+           t.interrupt();
+           t.join();
+        }
+        catch (InterruptedException ie) {
+	    unexpectedException();
+        }
+    }
+
+    /**
+     * putLast blocks waiting for take when full
+     */
+    public void testPutLastWithTake() {
+        final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    int added = 0;
+                    try {
+                        q.putLast(new Object());
+                        ++added;
+                        q.putLast(new Object());
+                        ++added;
+                        q.putLast(new Object());
+                        ++added;
+                        q.putLast(new Object());
+                        ++added;
+			threadShouldThrow();
+                    } catch (InterruptedException e){
+                        threadAssertTrue(added >= 2);
+                    }
+                }
+            });
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            q.take();
+            t.interrupt();
+            t.join();
+        } catch (Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * timed offerLast times out if full and elements not taken
+     */
+    public void testTimedOfferLast() {
+        final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        q.putLast(new Object());
+                        q.putLast(new Object());
+                        threadAssertFalse(q.offerLast(new Object(), SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+                        q.offerLast(new Object(), LONG_DELAY_MS, TimeUnit.MILLISECONDS);
+			threadShouldThrow();
+                    } catch (InterruptedException success){}
+                }
+            });
+
+        try {
+            t.start();
+            Thread.sleep(SMALL_DELAY_MS);
+            t.interrupt();
+            t.join();
+        } catch (Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * takeLast retrieves elements in FIFO order
+     */
+    public void testTakeLast() {
+	try {
+            LinkedBlockingDeque q = populatedDeque(SIZE);
+            for (int i = 0; i < SIZE; ++i) {
+                assertEquals(SIZE-i-1, ((Integer)q.takeLast()).intValue());
+            }
+        } catch (InterruptedException e){
+	    unexpectedException();
+	}
+    }
+
+    /**
+     * takeLast blocks interruptibly when empty
+     */
+    public void testTakeLastFromEmpty() {
+        final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        q.takeLast();
+			threadShouldThrow();
+                    } catch (InterruptedException success){ }
+                }
+            });
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            t.interrupt();
+            t.join();
+        } catch (Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * TakeLast removes existing elements until empty, then blocks interruptibly
+     */
+    public void testBlockingTakeLast() {
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        LinkedBlockingDeque q = populatedDeque(SIZE);
+                        for (int i = 0; i < SIZE; ++i) {
+                            assertEquals(SIZE-i-1, ((Integer)q.takeLast()).intValue());
+                        }
+                        q.takeLast();
+                        threadShouldThrow();
+                    } catch (InterruptedException success){
+                    }
+                }});
+        t.start();
+        try {
+           Thread.sleep(SHORT_DELAY_MS);
+           t.interrupt();
+           t.join();
+        }
+        catch (InterruptedException ie) {
+	    unexpectedException();
+        }
+    }
+
+
+    /**
+     * timed pollLast with zero timeout succeeds when non-empty, else times out
+     */
+    public void testTimedPollLast0() {
+        try {
+            LinkedBlockingDeque q = populatedDeque(SIZE);
+            for (int i = 0; i < SIZE; ++i) {
+                assertEquals(SIZE-i-1, ((Integer)q.pollLast(0, TimeUnit.MILLISECONDS)).intValue());
+            }
+            assertNull(q.pollLast(0, TimeUnit.MILLISECONDS));
+        } catch (InterruptedException e){
+	    unexpectedException();
+	}
+    }
+
+    /**
+     * timed pollLast with nonzero timeout succeeds when non-empty, else times out
+     */
+    public void testTimedPollLast() {
+        try {
+            LinkedBlockingDeque q = populatedDeque(SIZE);
+            for (int i = 0; i < SIZE; ++i) {
+                assertEquals(SIZE-i-1, ((Integer)q.pollLast(SHORT_DELAY_MS, TimeUnit.MILLISECONDS)).intValue());
+            }
+            assertNull(q.pollLast(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+        } catch (InterruptedException e){
+	    unexpectedException();
+	}
+    }
+
+    /**
+     * Interrupted timed pollLast throws InterruptedException instead of
+     * returning timeout status
+     */
+    public void testInterruptedTimedPollLast() {
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        LinkedBlockingDeque q = populatedDeque(SIZE);
+                        for (int i = 0; i < SIZE; ++i) {
+                            threadAssertEquals(SIZE-i-1, ((Integer)q.pollLast(SHORT_DELAY_MS, TimeUnit.MILLISECONDS)).intValue());
+                        }
+                        threadAssertNull(q.pollLast(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+                    } catch (InterruptedException success){
+                    }
+                }});
+        t.start();
+        try {
+           Thread.sleep(SHORT_DELAY_MS);
+           t.interrupt();
+           t.join();
+        }
+        catch (InterruptedException ie) {
+	    unexpectedException();
+        }
+    }
+
+    /**
+     *  timed poll before a delayed offerLast fails; after offerLast succeeds;
+     *  on interruption throws
+     */
+    public void testTimedPollWithOfferLast() {
+        final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        threadAssertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+                        q.poll(LONG_DELAY_MS, TimeUnit.MILLISECONDS);
+                        q.poll(LONG_DELAY_MS, TimeUnit.MILLISECONDS);
+			threadShouldThrow();
+                    } catch (InterruptedException success) { }
+                }
+            });
+        try {
+            t.start();
+            Thread.sleep(SMALL_DELAY_MS);
+            assertTrue(q.offerLast(zero, SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+            t.interrupt();
+            t.join();
+        } catch (Exception e){
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * element returns next element, or throws NSEE if empty
+     */
+    public void testElement() {
+        LinkedBlockingDeque q = populatedDeque(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.element()).intValue());
+            q.poll();
+        }
+        try {
+            q.element();
+            shouldThrow();
+        }
+        catch (NoSuchElementException success) {}
+    }
+
+    /**
+     * remove(x) removes x and returns true if present
+     */
+    public void testRemoveElement() {
+        LinkedBlockingDeque q = populatedDeque(SIZE);
+        for (int i = 1; i < SIZE; i+=2) {
+            assertTrue(q.remove(new Integer(i)));
+        }
+        for (int i = 0; i < SIZE; i+=2) {
+            assertTrue(q.remove(new Integer(i)));
+            assertFalse(q.remove(new Integer(i+1)));
+        }
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * contains(x) reports true when elements added but not yet removed
+     */
+    public void testContains() {
+        LinkedBlockingDeque q = populatedDeque(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(q.contains(new Integer(i)));
+            q.poll();
+            assertFalse(q.contains(new Integer(i)));
+        }
+    }
+
+    /**
+     * clear removes all elements
+     */
+    public void testClear() {
+        LinkedBlockingDeque q = populatedDeque(SIZE);
+        q.clear();
+        assertTrue(q.isEmpty());
+        assertEquals(0, q.size());
+        assertEquals(SIZE, q.remainingCapacity());
+        q.add(one);
+        assertFalse(q.isEmpty());
+        assertTrue(q.contains(one));
+        q.clear();
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * containsAll(c) is true when c contains a subset of elements
+     */
+    public void testContainsAll() {
+        LinkedBlockingDeque q = populatedDeque(SIZE);
+        LinkedBlockingDeque p = new LinkedBlockingDeque(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(q.containsAll(p));
+            assertFalse(p.containsAll(q));
+            p.add(new Integer(i));
+        }
+        assertTrue(p.containsAll(q));
+    }
+
+    /**
+     * retainAll(c) retains only those elements of c and reports true if changed
+     */
+    public void testRetainAll() {
+        LinkedBlockingDeque q = populatedDeque(SIZE);
+        LinkedBlockingDeque p = populatedDeque(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            boolean changed = q.retainAll(p);
+            if (i == 0)
+                assertFalse(changed);
+            else
+                assertTrue(changed);
+
+            assertTrue(q.containsAll(p));
+            assertEquals(SIZE-i, q.size());
+            p.remove();
+        }
+    }
+
+    /**
+     * removeAll(c) removes only those elements of c and reports true if changed
+     */
+    public void testRemoveAll() {
+        for (int i = 1; i < SIZE; ++i) {
+            LinkedBlockingDeque q = populatedDeque(SIZE);
+            LinkedBlockingDeque p = populatedDeque(i);
+            assertTrue(q.removeAll(p));
+            assertEquals(SIZE-i, q.size());
+            for (int j = 0; j < i; ++j) {
+                Integer I = (Integer)(p.remove());
+                assertFalse(q.contains(I));
+            }
+        }
+    }
+
+    /**
+     * toArray contains all elements
+     */
+    public void testToArray() {
+        LinkedBlockingDeque q = populatedDeque(SIZE);
+	Object[] o = q.toArray();
+	try {
+	for(int i = 0; i < o.length; i++)
+	    assertEquals(o[i], q.take());
+	} catch (InterruptedException e){
+	    unexpectedException();
+	}
+    }
+
+    /**
+     * toArray(a) contains all elements
+     */
+    public void testToArray2() {
+        LinkedBlockingDeque q = populatedDeque(SIZE);
+	Integer[] ints = new Integer[SIZE];
+	ints = (Integer[])q.toArray(ints);
+	try {
+	    for(int i = 0; i < ints.length; i++)
+		assertEquals(ints[i], q.take());
+	} catch (InterruptedException e){
+	    unexpectedException();
+	}
+    }
+
+    /**
+     * toArray(null) throws NPE
+     */
+    public void testToArray_BadArg() {
+	try {
+            LinkedBlockingDeque q = populatedDeque(SIZE);
+	    Object o[] = q.toArray(null);
+	    shouldThrow();
+	} catch(NullPointerException success){}
+    }
+
+    /**
+     * toArray with incompatible array type throws CCE
+     */
+    public void testToArray1_BadArg() {
+	try {
+            LinkedBlockingDeque q = populatedDeque(SIZE);
+	    Object o[] = q.toArray(new String[10] );
+	    shouldThrow();
+	} catch(ArrayStoreException  success){}
+    }
+
+
+    /**
+     * iterator iterates through all elements
+     */
+    public void testIterator() {
+        LinkedBlockingDeque q = populatedDeque(SIZE);
+	Iterator it = q.iterator();
+	try {
+	    while(it.hasNext()){
+		assertEquals(it.next(), q.take());
+	    }
+	} catch (InterruptedException e){
+	    unexpectedException();
+	}
+    }
+
+    /**
+     * iterator.remove removes current element
+     */
+    public void testIteratorRemove () {
+        final LinkedBlockingDeque q = new LinkedBlockingDeque(3);
+        q.add(two);
+        q.add(one);
+        q.add(three);
+
+        Iterator it = q.iterator();
+        it.next();
+        it.remove();
+
+        it = q.iterator();
+        assertEquals(it.next(), one);
+        assertEquals(it.next(), three);
+        assertFalse(it.hasNext());
+    }
+
+
+    /**
+     * iterator ordering is FIFO
+     */
+    public void testIteratorOrdering() {
+        final LinkedBlockingDeque q = new LinkedBlockingDeque(3);
+        q.add(one);
+        q.add(two);
+        q.add(three);
+        assertEquals(0, q.remainingCapacity());
+        int k = 0;
+        for (Iterator it = q.iterator(); it.hasNext();) {
+            int i = ((Integer)(it.next())).intValue();
+            assertEquals(++k, i);
+        }
+        assertEquals(3, k);
+    }
+
+    /**
+     * Modifications do not cause iterators to fail
+     */
+    public void testWeaklyConsistentIteration () {
+        final LinkedBlockingDeque q = new LinkedBlockingDeque(3);
+        q.add(one);
+        q.add(two);
+        q.add(three);
+        try {
+            for (Iterator it = q.iterator(); it.hasNext();) {
+                q.remove();
+                it.next();
+            }
+        }
+        catch (ConcurrentModificationException e) {
+            unexpectedException();
+        }
+        assertEquals(0, q.size());
+    }
+
+
+    /**
+     *  Descending iterator iterates through all elements
+     */
+    public void testDescendingIterator() {
+        LinkedBlockingDeque q = populatedDeque(SIZE);
+        int i = 0;
+	Iterator it = q.descendingIterator();
+        while(it.hasNext()) {
+            assertTrue(q.contains(it.next()));
+            ++i;
+        }
+        assertEquals(i, SIZE);
+        assertFalse(it.hasNext());
+        try {
+            it.next();
+        } catch(NoSuchElementException success) {
+        }
+    }
+
+    /**
+     *  Descending iterator ordering is reverse FIFO
+     */
+    public void testDescendingIteratorOrdering() {
+        final LinkedBlockingDeque q = new LinkedBlockingDeque();
+        for (int iters = 0; iters < 100; ++iters) {
+            q.add(new Integer(3));
+            q.add(new Integer(2));
+            q.add(new Integer(1));
+            int k = 0;
+            for (Iterator it = q.descendingIterator(); it.hasNext();) {
+                int i = ((Integer)(it.next())).intValue();
+                assertEquals(++k, i);
+            }
+
+            assertEquals(3, k);
+            q.remove();
+            q.remove();
+            q.remove();
+        }
+    }
+
+    /**
+     * descendingIterator.remove removes current element
+     */
+    public void testDescendingIteratorRemove () {
+        final LinkedBlockingDeque q = new LinkedBlockingDeque();
+        for (int iters = 0; iters < 100; ++iters) {
+            q.add(new Integer(3));
+            q.add(new Integer(2));
+            q.add(new Integer(1));
+            Iterator it = q.descendingIterator();
+            assertEquals(it.next(), new Integer(1));
+            it.remove();
+            assertEquals(it.next(), new Integer(2));
+            it = q.descendingIterator();
+            assertEquals(it.next(), new Integer(2));
+            assertEquals(it.next(), new Integer(3));
+            it.remove();
+            assertFalse(it.hasNext());
+            q.remove();
+        }
+    }
+
+
+    /**
+     * toString contains toStrings of elements
+     */
+    public void testToString() {
+        LinkedBlockingDeque q = populatedDeque(SIZE);
+        String s = q.toString();
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(s.indexOf(String.valueOf(i)) >= 0);
+        }
+    }
+
+
+    /**
+     * offer transfers elements across Executor tasks
+     */
+    public void testOfferInExecutor() {
+        final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
+        q.add(one);
+        q.add(two);
+        ExecutorService executor = Executors.newFixedThreadPool(2);
+        executor.execute(new Runnable() {
+            public void run() {
+                threadAssertFalse(q.offer(three));
+                try {
+                    threadAssertTrue(q.offer(three, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS));
+                    threadAssertEquals(0, q.remainingCapacity());
+                }
+                catch (InterruptedException e) {
+                    threadUnexpectedException();
+                }
+            }
+        });
+
+        executor.execute(new Runnable() {
+            public void run() {
+                try {
+                    Thread.sleep(SMALL_DELAY_MS);
+                    threadAssertEquals(one, q.take());
+                }
+                catch (InterruptedException e) {
+                    threadUnexpectedException();
+                }
+            }
+        });
+
+        joinPool(executor);
+    }
+
+    /**
+     * poll retrieves elements across Executor threads
+     */
+    public void testPollInExecutor() {
+        final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
+        ExecutorService executor = Executors.newFixedThreadPool(2);
+        executor.execute(new Runnable() {
+            public void run() {
+                threadAssertNull(q.poll());
+                try {
+                    threadAssertTrue(null != q.poll(MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS));
+                    threadAssertTrue(q.isEmpty());
+                }
+                catch (InterruptedException e) {
+                    threadUnexpectedException();
+                }
+            }
+        });
+
+        executor.execute(new Runnable() {
+            public void run() {
+                try {
+                    Thread.sleep(SMALL_DELAY_MS);
+                    q.put(one);
+                }
+                catch (InterruptedException e) {
+                    threadUnexpectedException();
+                }
+            }
+        });
+
+        joinPool(executor);
+    }
+
+    /**
+     * A deserialized serialized deque has same elements in same order
+     */
+    public void testSerialization() {
+        LinkedBlockingDeque q = populatedDeque(SIZE);
+
+        try {
+            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
+            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
+            out.writeObject(q);
+            out.close();
+
+            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
+            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
+            LinkedBlockingDeque r = (LinkedBlockingDeque)in.readObject();
+            assertEquals(q.size(), r.size());
+            while (!q.isEmpty())
+                assertEquals(q.remove(), r.remove());
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * drainTo(null) throws NPE
+     */
+    public void testDrainToNull() {
+        LinkedBlockingDeque q = populatedDeque(SIZE);
+        try {
+            q.drainTo(null);
+            shouldThrow();
+        } catch(NullPointerException success) {
+        }
+    }
+
+    /**
+     * drainTo(this) throws IAE
+     */
+    public void testDrainToSelf() {
+        LinkedBlockingDeque q = populatedDeque(SIZE);
+        try {
+            q.drainTo(q);
+            shouldThrow();
+        } catch(IllegalArgumentException success) {
+        }
+    }
+
+    /**
+     * drainTo(c) empties deque into another collection c
+     */
+    public void testDrainTo() {
+        LinkedBlockingDeque q = populatedDeque(SIZE);
+        ArrayList l = new ArrayList();
+        q.drainTo(l);
+        assertEquals(q.size(), 0);
+        assertEquals(l.size(), SIZE);
+        for (int i = 0; i < SIZE; ++i)
+            assertEquals(l.get(i), new Integer(i));
+        q.add(zero);
+        q.add(one);
+        assertFalse(q.isEmpty());
+        assertTrue(q.contains(zero));
+        assertTrue(q.contains(one));
+        l.clear();
+        q.drainTo(l);
+        assertEquals(q.size(), 0);
+        assertEquals(l.size(), 2);
+        for (int i = 0; i < 2; ++i)
+            assertEquals(l.get(i), new Integer(i));
+    }
+
+    /**
+     * drainTo empties full deque, unblocking a waiting put.
+     */
+    public void testDrainToWithActivePut() {
+        final LinkedBlockingDeque q = populatedDeque(SIZE);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        q.put(new Integer(SIZE+1));
+                    } catch (InterruptedException ie){
+                        threadUnexpectedException();
+                    }
+                }
+            });
+        try {
+            t.start();
+            ArrayList l = new ArrayList();
+            q.drainTo(l);
+            assertTrue(l.size() >= SIZE);
+            for (int i = 0; i < SIZE; ++i)
+                assertEquals(l.get(i), new Integer(i));
+            t.join();
+            assertTrue(q.size() + l.size() >= SIZE);
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * drainTo(null, n) throws NPE
+     */
+    public void testDrainToNullN() {
+        LinkedBlockingDeque q = populatedDeque(SIZE);
+        try {
+            q.drainTo(null, 0);
+            shouldThrow();
+        } catch(NullPointerException success) {
+        }
+    }
+
+    /**
+     * drainTo(this, n) throws IAE
+     */
+    public void testDrainToSelfN() {
+        LinkedBlockingDeque q = populatedDeque(SIZE);
+        try {
+            q.drainTo(q, 0);
+            shouldThrow();
+        } catch(IllegalArgumentException success) {
+        }
+    }
+
+    /**
+     * drainTo(c, n) empties first max {n, size} elements of deque into c
+     */
+    public void testDrainToN() {
+        LinkedBlockingDeque q = new LinkedBlockingDeque();
+        for (int i = 0; i < SIZE + 2; ++i) {
+            for(int j = 0; j < SIZE; j++)
+                assertTrue(q.offer(new Integer(j)));
+            ArrayList l = new ArrayList();
+            q.drainTo(l, i);
+            int k = (i < SIZE)? i : SIZE;
+            assertEquals(l.size(), k);
+            assertEquals(q.size(), SIZE-k);
+            for (int j = 0; j < k; ++j)
+                assertEquals(l.get(j), new Integer(j));
+            while (q.poll() != null) ;
+        }
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/LinkedBlockingQueueTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/LinkedBlockingQueueTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/LinkedBlockingQueueTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,1066 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import java.io.*;
+import java.util.NoSuchElementException;
+import java.util.Iterator;
+import java.util.ConcurrentModificationException;
+import java.util.ArrayList;
+
+public class LinkedBlockingQueueTest extends JSR166TestCase {
+
+    public static void main(String[] args) {
+        junit.textui.TestRunner.run (suite());
+    }
+
+    public static Test suite() {
+        return new TestSuite(LinkedBlockingQueueTest.class);
+    }
+
+
+    /**
+     * Create a queue of given size containing consecutive
+     * Integers 0 ... n.
+     */
+    private LinkedBlockingQueue populatedQueue(int n) {
+        LinkedBlockingQueue q = new LinkedBlockingQueue(n);
+        assertTrue(q.isEmpty());
+        for(int i = 0; i < n; i++)
+            assertTrue(q.offer(new Integer(i)));
+        assertFalse(q.isEmpty());
+        assertEquals(0, q.remainingCapacity());
+        assertEquals(n, q.size());
+        return q;
+    }
+
+    /**
+     * A new queue has the indicated capacity, or Integer.MAX_VALUE if
+     * none given
+     */
+    public void testConstructor1() {
+        assertEquals(SIZE, new LinkedBlockingQueue(SIZE).remainingCapacity());
+        assertEquals(Integer.MAX_VALUE, new LinkedBlockingQueue().remainingCapacity());
+    }
+
+    /**
+     * Constructor throws IAE if  capacity argument nonpositive
+     */
+    public void testConstructor2() {
+        try {
+            LinkedBlockingQueue q = new LinkedBlockingQueue(0);
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success) {}
+    }
+
+    /**
+     * Initializing from null Collection throws NPE
+     */
+    public void testConstructor3() {
+        try {
+            LinkedBlockingQueue q = new LinkedBlockingQueue(null);
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Initializing from Collection of null elements throws NPE
+     */
+    public void testConstructor4() {
+        try {
+            Integer[] ints = new Integer[SIZE];
+            LinkedBlockingQueue q = new LinkedBlockingQueue(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Initializing from Collection with some null elements throws NPE
+     */
+    public void testConstructor5() {
+        try {
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE-1; ++i)
+                ints[i] = new Integer(i);
+            LinkedBlockingQueue q = new LinkedBlockingQueue(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Queue contains all elements of collection used to initialize
+     */
+    public void testConstructor6() {
+        try {
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE; ++i)
+                ints[i] = new Integer(i);
+            LinkedBlockingQueue q = new LinkedBlockingQueue(Arrays.asList(ints));
+            for (int i = 0; i < SIZE; ++i)
+                assertEquals(ints[i], q.poll());
+        }
+        finally {}
+    }
+
+    /**
+     * Queue transitions from empty to full when elements added
+     */
+    public void testEmptyFull() {
+        LinkedBlockingQueue q = new LinkedBlockingQueue(2);
+        assertTrue(q.isEmpty());
+        assertEquals("should have room for 2", 2, q.remainingCapacity());
+        q.add(one);
+        assertFalse(q.isEmpty());
+        q.add(two);
+        assertFalse(q.isEmpty());
+        assertEquals(0, q.remainingCapacity());
+        assertFalse(q.offer(three));
+    }
+
+    /**
+     * remainingCapacity decreases on add, increases on remove
+     */
+    public void testRemainingCapacity() {
+        LinkedBlockingQueue q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, q.remainingCapacity());
+            assertEquals(SIZE-i, q.size());
+            q.remove();
+        }
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(SIZE-i, q.remainingCapacity());
+            assertEquals(i, q.size());
+            q.add(new Integer(i));
+        }
+    }
+
+    /**
+     * offer(null) throws NPE
+     */
+    public void testOfferNull() {
+        try {
+            LinkedBlockingQueue q = new LinkedBlockingQueue(1);
+            q.offer(null);
+            shouldThrow();
+        } catch (NullPointerException success) { }
+    }
+
+    /**
+     * add(null) throws NPE
+     */
+    public void testAddNull() {
+        try {
+            LinkedBlockingQueue q = new LinkedBlockingQueue(1);
+            q.add(null);
+            shouldThrow();
+        } catch (NullPointerException success) { }
+    }
+
+    /**
+     * Offer succeeds if not full; fails if full
+     */
+    public void testOffer() {
+        LinkedBlockingQueue q = new LinkedBlockingQueue(1);
+        assertTrue(q.offer(zero));
+        assertFalse(q.offer(one));
+    }
+
+    /**
+     * add succeeds if not full; throws ISE if full
+     */
+    public void testAdd() {
+        try {
+            LinkedBlockingQueue q = new LinkedBlockingQueue(SIZE);
+            for (int i = 0; i < SIZE; ++i) {
+                assertTrue(q.add(new Integer(i)));
+            }
+            assertEquals(0, q.remainingCapacity());
+            q.add(new Integer(SIZE));
+        } catch (IllegalStateException success){
+        }
+    }
+
+    /**
+     * addAll(null) throws NPE
+     */
+    public void testAddAll1() {
+        try {
+            LinkedBlockingQueue q = new LinkedBlockingQueue(1);
+            q.addAll(null);
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * addAll(this) throws IAE
+     */
+    public void testAddAllSelf() {
+        try {
+            LinkedBlockingQueue q = populatedQueue(SIZE);
+            q.addAll(q);
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success) {}
+    }
+
+    /**
+     * addAll of a collection with null elements throws NPE
+     */
+    public void testAddAll2() {
+        try {
+            LinkedBlockingQueue q = new LinkedBlockingQueue(SIZE);
+            Integer[] ints = new Integer[SIZE];
+            q.addAll(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+    /**
+     * addAll of a collection with any null elements throws NPE after
+     * possibly adding some elements
+     */
+    public void testAddAll3() {
+        try {
+            LinkedBlockingQueue q = new LinkedBlockingQueue(SIZE);
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE-1; ++i)
+                ints[i] = new Integer(i);
+            q.addAll(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+    /**
+     * addAll throws ISE if not enough room
+     */
+    public void testAddAll4() {
+        try {
+            LinkedBlockingQueue q = new LinkedBlockingQueue(1);
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE; ++i)
+                ints[i] = new Integer(i);
+            q.addAll(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (IllegalStateException success) {}
+    }
+    /**
+     * Queue contains all elements, in traversal order, of successful addAll
+     */
+    public void testAddAll5() {
+        try {
+            Integer[] empty = new Integer[0];
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE; ++i)
+                ints[i] = new Integer(i);
+            LinkedBlockingQueue q = new LinkedBlockingQueue(SIZE);
+            assertFalse(q.addAll(Arrays.asList(empty)));
+            assertTrue(q.addAll(Arrays.asList(ints)));
+            for (int i = 0; i < SIZE; ++i)
+                assertEquals(ints[i], q.poll());
+        }
+        finally {}
+    }
+
+    /**
+     * put(null) throws NPE
+     */
+     public void testPutNull() {
+        try {
+            LinkedBlockingQueue q = new LinkedBlockingQueue(SIZE);
+            q.put(null);
+            shouldThrow();
+        }
+        catch (NullPointerException success){
+        }
+        catch (InterruptedException ie) {
+            unexpectedException();
+        }
+     }
+
+    /**
+     * all elements successfully put are contained
+     */
+     public void testPut() {
+         try {
+             LinkedBlockingQueue q = new LinkedBlockingQueue(SIZE);
+             for (int i = 0; i < SIZE; ++i) {
+                 Integer I = new Integer(i);
+                 q.put(I);
+                 assertTrue(q.contains(I));
+             }
+             assertEquals(0, q.remainingCapacity());
+         }
+        catch (InterruptedException ie) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * put blocks interruptibly if full
+     */
+    public void testBlockingPut() {
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    int added = 0;
+                    try {
+                        LinkedBlockingQueue q = new LinkedBlockingQueue(SIZE);
+                        for (int i = 0; i < SIZE; ++i) {
+                            q.put(new Integer(i));
+                            ++added;
+                        }
+                        q.put(new Integer(SIZE));
+                        threadShouldThrow();
+                    } catch (InterruptedException ie){
+                        threadAssertEquals(added, SIZE);
+                    }
+                }});
+        t.start();
+        try {
+           Thread.sleep(SHORT_DELAY_MS);
+           t.interrupt();
+           t.join();
+        }
+        catch (InterruptedException ie) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * put blocks waiting for take when full
+     */
+    public void testPutWithTake() {
+        final LinkedBlockingQueue q = new LinkedBlockingQueue(2);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    int added = 0;
+                    try {
+                        q.put(new Object());
+                        ++added;
+                        q.put(new Object());
+                        ++added;
+                        q.put(new Object());
+                        ++added;
+                        q.put(new Object());
+                        ++added;
+                        threadShouldThrow();
+                    } catch (InterruptedException e){
+                        threadAssertTrue(added >= 2);
+                    }
+                }
+            });
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            q.take();
+            t.interrupt();
+            t.join();
+        } catch (Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * timed offer times out if full and elements not taken
+     */
+    public void testTimedOffer() {
+        final LinkedBlockingQueue q = new LinkedBlockingQueue(2);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        q.put(new Object());
+                        q.put(new Object());
+                        threadAssertFalse(q.offer(new Object(), SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+                        q.offer(new Object(), LONG_DELAY_MS, TimeUnit.MILLISECONDS);
+                        threadShouldThrow();
+                    } catch (InterruptedException success){}
+                }
+            });
+
+        try {
+            t.start();
+            Thread.sleep(SMALL_DELAY_MS);
+            t.interrupt();
+            t.join();
+        } catch (Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * take retrieves elements in FIFO order
+     */
+    public void testTake() {
+        try {
+            LinkedBlockingQueue q = populatedQueue(SIZE);
+            for (int i = 0; i < SIZE; ++i) {
+                assertEquals(i, ((Integer)q.take()).intValue());
+            }
+        } catch (InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * take blocks interruptibly when empty
+     */
+    public void testTakeFromEmpty() {
+        final LinkedBlockingQueue q = new LinkedBlockingQueue(2);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        q.take();
+                        threadShouldThrow();
+                    } catch (InterruptedException success){ }
+                }
+            });
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            t.interrupt();
+            t.join();
+        } catch (Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * Take removes existing elements until empty, then blocks interruptibly
+     */
+    public void testBlockingTake() {
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        LinkedBlockingQueue q = populatedQueue(SIZE);
+                        for (int i = 0; i < SIZE; ++i) {
+                            assertEquals(i, ((Integer)q.take()).intValue());
+                        }
+                        q.take();
+                        threadShouldThrow();
+                    } catch (InterruptedException success){
+                    }
+                }});
+        t.start();
+        try {
+           Thread.sleep(SHORT_DELAY_MS);
+           t.interrupt();
+           t.join();
+        }
+        catch (InterruptedException ie) {
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * poll succeeds unless empty
+     */
+    public void testPoll() {
+        LinkedBlockingQueue q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.poll()).intValue());
+        }
+        assertNull(q.poll());
+    }
+
+    /**
+     * timed pool with zero timeout succeeds when non-empty, else times out
+     */
+    public void testTimedPoll0() {
+        try {
+            LinkedBlockingQueue q = populatedQueue(SIZE);
+            for (int i = 0; i < SIZE; ++i) {
+                assertEquals(i, ((Integer)q.poll(0, TimeUnit.MILLISECONDS)).intValue());
+            }
+            assertNull(q.poll(0, TimeUnit.MILLISECONDS));
+        } catch (InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * timed pool with nonzero timeout succeeds when non-empty, else times out
+     */
+    public void testTimedPoll() {
+        try {
+            LinkedBlockingQueue q = populatedQueue(SIZE);
+            for (int i = 0; i < SIZE; ++i) {
+                assertEquals(i, ((Integer)q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS)).intValue());
+            }
+            assertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+        } catch (InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * Interrupted timed poll throws InterruptedException instead of
+     * returning timeout status
+     */
+    public void testInterruptedTimedPoll() {
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        LinkedBlockingQueue q = populatedQueue(SIZE);
+                        for (int i = 0; i < SIZE; ++i) {
+                            threadAssertEquals(i, ((Integer)q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS)).intValue());
+                        }
+                        threadAssertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+                    } catch (InterruptedException success){
+                    }
+                }});
+        t.start();
+        try {
+           Thread.sleep(SHORT_DELAY_MS);
+           t.interrupt();
+           t.join();
+        }
+        catch (InterruptedException ie) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     *  timed poll before a delayed offer fails; after offer succeeds;
+     *  on interruption throws
+     */
+    public void testTimedPollWithOffer() {
+        final LinkedBlockingQueue q = new LinkedBlockingQueue(2);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        threadAssertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+                        q.poll(LONG_DELAY_MS, TimeUnit.MILLISECONDS);
+                        q.poll(LONG_DELAY_MS, TimeUnit.MILLISECONDS);
+                        threadShouldThrow();
+                    } catch (InterruptedException success) { }
+                }
+            });
+        try {
+            t.start();
+            Thread.sleep(SMALL_DELAY_MS);
+            assertTrue(q.offer(zero, SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+            t.interrupt();
+            t.join();
+        } catch (Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * peek returns next element, or null if empty
+     */
+    public void testPeek() {
+        LinkedBlockingQueue q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.peek()).intValue());
+            q.poll();
+            assertTrue(q.peek() == null ||
+                       i != ((Integer)q.peek()).intValue());
+        }
+        assertNull(q.peek());
+    }
+
+    /**
+     * element returns next element, or throws NSEE if empty
+     */
+    public void testElement() {
+        LinkedBlockingQueue q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.element()).intValue());
+            q.poll();
+        }
+        try {
+            q.element();
+            shouldThrow();
+        }
+        catch (NoSuchElementException success) {}
+    }
+
+    /**
+     * remove removes next element, or throws NSEE if empty
+     */
+    public void testRemove() {
+        LinkedBlockingQueue q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.remove()).intValue());
+        }
+        try {
+            q.remove();
+            shouldThrow();
+        } catch (NoSuchElementException success){
+        }
+    }
+
+    /**
+     * remove(x) removes x and returns true if present
+     */
+    public void testRemoveElement() {
+        LinkedBlockingQueue q = populatedQueue(SIZE);
+        for (int i = 1; i < SIZE; i+=2) {
+            assertTrue(q.remove(new Integer(i)));
+        }
+        for (int i = 0; i < SIZE; i+=2) {
+            assertTrue(q.remove(new Integer(i)));
+            assertFalse(q.remove(new Integer(i+1)));
+        }
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * An add following remove(x) succeeds
+     */
+    public void testRemoveElementAndAdd() {
+        try {
+            LinkedBlockingQueue q = new LinkedBlockingQueue();
+            assertTrue(q.add(new Integer(1)));
+            assertTrue(q.add(new Integer(2)));
+            assertTrue(q.remove(new Integer(1)));
+            assertTrue(q.remove(new Integer(2)));
+            assertTrue(q.add(new Integer(3)));
+            assertTrue(q.take() != null);
+        } catch (Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * contains(x) reports true when elements added but not yet removed
+     */
+    public void testContains() {
+        LinkedBlockingQueue q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(q.contains(new Integer(i)));
+            q.poll();
+            assertFalse(q.contains(new Integer(i)));
+        }
+    }
+
+    /**
+     * clear removes all elements
+     */
+    public void testClear() {
+        LinkedBlockingQueue q = populatedQueue(SIZE);
+        q.clear();
+        assertTrue(q.isEmpty());
+        assertEquals(0, q.size());
+        assertEquals(SIZE, q.remainingCapacity());
+        q.add(one);
+        assertFalse(q.isEmpty());
+        assertTrue(q.contains(one));
+        q.clear();
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * containsAll(c) is true when c contains a subset of elements
+     */
+    public void testContainsAll() {
+        LinkedBlockingQueue q = populatedQueue(SIZE);
+        LinkedBlockingQueue p = new LinkedBlockingQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(q.containsAll(p));
+            assertFalse(p.containsAll(q));
+            p.add(new Integer(i));
+        }
+        assertTrue(p.containsAll(q));
+    }
+
+    /**
+     * retainAll(c) retains only those elements of c and reports true if changed
+     */
+    public void testRetainAll() {
+        LinkedBlockingQueue q = populatedQueue(SIZE);
+        LinkedBlockingQueue p = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            boolean changed = q.retainAll(p);
+            if (i == 0)
+                assertFalse(changed);
+            else
+                assertTrue(changed);
+
+            assertTrue(q.containsAll(p));
+            assertEquals(SIZE-i, q.size());
+            p.remove();
+        }
+    }
+
+    /**
+     * removeAll(c) removes only those elements of c and reports true if changed
+     */
+    public void testRemoveAll() {
+        for (int i = 1; i < SIZE; ++i) {
+            LinkedBlockingQueue q = populatedQueue(SIZE);
+            LinkedBlockingQueue p = populatedQueue(i);
+            assertTrue(q.removeAll(p));
+            assertEquals(SIZE-i, q.size());
+            for (int j = 0; j < i; ++j) {
+                Integer I = (Integer)(p.remove());
+                assertFalse(q.contains(I));
+            }
+        }
+    }
+
+    /**
+     * toArray contains all elements
+     */
+    public void testToArray() {
+        LinkedBlockingQueue q = populatedQueue(SIZE);
+        Object[] o = q.toArray();
+        try {
+        for(int i = 0; i < o.length; i++)
+            assertEquals(o[i], q.take());
+        } catch (InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * toArray(a) contains all elements
+     */
+    public void testToArray2() {
+        LinkedBlockingQueue q = populatedQueue(SIZE);
+        Integer[] ints = new Integer[SIZE];
+        ints = (Integer[])q.toArray(ints);
+        try {
+            for(int i = 0; i < ints.length; i++)
+                assertEquals(ints[i], q.take());
+        } catch (InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * toArray(null) throws NPE
+     */
+    public void testToArray_BadArg() {
+        try {
+            LinkedBlockingQueue q = populatedQueue(SIZE);
+            Object o[] = q.toArray(null);
+            shouldThrow();
+        } catch(NullPointerException success){}
+    }
+
+    /**
+     * toArray with incompatible array type throws CCE
+     */
+    public void testToArray1_BadArg() {
+        try {
+            LinkedBlockingQueue q = populatedQueue(SIZE);
+            Object o[] = q.toArray(new String[10] );
+            shouldThrow();
+        } catch(ArrayStoreException  success){}
+    }
+
+
+    /**
+     * iterator iterates through all elements
+     */
+    public void testIterator() {
+        LinkedBlockingQueue q = populatedQueue(SIZE);
+        Iterator it = q.iterator();
+        try {
+            while(it.hasNext()){
+                assertEquals(it.next(), q.take());
+            }
+        } catch (InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * iterator.remove removes current element
+     */
+    public void testIteratorRemove () {
+        final LinkedBlockingQueue q = new LinkedBlockingQueue(3);
+        q.add(two);
+        q.add(one);
+        q.add(three);
+
+        Iterator it = q.iterator();
+        it.next();
+        it.remove();
+
+        it = q.iterator();
+        assertEquals(it.next(), one);
+        assertEquals(it.next(), three);
+        assertFalse(it.hasNext());
+    }
+
+
+    /**
+     * iterator ordering is FIFO
+     */
+    public void testIteratorOrdering() {
+        final LinkedBlockingQueue q = new LinkedBlockingQueue(3);
+        q.add(one);
+        q.add(two);
+        q.add(three);
+        assertEquals(0, q.remainingCapacity());
+        int k = 0;
+        for (Iterator it = q.iterator(); it.hasNext();) {
+            int i = ((Integer)(it.next())).intValue();
+            assertEquals(++k, i);
+        }
+        assertEquals(3, k);
+    }
+
+    /**
+     * Modifications do not cause iterators to fail
+     */
+    public void testWeaklyConsistentIteration () {
+        final LinkedBlockingQueue q = new LinkedBlockingQueue(3);
+        q.add(one);
+        q.add(two);
+        q.add(three);
+        try {
+            for (Iterator it = q.iterator(); it.hasNext();) {
+                q.remove();
+                it.next();
+            }
+        }
+        catch (ConcurrentModificationException e) {
+            unexpectedException();
+        }
+        assertEquals(0, q.size());
+    }
+
+
+    /**
+     * toString contains toStrings of elements
+     */
+    public void testToString() {
+        LinkedBlockingQueue q = populatedQueue(SIZE);
+        String s = q.toString();
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(s.indexOf(String.valueOf(i)) >= 0);
+        }
+    }
+
+
+    /**
+     * offer transfers elements across Executor tasks
+     */
+    public void testOfferInExecutor() {
+        final LinkedBlockingQueue q = new LinkedBlockingQueue(2);
+        q.add(one);
+        q.add(two);
+        ExecutorService executor = Executors.newFixedThreadPool(2);
+        executor.execute(new Runnable() {
+            public void run() {
+                threadAssertFalse(q.offer(three));
+                try {
+                    threadAssertTrue(q.offer(three, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS));
+                    threadAssertEquals(0, q.remainingCapacity());
+                }
+                catch (InterruptedException e) {
+                    threadUnexpectedException();
+                }
+            }
+        });
+
+        executor.execute(new Runnable() {
+            public void run() {
+                try {
+                    Thread.sleep(SMALL_DELAY_MS);
+                    threadAssertEquals(one, q.take());
+                }
+                catch (InterruptedException e) {
+                    threadUnexpectedException();
+                }
+            }
+        });
+
+        joinPool(executor);
+    }
+
+    /**
+     * poll retrieves elements across Executor threads
+     */
+    public void testPollInExecutor() {
+        final LinkedBlockingQueue q = new LinkedBlockingQueue(2);
+        ExecutorService executor = Executors.newFixedThreadPool(2);
+        executor.execute(new Runnable() {
+            public void run() {
+                threadAssertNull(q.poll());
+                try {
+                    threadAssertTrue(null != q.poll(MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS));
+                    threadAssertTrue(q.isEmpty());
+                }
+                catch (InterruptedException e) {
+                    threadUnexpectedException();
+                }
+            }
+        });
+
+        executor.execute(new Runnable() {
+            public void run() {
+                try {
+                    Thread.sleep(SMALL_DELAY_MS);
+                    q.put(one);
+                }
+                catch (InterruptedException e) {
+                    threadUnexpectedException();
+                }
+            }
+        });
+
+        joinPool(executor);
+    }
+
+    /**
+     * A deserialized serialized queue has same elements in same order
+     */
+    public void testSerialization() {
+        LinkedBlockingQueue q = populatedQueue(SIZE);
+
+        try {
+            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
+            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
+            out.writeObject(q);
+            out.close();
+
+            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
+            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
+            LinkedBlockingQueue r = (LinkedBlockingQueue)in.readObject();
+            assertEquals(q.size(), r.size());
+            while (!q.isEmpty())
+                assertEquals(q.remove(), r.remove());
+        } catch(Exception e){
+            e.printStackTrace();
+            unexpectedException();
+        }
+    }
+
+    /**
+     * drainTo(null) throws NPE
+     */
+    public void testDrainToNull() {
+        LinkedBlockingQueue q = populatedQueue(SIZE);
+        try {
+            q.drainTo(null);
+            shouldThrow();
+        } catch(NullPointerException success) {
+        }
+    }
+
+    /**
+     * drainTo(this) throws IAE
+     */
+    public void testDrainToSelf() {
+        LinkedBlockingQueue q = populatedQueue(SIZE);
+        try {
+            q.drainTo(q);
+            shouldThrow();
+        } catch(IllegalArgumentException success) {
+        }
+    }
+
+    /**
+     * drainTo(c) empties queue into another collection c
+     */
+    public void testDrainTo() {
+        LinkedBlockingQueue q = populatedQueue(SIZE);
+        ArrayList l = new ArrayList();
+        q.drainTo(l);
+        assertEquals(q.size(), 0);
+        assertEquals(l.size(), SIZE);
+        for (int i = 0; i < SIZE; ++i)
+            assertEquals(l.get(i), new Integer(i));
+        q.add(zero);
+        q.add(one);
+        assertFalse(q.isEmpty());
+        assertTrue(q.contains(zero));
+        assertTrue(q.contains(one));
+        l.clear();
+        q.drainTo(l);
+        assertEquals(q.size(), 0);
+        assertEquals(l.size(), 2);
+        for (int i = 0; i < 2; ++i)
+            assertEquals(l.get(i), new Integer(i));
+    }
+
+    /**
+     * drainTo empties full queue, unblocking a waiting put.
+     */
+    public void testDrainToWithActivePut() {
+        final LinkedBlockingQueue q = populatedQueue(SIZE);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        q.put(new Integer(SIZE+1));
+                    } catch (InterruptedException ie){
+                        threadUnexpectedException();
+                    }
+                }
+            });
+        try {
+            t.start();
+            ArrayList l = new ArrayList();
+            q.drainTo(l);
+            assertTrue(l.size() >= SIZE);
+            for (int i = 0; i < SIZE; ++i)
+                assertEquals(l.get(i), new Integer(i));
+            t.join();
+            assertTrue(q.size() + l.size() >= SIZE);
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * drainTo(null, n) throws NPE
+     */
+    public void testDrainToNullN() {
+        LinkedBlockingQueue q = populatedQueue(SIZE);
+        try {
+            q.drainTo(null, 0);
+            shouldThrow();
+        } catch(NullPointerException success) {
+        }
+    }
+
+    /**
+     * drainTo(this, n) throws IAE
+     */
+    public void testDrainToSelfN() {
+        LinkedBlockingQueue q = populatedQueue(SIZE);
+        try {
+            q.drainTo(q, 0);
+            shouldThrow();
+        } catch(IllegalArgumentException success) {
+        }
+    }
+
+    /**
+     * drainTo(c, n) empties first max {n, size} elements of queue into c
+     */
+    public void testDrainToN() {
+        LinkedBlockingQueue q = new LinkedBlockingQueue();
+        for (int i = 0; i < SIZE + 2; ++i) {
+            for(int j = 0; j < SIZE; j++)
+                assertTrue(q.offer(new Integer(j)));
+            ArrayList l = new ArrayList();
+            q.drainTo(l, i);
+            int k = (i < SIZE)? i : SIZE;
+            assertEquals(l.size(), k);
+            assertEquals(q.size(), SIZE-k);
+            for (int j = 0; j < k; ++j)
+                assertEquals(l.get(j), new Integer(j));
+            while (q.poll() != null) ;
+        }
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/LinkedListTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/LinkedListTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/LinkedListTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,650 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.LinkedList;
+import java.util.Collection;
+import java.util.Arrays;
+import java.util.NoSuchElementException;
+import java.util.Iterator;
+
+public class LinkedListTest extends JSR166TestCase {
+    public static void main(String[] args) {
+	junit.textui.TestRunner.run (suite());
+    }
+
+    public static Test suite() {
+	return new TestSuite(LinkedListTest.class);
+    }
+
+    /**
+     * Create a queue of given size containing consecutive
+     * Integers 0 ... n.
+     */
+    private LinkedList populatedQueue(int n) {
+        LinkedList q = new LinkedList();
+        assertTrue(q.isEmpty());
+	for(int i = 0; i < n; ++i)
+	    assertTrue(q.offer(new Integer(i)));
+        assertFalse(q.isEmpty());
+	assertEquals(n, q.size());
+        return q;
+    }
+
+    /**
+     * new queue is empty
+     */
+    public void testConstructor1() {
+        assertEquals(0, new LinkedList().size());
+    }
+
+    /**
+     * Initializing from null Collection throws NPE
+     */
+    public void testConstructor3() {
+        try {
+            LinkedList q = new LinkedList((Collection)null);
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Queue contains all elements of collection used to initialize
+
+     */
+    public void testConstructor6() {
+        try {
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE; ++i)
+                ints[i] = new Integer(i);
+            LinkedList q = new LinkedList(Arrays.asList(ints));
+            for (int i = 0; i < SIZE; ++i)
+                assertEquals(ints[i], q.poll());
+        }
+        finally {}
+    }
+
+    /**
+     * isEmpty is true before add, false after
+     */
+    public void testEmpty() {
+        LinkedList q = new LinkedList();
+        assertTrue(q.isEmpty());
+        q.add(new Integer(1));
+        assertFalse(q.isEmpty());
+        q.add(new Integer(2));
+        q.remove();
+        q.remove();
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * size changes when elements added and removed
+     */
+    public void testSize() {
+        LinkedList q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(SIZE-i, q.size());
+            q.remove();
+        }
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, q.size());
+            q.add(new Integer(i));
+        }
+    }
+
+    /**
+     * offer(null) succeeds
+     */
+    public void testOfferNull() {
+	try {
+            LinkedList q = new LinkedList();
+            q.offer(null);
+        } catch (NullPointerException ie) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * Offer succeeds
+     */
+    public void testOffer() {
+        LinkedList q = new LinkedList();
+        assertTrue(q.offer(new Integer(0)));
+        assertTrue(q.offer(new Integer(1)));
+    }
+
+    /**
+     * add succeeds
+     */
+    public void testAdd() {
+        LinkedList q = new LinkedList();
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, q.size());
+            assertTrue(q.add(new Integer(i)));
+        }
+    }
+
+    /**
+     * addAll(null) throws NPE
+     */
+    public void testAddAll1() {
+        try {
+            LinkedList q = new LinkedList();
+            q.addAll(null);
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Queue contains all elements, in traversal order, of successful addAll
+     */
+    public void testAddAll5() {
+        try {
+            Integer[] empty = new Integer[0];
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE; ++i)
+                ints[i] = new Integer(i);
+            LinkedList q = new LinkedList();
+            assertFalse(q.addAll(Arrays.asList(empty)));
+            assertTrue(q.addAll(Arrays.asList(ints)));
+            for (int i = 0; i < SIZE; ++i)
+                assertEquals(ints[i], q.poll());
+        }
+        finally {}
+    }
+
+    /**
+     * addAll with too large an index throws IOOBE
+     */
+    public void testAddAll2_IndexOutOfBoundsException() {
+	try {
+	    LinkedList l = new LinkedList();
+	    l.add(new Object());
+	    LinkedList m = new LinkedList();
+	    m.add(new Object());
+	    l.addAll(4,m);
+	    shouldThrow();
+	} catch(IndexOutOfBoundsException  success) {}
+    }
+
+    /**
+     * addAll with negative index throws IOOBE
+     */
+    public void testAddAll4_BadIndex() {
+	try {
+	    LinkedList l = new LinkedList();
+	    l.add(new Object());
+	    LinkedList m = new LinkedList();
+	    m.add(new Object());
+	    l.addAll(-1,m);
+	    shouldThrow();
+	} catch(IndexOutOfBoundsException  success){}
+    }
+
+    /**
+     *  poll succeeds unless empty
+     */
+    public void testPoll() {
+        LinkedList q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.poll()).intValue());
+        }
+	assertNull(q.poll());
+    }
+
+    /**
+     *  peek returns next element, or null if empty
+     */
+    public void testPeek() {
+        LinkedList q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.peek()).intValue());
+            q.poll();
+            assertTrue(q.peek() == null ||
+                       i != ((Integer)q.peek()).intValue());
+        }
+	assertNull(q.peek());
+    }
+
+    /**
+     * element returns next element, or throws NSEE if empty
+     */
+    public void testElement() {
+        LinkedList q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.element()).intValue());
+            q.poll();
+        }
+        try {
+            q.element();
+            shouldThrow();
+        }
+        catch (NoSuchElementException success) {}
+    }
+
+    /**
+     *  remove removes next element, or throws NSEE if empty
+     */
+    public void testRemove() {
+        LinkedList q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.remove()).intValue());
+        }
+        try {
+            q.remove();
+            shouldThrow();
+        } catch (NoSuchElementException success){
+	}
+    }
+
+    /**
+     * remove(x) removes x and returns true if present
+     */
+    public void testRemoveElement() {
+        LinkedList q = populatedQueue(SIZE);
+        for (int i = 1; i < SIZE; i+=2) {
+            assertTrue(q.remove(new Integer(i)));
+        }
+        for (int i = 0; i < SIZE; i+=2) {
+            assertTrue(q.remove(new Integer(i)));
+            assertFalse(q.remove(new Integer(i+1)));
+        }
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * contains(x) reports true when elements added but not yet removed
+     */
+    public void testContains() {
+        LinkedList q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(q.contains(new Integer(i)));
+            q.poll();
+            assertFalse(q.contains(new Integer(i)));
+        }
+    }
+
+    /**
+     * clear removes all elements
+     */
+    public void testClear() {
+        LinkedList q = populatedQueue(SIZE);
+        q.clear();
+        assertTrue(q.isEmpty());
+        assertEquals(0, q.size());
+        q.add(new Integer(1));
+        assertFalse(q.isEmpty());
+        q.clear();
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * containsAll(c) is true when c contains a subset of elements
+     */
+    public void testContainsAll() {
+        LinkedList q = populatedQueue(SIZE);
+        LinkedList p = new LinkedList();
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(q.containsAll(p));
+            assertFalse(p.containsAll(q));
+            p.add(new Integer(i));
+        }
+        assertTrue(p.containsAll(q));
+    }
+
+    /**
+     * retainAll(c) retains only those elements of c and reports true if changed
+     */
+    public void testRetainAll() {
+        LinkedList q = populatedQueue(SIZE);
+        LinkedList p = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            boolean changed = q.retainAll(p);
+            if (i == 0)
+                assertFalse(changed);
+            else
+                assertTrue(changed);
+
+            assertTrue(q.containsAll(p));
+            assertEquals(SIZE-i, q.size());
+            p.remove();
+        }
+    }
+
+    /**
+     * removeAll(c) removes only those elements of c and reports true if changed
+     */
+    public void testRemoveAll() {
+        for (int i = 1; i < SIZE; ++i) {
+            LinkedList q = populatedQueue(SIZE);
+            LinkedList p = populatedQueue(i);
+            assertTrue(q.removeAll(p));
+            assertEquals(SIZE-i, q.size());
+            for (int j = 0; j < i; ++j) {
+                Integer I = (Integer)(p.remove());
+                assertFalse(q.contains(I));
+            }
+        }
+    }
+
+    /**
+     *  toArray contains all elements
+     */
+    public void testToArray() {
+        LinkedList q = populatedQueue(SIZE);
+	Object[] o = q.toArray();
+        Arrays.sort(o);
+	for(int i = 0; i < o.length; i++)
+	    assertEquals(o[i], q.poll());
+    }
+
+    /**
+     *  toArray(a) contains all elements
+     */
+    public void testToArray2() {
+        LinkedList q = populatedQueue(SIZE);
+	Integer[] ints = new Integer[SIZE];
+	ints = (Integer[])q.toArray(ints);
+        Arrays.sort(ints);
+        for(int i = 0; i < ints.length; i++)
+            assertEquals(ints[i], q.poll());
+    }
+
+    /**
+     * toArray(null) throws NPE
+     */
+    public void testToArray_BadArg() {
+	try {
+	    LinkedList l = new LinkedList();
+	    l.add(new Object());
+	    Object o[] = l.toArray(null);
+	    shouldThrow();
+	} catch(NullPointerException success){}
+    }
+
+    /**
+     * toArray with incompatable aray type throws CCE
+     */
+    public void testToArray1_BadArg() {
+	try {
+	    LinkedList l = new LinkedList();
+	    l.add(new Integer(5));
+	    Object o[] = l.toArray(new String[10] );
+	    shouldThrow();
+	} catch(ArrayStoreException  success){}
+    }
+
+    /**
+     *  iterator iterates through all elements
+     */
+    public void testIterator() {
+        LinkedList q = populatedQueue(SIZE);
+        int i = 0;
+	Iterator it = q.iterator();
+        while(it.hasNext()) {
+            assertTrue(q.contains(it.next()));
+            ++i;
+        }
+        assertEquals(i, SIZE);
+    }
+
+    /**
+     *  iterator ordering is FIFO
+     */
+    public void testIteratorOrdering() {
+        final LinkedList q = new LinkedList();
+        q.add(new Integer(1));
+        q.add(new Integer(2));
+        q.add(new Integer(3));
+        int k = 0;
+        for (Iterator it = q.iterator(); it.hasNext();) {
+            int i = ((Integer)(it.next())).intValue();
+            assertEquals(++k, i);
+        }
+
+        assertEquals(3, k);
+    }
+
+    /**
+     * iterator.remove removes current element
+     */
+    public void testIteratorRemove () {
+        final LinkedList q = new LinkedList();
+        q.add(new Integer(1));
+        q.add(new Integer(2));
+        q.add(new Integer(3));
+        Iterator it = q.iterator();
+        it.next();
+        it.remove();
+        it = q.iterator();
+        assertEquals(it.next(), new Integer(2));
+        assertEquals(it.next(), new Integer(3));
+        assertFalse(it.hasNext());
+    }
+
+    /**
+     *  Descending iterator iterates through all elements
+     */
+    public void testDescendingIterator() {
+        LinkedList q = populatedQueue(SIZE);
+        int i = 0;
+	Iterator it = q.descendingIterator();
+        while(it.hasNext()) {
+            assertTrue(q.contains(it.next()));
+            ++i;
+        }
+        assertEquals(i, SIZE);
+        assertFalse(it.hasNext());
+        try {
+            it.next();
+        } catch(NoSuchElementException success) {
+        }
+    }
+
+    /**
+     *  Descending iterator ordering is reverse FIFO
+     */
+    public void testDescendingIteratorOrdering() {
+        final LinkedList q = new LinkedList();
+        q.add(new Integer(3));
+        q.add(new Integer(2));
+        q.add(new Integer(1));
+        int k = 0;
+        for (Iterator it = q.descendingIterator(); it.hasNext();) {
+            int i = ((Integer)(it.next())).intValue();
+            assertEquals(++k, i);
+        }
+
+        assertEquals(3, k);
+    }
+
+    /**
+     * descendingIterator.remove removes current element
+     */
+    public void testDescendingIteratorRemove () {
+        final LinkedList q = new LinkedList();
+        q.add(new Integer(3));
+        q.add(new Integer(2));
+        q.add(new Integer(1));
+        Iterator it = q.descendingIterator();
+        it.next();
+        it.remove();
+        it = q.descendingIterator();
+        assertEquals(it.next(), new Integer(2));
+        assertEquals(it.next(), new Integer(3));
+        assertFalse(it.hasNext());
+    }
+
+
+    /**
+     * toString contains toStrings of elements
+     */
+    public void testToString() {
+        LinkedList q = populatedQueue(SIZE);
+        String s = q.toString();
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(s.indexOf(String.valueOf(i)) >= 0);
+        }
+    }
+
+    /**
+     * peek returns element inserted with addFirst
+     */
+    public void testAddFirst() {
+        LinkedList q = populatedQueue(3);
+	q.addFirst(four);
+	assertEquals(four,q.peek());
+    }
+
+    /**
+     * peekFirst returns element inserted with push
+     */
+    public void testPush() {
+        LinkedList q = populatedQueue(3);
+        q.pollLast();
+	q.push(four);
+	assertEquals(four,q.peekFirst());
+    }
+
+    /**
+     *  pop removes next element, or throws NSEE if empty
+     */
+    public void testPop() {
+        LinkedList q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.pop()).intValue());
+        }
+        try {
+            q.pop();
+            shouldThrow();
+        } catch (NoSuchElementException success){
+	}
+    }
+
+    /**
+     * OfferFirst succeeds
+     */
+    public void testOfferFirst() {
+        LinkedList q = new LinkedList();
+        assertTrue(q.offerFirst(new Integer(0)));
+        assertTrue(q.offerFirst(new Integer(1)));
+    }
+
+    /**
+     * OfferLast succeeds
+     */
+    public void testOfferLast() {
+        LinkedList q = new LinkedList();
+        assertTrue(q.offerLast(new Integer(0)));
+        assertTrue(q.offerLast(new Integer(1)));
+    }
+
+    /**
+     *  pollLast succeeds unless empty
+     */
+    public void testPollLast() {
+        LinkedList q = populatedQueue(SIZE);
+        for (int i = SIZE-1; i >= 0; --i) {
+            assertEquals(i, ((Integer)q.pollLast()).intValue());
+        }
+	assertNull(q.pollLast());
+    }
+
+    /**
+     *  peekFirst returns next element, or null if empty
+     */
+    public void testPeekFirst() {
+        LinkedList q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.peekFirst()).intValue());
+            q.pollFirst();
+            assertTrue(q.peekFirst() == null ||
+                       i != ((Integer)q.peekFirst()).intValue());
+        }
+	assertNull(q.peekFirst());
+    }
+
+
+    /**
+     *  peekLast returns next element, or null if empty
+     */
+    public void testPeekLast() {
+        LinkedList q = populatedQueue(SIZE);
+        for (int i = SIZE-1; i >= 0; --i) {
+            assertEquals(i, ((Integer)q.peekLast()).intValue());
+            q.pollLast();
+            assertTrue(q.peekLast() == null ||
+                       i != ((Integer)q.peekLast()).intValue());
+        }
+	assertNull(q.peekLast());
+    }
+
+    public void testFirstElement() {
+        LinkedList q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.getFirst()).intValue());
+            q.pollFirst();
+        }
+        try {
+            q.getFirst();
+            shouldThrow();
+        }
+        catch (NoSuchElementException success) {}
+    }
+
+    /**
+     *  getLast returns next element, or throws NSEE if empty
+     */
+    public void testLastElement() {
+        LinkedList q = populatedQueue(SIZE);
+        for (int i = SIZE-1; i >= 0; --i) {
+            assertEquals(i, ((Integer)q.getLast()).intValue());
+            q.pollLast();
+        }
+        try {
+            q.getLast();
+            shouldThrow();
+        }
+        catch (NoSuchElementException success) {}
+	assertNull(q.peekLast());
+    }
+
+    /**
+     * removeFirstOccurrence(x) removes x and returns true if present
+     */
+    public void testRemoveFirstOccurrence() {
+        LinkedList q = populatedQueue(SIZE);
+        for (int i = 1; i < SIZE; i+=2) {
+            assertTrue(q.removeFirstOccurrence(new Integer(i)));
+        }
+        for (int i = 0; i < SIZE; i+=2) {
+            assertTrue(q.removeFirstOccurrence(new Integer(i)));
+            assertFalse(q.removeFirstOccurrence(new Integer(i+1)));
+        }
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * removeLastOccurrence(x) removes x and returns true if present
+     */
+    public void testRemoveLastOccurrence() {
+        LinkedList q = populatedQueue(SIZE);
+        for (int i = 1; i < SIZE; i+=2) {
+            assertTrue(q.removeLastOccurrence(new Integer(i)));
+        }
+        for (int i = 0; i < SIZE; i+=2) {
+            assertTrue(q.removeLastOccurrence(new Integer(i)));
+            assertFalse(q.removeLastOccurrence(new Integer(i+1)));
+        }
+        assertTrue(q.isEmpty());
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/LockSupportTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/LockSupportTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/LockSupportTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,167 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+
+public class LockSupportTest extends JSR166TestCase{
+//    public static void main(String[] args) {
+//	junit.textui.TestRunner.run (suite());
+//    }
+//    public static Test suite() {
+//	return new TestSuite(LockSupportTest.class);
+//    }
+//
+//    /**
+//     * park is released by unpark occurring after park
+//     */
+//    public void testPark() {
+//	Thread t = new Thread(new Runnable() {
+//		public void run() {
+//		    try {
+//			LockSupport.park();
+//		    } catch(Exception e){
+//                        threadUnexpectedException();
+//                    }
+//		}
+//	    });
+//	try {
+//            t.start();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            LockSupport.unpark(t);
+//            t.join();
+//	}
+//	catch(Exception e) {
+//            unexpectedException();
+//        }
+//    }
+//
+//    /**
+//     * park is released by unpark occurring before park
+//     */
+//    public void testPark2() {
+//	Thread t = new Thread(new Runnable() {
+//		public void run() {
+//		    try {
+//                        Thread.sleep(SHORT_DELAY_MS);
+//			LockSupport.park();
+//		    } catch(Exception e){
+//                        threadUnexpectedException();
+//                    }
+//		}
+//	    });
+//	try {
+//            t.start();
+//            LockSupport.unpark(t);
+//            t.join();
+//	}
+//	catch(Exception e) {
+//            unexpectedException();
+//        }
+//    }
+//
+//    /**
+//     * park is released by interrupt
+//     */
+//    public void testPark3() {
+//	Thread t = new Thread(new Runnable() {
+//		public void run() {
+//		    try {
+//			LockSupport.park();
+//                        threadAssertTrue(Thread.interrupted());
+//		    } catch(Exception e){
+//                        threadUnexpectedException();
+//                    }
+//		}
+//	    });
+//	try {
+//            t.start();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            t.interrupt();
+//            t.join();
+//	}
+//	catch(Exception e) {
+//            unexpectedException();
+//        }
+//    }
+//
+//    /**
+//     * park returns if interrupted before park
+//     */
+//    public void testPark4() {
+//        final ReentrantLock lock = new ReentrantLock();
+//        lock.lock();
+//	Thread t = new Thread(new Runnable() {
+//		public void run() {
+//		    try {
+//                        lock.lock();
+//			LockSupport.park();
+//		    } catch(Exception e){
+//                        threadUnexpectedException();
+//                    }
+//		}
+//	    });
+//	try {
+//            t.start();
+//            t.interrupt();
+//            lock.unlock();
+//            t.join();
+//	}
+//	catch(Exception e) {
+//            unexpectedException();
+//        }
+//    }
+//
+//    /**
+//     * parkNanos times out if not unparked
+//     */
+//    public void testParkNanos() {
+//	Thread t = new Thread(new Runnable() {
+//		public void run() {
+//		    try {
+//			LockSupport.parkNanos(1000);
+//		    } catch(Exception e){
+//                        threadUnexpectedException();
+//                    }
+//		}
+//	    });
+//	try {
+//            t.start();
+//            t.join();
+//	}
+//	catch(Exception e) {
+//            unexpectedException();
+//        }
+//    }
+//
+//
+//    /**
+//     * parkUntil times out if not unparked
+//     */
+//    public void testParkUntil() {
+//	Thread t = new Thread(new Runnable() {
+//		public void run() {
+//		    try {
+//                        long d = new Date().getTime() + 100;
+//			LockSupport.parkUntil(d);
+//		    } catch(Exception e){
+//                        threadUnexpectedException();
+//                    }
+//		}
+//	    });
+//	try {
+//            t.start();
+//            t.join();
+//	}
+//	catch(Exception e) {
+//            unexpectedException();
+//        }
+//    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/PriorityBlockingQueueTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/PriorityBlockingQueueTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/PriorityBlockingQueueTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,960 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import java.io.*;
+import edu.emory.mathcs.backport.java.util.PriorityQueue;
+import java.util.Comparator;
+import java.util.Arrays;
+import java.util.NoSuchElementException;
+import java.util.Iterator;
+import java.util.ArrayList;
+
+public class PriorityBlockingQueueTest extends JSR166TestCase {
+    public static void main(String[] args) {
+        junit.textui.TestRunner.run (suite());
+    }
+    public static Test suite() {
+        return new TestSuite(PriorityBlockingQueueTest.class);
+    }
+
+    private static final int NOCAP = Integer.MAX_VALUE;
+
+    /** Sample Comparator */
+    static class MyReverseComparator implements Comparator {
+        public int compare(Object x, Object y) {
+            int i = ((Integer)x).intValue();
+            int j = ((Integer)y).intValue();
+            if (i < j) return 1;
+            if (i > j) return -1;
+            return 0;
+        }
+    }
+
+    /**
+     * Create a queue of given size containing consecutive
+     * Integers 0 ... n.
+     */
+    private PriorityBlockingQueue populatedQueue(int n) {
+        PriorityBlockingQueue q = new PriorityBlockingQueue(n);
+        assertTrue(q.isEmpty());
+        for(int i = n-1; i >= 0; i-=2)
+            assertTrue(q.offer(new Integer(i)));
+        for(int i = (n & 1); i < n; i+=2)
+            assertTrue(q.offer(new Integer(i)));
+        assertFalse(q.isEmpty());
+        assertEquals(NOCAP, q.remainingCapacity());
+        assertEquals(n, q.size());
+        return q;
+    }
+
+    /**
+     * A new queue has unbounded capacity
+     */
+    public void testConstructor1() {
+        assertEquals(NOCAP, new PriorityBlockingQueue(SIZE).remainingCapacity());
+    }
+
+    /**
+     * Constructor throws IAE if  capacity argument nonpositive
+     */
+    public void testConstructor2() {
+        try {
+            PriorityBlockingQueue q = new PriorityBlockingQueue(0);
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success) {}
+    }
+
+    /**
+     * Initializing from null Collection throws NPE
+     */
+    public void testConstructor3() {
+        try {
+            PriorityBlockingQueue q = new PriorityBlockingQueue(null);
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Initializing from Collection of null elements throws NPE
+     */
+    public void testConstructor4() {
+        try {
+            Integer[] ints = new Integer[SIZE];
+            PriorityBlockingQueue q = new PriorityBlockingQueue(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Initializing from Collection with some null elements throws NPE
+     */
+    public void testConstructor5() {
+        try {
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE-1; ++i)
+                ints[i] = new Integer(i);
+            PriorityBlockingQueue q = new PriorityBlockingQueue(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Queue contains all elements of collection used to initialize
+     */
+    public void testConstructor6() {
+        try {
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE; ++i)
+                ints[i] = new Integer(i);
+            PriorityBlockingQueue q = new PriorityBlockingQueue(Arrays.asList(ints));
+            for (int i = 0; i < SIZE; ++i)
+                assertEquals(ints[i], q.poll());
+        }
+        finally {}
+    }
+
+    /**
+     * The comparator used in constructor is used
+     */
+    public void testConstructor7() {
+        try {
+            MyReverseComparator cmp = new MyReverseComparator();
+            PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE, cmp);
+            assertEquals(cmp, q.comparator());
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE; ++i)
+                ints[i] = new Integer(i);
+            q.addAll(Arrays.asList(ints));
+            for (int i = SIZE-1; i >= 0; --i)
+                assertEquals(ints[i], q.poll());
+        }
+        finally {}
+    }
+
+    /**
+     * isEmpty is true before add, false after
+     */
+    public void testEmpty() {
+        PriorityBlockingQueue q = new PriorityBlockingQueue(2);
+        assertTrue(q.isEmpty());
+        assertEquals(NOCAP, q.remainingCapacity());
+        q.add(one);
+        assertFalse(q.isEmpty());
+        q.add(two);
+        q.remove();
+        q.remove();
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * remainingCapacity does not change when elements added or removed,
+     * but size does
+     */
+    public void testRemainingCapacity() {
+        PriorityBlockingQueue q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(NOCAP, q.remainingCapacity());
+            assertEquals(SIZE-i, q.size());
+            q.remove();
+        }
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(NOCAP, q.remainingCapacity());
+            assertEquals(i, q.size());
+            q.add(new Integer(i));
+        }
+    }
+
+    /**
+     * offer(null) throws NPE
+     */
+    public void testOfferNull() {
+        try {
+            PriorityBlockingQueue q = new PriorityBlockingQueue(1);
+            q.offer(null);
+            shouldThrow();
+        } catch (NullPointerException success) { }
+    }
+
+    /**
+     * add(null) throws NPE
+     */
+    public void testAddNull() {
+        try {
+            PriorityBlockingQueue q = new PriorityBlockingQueue(1);
+            q.add(null);
+            shouldThrow();
+        } catch (NullPointerException success) { }
+    }
+
+    /**
+     * Offer of comparable element succeeds
+     */
+    public void testOffer() {
+        PriorityBlockingQueue q = new PriorityBlockingQueue(1);
+        assertTrue(q.offer(zero));
+        assertTrue(q.offer(one));
+    }
+
+    /**
+     * Offer of non-Comparable throws CCE
+     */
+    public void testOfferNonComparable() {
+        try {
+            PriorityBlockingQueue q = new PriorityBlockingQueue(1);
+            q.offer(new Object());
+            q.offer(new Object());
+            q.offer(new Object());
+            shouldThrow();
+        }
+        catch(ClassCastException success) {}
+    }
+
+    /**
+     * add of comparable succeeds
+     */
+    public void testAdd() {
+        PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, q.size());
+            assertTrue(q.add(new Integer(i)));
+        }
+    }
+
+    /**
+     * addAll(null) throws NPE
+     */
+    public void testAddAll1() {
+        try {
+            PriorityBlockingQueue q = new PriorityBlockingQueue(1);
+            q.addAll(null);
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * addAll(this) throws IAE
+     */
+    public void testAddAllSelf() {
+        try {
+            PriorityBlockingQueue q = populatedQueue(SIZE);
+            q.addAll(q);
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success) {}
+    }
+
+    /**
+     * addAll of a collection with null elements throws NPE
+     */
+    public void testAddAll2() {
+        try {
+            PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE);
+            Integer[] ints = new Integer[SIZE];
+            q.addAll(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+    /**
+     * addAll of a collection with any null elements throws NPE after
+     * possibly adding some elements
+     */
+    public void testAddAll3() {
+        try {
+            PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE);
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE-1; ++i)
+                ints[i] = new Integer(i);
+            q.addAll(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Queue contains all elements of successful addAll
+     */
+    public void testAddAll5() {
+        try {
+            Integer[] empty = new Integer[0];
+            Integer[] ints = new Integer[SIZE];
+            for (int i = SIZE-1; i >= 0; --i)
+                ints[i] = new Integer(i);
+            PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE);
+            assertFalse(q.addAll(Arrays.asList(empty)));
+            assertTrue(q.addAll(Arrays.asList(ints)));
+            for (int i = 0; i < SIZE; ++i)
+                assertEquals(ints[i], q.poll());
+        }
+        finally {}
+    }
+
+    /**
+     * put(null) throws NPE
+     */
+     public void testPutNull() {
+        try {
+            PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE);
+            q.put(null);
+            shouldThrow();
+        }
+        catch (NullPointerException success){
+        }
+     }
+
+    /**
+     * all elements successfully put are contained
+     */
+     public void testPut() {
+         try {
+             PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE);
+             for (int i = 0; i < SIZE; ++i) {
+                 Integer I = new Integer(i);
+                 q.put(I);
+                 assertTrue(q.contains(I));
+             }
+             assertEquals(SIZE, q.size());
+         }
+         finally {
+        }
+    }
+
+    /**
+     * put doesn't block waiting for take
+     */
+    public void testPutWithTake() {
+        final PriorityBlockingQueue q = new PriorityBlockingQueue(2);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    int added = 0;
+                    try {
+                        q.put(new Integer(0));
+                        ++added;
+                        q.put(new Integer(0));
+                        ++added;
+                        q.put(new Integer(0));
+                        ++added;
+                        q.put(new Integer(0));
+                        ++added;
+                        threadAssertTrue(added == 4);
+                    } finally {
+                    }
+                }
+            });
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            q.take();
+            t.interrupt();
+            t.join();
+        } catch (Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * timed offer does not time out
+     */
+    public void testTimedOffer() {
+        final PriorityBlockingQueue q = new PriorityBlockingQueue(2);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        q.put(new Integer(0));
+                        q.put(new Integer(0));
+                        threadAssertTrue(q.offer(new Integer(0), SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+                        threadAssertTrue(q.offer(new Integer(0), LONG_DELAY_MS, TimeUnit.MILLISECONDS));
+                    } finally { }
+                }
+            });
+
+        try {
+            t.start();
+            Thread.sleep(SMALL_DELAY_MS);
+            t.interrupt();
+            t.join();
+        } catch (Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * take retrieves elements in priority order
+     */
+    public void testTake() {
+        try {
+            PriorityBlockingQueue q = populatedQueue(SIZE);
+            for (int i = 0; i < SIZE; ++i) {
+                assertEquals(i, ((Integer)q.take()).intValue());
+            }
+        } catch (InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * take blocks interruptibly when empty
+     */
+    public void testTakeFromEmpty() {
+        final PriorityBlockingQueue q = new PriorityBlockingQueue(2);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        q.take();
+                        threadShouldThrow();
+                    } catch (InterruptedException success){ }
+                }
+            });
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            t.interrupt();
+            t.join();
+        } catch (Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * Take removes existing elements until empty, then blocks interruptibly
+     */
+    public void testBlockingTake() {
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        PriorityBlockingQueue q = populatedQueue(SIZE);
+                        for (int i = 0; i < SIZE; ++i) {
+                            threadAssertEquals(i, ((Integer)q.take()).intValue());
+                        }
+                        q.take();
+                        threadShouldThrow();
+                    } catch (InterruptedException success){
+                    }
+                }});
+        t.start();
+        try {
+           Thread.sleep(SHORT_DELAY_MS);
+           t.interrupt();
+           t.join();
+        }
+        catch (InterruptedException ie) {
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * poll succeeds unless empty
+     */
+    public void testPoll() {
+        PriorityBlockingQueue q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.poll()).intValue());
+        }
+        assertNull(q.poll());
+    }
+
+    /**
+     * timed pool with zero timeout succeeds when non-empty, else times out
+     */
+    public void testTimedPoll0() {
+        try {
+            PriorityBlockingQueue q = populatedQueue(SIZE);
+            for (int i = 0; i < SIZE; ++i) {
+                assertEquals(i, ((Integer)q.poll(0, TimeUnit.MILLISECONDS)).intValue());
+            }
+            assertNull(q.poll(0, TimeUnit.MILLISECONDS));
+        } catch (InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * timed pool with nonzero timeout succeeds when non-empty, else times out
+     */
+    public void testTimedPoll() {
+        try {
+            PriorityBlockingQueue q = populatedQueue(SIZE);
+            for (int i = 0; i < SIZE; ++i) {
+                assertEquals(i, ((Integer)q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS)).intValue());
+            }
+            assertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+        } catch (InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * Interrupted timed poll throws InterruptedException instead of
+     * returning timeout status
+     */
+    public void testInterruptedTimedPoll() {
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        PriorityBlockingQueue q = populatedQueue(SIZE);
+                        for (int i = 0; i < SIZE; ++i) {
+                            threadAssertEquals(i, ((Integer)q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS)).intValue());
+                        }
+                        threadAssertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+                    } catch (InterruptedException success){
+                    }
+                }});
+        t.start();
+        try {
+           Thread.sleep(SHORT_DELAY_MS);
+           t.interrupt();
+           t.join();
+        }
+        catch (InterruptedException ie) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     *  timed poll before a delayed offer fails; after offer succeeds;
+     *  on interruption throws
+     */
+    public void testTimedPollWithOffer() {
+        final PriorityBlockingQueue q = new PriorityBlockingQueue(2);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        threadAssertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+                        q.poll(LONG_DELAY_MS, TimeUnit.MILLISECONDS);
+                        q.poll(LONG_DELAY_MS, TimeUnit.MILLISECONDS);
+                        threadShouldThrow();
+                    } catch (InterruptedException success) { }
+                }
+            });
+        try {
+            t.start();
+            Thread.sleep(SMALL_DELAY_MS);
+            assertTrue(q.offer(new Integer(0), SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+            t.interrupt();
+            t.join();
+        } catch (Exception e){
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * peek returns next element, or null if empty
+     */
+    public void testPeek() {
+        PriorityBlockingQueue q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.peek()).intValue());
+            q.poll();
+            assertTrue(q.peek() == null ||
+                       i != ((Integer)q.peek()).intValue());
+        }
+        assertNull(q.peek());
+    }
+
+    /**
+     * element returns next element, or throws NSEE if empty
+     */
+    public void testElement() {
+        PriorityBlockingQueue q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.element()).intValue());
+            q.poll();
+        }
+        try {
+            q.element();
+            shouldThrow();
+        }
+        catch (NoSuchElementException success) {}
+    }
+
+    /**
+     * remove removes next element, or throws NSEE if empty
+     */
+    public void testRemove() {
+        PriorityBlockingQueue q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.remove()).intValue());
+        }
+        try {
+            q.remove();
+            shouldThrow();
+        } catch (NoSuchElementException success){
+        }
+    }
+
+    /**
+     * remove(x) removes x and returns true if present
+     */
+    public void testRemoveElement() {
+        PriorityBlockingQueue q = populatedQueue(SIZE);
+        for (int i = 1; i < SIZE; i+=2) {
+            assertTrue(q.remove(new Integer(i)));
+        }
+        for (int i = 0; i < SIZE; i+=2) {
+            assertTrue(q.remove(new Integer(i)));
+            assertFalse(q.remove(new Integer(i+1)));
+        }
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * contains(x) reports true when elements added but not yet removed
+     */
+    public void testContains() {
+        PriorityBlockingQueue q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(q.contains(new Integer(i)));
+            q.poll();
+            assertFalse(q.contains(new Integer(i)));
+        }
+    }
+
+    /**
+     * clear removes all elements
+     */
+    public void testClear() {
+        PriorityBlockingQueue q = populatedQueue(SIZE);
+        q.clear();
+        assertTrue(q.isEmpty());
+        assertEquals(0, q.size());
+        q.add(one);
+        assertFalse(q.isEmpty());
+        assertTrue(q.contains(one));
+        q.clear();
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * containsAll(c) is true when c contains a subset of elements
+     */
+    public void testContainsAll() {
+        PriorityBlockingQueue q = populatedQueue(SIZE);
+        PriorityBlockingQueue p = new PriorityBlockingQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(q.containsAll(p));
+            assertFalse(p.containsAll(q));
+            p.add(new Integer(i));
+        }
+        assertTrue(p.containsAll(q));
+    }
+
+    /**
+     * retainAll(c) retains only those elements of c and reports true if changed
+     */
+    public void testRetainAll() {
+        PriorityBlockingQueue q = populatedQueue(SIZE);
+        PriorityBlockingQueue p = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            boolean changed = q.retainAll(p);
+            if (i == 0)
+                assertFalse(changed);
+            else
+                assertTrue(changed);
+
+            assertTrue(q.containsAll(p));
+            assertEquals(SIZE-i, q.size());
+            p.remove();
+        }
+    }
+
+    /**
+     * removeAll(c) removes only those elements of c and reports true if changed
+     */
+    public void testRemoveAll() {
+        for (int i = 1; i < SIZE; ++i) {
+            PriorityBlockingQueue q = populatedQueue(SIZE);
+            PriorityBlockingQueue p = populatedQueue(i);
+            assertTrue(q.removeAll(p));
+            assertEquals(SIZE-i, q.size());
+            for (int j = 0; j < i; ++j) {
+                Integer I = (Integer)(p.remove());
+                assertFalse(q.contains(I));
+            }
+        }
+    }
+
+    /**
+     *  toArray contains all elements
+     */
+    public void testToArray() {
+        PriorityBlockingQueue q = populatedQueue(SIZE);
+        Object[] o = q.toArray();
+        Arrays.sort(o);
+        try {
+        for(int i = 0; i < o.length; i++)
+            assertEquals(o[i], q.take());
+        } catch (InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * toArray(a) contains all elements
+     */
+    public void testToArray2() {
+        PriorityBlockingQueue q = populatedQueue(SIZE);
+        Integer[] ints = new Integer[SIZE];
+        ints = (Integer[])q.toArray(ints);
+        Arrays.sort(ints);
+        try {
+            for(int i = 0; i < ints.length; i++)
+                assertEquals(ints[i], q.take());
+        } catch (InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * toArray(null) throws NPE
+     */
+    public void testToArray_BadArg() {
+        try {
+            PriorityBlockingQueue q = populatedQueue(SIZE);
+            Object o[] = q.toArray(null);
+            shouldThrow();
+        } catch(NullPointerException success){}
+    }
+
+    /**
+     * toArray with incompatible array type throws CCE
+     */
+    public void testToArray1_BadArg() {
+        try {
+            PriorityBlockingQueue q = populatedQueue(SIZE);
+            Object o[] = q.toArray(new String[10] );
+            shouldThrow();
+        } catch(ArrayStoreException  success){}
+    }
+
+    /**
+     * iterator iterates through all elements
+     */
+    public void testIterator() {
+        PriorityBlockingQueue q = populatedQueue(SIZE);
+        int i = 0;
+        Iterator it = q.iterator();
+        while(it.hasNext()) {
+            assertTrue(q.contains(it.next()));
+            ++i;
+        }
+        assertEquals(i, SIZE);
+    }
+
+    /**
+     * iterator.remove removes current element
+     */
+    public void testIteratorRemove () {
+        final PriorityBlockingQueue q = new PriorityBlockingQueue(3);
+        q.add(new Integer(2));
+        q.add(new Integer(1));
+        q.add(new Integer(3));
+
+        Iterator it = q.iterator();
+        it.next();
+        it.remove();
+
+        it = q.iterator();
+        assertEquals(it.next(), new Integer(2));
+        assertEquals(it.next(), new Integer(3));
+        assertFalse(it.hasNext());
+    }
+
+
+    /**
+     * toString contains toStrings of elements
+     */
+    public void testToString() {
+        PriorityBlockingQueue q = populatedQueue(SIZE);
+        String s = q.toString();
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(s.indexOf(String.valueOf(i)) >= 0);
+        }
+    }
+
+    /**
+     * offer transfers elements across Executor tasks
+     */
+    public void testPollInExecutor() {
+        final PriorityBlockingQueue q = new PriorityBlockingQueue(2);
+        ExecutorService executor = Executors.newFixedThreadPool(2);
+        executor.execute(new Runnable() {
+            public void run() {
+                threadAssertNull(q.poll());
+                try {
+                    threadAssertTrue(null != q.poll(MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS));
+                    threadAssertTrue(q.isEmpty());
+                }
+                catch (InterruptedException e) {
+                    threadUnexpectedException();
+                }
+            }
+        });
+
+        executor.execute(new Runnable() {
+            public void run() {
+                try {
+                    Thread.sleep(SMALL_DELAY_MS);
+                    q.put(new Integer(1));
+                }
+                catch (InterruptedException e) {
+                    threadUnexpectedException();
+                }
+            }
+        });
+
+        joinPool(executor);
+    }
+
+    /**
+     * A deserialized serialized queue has same elements
+     */
+    public void testSerialization() {
+        PriorityBlockingQueue q = populatedQueue(SIZE);
+        try {
+            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
+            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
+            out.writeObject(q);
+            out.close();
+
+            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
+            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
+            PriorityBlockingQueue r = (PriorityBlockingQueue)in.readObject();
+            assertEquals(q.size(), r.size());
+            while (!q.isEmpty())
+                assertEquals(q.remove(), r.remove());
+        } catch(Exception e){
+            e.printStackTrace();
+            unexpectedException();
+        }
+    }
+
+    /**
+     * drainTo(null) throws NPE
+     */
+    public void testDrainToNull() {
+        PriorityBlockingQueue q = populatedQueue(SIZE);
+        try {
+            q.drainTo(null);
+            shouldThrow();
+        } catch(NullPointerException success) {
+        }
+    }
+
+    /**
+     * drainTo(this) throws IAE
+     */
+    public void testDrainToSelf() {
+        PriorityBlockingQueue q = populatedQueue(SIZE);
+        try {
+            q.drainTo(q);
+            shouldThrow();
+        } catch(IllegalArgumentException success) {
+        }
+    }
+
+    /**
+     * drainTo(c) empties queue into another collection c
+     */
+    public void testDrainTo() {
+        PriorityBlockingQueue q = populatedQueue(SIZE);
+        ArrayList l = new ArrayList();
+        q.drainTo(l);
+        assertEquals(q.size(), 0);
+        assertEquals(l.size(), SIZE);
+        for (int i = 0; i < SIZE; ++i)
+            assertEquals(l.get(i), new Integer(i));
+        q.add(zero);
+        q.add(one);
+        assertFalse(q.isEmpty());
+        assertTrue(q.contains(zero));
+        assertTrue(q.contains(one));
+        l.clear();
+        q.drainTo(l);
+        assertEquals(q.size(), 0);
+        assertEquals(l.size(), 2);
+        for (int i = 0; i < 2; ++i)
+            assertEquals(l.get(i), new Integer(i));
+    }
+
+    /**
+     * drainTo empties queue
+     */
+    public void testDrainToWithActivePut() {
+        final PriorityBlockingQueue q = populatedQueue(SIZE);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    q.put(new Integer(SIZE+1));
+                }
+            });
+        try {
+            t.start();
+            ArrayList l = new ArrayList();
+            q.drainTo(l);
+            assertTrue(l.size() >= SIZE);
+            for (int i = 0; i < SIZE; ++i)
+                assertEquals(l.get(i), new Integer(i));
+            t.join();
+            assertTrue(q.size() + l.size() >= SIZE);
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * drainTo(null, n) throws NPE
+     */
+    public void testDrainToNullN() {
+        PriorityBlockingQueue q = populatedQueue(SIZE);
+        try {
+            q.drainTo(null, 0);
+            shouldThrow();
+        } catch(NullPointerException success) {
+        }
+    }
+
+    /**
+     * drainTo(this, n) throws IAE
+     */
+    public void testDrainToSelfN() {
+        PriorityBlockingQueue q = populatedQueue(SIZE);
+        try {
+            q.drainTo(q, 0);
+            shouldThrow();
+        } catch(IllegalArgumentException success) {
+        }
+    }
+
+    /**
+     * drainTo(c, n) empties first max {n, size} elements of queue into c
+     */
+    public void testDrainToN() {
+        PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE*2);
+        for (int i = 0; i < SIZE + 2; ++i) {
+            for(int j = 0; j < SIZE; j++)
+                assertTrue(q.offer(new Integer(j)));
+            ArrayList l = new ArrayList();
+            q.drainTo(l, i);
+            int k = (i < SIZE)? i : SIZE;
+            assertEquals(l.size(), k);
+            assertEquals(q.size(), SIZE-k);
+            for (int j = 0; j < k; ++j)
+                assertEquals(l.get(j), new Integer(j));
+            while (q.poll() != null) ;
+        }
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/PriorityQueueTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/PriorityQueueTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/PriorityQueueTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,517 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.PriorityQueue;
+import java.io.*;
+import java.util.Comparator;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.NoSuchElementException;
+import java.util.Iterator;
+
+public class PriorityQueueTest extends JSR166TestCase {
+    public static void main(String[] args) {
+	junit.textui.TestRunner.run (suite());
+    }
+    public static Test suite() {
+	return new TestSuite(PriorityQueueTest.class);
+    }
+
+    static class MyReverseComparator implements Comparator {
+        public int compare(Object x, Object y) {
+            int i = ((Integer)x).intValue();
+            int j = ((Integer)y).intValue();
+            if (i < j) return 1;
+            if (i > j) return -1;
+            return 0;
+        }
+    }
+
+    /**
+     * Create a queue of given size containing consecutive
+     * Integers 0 ... n.
+     */
+    private PriorityQueue populatedQueue(int n) {
+        PriorityQueue q = new PriorityQueue(n);
+        assertTrue(q.isEmpty());
+	for(int i = n-1; i >= 0; i-=2)
+	    assertTrue(q.offer(new Integer(i)));
+	for(int i = (n & 1); i < n; i+=2)
+	    assertTrue(q.offer(new Integer(i)));
+        assertFalse(q.isEmpty());
+	assertEquals(n, q.size());
+        return q;
+    }
+
+    /**
+     * A new queue has unbounded capacity
+     */
+    public void testConstructor1() {
+        assertEquals(0, new PriorityQueue(SIZE).size());
+    }
+
+    /**
+     * Constructor throws IAE if  capacity argument nonpositive
+     */
+    public void testConstructor2() {
+        try {
+            PriorityQueue q = new PriorityQueue(0);
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success) {}
+    }
+
+    /**
+     * Initializing from null Collection throws NPE
+     */
+    public void testConstructor3() {
+        try {
+            PriorityQueue q = new PriorityQueue((Collection)null);
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Initializing from Collection of null elements throws NPE
+     */
+    public void testConstructor4() {
+        try {
+            Integer[] ints = new Integer[SIZE];
+            PriorityQueue q = new PriorityQueue(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Initializing from Collection with some null elements throws NPE
+     */
+    public void testConstructor5() {
+        try {
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE-1; ++i)
+                ints[i] = new Integer(i);
+            PriorityQueue q = new PriorityQueue(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Queue contains all elements of collection used to initialize
+     */
+    public void testConstructor6() {
+        try {
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE; ++i)
+                ints[i] = new Integer(i);
+            PriorityQueue q = new PriorityQueue(Arrays.asList(ints));
+            for (int i = 0; i < SIZE; ++i)
+                assertEquals(ints[i], q.poll());
+        }
+        finally {}
+    }
+
+    /**
+     * The comparator used in constructor is used
+     */
+    public void testConstructor7() {
+        try {
+            MyReverseComparator cmp = new MyReverseComparator();
+            PriorityQueue q = new PriorityQueue(SIZE, cmp);
+            assertEquals(cmp, q.comparator());
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE; ++i)
+                ints[i] = new Integer(i);
+            q.addAll(Arrays.asList(ints));
+            for (int i = SIZE-1; i >= 0; --i)
+                assertEquals(ints[i], q.poll());
+        }
+        finally {}
+    }
+
+    /**
+     * isEmpty is true before add, false after
+     */
+    public void testEmpty() {
+        PriorityQueue q = new PriorityQueue(2);
+        assertTrue(q.isEmpty());
+        q.add(new Integer(1));
+        assertFalse(q.isEmpty());
+        q.add(new Integer(2));
+        q.remove();
+        q.remove();
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * size changes when elements added and removed
+     */
+    public void testSize() {
+        PriorityQueue q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(SIZE-i, q.size());
+            q.remove();
+        }
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, q.size());
+            q.add(new Integer(i));
+        }
+    }
+
+    /**
+     * offer(null) throws NPE
+     */
+    public void testOfferNull() {
+	try {
+            PriorityQueue q = new PriorityQueue(1);
+            q.offer(null);
+            shouldThrow();
+        } catch (NullPointerException success) { }
+    }
+
+    /**
+     * add(null) throws NPE
+     */
+    public void testAddNull() {
+	try {
+            PriorityQueue q = new PriorityQueue(1);
+            q.add(null);
+            shouldThrow();
+        } catch (NullPointerException success) { }
+    }
+
+    /**
+     * Offer of comparable element succeeds
+     */
+    public void testOffer() {
+        PriorityQueue q = new PriorityQueue(1);
+        assertTrue(q.offer(zero));
+        assertTrue(q.offer(one));
+    }
+
+    /**
+     * Offer of non-Comparable throws CCE
+     */
+    public void testOfferNonComparable() {
+        try {
+            PriorityQueue q = new PriorityQueue(1);
+            q.offer(new Object());
+            q.offer(new Object());
+            q.offer(new Object());
+            shouldThrow();
+        }
+        catch(ClassCastException success) {}
+    }
+
+    /**
+     * add of comparable succeeds
+     */
+    public void testAdd() {
+        PriorityQueue q = new PriorityQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, q.size());
+            assertTrue(q.add(new Integer(i)));
+        }
+    }
+
+    /**
+     * addAll(null) throws NPE
+     */
+    public void testAddAll1() {
+        try {
+            PriorityQueue q = new PriorityQueue(1);
+            q.addAll(null);
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+    /**
+     * addAll of a collection with null elements throws NPE
+     */
+    public void testAddAll2() {
+        try {
+            PriorityQueue q = new PriorityQueue(SIZE);
+            Integer[] ints = new Integer[SIZE];
+            q.addAll(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+    /**
+     * addAll of a collection with any null elements throws NPE after
+     * possibly adding some elements
+     */
+    public void testAddAll3() {
+        try {
+            PriorityQueue q = new PriorityQueue(SIZE);
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE-1; ++i)
+                ints[i] = new Integer(i);
+            q.addAll(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Queue contains all elements of successful addAll
+     */
+    public void testAddAll5() {
+        try {
+            Integer[] empty = new Integer[0];
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE; ++i)
+                ints[i] = new Integer(SIZE-1-i);
+            PriorityQueue q = new PriorityQueue(SIZE);
+            assertFalse(q.addAll(Arrays.asList(empty)));
+            assertTrue(q.addAll(Arrays.asList(ints)));
+            for (int i = 0; i < SIZE; ++i)
+                assertEquals(new Integer(i), q.poll());
+        }
+        finally {}
+    }
+
+    /**
+     * poll succeeds unless empty
+     */
+    public void testPoll() {
+        PriorityQueue q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.poll()).intValue());
+        }
+	assertNull(q.poll());
+    }
+
+    /**
+     * peek returns next element, or null if empty
+     */
+    public void testPeek() {
+        PriorityQueue q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.peek()).intValue());
+            q.poll();
+            assertTrue(q.peek() == null ||
+                       i != ((Integer)q.peek()).intValue());
+        }
+	assertNull(q.peek());
+    }
+
+    /**
+     * element returns next element, or throws NSEE if empty
+     */
+    public void testElement() {
+        PriorityQueue q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.element()).intValue());
+            q.poll();
+        }
+        try {
+            q.element();
+            shouldThrow();
+        }
+        catch (NoSuchElementException success) {}
+    }
+
+    /**
+     * remove removes next element, or throws NSEE if empty
+     */
+    public void testRemove() {
+        PriorityQueue q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.remove()).intValue());
+        }
+        try {
+            q.remove();
+            shouldThrow();
+        } catch (NoSuchElementException success){
+	}
+    }
+
+    /**
+     * remove(x) removes x and returns true if present
+     */
+    public void testRemoveElement() {
+        PriorityQueue q = populatedQueue(SIZE);
+        for (int i = 1; i < SIZE; i+=2) {
+            assertTrue(q.remove(new Integer(i)));
+        }
+        for (int i = 0; i < SIZE; i+=2) {
+            assertTrue(q.remove(new Integer(i)));
+            assertFalse(q.remove(new Integer(i+1)));
+        }
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * contains(x) reports true when elements added but not yet removed
+     */
+    public void testContains() {
+        PriorityQueue q = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(q.contains(new Integer(i)));
+            q.poll();
+            assertFalse(q.contains(new Integer(i)));
+        }
+    }
+
+    /**
+     * clear removes all elements
+     */
+    public void testClear() {
+        PriorityQueue q = populatedQueue(SIZE);
+        q.clear();
+        assertTrue(q.isEmpty());
+        assertEquals(0, q.size());
+        q.add(new Integer(1));
+        assertFalse(q.isEmpty());
+        q.clear();
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * containsAll(c) is true when c contains a subset of elements
+     */
+    public void testContainsAll() {
+        PriorityQueue q = populatedQueue(SIZE);
+        PriorityQueue p = new PriorityQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(q.containsAll(p));
+            assertFalse(p.containsAll(q));
+            p.add(new Integer(i));
+        }
+        assertTrue(p.containsAll(q));
+    }
+
+    /**
+     * retainAll(c) retains only those elements of c and reports true if changed
+     */
+    public void testRetainAll() {
+        PriorityQueue q = populatedQueue(SIZE);
+        PriorityQueue p = populatedQueue(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            boolean changed = q.retainAll(p);
+            if (i == 0)
+                assertFalse(changed);
+            else
+                assertTrue(changed);
+
+            assertTrue(q.containsAll(p));
+            assertEquals(SIZE-i, q.size());
+            p.remove();
+        }
+    }
+
+    /**
+     * removeAll(c) removes only those elements of c and reports true if changed
+     */
+    public void testRemoveAll() {
+        for (int i = 1; i < SIZE; ++i) {
+            PriorityQueue q = populatedQueue(SIZE);
+            PriorityQueue p = populatedQueue(i);
+            assertTrue(q.removeAll(p));
+            assertEquals(SIZE-i, q.size());
+            for (int j = 0; j < i; ++j) {
+                Integer I = (Integer)(p.remove());
+                assertFalse(q.contains(I));
+            }
+        }
+    }
+
+    /**
+     * toArray contains all elements
+     */
+    public void testToArray() {
+        PriorityQueue q = populatedQueue(SIZE);
+	Object[] o = q.toArray();
+        Arrays.sort(o);
+	for(int i = 0; i < o.length; i++)
+	    assertEquals(o[i], q.poll());
+    }
+
+    /**
+     * toArray(a) contains all elements
+     */
+    public void testToArray2() {
+        PriorityQueue q = populatedQueue(SIZE);
+	Integer[] ints = new Integer[SIZE];
+	ints = (Integer[])q.toArray(ints);
+        Arrays.sort(ints);
+        for(int i = 0; i < ints.length; i++)
+            assertEquals(ints[i], q.poll());
+    }
+
+    /**
+     * iterator iterates through all elements
+     */
+    public void testIterator() {
+        PriorityQueue q = populatedQueue(SIZE);
+        int i = 0;
+	Iterator it = q.iterator();
+        while(it.hasNext()) {
+            assertTrue(q.contains(it.next()));
+            ++i;
+        }
+        assertEquals(i, SIZE);
+    }
+
+    /**
+     * iterator.remove removes current element
+     */
+    public void testIteratorRemove () {
+        final PriorityQueue q = new PriorityQueue(3);
+        q.add(new Integer(2));
+        q.add(new Integer(1));
+        q.add(new Integer(3));
+
+        Iterator it = q.iterator();
+        it.next();
+        it.remove();
+
+        it = q.iterator();
+        assertEquals(it.next(), new Integer(2));
+        assertEquals(it.next(), new Integer(3));
+        assertFalse(it.hasNext());
+    }
+
+
+    /**
+     * toString contains toStrings of elements
+     */
+    public void testToString() {
+        PriorityQueue q = populatedQueue(SIZE);
+        String s = q.toString();
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(s.indexOf(String.valueOf(i)) >= 0);
+        }
+    }
+
+    /**
+     * A deserialized serialized queue has same elements
+     */
+    public void testSerialization() {
+        PriorityQueue q = populatedQueue(SIZE);
+        try {
+            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
+            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
+            out.writeObject(q);
+            out.close();
+
+            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
+            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
+            PriorityQueue r = (PriorityQueue)in.readObject();
+            assertEquals(q.size(), r.size());
+            while (!q.isEmpty())
+                assertEquals(q.remove(), r.remove());
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/ReentrantLockTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/ReentrantLockTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/ReentrantLockTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,1163 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.Utils;
+
+import java.io.*;
+import java.util.Collection;
+
+public class ReentrantLockTest extends JSR166TestCase {
+    public static void main(String[] args) {
+        junit.textui.TestRunner.run (suite());
+    }
+    public static Test suite() {
+        return new TestSuite(ReentrantLockTest.class);
+    }
+
+    /**
+     * A runnable calling lockInterruptibly
+     */
+    class InterruptibleLockRunnable implements Runnable {
+        final ReentrantLock lock;
+        InterruptibleLockRunnable(ReentrantLock l) { lock = l; }
+        public void run() {
+            try {
+                lock.lockInterruptibly();
+            } catch(InterruptedException success){}
+        }
+    }
+
+
+    /**
+     * A runnable calling lockInterruptibly that expects to be
+     * interrupted
+     */
+    class InterruptedLockRunnable implements Runnable {
+        final ReentrantLock lock;
+        InterruptedLockRunnable(ReentrantLock l) { lock = l; }
+        public void run() {
+            try {
+                lock.lockInterruptibly();
+                threadShouldThrow();
+            } catch(InterruptedException success){}
+        }
+    }
+
+    /**
+     * Subclass to expose protected methods
+     */
+    static class PublicReentrantLock extends ReentrantLock {
+        PublicReentrantLock() { super(); }
+        PublicReentrantLock(boolean fair) { super(fair); }
+        public Collection getQueuedThreads() {
+            return super.getQueuedThreads();
+        }
+        public Collection getWaitingThreads(Condition c) {
+            return super.getWaitingThreads(c);
+        }
+    }
+
+    /**
+     * Constructor sets given fairness
+     */
+    public void testConstructor() {
+        ReentrantLock rl = new ReentrantLock();
+        assertFalse(rl.isFair());
+        ReentrantLock r2 = new ReentrantLock(true);
+        assertTrue(r2.isFair());
+    }
+
+    /**
+     * locking an unlocked lock succeeds
+     */
+    public void testLock() {
+        ReentrantLock rl = new ReentrantLock();
+        rl.lock();
+        assertTrue(rl.isLocked());
+        rl.unlock();
+    }
+
+    /**
+     * locking an unlocked fair lock succeeds
+     */
+    public void testFairLock() {
+        ReentrantLock rl = new ReentrantLock(true);
+        rl.lock();
+        assertTrue(rl.isLocked());
+        rl.unlock();
+    }
+
+    /**
+     * Unlocking an unlocked lock throws IllegalMonitorStateException
+     */
+    public void testUnlock_IllegalMonitorStateException() {
+        ReentrantLock rl = new ReentrantLock();
+        try {
+            rl.unlock();
+            shouldThrow();
+
+        } catch(IllegalMonitorStateException success){}
+    }
+
+    /**
+     * tryLock on an unlocked lock succeeds
+     */
+    public void testTryLock() {
+        ReentrantLock rl = new ReentrantLock();
+        assertTrue(rl.tryLock());
+        assertTrue(rl.isLocked());
+        rl.unlock();
+    }
+
+
+    /**
+     * hasQueuedThreads reports whether there are waiting threads
+     */
+    public void testhasQueuedThreads() {
+        final ReentrantLock lock = new ReentrantLock(true); // originally was non-fair
+        Thread t1 = new Thread(new InterruptedLockRunnable(lock));
+        Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
+        try {
+            assertFalse(lock.hasQueuedThreads());
+            lock.lock();
+            t1.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertTrue(lock.hasQueuedThreads());
+            t2.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertTrue(lock.hasQueuedThreads());
+            t1.interrupt();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertTrue(lock.hasQueuedThreads());
+            lock.unlock();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertFalse(lock.hasQueuedThreads());
+            t1.join();
+            t2.join();
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * getQueueLength reports number of waiting threads
+     */
+    public void testGetQueueLength() {
+        final ReentrantLock lock = new ReentrantLock(true); // originally was non-fair
+        Thread t1 = new Thread(new InterruptedLockRunnable(lock));
+        Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
+        try {
+            assertEquals(0, lock.getQueueLength());
+            lock.lock();
+            t1.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertEquals(1, lock.getQueueLength());
+            t2.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertEquals(2, lock.getQueueLength());
+            t1.interrupt();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertEquals(1, lock.getQueueLength());
+            lock.unlock();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertEquals(0, lock.getQueueLength());
+            t1.join();
+            t2.join();
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * getQueueLength reports number of waiting threads
+     */
+    public void testGetQueueLength_fair() {
+        final ReentrantLock lock = new ReentrantLock(true);
+        Thread t1 = new Thread(new InterruptedLockRunnable(lock));
+        Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
+        try {
+            assertEquals(0, lock.getQueueLength());
+            lock.lock();
+            t1.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertEquals(1, lock.getQueueLength());
+            t2.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertEquals(2, lock.getQueueLength());
+            t1.interrupt();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertEquals(1, lock.getQueueLength());
+            lock.unlock();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertEquals(0, lock.getQueueLength());
+            t1.join();
+            t2.join();
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * hasQueuedThread(null) throws NPE
+     */
+    public void testHasQueuedThreadNPE() {
+        final ReentrantLock sync = new ReentrantLock(true); // originally was non-fair
+        try {
+            sync.hasQueuedThread(null);
+            shouldThrow();
+        } catch (NullPointerException success) {
+        }
+    }
+
+    /**
+     * hasQueuedThread reports whether a thread is queued.
+     */
+    public void testHasQueuedThread() {
+        final ReentrantLock sync = new ReentrantLock(true); // originally was non-fair
+        Thread t1 = new Thread(new InterruptedLockRunnable(sync));
+        Thread t2 = new Thread(new InterruptibleLockRunnable(sync));
+        try {
+            assertFalse(sync.hasQueuedThread(t1));
+            assertFalse(sync.hasQueuedThread(t2));
+            sync.lock();
+            t1.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertTrue(sync.hasQueuedThread(t1));
+            t2.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertTrue(sync.hasQueuedThread(t1));
+            assertTrue(sync.hasQueuedThread(t2));
+            t1.interrupt();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertFalse(sync.hasQueuedThread(t1));
+            assertTrue(sync.hasQueuedThread(t2));
+            sync.unlock();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertFalse(sync.hasQueuedThread(t1));
+            Thread.sleep(SHORT_DELAY_MS);
+            assertFalse(sync.hasQueuedThread(t2));
+            t1.join();
+            t2.join();
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * getQueuedThreads includes waiting threads
+     */
+    public void testGetQueuedThreads() {
+        final PublicReentrantLock lock = new PublicReentrantLock(true); // originally was non-fair
+        Thread t1 = new Thread(new InterruptedLockRunnable(lock));
+        Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
+        try {
+            assertTrue(lock.getQueuedThreads().isEmpty());
+            lock.lock();
+            assertTrue(lock.getQueuedThreads().isEmpty());
+            t1.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertTrue(lock.getQueuedThreads().contains(t1));
+            t2.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertTrue(lock.getQueuedThreads().contains(t1));
+            assertTrue(lock.getQueuedThreads().contains(t2));
+            t1.interrupt();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertFalse(lock.getQueuedThreads().contains(t1));
+            assertTrue(lock.getQueuedThreads().contains(t2));
+            lock.unlock();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertTrue(lock.getQueuedThreads().isEmpty());
+            t1.join();
+            t2.join();
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * timed tryLock is interruptible.
+     */
+    public void testInterruptedException2() {
+        final ReentrantLock lock = new ReentrantLock();
+        lock.lock();
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        lock.tryLock(MEDIUM_DELAY_MS,TimeUnit.MILLISECONDS);
+                        threadShouldThrow();
+                    } catch(InterruptedException success){}
+                }
+            });
+        try {
+            t.start();
+            t.interrupt();
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * TryLock on a locked lock fails
+     */
+    public void testTryLockWhenLocked() {
+        final ReentrantLock lock = new ReentrantLock();
+        lock.lock();
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    threadAssertFalse(lock.tryLock());
+                }
+            });
+        try {
+            t.start();
+            t.join();
+            lock.unlock();
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * Timed tryLock on a locked lock times out
+     */
+    public void testTryLock_Timeout() {
+        final ReentrantLock lock = new ReentrantLock();
+        lock.lock();
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        threadAssertFalse(lock.tryLock(1, TimeUnit.MILLISECONDS));
+                    } catch (Exception ex) {
+                        threadUnexpectedException();
+                    }
+                }
+            });
+        try {
+            t.start();
+            t.join();
+            lock.unlock();
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * getHoldCount returns number of recursive holds
+     */
+    public void testGetHoldCount() {
+        ReentrantLock lock = new ReentrantLock();
+        for(int i = 1; i <= SIZE; i++) {
+            lock.lock();
+            assertEquals(i,lock.getHoldCount());
+        }
+        for(int i = SIZE; i > 0; i--) {
+            lock.unlock();
+            assertEquals(i-1,lock.getHoldCount());
+        }
+    }
+
+
+    /**
+     * isLocked is true when locked and false when not
+     */
+    public void testIsLocked() {
+        final ReentrantLock lock = new ReentrantLock();
+        lock.lock();
+        assertTrue(lock.isLocked());
+        lock.unlock();
+        assertFalse(lock.isLocked());
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    lock.lock();
+                    try {
+                        Thread.sleep(SMALL_DELAY_MS);
+                    }
+                    catch(Exception e) {
+                        threadUnexpectedException();
+                    }
+                    lock.unlock();
+                }
+            });
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertTrue(lock.isLocked());
+            t.join();
+            assertFalse(lock.isLocked());
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * lockInterruptibly is interruptible.
+     */
+    public void testLockInterruptibly1() {
+        final ReentrantLock lock = new ReentrantLock();
+        lock.lock();
+        Thread t = new Thread(new InterruptedLockRunnable(lock));
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            t.interrupt();
+            Thread.sleep(SHORT_DELAY_MS);
+            lock.unlock();
+            t.join();
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * lockInterruptibly succeeds when unlocked, else is interruptible
+     */
+    public void testLockInterruptibly2() {
+        final ReentrantLock lock = new ReentrantLock();
+        try {
+            lock.lockInterruptibly();
+        } catch(Exception e) {
+            unexpectedException();
+        }
+        Thread t = new Thread(new InterruptedLockRunnable(lock));
+        try {
+            t.start();
+            t.interrupt();
+            assertTrue(lock.isLocked());
+            assertTrue(lock.isHeldByCurrentThread());
+            t.join();
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * Calling await without holding lock throws IllegalMonitorStateException
+     */
+    public void testAwait_IllegalMonitor() {
+        final ReentrantLock lock = new ReentrantLock();
+        final Condition c = lock.newCondition();
+        try {
+            c.await();
+            shouldThrow();
+        }
+        catch (IllegalMonitorStateException success) {
+        }
+        catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * Calling signal without holding lock throws IllegalMonitorStateException
+     */
+    public void testSignal_IllegalMonitor() {
+        final ReentrantLock lock = new ReentrantLock();
+        final Condition c = lock.newCondition();
+        try {
+            c.signal();
+            shouldThrow();
+        }
+        catch (IllegalMonitorStateException success) {
+        }
+        catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * awaitNanos without a signal times out
+     */
+    public void testAwaitNanos_Timeout() {
+        final ReentrantLock lock = new ReentrantLock();
+        final Condition c = lock.newCondition();
+        try {
+            lock.lock();
+            long t = Utils.awaitNanos(c, 100);
+            assertTrue(t <= 0);
+            lock.unlock();
+        }
+        catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     *  timed await without a signal times out
+     */
+    public void testAwait_Timeout() {
+        final ReentrantLock lock = new ReentrantLock();
+        final Condition c = lock.newCondition();
+        try {
+            lock.lock();
+            c.await(SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
+            lock.unlock();
+        }
+        catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * awaitUntil without a signal times out
+     */
+    public void testAwaitUntil_Timeout() {
+        final ReentrantLock lock = new ReentrantLock();
+        final Condition c = lock.newCondition();
+        try {
+            lock.lock();
+            java.util.Date d = new java.util.Date();
+            c.awaitUntil(new java.util.Date(d.getTime() + 10));
+            lock.unlock();
+        }
+        catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * await returns when signalled
+     */
+    public void testAwait() {
+        final ReentrantLock lock = new ReentrantLock();
+        final Condition c = lock.newCondition();
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        lock.lock();
+                        c.await();
+                        lock.unlock();
+                    }
+                    catch(InterruptedException e) {
+                        threadUnexpectedException();
+                    }
+                }
+            });
+
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            lock.lock();
+            c.signal();
+            lock.unlock();
+            t.join(SHORT_DELAY_MS);
+            assertFalse(t.isAlive());
+        }
+        catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * hasWaiters throws NPE if null
+     */
+    public void testHasWaitersNPE() {
+        final ReentrantLock lock = new ReentrantLock();
+        try {
+            lock.hasWaiters(null);
+            shouldThrow();
+        } catch (NullPointerException success) {
+        } catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * getWaitQueueLength throws NPE if null
+     */
+    public void testGetWaitQueueLengthNPE() {
+        final ReentrantLock lock = new ReentrantLock();
+        try {
+            lock.getWaitQueueLength(null);
+            shouldThrow();
+        } catch (NullPointerException success) {
+        } catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * getWaitingThreads throws NPE if null
+     */
+    public void testGetWaitingThreadsNPE() {
+        final PublicReentrantLock lock = new PublicReentrantLock(true); // originally was non-fair
+        try {
+            lock.getWaitingThreads(null);
+            shouldThrow();
+        } catch (NullPointerException success) {
+        } catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * hasWaiters throws IAE if not owned
+     */
+    public void testHasWaitersIAE() {
+        final ReentrantLock lock = new ReentrantLock();
+        final Condition c = (lock.newCondition());
+        final ReentrantLock lock2 = new ReentrantLock();
+        try {
+            lock2.hasWaiters(c);
+            shouldThrow();
+        } catch (IllegalArgumentException success) {
+        } catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * hasWaiters throws IMSE if not locked
+     */
+    public void testHasWaitersIMSE() {
+        final ReentrantLock lock = new ReentrantLock(true); // originally was non-fair
+        final Condition c = (lock.newCondition());
+        try {
+            lock.hasWaiters(c);
+            shouldThrow();
+        } catch (IllegalMonitorStateException success) {
+        } catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * getWaitQueueLength throws IAE if not owned
+     */
+    public void testGetWaitQueueLengthIAE() {
+        final ReentrantLock lock = new ReentrantLock();
+        final Condition c = (lock.newCondition());
+        final ReentrantLock lock2 = new ReentrantLock();
+        try {
+            lock2.getWaitQueueLength(c);
+            shouldThrow();
+        } catch (IllegalArgumentException success) {
+        } catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * getWaitQueueLength throws IMSE if not locked
+     */
+    public void testGetWaitQueueLengthIMSE() {
+        final ReentrantLock lock = new ReentrantLock(true); // originally was non-fair
+        final Condition c = (lock.newCondition());
+        try {
+            lock.getWaitQueueLength(c);
+            shouldThrow();
+        } catch (IllegalMonitorStateException success) {
+        } catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * getWaitingThreads throws IAE if not owned
+     */
+    public void testGetWaitingThreadsIAE() {
+        final PublicReentrantLock lock = new PublicReentrantLock();
+        final Condition c = (lock.newCondition());
+        final PublicReentrantLock lock2 = new PublicReentrantLock();
+        try {
+            lock2.getWaitingThreads(c);
+            shouldThrow();
+        } catch (IllegalArgumentException success) {
+        } catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * getWaitingThreads throws IMSE if not locked
+     */
+    public void testGetWaitingThreadsIMSE() {
+        final PublicReentrantLock lock = new PublicReentrantLock(true); // originally was non-fair
+        final Condition c = (lock.newCondition());
+        try {
+            lock.getWaitingThreads(c);
+            shouldThrow();
+        } catch (IllegalMonitorStateException success) {
+        } catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+
+
+    /**
+     * hasWaiters returns true when a thread is waiting, else false
+     */
+    public void testHasWaiters() {
+        final ReentrantLock lock = new ReentrantLock(true); // originally was non-fair
+        final Condition c = lock.newCondition();
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        lock.lock();
+                        threadAssertFalse(lock.hasWaiters(c));
+                        threadAssertEquals(0, lock.getWaitQueueLength(c));
+                        c.await();
+                        lock.unlock();
+                    }
+                    catch(InterruptedException e) {
+                        threadUnexpectedException();
+                    }
+                }
+            });
+
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            lock.lock();
+            assertTrue(lock.hasWaiters(c));
+            assertEquals(1, lock.getWaitQueueLength(c));
+            c.signal();
+            lock.unlock();
+            Thread.sleep(SHORT_DELAY_MS);
+            lock.lock();
+            assertFalse(lock.hasWaiters(c));
+            assertEquals(0, lock.getWaitQueueLength(c));
+            lock.unlock();
+            t.join(SHORT_DELAY_MS);
+            assertFalse(t.isAlive());
+        }
+        catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * getWaitQueueLength returns number of waiting threads
+     */
+    public void testGetWaitQueueLength() {
+        final ReentrantLock lock = new ReentrantLock(true); // originally was non-fair
+        final Condition c = lock.newCondition();
+        Thread t1 = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        lock.lock();
+                        threadAssertFalse(lock.hasWaiters(c));
+                        threadAssertEquals(0, lock.getWaitQueueLength(c));
+                        c.await();
+                        lock.unlock();
+                    }
+                    catch(InterruptedException e) {
+                        threadUnexpectedException();
+                    }
+                }
+            });
+
+        Thread t2 = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        lock.lock();
+                        threadAssertTrue(lock.hasWaiters(c));
+                        threadAssertEquals(1, lock.getWaitQueueLength(c));
+                        c.await();
+                        lock.unlock();
+                    }
+                    catch(InterruptedException e) {
+                        threadUnexpectedException();
+                    }
+                }
+            });
+
+        try {
+            t1.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            t2.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            lock.lock();
+            assertTrue(lock.hasWaiters(c));
+            assertEquals(2, lock.getWaitQueueLength(c));
+            c.signalAll();
+            lock.unlock();
+            Thread.sleep(SHORT_DELAY_MS);
+            lock.lock();
+            assertFalse(lock.hasWaiters(c));
+            assertEquals(0, lock.getWaitQueueLength(c));
+            lock.unlock();
+            t1.join(SHORT_DELAY_MS);
+            t2.join(SHORT_DELAY_MS);
+            assertFalse(t1.isAlive());
+            assertFalse(t2.isAlive());
+        }
+        catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * getWaitingThreads returns only and all waiting threads
+     */
+    public void testGetWaitingThreads() {
+        final PublicReentrantLock lock = new PublicReentrantLock(true); // originally was non-fair
+        final Condition c = lock.newCondition();
+        Thread t1 = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        lock.lock();
+                        threadAssertTrue(lock.getWaitingThreads(c).isEmpty());
+                        c.await();
+                        lock.unlock();
+                    }
+                    catch(InterruptedException e) {
+                        threadUnexpectedException();
+                    }
+                }
+            });
+
+        Thread t2 = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        lock.lock();
+                        threadAssertFalse(lock.getWaitingThreads(c).isEmpty());
+                        c.await();
+                        lock.unlock();
+                    }
+                    catch(InterruptedException e) {
+                        threadUnexpectedException();
+                    }
+                }
+            });
+
+        try {
+            lock.lock();
+            assertTrue(lock.getWaitingThreads(c).isEmpty());
+            lock.unlock();
+            t1.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            t2.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            lock.lock();
+            assertTrue(lock.hasWaiters(c));
+            assertTrue(lock.getWaitingThreads(c).contains(t1));
+            assertTrue(lock.getWaitingThreads(c).contains(t2));
+            c.signalAll();
+            lock.unlock();
+            Thread.sleep(SHORT_DELAY_MS);
+            lock.lock();
+            assertFalse(lock.hasWaiters(c));
+            assertTrue(lock.getWaitingThreads(c).isEmpty());
+            lock.unlock();
+            t1.join(SHORT_DELAY_MS);
+            t2.join(SHORT_DELAY_MS);
+            assertFalse(t1.isAlive());
+            assertFalse(t2.isAlive());
+        }
+        catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+    /** A helper class for uninterruptible wait tests */
+    class UninterruptableThread extends Thread {
+        private ReentrantLock lock;
+        private Condition c;
+
+        public volatile boolean canAwake = false;
+        public volatile boolean interrupted = false;
+        public volatile boolean lockStarted = false;
+
+        public UninterruptableThread(ReentrantLock lock, Condition c) {
+            this.lock = lock;
+            this.c = c;
+        }
+
+        public synchronized void run() {
+            lock.lock();
+            lockStarted = true;
+
+            while (!canAwake) {
+                c.awaitUninterruptibly();
+            }
+
+            interrupted = isInterrupted();
+            lock.unlock();
+        }
+    }
+
+    /**
+     * awaitUninterruptibly doesn't abort on interrupt
+     */
+    public void testAwaitUninterruptibly() {
+        final ReentrantLock lock = new ReentrantLock();
+        final Condition c = lock.newCondition();
+        UninterruptableThread thread = new UninterruptableThread(lock, c);
+
+        try {
+            thread.start();
+
+            while (!thread.lockStarted) {
+                Thread.sleep(100);
+            }
+
+            lock.lock();
+            try {
+                thread.interrupt();
+                thread.canAwake = true;
+                c.signal();
+            } finally {
+                lock.unlock();
+            }
+
+            thread.join();
+            assertTrue(thread.interrupted);
+            assertFalse(thread.isAlive());
+        } catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * await is interruptible
+     */
+    public void testAwait_Interrupt() {
+        final ReentrantLock lock = new ReentrantLock();
+        final Condition c = lock.newCondition();
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        lock.lock();
+                        c.await();
+                        lock.unlock();
+                        threadShouldThrow();
+                    }
+                    catch(InterruptedException success) {
+                    }
+                }
+            });
+
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            t.interrupt();
+            t.join(SHORT_DELAY_MS);
+            assertFalse(t.isAlive());
+        }
+        catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * awaitNanos is interruptible
+     */
+    public void testAwaitNanos_Interrupt() {
+        final ReentrantLock lock = new ReentrantLock();
+        final Condition c = lock.newCondition();
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        lock.lock();
+                        Utils.awaitNanos(c, 1000 * 1000 * 1000); // 1 sec
+                        lock.unlock();
+                        threadShouldThrow();
+                    }
+                    catch(InterruptedException success) {
+                    }
+                }
+            });
+
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            t.interrupt();
+            t.join(SHORT_DELAY_MS);
+            assertFalse(t.isAlive());
+        }
+        catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * awaitUntil is interruptible
+     */
+    public void testAwaitUntil_Interrupt() {
+        final ReentrantLock lock = new ReentrantLock();
+        final Condition c = lock.newCondition();
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        lock.lock();
+                        java.util.Date d = new java.util.Date();
+                        c.awaitUntil(new java.util.Date(d.getTime() + 10000));
+                        lock.unlock();
+                        threadShouldThrow();
+                    }
+                    catch(InterruptedException success) {
+                    }
+                }
+            });
+
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            t.interrupt();
+            t.join(SHORT_DELAY_MS);
+            assertFalse(t.isAlive());
+        }
+        catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * signalAll wakes up all threads
+     */
+    public void testSignalAll() {
+        final ReentrantLock lock = new ReentrantLock();
+        final Condition c = lock.newCondition();
+        Thread t1 = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        lock.lock();
+                        c.await();
+                        lock.unlock();
+                    }
+                    catch(InterruptedException e) {
+                        threadUnexpectedException();
+                    }
+                }
+            });
+
+        Thread t2 = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        lock.lock();
+                        c.await();
+                        lock.unlock();
+                    }
+                    catch(InterruptedException e) {
+                        threadUnexpectedException();
+                    }
+                }
+            });
+
+        try {
+            t1.start();
+            t2.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            lock.lock();
+            c.signalAll();
+            lock.unlock();
+            t1.join(SHORT_DELAY_MS);
+            t2.join(SHORT_DELAY_MS);
+            assertFalse(t1.isAlive());
+            assertFalse(t2.isAlive());
+        }
+        catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * await after multiple reentrant locking preserves lock count
+     */
+    public void testAwaitLockCount() {
+        final ReentrantLock lock = new ReentrantLock();
+        final Condition c = lock.newCondition();
+        Thread t1 = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        lock.lock();
+                        threadAssertEquals(1, lock.getHoldCount());
+                        c.await();
+                        threadAssertEquals(1, lock.getHoldCount());
+                        lock.unlock();
+                    }
+                    catch(InterruptedException e) {
+                        threadUnexpectedException();
+                    }
+                }
+            });
+
+        Thread t2 = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        lock.lock();
+                        lock.lock();
+                        threadAssertEquals(2, lock.getHoldCount());
+                        c.await();
+                        threadAssertEquals(2, lock.getHoldCount());
+                        lock.unlock();
+                        lock.unlock();
+                    }
+                    catch(InterruptedException e) {
+                        threadUnexpectedException();
+                    }
+                }
+            });
+
+        try {
+            t1.start();
+            t2.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            lock.lock();
+            c.signalAll();
+            lock.unlock();
+            t1.join(SHORT_DELAY_MS);
+            t2.join(SHORT_DELAY_MS);
+            assertFalse(t1.isAlive());
+            assertFalse(t2.isAlive());
+        }
+        catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * A serialized lock deserializes as unlocked
+     */
+    public void testSerialization() {
+        ReentrantLock l = new ReentrantLock();
+        l.lock();
+        l.unlock();
+
+        try {
+            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
+            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
+            out.writeObject(l);
+            out.close();
+
+            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
+            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
+            ReentrantLock r = (ReentrantLock) in.readObject();
+            r.lock();
+            r.unlock();
+        } catch(Exception e){
+            e.printStackTrace();
+            unexpectedException();
+        }
+    }
+
+    /**
+     * toString indicates current lock state
+     */
+    public void testToString() {
+        ReentrantLock lock = new ReentrantLock();
+        String us = lock.toString();
+        assertTrue(us.indexOf("Unlocked") >= 0);
+        lock.lock();
+        String ls = lock.toString();
+        assertTrue(ls.indexOf("Locked") >= 0);
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/ReentrantReadWriteLockTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/ReentrantReadWriteLockTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/ReentrantReadWriteLockTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,1699 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.Utils;
+import java.io.*;
+import java.util.Collection;
+
+public class ReentrantReadWriteLockTest extends JSR166TestCase {
+    public static void main(String[] args) {
+        junit.textui.TestRunner.run (suite());
+    }
+    public static Test suite() {
+        return new TestSuite(ReentrantReadWriteLockTest.class);
+    }
+
+    /**
+     * A runnable calling lockInterruptibly
+     */
+    class InterruptibleLockRunnable implements Runnable {
+        final ReentrantReadWriteLock lock;
+        InterruptibleLockRunnable(ReentrantReadWriteLock l) { lock = l; }
+        public void run() {
+            try {
+                lock.writeLock().lockInterruptibly();
+            } catch(InterruptedException success){}
+        }
+    }
+
+
+    /**
+     * A runnable calling lockInterruptibly that expects to be
+     * interrupted
+     */
+    class InterruptedLockRunnable implements Runnable {
+        final ReentrantReadWriteLock lock;
+        InterruptedLockRunnable(ReentrantReadWriteLock l) { lock = l; }
+        public void run() {
+            try {
+                lock.writeLock().lockInterruptibly();
+                threadShouldThrow();
+            } catch(InterruptedException success){}
+        }
+    }
+
+    /**
+     * Subclass to expose protected methods
+     */
+    static class PublicReentrantReadWriteLock extends ReentrantReadWriteLock {
+        PublicReentrantReadWriteLock() { super(); }
+//        public Collection getQueuedThreads() {
+//            return super.getQueuedThreads();
+//        }
+//        public Collection getWaitingThreads(Condition c) {
+//            return super.getWaitingThreads(c);
+//        }
+    }
+
+    /**
+     * Constructor sets given fairness, and is in unlocked state
+     */
+    public void testConstructor() {
+        ReentrantReadWriteLock rl = new ReentrantReadWriteLock();
+        assertFalse(rl.isFair());
+        assertFalse(rl.isWriteLocked());
+        assertEquals(0, rl.getReadLockCount());
+//      ReentrantReadWriteLock r2 = new ReentrantReadWriteLock(true);
+//        assertTrue(r2.isFair());
+//        assertFalse(r2.isWriteLocked());
+//        assertEquals(0, r2.getReadLockCount());
+    }
+
+    /**
+     * write-locking and read-locking an unlocked lock succeed
+     */
+    public void testLock() {
+        ReentrantReadWriteLock rl = new ReentrantReadWriteLock();
+        rl.writeLock().lock();
+        assertTrue(rl.isWriteLocked());
+        assertTrue(rl.isWriteLockedByCurrentThread());
+        assertTrue(((ReentrantReadWriteLock.WriteLock)rl.writeLock()).isHeldByCurrentThread());
+        assertEquals(0, rl.getReadLockCount());
+        rl.writeLock().unlock();
+        assertFalse(rl.isWriteLocked());
+        assertFalse(rl.isWriteLockedByCurrentThread());
+        assertFalse(((ReentrantReadWriteLock.WriteLock)rl.writeLock()).isHeldByCurrentThread());
+        assertEquals(0, rl.getReadLockCount());
+        rl.readLock().lock();
+        assertFalse(rl.isWriteLocked());
+        assertFalse(rl.isWriteLockedByCurrentThread());
+        assertFalse(((ReentrantReadWriteLock.WriteLock)rl.writeLock()).isHeldByCurrentThread());
+        assertEquals(1, rl.getReadLockCount());
+        rl.readLock().unlock();
+        assertFalse(rl.isWriteLocked());
+        assertFalse(rl.isWriteLockedByCurrentThread());
+        assertFalse(((ReentrantReadWriteLock.WriteLock)rl.writeLock()).isHeldByCurrentThread());
+        assertEquals(0, rl.getReadLockCount());
+    }
+
+
+//    /**
+//     * locking an unlocked fair lock succeeds
+//     */
+//    public void testFairLock() {
+//      ReentrantReadWriteLock rl = new ReentrantReadWriteLock(true);
+//        rl.writeLock().lock();
+//        assertTrue(rl.isWriteLocked());
+//        assertTrue(rl.isWriteLockedByCurrentThread());
+//        assertTrue(rl.writeLock().isHeldByCurrentThread());
+//        assertEquals(0, rl.getReadLockCount());
+//        rl.writeLock().unlock();
+//        assertFalse(rl.isWriteLocked());
+//        assertFalse(rl.isWriteLockedByCurrentThread());
+//        assertFalse(rl.writeLock().isHeldByCurrentThread());
+//        assertEquals(0, rl.getReadLockCount());
+//        rl.readLock().lock();
+//        assertFalse(rl.isWriteLocked());
+//        assertFalse(rl.isWriteLockedByCurrentThread());
+//        assertFalse(rl.writeLock().isHeldByCurrentThread());
+//        assertEquals(1, rl.getReadLockCount());
+//        rl.readLock().unlock();
+//        assertFalse(rl.isWriteLocked());
+//        assertFalse(rl.isWriteLockedByCurrentThread());
+//        assertFalse(rl.writeLock().isHeldByCurrentThread());
+//        assertEquals(0, rl.getReadLockCount());
+//    }
+
+    /**
+     * getWriteHoldCount returns number of recursive holds
+     */
+    public void testGetWriteHoldCount() {
+        ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        for(int i = 1; i <= SIZE; i++) {
+            lock.writeLock().lock();
+            assertEquals(i,lock.getWriteHoldCount());
+        }
+        for(int i = SIZE; i > 0; i--) {
+            lock.writeLock().unlock();
+            assertEquals(i-1,lock.getWriteHoldCount());
+        }
+    }
+
+    /**
+     * WriteLock.getHoldCount returns number of recursive holds
+     */
+    public void testGetHoldCount() {
+        ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        for(int i = 1; i <= SIZE; i++) {
+            lock.writeLock().lock();
+            assertEquals(i,((ReentrantReadWriteLock.WriteLock)lock.writeLock()).getHoldCount());
+        }
+        for(int i = SIZE; i > 0; i--) {
+            lock.writeLock().unlock();
+            assertEquals(i-1,((ReentrantReadWriteLock.WriteLock)lock.writeLock()).getHoldCount());
+        }
+    }
+
+    /**
+     * getReadHoldCount returns number of recursive holds
+     */
+    public void testGetReadHoldCount() {
+        ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        for(int i = 1; i <= SIZE; i++) {
+            lock.readLock().lock();
+            assertEquals(i,lock.getReadHoldCount());
+        }
+        for(int i = SIZE; i > 0; i--) {
+            lock.readLock().unlock();
+            assertEquals(i-1,lock.getReadHoldCount());
+        }
+    }
+
+
+    /**
+     * write-unlocking an unlocked lock throws IllegalMonitorStateException
+     */
+    public void testUnlock_IllegalMonitorStateException() {
+        ReentrantReadWriteLock rl = new ReentrantReadWriteLock();
+        try {
+            rl.writeLock().unlock();
+            shouldThrow();
+        } catch(IllegalMonitorStateException success){}
+    }
+
+
+    /**
+     * write-lockInterruptibly is interruptible
+     */
+    public void testWriteLockInterruptibly_Interrupted() {
+        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        lock.writeLock().lockInterruptibly();
+                        lock.writeLock().unlock();
+                        lock.writeLock().lockInterruptibly();
+                        lock.writeLock().unlock();
+                    } catch(InterruptedException success){}
+                }
+            });
+        try {
+            lock.writeLock().lock();
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            t.interrupt();
+            Thread.sleep(SHORT_DELAY_MS);
+            lock.writeLock().unlock();
+            t.join();
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * timed write-tryLock is interruptible
+     */
+    public void testWriteTryLock_Interrupted() {
+        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        lock.writeLock().lock();
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        lock.writeLock().tryLock(1000,TimeUnit.MILLISECONDS);
+                    } catch(InterruptedException success){}
+                }
+            });
+        try {
+            t.start();
+            t.interrupt();
+            lock.writeLock().unlock();
+            t.join();
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * read-lockInterruptibly is interruptible
+     */
+    public void testReadLockInterruptibly_Interrupted() {
+        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        lock.writeLock().lock();
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        lock.readLock().lockInterruptibly();
+                    } catch(InterruptedException success){}
+                }
+            });
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            t.interrupt();
+            Thread.sleep(SHORT_DELAY_MS);
+            lock.writeLock().unlock();
+            t.join();
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * timed read-tryLock is interruptible
+     */
+    public void testReadTryLock_Interrupted() {
+        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        lock.writeLock().lock();
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        lock.readLock().tryLock(1000,TimeUnit.MILLISECONDS);
+                        threadShouldThrow();
+                    } catch(InterruptedException success){}
+                }
+            });
+        try {
+            t.start();
+            t.interrupt();
+            t.join();
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * write-tryLock fails if locked
+     */
+    public void testWriteTryLockWhenLocked() {
+        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        lock.writeLock().lock();
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    threadAssertFalse(lock.writeLock().tryLock());
+                }
+            });
+        try {
+            t.start();
+            t.join();
+            lock.writeLock().unlock();
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * read-tryLock fails if locked
+     */
+    public void testReadTryLockWhenLocked() {
+        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        lock.writeLock().lock();
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    threadAssertFalse(lock.readLock().tryLock());
+                }
+            });
+        try {
+            t.start();
+            t.join();
+            lock.writeLock().unlock();
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * Multiple threads can hold a read lock when not write-locked
+     */
+    public void testMultipleReadLocks() {
+        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        lock.readLock().lock();
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    threadAssertTrue(lock.readLock().tryLock());
+                    lock.readLock().unlock();
+                }
+            });
+        try {
+            t.start();
+            t.join();
+            lock.readLock().unlock();
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * A writelock succeeds after reading threads unlock
+     */
+    public void testWriteAfterMultipleReadLocks() {
+        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        lock.readLock().lock();
+        Thread t1 = new Thread(new Runnable() {
+                public void run() {
+                    lock.readLock().lock();
+                    lock.readLock().unlock();
+                }
+            });
+        Thread t2 = new Thread(new Runnable() {
+                public void run() {
+                    lock.writeLock().lock();
+                    lock.writeLock().unlock();
+                }
+            });
+
+        try {
+            t1.start();
+            t2.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            lock.readLock().unlock();
+            t1.join(MEDIUM_DELAY_MS);
+            t2.join(MEDIUM_DELAY_MS);
+            assertTrue(!t1.isAlive());
+            assertTrue(!t2.isAlive());
+
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * Readlocks succeed after a writing thread unlocks
+     */
+    public void testReadAfterWriteLock() {
+        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        lock.writeLock().lock();
+        Thread t1 = new Thread(new Runnable() {
+                public void run() {
+                    lock.readLock().lock();
+                    lock.readLock().unlock();
+                }
+            });
+        Thread t2 = new Thread(new Runnable() {
+                public void run() {
+                    lock.readLock().lock();
+                    lock.readLock().unlock();
+                }
+            });
+
+        try {
+            t1.start();
+            t2.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            lock.writeLock().unlock();
+            t1.join(MEDIUM_DELAY_MS);
+            t2.join(MEDIUM_DELAY_MS);
+            assertTrue(!t1.isAlive());
+            assertTrue(!t2.isAlive());
+
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * Read trylock succeeds if write locked by current thread
+     */
+    public void testReadHoldingWriteLock() {
+        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        lock.writeLock().lock();
+        assertTrue(lock.readLock().tryLock());
+        lock.readLock().unlock();
+        lock.writeLock().unlock();
+    }
+
+    /**
+     * Read lock succeeds if write locked by current thread even if
+     * other threads are waiting for readlock
+     */
+    public void testReadHoldingWriteLock2() {
+        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        lock.writeLock().lock();
+        Thread t1 = new Thread(new Runnable() {
+                public void run() {
+                    lock.readLock().lock();
+                    lock.readLock().unlock();
+                }
+            });
+        Thread t2 = new Thread(new Runnable() {
+                public void run() {
+                    lock.readLock().lock();
+                    lock.readLock().unlock();
+                }
+            });
+
+        try {
+            t1.start();
+            t2.start();
+            lock.readLock().lock();
+            lock.readLock().unlock();
+            Thread.sleep(SHORT_DELAY_MS);
+            lock.readLock().lock();
+            lock.readLock().unlock();
+            lock.writeLock().unlock();
+            t1.join(MEDIUM_DELAY_MS);
+            t2.join(MEDIUM_DELAY_MS);
+            assertTrue(!t1.isAlive());
+            assertTrue(!t2.isAlive());
+
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     *  Read lock succeeds if write locked by current thread even if
+     * other threads are waiting for writelock
+     */
+    public void testReadHoldingWriteLock3() {
+        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        lock.writeLock().lock();
+        Thread t1 = new Thread(new Runnable() {
+                public void run() {
+                    lock.writeLock().lock();
+                    lock.writeLock().unlock();
+                }
+            });
+        Thread t2 = new Thread(new Runnable() {
+                public void run() {
+                    lock.writeLock().lock();
+                    lock.writeLock().unlock();
+                }
+            });
+
+        try {
+            t1.start();
+            t2.start();
+            lock.readLock().lock();
+            lock.readLock().unlock();
+            Thread.sleep(SHORT_DELAY_MS);
+            lock.readLock().lock();
+            lock.readLock().unlock();
+            lock.writeLock().unlock();
+            t1.join(MEDIUM_DELAY_MS);
+            t2.join(MEDIUM_DELAY_MS);
+            assertTrue(!t1.isAlive());
+            assertTrue(!t2.isAlive());
+
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     *  Write lock succeeds if write locked by current thread even if
+     * other threads are waiting for writelock
+     */
+    public void testWriteHoldingWriteLock4() {
+        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        lock.writeLock().lock();
+        Thread t1 = new Thread(new Runnable() {
+                public void run() {
+                    lock.writeLock().lock();
+                    lock.writeLock().unlock();
+                }
+            });
+        Thread t2 = new Thread(new Runnable() {
+                public void run() {
+                    lock.writeLock().lock();
+                    lock.writeLock().unlock();
+                }
+            });
+
+        try {
+            t1.start();
+            t2.start();
+            lock.writeLock().lock();
+            lock.writeLock().unlock();
+            Thread.sleep(SHORT_DELAY_MS);
+            lock.writeLock().lock();
+            lock.writeLock().unlock();
+            lock.writeLock().unlock();
+            t1.join(MEDIUM_DELAY_MS);
+            t2.join(MEDIUM_DELAY_MS);
+            assertTrue(!t1.isAlive());
+            assertTrue(!t2.isAlive());
+
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+
+//    /**
+//     * Fair Read trylock succeeds if write locked by current thread
+//     */
+//    public void testReadHoldingWriteLockFair() {
+//      final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);
+//      lock.writeLock().lock();
+//        assertTrue(lock.readLock().tryLock());
+//        lock.readLock().unlock();
+//        lock.writeLock().unlock();
+//    }
+
+//    /**
+//     * Fair Read lock succeeds if write locked by current thread even if
+//     * other threads are waiting for readlock
+//     */
+//    public void testReadHoldingWriteLockFair2() {
+//      final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);
+//      lock.writeLock().lock();
+//      Thread t1 = new Thread(new Runnable() {
+//                public void run() {
+//                    lock.readLock().lock();
+//                    lock.readLock().unlock();
+//              }
+//          });
+//      Thread t2 = new Thread(new Runnable() {
+//                public void run() {
+//                    lock.readLock().lock();
+//                    lock.readLock().unlock();
+//              }
+//          });
+//
+//        try {
+//            t1.start();
+//            t2.start();
+//            lock.readLock().lock();
+//            lock.readLock().unlock();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            lock.readLock().lock();
+//            lock.readLock().unlock();
+//            lock.writeLock().unlock();
+//            t1.join(MEDIUM_DELAY_MS);
+//            t2.join(MEDIUM_DELAY_MS);
+//            assertTrue(!t1.isAlive());
+//            assertTrue(!t2.isAlive());
+//
+//        } catch(Exception e){
+//            unexpectedException();
+//        }
+//    }
+
+
+//    /**
+//     * Fair Read lock succeeds if write locked by current thread even if
+//     * other threads are waiting for writelock
+//     */
+//    public void testReadHoldingWriteLockFair3() {
+//      final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);
+//      lock.writeLock().lock();
+//      Thread t1 = new Thread(new Runnable() {
+//                public void run() {
+//                    lock.writeLock().lock();
+//                    lock.writeLock().unlock();
+//              }
+//          });
+//      Thread t2 = new Thread(new Runnable() {
+//                public void run() {
+//                    lock.writeLock().lock();
+//                    lock.writeLock().unlock();
+//              }
+//          });
+//
+//        try {
+//            t1.start();
+//            t2.start();
+//            lock.readLock().lock();
+//            lock.readLock().unlock();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            lock.readLock().lock();
+//            lock.readLock().unlock();
+//            lock.writeLock().unlock();
+//            t1.join(MEDIUM_DELAY_MS);
+//            t2.join(MEDIUM_DELAY_MS);
+//            assertTrue(!t1.isAlive());
+//            assertTrue(!t2.isAlive());
+//
+//        } catch(Exception e){
+//            unexpectedException();
+//        }
+//    }
+
+
+//    /**
+//     * Fair Write lock succeeds if write locked by current thread even if
+//     * other threads are waiting for writelock
+//     */
+//    public void testWriteHoldingWriteLockFair4() {
+//      final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);
+//      lock.writeLock().lock();
+//      Thread t1 = new Thread(new Runnable() {
+//                public void run() {
+//                    lock.writeLock().lock();
+//                    lock.writeLock().unlock();
+//              }
+//          });
+//      Thread t2 = new Thread(new Runnable() {
+//                public void run() {
+//                    lock.writeLock().lock();
+//                    lock.writeLock().unlock();
+//              }
+//          });
+//
+//        try {
+//            t1.start();
+//            t2.start();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertTrue(lock.isWriteLockedByCurrentThread());
+//            assertTrue(lock.getWriteHoldCount() == 1);
+//            lock.writeLock().lock();
+//            assertTrue(lock.getWriteHoldCount() == 2);
+//            lock.writeLock().unlock();
+//            lock.writeLock().lock();
+//            lock.writeLock().unlock();
+//            lock.writeLock().unlock();
+//            t1.join(MEDIUM_DELAY_MS);
+//            t2.join(MEDIUM_DELAY_MS);
+//            assertTrue(!t1.isAlive());
+//            assertTrue(!t2.isAlive());
+//
+//        } catch(Exception e){
+//            unexpectedException();
+//        }
+//    }
+
+
+    /**
+     * Read tryLock succeeds if readlocked but not writelocked
+     */
+    public void testTryLockWhenReadLocked() {
+        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        lock.readLock().lock();
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    threadAssertTrue(lock.readLock().tryLock());
+                    lock.readLock().unlock();
+                }
+            });
+        try {
+            t.start();
+            t.join();
+            lock.readLock().unlock();
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+
+
+    /**
+     * write tryLock fails when readlocked
+     */
+    public void testWriteTryLockWhenReadLocked() {
+        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        lock.readLock().lock();
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    threadAssertFalse(lock.writeLock().tryLock());
+                }
+            });
+        try {
+            t.start();
+            t.join();
+            lock.readLock().unlock();
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+
+//    /**
+//     * Fair Read tryLock succeeds if readlocked but not writelocked
+//     */
+//    public void testTryLockWhenReadLockedFair() {
+//      final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);
+//      lock.readLock().lock();
+//      Thread t = new Thread(new Runnable() {
+//                public void run() {
+//                    threadAssertTrue(lock.readLock().tryLock());
+//                    lock.readLock().unlock();
+//              }
+//          });
+//        try {
+//            t.start();
+//            t.join();
+//            lock.readLock().unlock();
+//        } catch(Exception e){
+//            unexpectedException();
+//        }
+//    }
+
+
+
+//    /**
+//     * Fair write tryLock fails when readlocked
+//     */
+//    public void testWriteTryLockWhenReadLockedFair() {
+//      final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);
+//      lock.readLock().lock();
+//      Thread t = new Thread(new Runnable() {
+//                public void run() {
+//                    threadAssertFalse(lock.writeLock().tryLock());
+//              }
+//          });
+//        try {
+//            t.start();
+//            t.join();
+//            lock.readLock().unlock();
+//        } catch(Exception e){
+//            unexpectedException();
+//        }
+//    }
+
+
+
+    /**
+     * write timed tryLock times out if locked
+     */
+    public void testWriteTryLock_Timeout() {
+        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        lock.writeLock().lock();
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        threadAssertFalse(lock.writeLock().tryLock(1, TimeUnit.MILLISECONDS));
+                    } catch (Exception ex) {
+                        threadUnexpectedException();
+                    }
+                }
+            });
+        try {
+            t.start();
+            t.join();
+            lock.writeLock().unlock();
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * read timed tryLock times out if write-locked
+     */
+    public void testReadTryLock_Timeout() {
+        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        lock.writeLock().lock();
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        threadAssertFalse(lock.readLock().tryLock(1, TimeUnit.MILLISECONDS));
+                    } catch (Exception ex) {
+                        threadUnexpectedException();
+                    }
+                }
+            });
+        try {
+            t.start();
+            t.join();
+            lock.writeLock().unlock();
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * write lockInterruptibly succeeds if lock free else is interruptible
+     */
+    public void testWriteLockInterruptibly() {
+        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        try {
+            lock.writeLock().lockInterruptibly();
+        } catch(Exception e) {
+            unexpectedException();
+        }
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        lock.writeLock().lockInterruptibly();
+                        threadShouldThrow();
+                    }
+                    catch(InterruptedException success) {
+                    }
+                }
+            });
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            t.interrupt();
+            Thread.sleep(SHORT_DELAY_MS);
+            t.join();
+            lock.writeLock().unlock();
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     *  read lockInterruptibly succeeds if lock free else is interruptible
+     */
+    public void testReadLockInterruptibly() {
+        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        try {
+            lock.writeLock().lockInterruptibly();
+        } catch(Exception e) {
+            unexpectedException();
+        }
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        lock.readLock().lockInterruptibly();
+                        threadShouldThrow();
+                    }
+                    catch(InterruptedException success) {
+                    }
+                }
+            });
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            t.interrupt();
+            t.join();
+            lock.writeLock().unlock();
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * Calling await without holding lock throws IllegalMonitorStateException
+     */
+    public void testAwait_IllegalMonitor() {
+        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        final Condition c = lock.writeLock().newCondition();
+        try {
+            c.await();
+            shouldThrow();
+        }
+        catch (IllegalMonitorStateException success) {
+        }
+        catch (Exception ex) {
+            shouldThrow();
+        }
+    }
+
+    /**
+     * Calling signal without holding lock throws IllegalMonitorStateException
+     */
+    public void testSignal_IllegalMonitor() {
+        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        final Condition c = lock.writeLock().newCondition();
+        try {
+            c.signal();
+            shouldThrow();
+        }
+        catch (IllegalMonitorStateException success) {
+        }
+        catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * awaitNanos without a signal times out
+     */
+    public void testAwaitNanos_Timeout() {
+        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        final Condition c = lock.writeLock().newCondition();
+        try {
+            lock.writeLock().lock();
+            long t = Utils.awaitNanos(c, 100);
+            assertTrue(t <= 0);
+            lock.writeLock().unlock();
+        }
+        catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     *  timed await without a signal times out
+     */
+    public void testAwait_Timeout() {
+        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        final Condition c = lock.writeLock().newCondition();
+        try {
+            lock.writeLock().lock();
+            lock.writeLock().unlock();
+        }
+        catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * awaitUntil without a signal times out
+     */
+    public void testAwaitUntil_Timeout() {
+        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        final Condition c = lock.writeLock().newCondition();
+        try {
+            lock.writeLock().lock();
+            java.util.Date d = new java.util.Date();
+            lock.writeLock().unlock();
+        }
+        catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * await returns when signalled
+     */
+    public void testAwait() {
+        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        final Condition c = lock.writeLock().newCondition();
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        lock.writeLock().lock();
+                        c.await();
+                        lock.writeLock().unlock();
+                    }
+                    catch(InterruptedException e) {
+                        threadUnexpectedException();
+                    }
+                }
+            });
+
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            lock.writeLock().lock();
+            c.signal();
+            lock.writeLock().unlock();
+            t.join(SHORT_DELAY_MS);
+            assertFalse(t.isAlive());
+        }
+        catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+    /** A helper class for uninterruptible wait tests */
+    class UninterruptableThread extends Thread {
+        private Lock lock;
+        private Condition c;
+
+        public volatile boolean canAwake = false;
+        public volatile boolean interrupted = false;
+        public volatile boolean lockStarted = false;
+
+        public UninterruptableThread(Lock lock, Condition c) {
+            this.lock = lock;
+            this.c = c;
+        }
+
+        public synchronized void run() {
+            lock.lock();
+            lockStarted = true;
+
+            while (!canAwake) {
+                c.awaitUninterruptibly();
+            }
+
+            interrupted = isInterrupted();
+            lock.unlock();
+        }
+    }
+
+    /**
+     * awaitUninterruptibly doesn't abort on interrupt
+     */
+    public void testAwaitUninterruptibly() {
+        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        final Condition c = lock.writeLock().newCondition();
+        UninterruptableThread thread = new UninterruptableThread(lock.writeLock(), c);
+
+        try {
+            thread.start();
+
+            while (!thread.lockStarted) {
+                Thread.sleep(100);
+            }
+
+            lock.writeLock().lock();
+            try {
+                thread.interrupt();
+                thread.canAwake = true;
+                c.signal();
+            } finally {
+                lock.writeLock().unlock();
+            }
+
+            thread.join();
+            assertTrue(thread.interrupted);
+            assertFalse(thread.isAlive());
+        } catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * await is interruptible
+     */
+    public void testAwait_Interrupt() {
+        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        final Condition c = lock.writeLock().newCondition();
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        lock.writeLock().lock();
+                        c.await();
+                        lock.writeLock().unlock();
+                        threadShouldThrow();
+                    }
+                    catch(InterruptedException success) {
+                    }
+                }
+            });
+
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            t.interrupt();
+            t.join(SHORT_DELAY_MS);
+            assertFalse(t.isAlive());
+        }
+        catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * awaitNanos is interruptible
+     */
+    public void testAwaitNanos_Interrupt() {
+        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        final Condition c = lock.writeLock().newCondition();
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        lock.writeLock().lock();
+                        Utils.awaitNanos(c, SHORT_DELAY_MS * 2 * 1000000);
+                        lock.writeLock().unlock();
+                        threadShouldThrow();
+                    }
+                    catch(InterruptedException success) {
+                    }
+                }
+            });
+
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            t.interrupt();
+            t.join(SHORT_DELAY_MS);
+            assertFalse(t.isAlive());
+        }
+        catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * awaitUntil is interruptible
+     */
+    public void testAwaitUntil_Interrupt() {
+        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        final Condition c = lock.writeLock().newCondition();
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        lock.writeLock().lock();
+                        java.util.Date d = new java.util.Date();
+                        c.awaitUntil(new java.util.Date(d.getTime() + 10000));
+                        lock.writeLock().unlock();
+                        threadShouldThrow();
+                    }
+                    catch(InterruptedException success) {
+                    }
+                }
+            });
+
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            t.interrupt();
+            t.join(SHORT_DELAY_MS);
+            assertFalse(t.isAlive());
+        }
+        catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * signalAll wakes up all threads
+     */
+    public void testSignalAll() {
+        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        final Condition c = lock.writeLock().newCondition();
+        Thread t1 = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        lock.writeLock().lock();
+                        c.await();
+                        lock.writeLock().unlock();
+                    }
+                    catch(InterruptedException e) {
+                        threadUnexpectedException();
+                    }
+                }
+            });
+
+        Thread t2 = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        lock.writeLock().lock();
+                        c.await();
+                        lock.writeLock().unlock();
+                    }
+                    catch(InterruptedException e) {
+                        threadUnexpectedException();
+                    }
+                }
+            });
+
+        try {
+            t1.start();
+            t2.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            lock.writeLock().lock();
+            c.signalAll();
+            lock.writeLock().unlock();
+            t1.join(SHORT_DELAY_MS);
+            t2.join(SHORT_DELAY_MS);
+            assertFalse(t1.isAlive());
+            assertFalse(t2.isAlive());
+        }
+        catch (Exception ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * A serialized lock deserializes as unlocked
+     */
+    public void testSerialization() {
+        ReentrantReadWriteLock l = new ReentrantReadWriteLock();
+        l.readLock().lock();
+        l.readLock().unlock();
+
+        try {
+            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
+            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
+            out.writeObject(l);
+            out.close();
+
+            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
+            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
+            ReentrantReadWriteLock r = (ReentrantReadWriteLock) in.readObject();
+            r.readLock().lock();
+            r.readLock().unlock();
+        } catch(Exception e){
+            e.printStackTrace();
+            unexpectedException();
+        }
+    }
+
+    /**
+     * hasQueuedThreads reports whether there are waiting threads
+     */
+    public void testhasQueuedThreads() {
+        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        Thread t1 = new Thread(new InterruptedLockRunnable(lock));
+        Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
+        try {
+            assertFalse(lock.hasQueuedThreads());
+            lock.writeLock().lock();
+            t1.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertTrue(lock.hasQueuedThreads());
+            t2.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertTrue(lock.hasQueuedThreads());
+            t1.interrupt();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertTrue(lock.hasQueuedThreads());
+            lock.writeLock().unlock();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertFalse(lock.hasQueuedThreads());
+            t1.join();
+            t2.join();
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+//    /**
+//     * hasQueuedThread(null) throws NPE
+//     */
+//    public void testHasQueuedThreadNPE() {
+//      final ReentrantReadWriteLock sync = new ReentrantReadWriteLock();
+//        try {
+//            sync.hasQueuedThread(null);
+//            shouldThrow();
+//        } catch (NullPointerException success) {
+//        }
+//    }
+//
+//    /**
+//     * hasQueuedThread reports whether a thread is queued.
+//     */
+//    public void testHasQueuedThread() {
+//      final ReentrantReadWriteLock sync = new ReentrantReadWriteLock();
+//        Thread t1 = new Thread(new InterruptedLockRunnable(sync));
+//        Thread t2 = new Thread(new InterruptibleLockRunnable(sync));
+//        try {
+//            assertFalse(sync.hasQueuedThread(t1));
+//            assertFalse(sync.hasQueuedThread(t2));
+//            sync.writeLock().lock();
+//            t1.start();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertTrue(sync.hasQueuedThread(t1));
+//            t2.start();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertTrue(sync.hasQueuedThread(t1));
+//            assertTrue(sync.hasQueuedThread(t2));
+//            t1.interrupt();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertFalse(sync.hasQueuedThread(t1));
+//            assertTrue(sync.hasQueuedThread(t2));
+//            sync.writeLock().unlock();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertFalse(sync.hasQueuedThread(t1));
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertFalse(sync.hasQueuedThread(t2));
+//            t1.join();
+//            t2.join();
+//        } catch(Exception e){
+//            unexpectedException();
+//        }
+//    }
+
+
+    /**
+     * getQueueLength reports number of waiting threads
+     */
+    public void testGetQueueLength() {
+        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        Thread t1 = new Thread(new InterruptedLockRunnable(lock));
+        Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
+        try {
+            assertEquals(0, lock.getQueueLength());
+            lock.writeLock().lock();
+            t1.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertEquals(1, lock.getQueueLength());
+            t2.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertEquals(2, lock.getQueueLength());
+            t1.interrupt();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertEquals(1, lock.getQueueLength());
+            lock.writeLock().unlock();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertEquals(0, lock.getQueueLength());
+            t1.join();
+            t2.join();
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+//    /**
+//     * getQueuedThreads includes waiting threads
+//     */
+//    public void testGetQueuedThreads() {
+//      final PublicReentrantReadWriteLock lock = new PublicReentrantReadWriteLock();
+//        Thread t1 = new Thread(new InterruptedLockRunnable(lock));
+//        Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
+//        try {
+//            assertTrue(lock.getQueuedThreads().isEmpty());
+//            lock.writeLock().lock();
+//            assertTrue(lock.getQueuedThreads().isEmpty());
+//            t1.start();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertTrue(lock.getQueuedThreads().contains(t1));
+//            t2.start();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertTrue(lock.getQueuedThreads().contains(t1));
+//            assertTrue(lock.getQueuedThreads().contains(t2));
+//            t1.interrupt();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertFalse(lock.getQueuedThreads().contains(t1));
+//            assertTrue(lock.getQueuedThreads().contains(t2));
+//            lock.writeLock().unlock();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            assertTrue(lock.getQueuedThreads().isEmpty());
+//            t1.join();
+//            t2.join();
+//        } catch(Exception e){
+//            unexpectedException();
+//        }
+//    }
+//
+//    /**
+//     * hasWaiters throws NPE if null
+//     */
+//    public void testHasWaitersNPE() {
+//      final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+//        try {
+//            lock.hasWaiters(null);
+//            shouldThrow();
+//        } catch (NullPointerException success) {
+//        } catch (Exception ex) {
+//            unexpectedException();
+//        }
+//    }
+//
+//    /**
+//     * getWaitQueueLength throws NPE if null
+//     */
+//    public void testGetWaitQueueLengthNPE() {
+//      final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+//        try {
+//            lock.getWaitQueueLength(null);
+//            shouldThrow();
+//        } catch (NullPointerException success) {
+//        } catch (Exception ex) {
+//            unexpectedException();
+//        }
+//    }
+//
+//
+//    /**
+//     * getWaitingThreads throws NPE if null
+//     */
+//    public void testGetWaitingThreadsNPE() {
+//      final PublicReentrantReadWriteLock lock = new PublicReentrantReadWriteLock();
+//        try {
+//            lock.getWaitingThreads(null);
+//            shouldThrow();
+//        } catch (NullPointerException success) {
+//        } catch (Exception ex) {
+//            unexpectedException();
+//        }
+//    }
+//
+//    /**
+//     * hasWaiters throws IAE if not owned
+//     */
+//    public void testHasWaitersIAE() {
+//      final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+//        final Condition c = (lock.writeLock().newCondition());
+//      final ReentrantReadWriteLock lock2 = new ReentrantReadWriteLock();
+//        try {
+//            lock2.hasWaiters(c);
+//            shouldThrow();
+//        } catch (IllegalArgumentException success) {
+//        } catch (Exception ex) {
+//            unexpectedException();
+//        }
+//    }
+//
+//    /**
+//     * hasWaiters throws IMSE if not locked
+//     */
+//    public void testHasWaitersIMSE() {
+//      final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+//        final Condition c = (lock.writeLock().newCondition());
+//        try {
+//            lock.hasWaiters(c);
+//            shouldThrow();
+//        } catch (IllegalMonitorStateException success) {
+//        } catch (Exception ex) {
+//            unexpectedException();
+//        }
+//    }
+//
+//
+//    /**
+//     * getWaitQueueLength throws IAE if not owned
+//     */
+//    public void testGetWaitQueueLengthIAE() {
+//      final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+//        final Condition c = (lock.writeLock().newCondition());
+//      final ReentrantReadWriteLock lock2 = new ReentrantReadWriteLock();
+//        try {
+//            lock2.getWaitQueueLength(c);
+//            shouldThrow();
+//        } catch (IllegalArgumentException success) {
+//        } catch (Exception ex) {
+//            unexpectedException();
+//        }
+//    }
+//
+//    /**
+//     * getWaitQueueLength throws IMSE if not locked
+//     */
+//    public void testGetWaitQueueLengthIMSE() {
+//      final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+//        final Condition c = (lock.writeLock().newCondition());
+//        try {
+//            lock.getWaitQueueLength(c);
+//            shouldThrow();
+//        } catch (IllegalMonitorStateException success) {
+//        } catch (Exception ex) {
+//            unexpectedException();
+//        }
+//    }
+//
+//
+//    /**
+//     * getWaitingThreads throws IAE if not owned
+//     */
+//    public void testGetWaitingThreadsIAE() {
+//      final PublicReentrantReadWriteLock lock = new PublicReentrantReadWriteLock();
+//        final Condition c = (lock.writeLock().newCondition());
+//      final PublicReentrantReadWriteLock lock2 = new PublicReentrantReadWriteLock();
+//        try {
+//            lock2.getWaitingThreads(c);
+//            shouldThrow();
+//        } catch (IllegalArgumentException success) {
+//        } catch (Exception ex) {
+//            unexpectedException();
+//        }
+//    }
+//
+//    /**
+//     * getWaitingThreads throws IMSE if not locked
+//     */
+//    public void testGetWaitingThreadsIMSE() {
+//      final PublicReentrantReadWriteLock lock = new PublicReentrantReadWriteLock();
+//        final Condition c = (lock.writeLock().newCondition());
+//        try {
+//            lock.getWaitingThreads(c);
+//            shouldThrow();
+//        } catch (IllegalMonitorStateException success) {
+//        } catch (Exception ex) {
+//            unexpectedException();
+//        }
+//    }
+//
+//
+//    /**
+//     * hasWaiters returns true when a thread is waiting, else false
+//     */
+//    public void testHasWaiters() {
+//      final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+//        final Condition c = (lock.writeLock().newCondition());
+//      Thread t = new Thread(new Runnable() {
+//              public void run() {
+//                  try {
+//                      lock.writeLock().lock();
+//                        threadAssertFalse(lock.hasWaiters(c));
+//                        threadAssertEquals(0, lock.getWaitQueueLength(c));
+//                        c.await();
+//                        lock.writeLock().unlock();
+//                  }
+//                  catch(InterruptedException e) {
+//                        threadUnexpectedException();
+//                    }
+//              }
+//          });
+//
+//        try {
+//            t.start();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            lock.writeLock().lock();
+//            assertTrue(lock.hasWaiters(c));
+//            assertEquals(1, lock.getWaitQueueLength(c));
+//            c.signal();
+//            lock.writeLock().unlock();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            lock.writeLock().lock();
+//            assertFalse(lock.hasWaiters(c));
+//            assertEquals(0, lock.getWaitQueueLength(c));
+//            lock.writeLock().unlock();
+//            t.join(SHORT_DELAY_MS);
+//            assertFalse(t.isAlive());
+//        }
+//        catch (Exception ex) {
+//            unexpectedException();
+//        }
+//    }
+//
+//    /**
+//     * getWaitQueueLength returns number of waiting threads
+//     */
+//    public void testGetWaitQueueLength() {
+//      final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+//        final Condition c = (lock.writeLock().newCondition());
+//      Thread t = new Thread(new Runnable() {
+//              public void run() {
+//                  try {
+//                      lock.writeLock().lock();
+//                        threadAssertFalse(lock.hasWaiters(c));
+//                        threadAssertEquals(0, lock.getWaitQueueLength(c));
+//                        c.await();
+//                        lock.writeLock().unlock();
+//                  }
+//                  catch(InterruptedException e) {
+//                        threadUnexpectedException();
+//                    }
+//              }
+//          });
+//
+//        try {
+//            t.start();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            lock.writeLock().lock();
+//            assertTrue(lock.hasWaiters(c));
+//            assertEquals(1, lock.getWaitQueueLength(c));
+//            c.signal();
+//            lock.writeLock().unlock();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            lock.writeLock().lock();
+//            assertFalse(lock.hasWaiters(c));
+//            assertEquals(0, lock.getWaitQueueLength(c));
+//            lock.writeLock().unlock();
+//            t.join(SHORT_DELAY_MS);
+//            assertFalse(t.isAlive());
+//        }
+//        catch (Exception ex) {
+//            unexpectedException();
+//        }
+//    }
+//
+//
+//    /**
+//     * getWaitingThreads returns only and all waiting threads
+//     */
+//    public void testGetWaitingThreads() {
+//      final PublicReentrantReadWriteLock lock = new PublicReentrantReadWriteLock();
+//        final Condition c = lock.writeLock().newCondition();
+//      Thread t1 = new Thread(new Runnable() {
+//              public void run() {
+//                  try {
+//                      lock.writeLock().lock();
+//                        threadAssertTrue(lock.getWaitingThreads(c).isEmpty());
+//                        c.await();
+//                        lock.writeLock().unlock();
+//                  }
+//                  catch(InterruptedException e) {
+//                        threadUnexpectedException();
+//                    }
+//              }
+//          });
+//
+//      Thread t2 = new Thread(new Runnable() {
+//              public void run() {
+//                  try {
+//                      lock.writeLock().lock();
+//                        threadAssertFalse(lock.getWaitingThreads(c).isEmpty());
+//                        c.await();
+//                        lock.writeLock().unlock();
+//                  }
+//                  catch(InterruptedException e) {
+//                        threadUnexpectedException();
+//                    }
+//              }
+//          });
+//
+//        try {
+//            lock.writeLock().lock();
+//            assertTrue(lock.getWaitingThreads(c).isEmpty());
+//            lock.writeLock().unlock();
+//            t1.start();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            t2.start();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            lock.writeLock().lock();
+//            assertTrue(lock.hasWaiters(c));
+//            assertTrue(lock.getWaitingThreads(c).contains(t1));
+//            assertTrue(lock.getWaitingThreads(c).contains(t2));
+//            c.signalAll();
+//            lock.writeLock().unlock();
+//            Thread.sleep(SHORT_DELAY_MS);
+//            lock.writeLock().lock();
+//            assertFalse(lock.hasWaiters(c));
+//            assertTrue(lock.getWaitingThreads(c).isEmpty());
+//            lock.writeLock().unlock();
+//            t1.join(SHORT_DELAY_MS);
+//            t2.join(SHORT_DELAY_MS);
+//            assertFalse(t1.isAlive());
+//            assertFalse(t2.isAlive());
+//        }
+//        catch (Exception ex) {
+//            unexpectedException();
+//        }
+//    }
+
+    /**
+     * toString indicates current lock state
+     */
+    public void testToString() {
+        ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        String us = lock.toString();
+        assertTrue(us.indexOf("Write locks = 0") >= 0);
+        assertTrue(us.indexOf("Read locks = 0") >= 0);
+        lock.writeLock().lock();
+        String ws = lock.toString();
+        assertTrue(ws.indexOf("Write locks = 1") >= 0);
+        assertTrue(ws.indexOf("Read locks = 0") >= 0);
+        lock.writeLock().unlock();
+        lock.readLock().lock();
+        lock.readLock().lock();
+        String rs = lock.toString();
+        assertTrue(rs.indexOf("Write locks = 0") >= 0);
+        assertTrue(rs.indexOf("Read locks = 2") >= 0);
+    }
+
+    /**
+     * readLock.toString indicates current lock state
+     */
+    public void testReadLockToString() {
+        ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        String us = lock.readLock().toString();
+        assertTrue(us.indexOf("Read locks = 0") >= 0);
+        lock.readLock().lock();
+        lock.readLock().lock();
+        String rs = lock.readLock().toString();
+        assertTrue(rs.indexOf("Read locks = 2") >= 0);
+    }
+
+    /**
+     * writeLock.toString indicates current lock state
+     */
+    public void testWriteLockToString() {
+        ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+        String us = lock.writeLock().toString();
+        assertTrue(us.indexOf("Unlocked") >= 0);
+        lock.writeLock().lock();
+        String ls = lock.writeLock().toString();
+        assertTrue(ls.indexOf("Locked") >= 0);
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/ScheduledExecutorSubclassTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/ScheduledExecutorSubclassTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/ScheduledExecutorSubclassTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,1206 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+import junit.framework.*;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Iterator;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.atomic.*;
+
+public class ScheduledExecutorSubclassTest extends JSR166TestCase {
+    public static void main(String[] args) {
+	junit.textui.TestRunner.run (suite());
+    }
+    public static Test suite() {
+	return new TestSuite(ScheduledExecutorTest.class);
+    }
+
+    static class CustomTask implements RunnableScheduledFuture {
+        RunnableScheduledFuture task;
+        volatile boolean ran;
+        CustomTask(RunnableScheduledFuture t) { task = t; }
+        public boolean isPeriodic() { return task.isPeriodic(); }
+        public void run() {
+            ran = true;
+            task.run();
+        }
+        public long getDelay(TimeUnit unit) { return task.getDelay(unit); }
+        public int compareTo(Object o) {
+            return compareTo((Delayed)o);
+        }
+        public int compareTo(Delayed t) {
+            return task.compareTo(((CustomTask)t).task);
+        }
+        public boolean cancel(boolean mayInterruptIfRunning) {
+            return task.cancel(mayInterruptIfRunning);
+        }
+        public boolean isCancelled() { return task.isCancelled(); }
+        public boolean isDone() { return task.isDone(); }
+        public Object get() throws InterruptedException,  ExecutionException {
+            Object v = task.get();
+            assertTrue(ran);
+            return v;
+        }
+        public Object get(long time, TimeUnit unit) throws InterruptedException,  ExecutionException, TimeoutException {
+            Object v = task.get(time, unit);
+            assertTrue(ran);
+            return v;
+        }
+    }
+
+
+    public class CustomExecutor extends ScheduledThreadPoolExecutor {
+
+        protected RunnableScheduledFuture decorateTask(Runnable r, RunnableScheduledFuture task) {
+            return new CustomTask(task);
+        }
+
+        protected RunnableScheduledFuture decorateTask(Callable c, RunnableScheduledFuture task) {
+            return new CustomTask(task);
+        }
+        CustomExecutor(int corePoolSize) { super(corePoolSize);}
+        CustomExecutor(int corePoolSize, RejectedExecutionHandler handler) {
+            super(corePoolSize, handler);
+        }
+
+        CustomExecutor(int corePoolSize, ThreadFactory threadFactory) {
+            super(corePoolSize, threadFactory);
+        }
+        CustomExecutor(int corePoolSize, ThreadFactory threadFactory,
+                       RejectedExecutionHandler handler) {
+            super(corePoolSize, threadFactory, handler);
+        }
+
+    }
+
+
+
+    /**
+     * execute successfully executes a runnable
+     */
+    public void testExecute() {
+	try {
+            TrackedShortRunnable runnable =new TrackedShortRunnable();
+            CustomExecutor p1 = new CustomExecutor(1);
+	    p1.execute(runnable);
+	    assertFalse(runnable.done);
+	    Thread.sleep(SHORT_DELAY_MS);
+	    try { p1.shutdown(); } catch(SecurityException ok) { return; }
+	    try {
+                Thread.sleep(MEDIUM_DELAY_MS);
+            } catch(InterruptedException e){
+                unexpectedException();
+            }
+	    assertTrue(runnable.done);
+            try { p1.shutdown(); } catch(SecurityException ok) { return; }
+            joinPool(p1);
+        }
+	catch(Exception e){
+            unexpectedException();
+        }
+
+    }
+
+
+    /**
+     * delayed schedule of callable successfully executes after delay
+     */
+    public void testSchedule1() {
+	try {
+            TrackedCallable callable = new TrackedCallable();
+            CustomExecutor p1 = new CustomExecutor(1);
+	    Future f = p1.schedule(callable, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
+	    assertFalse(callable.done);
+	    Thread.sleep(MEDIUM_DELAY_MS);
+	    assertTrue(callable.done);
+	    assertEquals(Boolean.TRUE, f.get());
+            try { p1.shutdown(); } catch(SecurityException ok) { return; }
+            joinPool(p1);
+	} catch(RejectedExecutionException e){}
+	catch(Exception e){
+            e.printStackTrace();
+            unexpectedException();
+        }
+    }
+
+    /**
+     *  delayed schedule of runnable successfully executes after delay
+     */
+    public void testSchedule3() {
+	try {
+            TrackedShortRunnable runnable = new TrackedShortRunnable();
+            CustomExecutor p1 = new CustomExecutor(1);
+	    p1.schedule(runnable, SMALL_DELAY_MS, TimeUnit.MILLISECONDS);
+	    Thread.sleep(SHORT_DELAY_MS);
+	    assertFalse(runnable.done);
+	    Thread.sleep(MEDIUM_DELAY_MS);
+	    assertTrue(runnable.done);
+            try { p1.shutdown(); } catch(SecurityException ok) { return; }
+            joinPool(p1);
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * scheduleAtFixedRate executes runnable after given initial delay
+     */
+    public void testSchedule4() {
+	try {
+            TrackedShortRunnable runnable = new TrackedShortRunnable();
+            CustomExecutor p1 = new CustomExecutor(1);
+	    ScheduledFuture h = p1.scheduleAtFixedRate(runnable, SHORT_DELAY_MS, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
+	    assertFalse(runnable.done);
+	    Thread.sleep(MEDIUM_DELAY_MS);
+	    assertTrue(runnable.done);
+            h.cancel(true);
+            joinPool(p1);
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    static class RunnableCounter implements Runnable {
+        AtomicInteger count = new AtomicInteger(0);
+        public void run() { count.getAndIncrement(); }
+    }
+
+    /**
+     * scheduleWithFixedDelay executes runnable after given initial delay
+     */
+    public void testSchedule5() {
+	try {
+            TrackedShortRunnable runnable = new TrackedShortRunnable();
+            CustomExecutor p1 = new CustomExecutor(1);
+	    ScheduledFuture h = p1.scheduleWithFixedDelay(runnable, SHORT_DELAY_MS, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
+	    assertFalse(runnable.done);
+	    Thread.sleep(MEDIUM_DELAY_MS);
+	    assertTrue(runnable.done);
+            h.cancel(true);
+            joinPool(p1);
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * scheduleAtFixedRate executes series of tasks at given rate
+     */
+    public void testFixedRateSequence() {
+	try {
+            CustomExecutor p1 = new CustomExecutor(1);
+            RunnableCounter counter = new RunnableCounter();
+	    ScheduledFuture h =
+                p1.scheduleAtFixedRate(counter, 0, 1, TimeUnit.MILLISECONDS);
+	    Thread.sleep(SMALL_DELAY_MS);
+            h.cancel(true);
+            int c = counter.count.get();
+            // By time scaling conventions, we must have at least
+            // an execution per SHORT delay, but no more than one SHORT more
+            assertTrue(c >= SMALL_DELAY_MS / SHORT_DELAY_MS);
+            assertTrue(c <= SMALL_DELAY_MS + SHORT_DELAY_MS);
+            joinPool(p1);
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * scheduleWithFixedDelay executes series of tasks with given period
+     */
+    public void testFixedDelaySequence() {
+	try {
+            CustomExecutor p1 = new CustomExecutor(1);
+            RunnableCounter counter = new RunnableCounter();
+	    ScheduledFuture h =
+                p1.scheduleWithFixedDelay(counter, 0, 1, TimeUnit.MILLISECONDS);
+	    Thread.sleep(SMALL_DELAY_MS);
+            h.cancel(true);
+            int c = counter.count.get();
+            assertTrue(c >= SMALL_DELAY_MS / SHORT_DELAY_MS);
+            assertTrue(c <= SMALL_DELAY_MS + SHORT_DELAY_MS);
+            joinPool(p1);
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     *  execute (null) throws NPE
+     */
+    public void testExecuteNull() {
+        CustomExecutor se = null;
+        try {
+	    se = new CustomExecutor(1);
+	    se.execute(null);
+            shouldThrow();
+	} catch(NullPointerException success){}
+	catch(Exception e){
+            unexpectedException();
+        }
+
+	joinPool(se);
+    }
+
+    /**
+     * schedule (null) throws NPE
+     */
+    public void testScheduleNull() {
+        CustomExecutor se = new CustomExecutor(1);
+	try {
+            TrackedCallable callable = null;
+	    Future f = se.schedule(callable, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
+            shouldThrow();
+	} catch(NullPointerException success){}
+	catch(Exception e){
+            unexpectedException();
+        }
+	joinPool(se);
+    }
+
+    /**
+     * execute throws RejectedExecutionException if shutdown
+     */
+    public void testSchedule1_RejectedExecutionException() {
+        CustomExecutor se = new CustomExecutor(1);
+        try {
+            se.shutdown();
+            se.schedule(new NoOpRunnable(),
+                        MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+            shouldThrow();
+        } catch(RejectedExecutionException success){
+        } catch (SecurityException ok) {
+        }
+
+        joinPool(se);
+
+    }
+
+    /**
+     * schedule throws RejectedExecutionException if shutdown
+     */
+    public void testSchedule2_RejectedExecutionException() {
+        CustomExecutor se = new CustomExecutor(1);
+        try {
+            se.shutdown();
+            se.schedule(new NoOpCallable(),
+                        MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+            shouldThrow();
+        } catch(RejectedExecutionException success){
+        } catch (SecurityException ok) {
+        }
+        joinPool(se);
+    }
+
+    /**
+     * schedule callable throws RejectedExecutionException if shutdown
+     */
+     public void testSchedule3_RejectedExecutionException() {
+         CustomExecutor se = new CustomExecutor(1);
+         try {
+            se.shutdown();
+            se.schedule(new NoOpCallable(),
+                        MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+            shouldThrow();
+        } catch(RejectedExecutionException success){
+        } catch (SecurityException ok) {
+        }
+         joinPool(se);
+    }
+
+    /**
+     *  scheduleAtFixedRate throws RejectedExecutionException if shutdown
+     */
+    public void testScheduleAtFixedRate1_RejectedExecutionException() {
+        CustomExecutor se = new CustomExecutor(1);
+        try {
+            se.shutdown();
+            se.scheduleAtFixedRate(new NoOpRunnable(),
+                                   MEDIUM_DELAY_MS, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+            shouldThrow();
+        } catch(RejectedExecutionException success){
+        } catch (SecurityException ok) {
+        }
+        joinPool(se);
+    }
+
+    /**
+     * scheduleWithFixedDelay throws RejectedExecutionException if shutdown
+     */
+    public void testScheduleWithFixedDelay1_RejectedExecutionException() {
+        CustomExecutor se = new CustomExecutor(1);
+        try {
+            se.shutdown();
+            se.scheduleWithFixedDelay(new NoOpRunnable(),
+                                      MEDIUM_DELAY_MS, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+            shouldThrow();
+        } catch(RejectedExecutionException success){
+        } catch (SecurityException ok) {
+        }
+        joinPool(se);
+    }
+
+    /**
+     *  getActiveCount increases but doesn't overestimate, when a
+     *  thread becomes active
+     */
+    public void testGetActiveCount() {
+        CustomExecutor p2 = new CustomExecutor(2);
+        assertEquals(0, p2.getActiveCount());
+        p2.execute(new SmallRunnable());
+        try {
+            Thread.sleep(SHORT_DELAY_MS);
+        } catch(Exception e){
+            unexpectedException();
+        }
+        assertEquals(1, p2.getActiveCount());
+        joinPool(p2);
+    }
+
+    /**
+     *    getCompletedTaskCount increases, but doesn't overestimate,
+     *   when tasks complete
+     */
+    public void testGetCompletedTaskCount() {
+        CustomExecutor p2 = new CustomExecutor(2);
+        assertEquals(0, p2.getCompletedTaskCount());
+        p2.execute(new SmallRunnable());
+        try {
+            Thread.sleep(MEDIUM_DELAY_MS);
+        } catch(Exception e){
+            unexpectedException();
+        }
+        assertEquals(1, p2.getCompletedTaskCount());
+        joinPool(p2);
+    }
+
+    /**
+     *  getCorePoolSize returns size given in constructor if not otherwise set
+     */
+    public void testGetCorePoolSize() {
+        CustomExecutor p1 = new CustomExecutor(1);
+        assertEquals(1, p1.getCorePoolSize());
+        joinPool(p1);
+    }
+
+    /**
+     *    getLargestPoolSize increases, but doesn't overestimate, when
+     *   multiple threads active
+     */
+    public void testGetLargestPoolSize() {
+        CustomExecutor p2 = new CustomExecutor(2);
+        assertEquals(0, p2.getLargestPoolSize());
+        p2.execute(new SmallRunnable());
+        p2.execute(new SmallRunnable());
+        try {
+            Thread.sleep(SHORT_DELAY_MS);
+        } catch(Exception e){
+            unexpectedException();
+        }
+        assertEquals(2, p2.getLargestPoolSize());
+        joinPool(p2);
+    }
+
+    /**
+     *   getPoolSize increases, but doesn't overestimate, when threads
+     *   become active
+     */
+    public void testGetPoolSize() {
+        CustomExecutor p1 = new CustomExecutor(1);
+        assertEquals(0, p1.getPoolSize());
+        p1.execute(new SmallRunnable());
+        assertEquals(1, p1.getPoolSize());
+        joinPool(p1);
+    }
+
+    /**
+     *    getTaskCount increases, but doesn't overestimate, when tasks
+     *    submitted
+     */
+    public void testGetTaskCount() {
+        CustomExecutor p1 = new CustomExecutor(1);
+        assertEquals(0, p1.getTaskCount());
+        for(int i = 0; i < 5; i++)
+            p1.execute(new SmallRunnable());
+        try {
+            Thread.sleep(SHORT_DELAY_MS);
+        } catch(Exception e){
+            unexpectedException();
+        }
+        assertEquals(5, p1.getTaskCount());
+        joinPool(p1);
+    }
+
+    /**
+     * getThreadFactory returns factory in constructor if not set
+     */
+    public void testGetThreadFactory() {
+        ThreadFactory tf = new SimpleThreadFactory();
+	CustomExecutor p = new CustomExecutor(1, tf);
+        assertSame(tf, p.getThreadFactory());
+        joinPool(p);
+    }
+
+    /**
+     * setThreadFactory sets the thread factory returned by getThreadFactory
+     */
+    public void testSetThreadFactory() {
+        ThreadFactory tf = new SimpleThreadFactory();
+	CustomExecutor p = new CustomExecutor(1);
+        p.setThreadFactory(tf);
+        assertSame(tf, p.getThreadFactory());
+        joinPool(p);
+    }
+
+    /**
+     * setThreadFactory(null) throws NPE
+     */
+    public void testSetThreadFactoryNull() {
+	CustomExecutor p = new CustomExecutor(1);
+        try {
+            p.setThreadFactory(null);
+            shouldThrow();
+        } catch (NullPointerException success) {
+        } finally {
+            joinPool(p);
+        }
+    }
+
+    /**
+     *   is isShutDown is false before shutdown, true after
+     */
+    public void testIsShutdown() {
+
+	CustomExecutor p1 = new CustomExecutor(1);
+        try {
+            assertFalse(p1.isShutdown());
+        }
+        finally {
+            try { p1.shutdown(); } catch(SecurityException ok) { return; }
+        }
+	assertTrue(p1.isShutdown());
+    }
+
+
+    /**
+     *   isTerminated is false before termination, true after
+     */
+    public void testIsTerminated() {
+	CustomExecutor p1 = new CustomExecutor(1);
+        try {
+            p1.execute(new SmallRunnable());
+        } finally {
+            try { p1.shutdown(); } catch(SecurityException ok) { return; }
+        }
+        try {
+	    assertTrue(p1.awaitTermination(LONG_DELAY_MS, TimeUnit.MILLISECONDS));
+            assertTrue(p1.isTerminated());
+	} catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     *  isTerminating is not true when running or when terminated
+     */
+    public void testIsTerminating() {
+	CustomExecutor p1 = new CustomExecutor(1);
+        assertFalse(p1.isTerminating());
+        try {
+            p1.execute(new SmallRunnable());
+            assertFalse(p1.isTerminating());
+        } finally {
+            try { p1.shutdown(); } catch(SecurityException ok) { return; }
+        }
+        try {
+	    assertTrue(p1.awaitTermination(LONG_DELAY_MS, TimeUnit.MILLISECONDS));
+            assertTrue(p1.isTerminated());
+            assertFalse(p1.isTerminating());
+	} catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * getQueue returns the work queue, which contains queued tasks
+     */
+    public void testGetQueue() {
+        CustomExecutor p1 = new CustomExecutor(1);
+        ScheduledFuture[] tasks = new ScheduledFuture[5];
+        for(int i = 0; i < 5; i++){
+            tasks[i] = p1.schedule(new SmallPossiblyInterruptedRunnable(), 1, TimeUnit.MILLISECONDS);
+        }
+        try {
+            Thread.sleep(SHORT_DELAY_MS);
+            BlockingQueue q = p1.getQueue();
+            assertTrue(q.contains(tasks[4]));
+            assertFalse(q.contains(tasks[0]));
+        } catch(Exception e) {
+            unexpectedException();
+        } finally {
+            joinPool(p1);
+        }
+    }
+
+    /**
+     * remove(task) removes queued task, and fails to remove active task
+     */
+    public void testRemove() {
+        CustomExecutor p1 = new CustomExecutor(1);
+        ScheduledFuture[] tasks = new ScheduledFuture[5];
+        for(int i = 0; i < 5; i++){
+            tasks[i] = p1.schedule(new SmallPossiblyInterruptedRunnable(), 1, TimeUnit.MILLISECONDS);
+        }
+        try {
+            Thread.sleep(SHORT_DELAY_MS);
+            BlockingQueue q = p1.getQueue();
+            assertFalse(p1.remove((Runnable)tasks[0]));
+            assertTrue(q.contains((Runnable)tasks[4]));
+            assertTrue(q.contains((Runnable)tasks[3]));
+            assertTrue(p1.remove((Runnable)tasks[4]));
+            assertFalse(p1.remove((Runnable)tasks[4]));
+            assertFalse(q.contains((Runnable)tasks[4]));
+            assertTrue(q.contains((Runnable)tasks[3]));
+            assertTrue(p1.remove((Runnable)tasks[3]));
+            assertFalse(q.contains((Runnable)tasks[3]));
+        } catch(Exception e) {
+            unexpectedException();
+        } finally {
+            joinPool(p1);
+        }
+    }
+
+    /**
+     *  purge removes cancelled tasks from the queue
+     */
+    public void testPurge() {
+        CustomExecutor p1 = new CustomExecutor(1);
+        ScheduledFuture[] tasks = new ScheduledFuture[5];
+        for(int i = 0; i < 5; i++){
+            tasks[i] = p1.schedule(new SmallPossiblyInterruptedRunnable(), SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
+        }
+        try {
+            int max = 5;
+            if (tasks[4].cancel(true)) --max;
+            if (tasks[3].cancel(true)) --max;
+            // There must eventually be an interference-free point at
+            // which purge will not fail. (At worst, when queue is empty.)
+            int k;
+            for (k = 0; k < SMALL_DELAY_MS; ++k) {
+                p1.purge();
+                long count = p1.getTaskCount();
+                if (count >= 0 && count <= max)
+                    break;
+                Thread.sleep(1);
+            }
+            assertTrue(k < SMALL_DELAY_MS);
+        } catch(Exception e) {
+            unexpectedException();
+        } finally {
+            joinPool(p1);
+        }
+    }
+
+    /**
+     *  shutDownNow returns a list containing tasks that were not run
+     */
+    public void testShutDownNow() {
+	CustomExecutor p1 = new CustomExecutor(1);
+        for(int i = 0; i < 5; i++)
+            p1.schedule(new SmallPossiblyInterruptedRunnable(), SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
+        List l;
+        try {
+            l = p1.shutdownNow();
+        } catch (SecurityException ok) {
+            return;
+        }
+	assertTrue(p1.isShutdown());
+	assertTrue(l.size() > 0 && l.size() <= 5);
+        joinPool(p1);
+    }
+
+    /**
+     * In default setting, shutdown cancels periodic but not delayed
+     * tasks at shutdown
+     */
+    public void testShutDown1() {
+        try {
+            CustomExecutor p1 = new CustomExecutor(1);
+            assertTrue(p1.getExecuteExistingDelayedTasksAfterShutdownPolicy());
+            assertFalse(p1.getContinueExistingPeriodicTasksAfterShutdownPolicy());
+
+            ScheduledFuture[] tasks = new ScheduledFuture[5];
+            for(int i = 0; i < 5; i++)
+                tasks[i] = p1.schedule(new NoOpRunnable(), SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
+            try { p1.shutdown(); } catch(SecurityException ok) { return; }
+            BlockingQueue q = p1.getQueue();
+            for (Iterator it = q.iterator(); it.hasNext();) {
+                ScheduledFuture t = (ScheduledFuture)it.next();
+                assertFalse(t.isCancelled());
+            }
+            assertTrue(p1.isShutdown());
+            Thread.sleep(SMALL_DELAY_MS);
+            for (int i = 0; i < 5; ++i) {
+                assertTrue(tasks[i].isDone());
+                assertFalse(tasks[i].isCancelled());
+            }
+
+        }
+        catch(Exception ex) {
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * If setExecuteExistingDelayedTasksAfterShutdownPolicy is false,
+     * delayed tasks are cancelled at shutdown
+     */
+    public void testShutDown2() {
+        try {
+            CustomExecutor p1 = new CustomExecutor(1);
+            p1.setExecuteExistingDelayedTasksAfterShutdownPolicy(false);
+            ScheduledFuture[] tasks = new ScheduledFuture[5];
+            for(int i = 0; i < 5; i++)
+                tasks[i] = p1.schedule(new NoOpRunnable(), SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
+            try { p1.shutdown(); } catch(SecurityException ok) { return; }
+            assertTrue(p1.isShutdown());
+            BlockingQueue q = p1.getQueue();
+            assertTrue(q.isEmpty());
+            Thread.sleep(SMALL_DELAY_MS);
+            assertTrue(p1.isTerminated());
+        }
+        catch(Exception ex) {
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * If setContinueExistingPeriodicTasksAfterShutdownPolicy is set false,
+     * periodic tasks are not cancelled at shutdown
+     */
+    public void testShutDown3() {
+        try {
+            CustomExecutor p1 = new CustomExecutor(1);
+            p1.setContinueExistingPeriodicTasksAfterShutdownPolicy(false);
+            ScheduledFuture task =
+                p1.scheduleAtFixedRate(new NoOpRunnable(), 5, 5, TimeUnit.MILLISECONDS);
+            try { p1.shutdown(); } catch(SecurityException ok) { return; }
+            assertTrue(p1.isShutdown());
+            BlockingQueue q = p1.getQueue();
+            assertTrue(q.isEmpty());
+            Thread.sleep(SHORT_DELAY_MS);
+            assertTrue(p1.isTerminated());
+        }
+        catch(Exception ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * if setContinueExistingPeriodicTasksAfterShutdownPolicy is true,
+     * periodic tasks are cancelled at shutdown
+     */
+    public void testShutDown4() {
+        CustomExecutor p1 = new CustomExecutor(1);
+        try {
+            p1.setContinueExistingPeriodicTasksAfterShutdownPolicy(true);
+            ScheduledFuture task =
+                p1.scheduleAtFixedRate(new NoOpRunnable(), 1, 1, TimeUnit.MILLISECONDS);
+            assertFalse(task.isCancelled());
+            try { p1.shutdown(); } catch(SecurityException ok) { return; }
+            assertFalse(task.isCancelled());
+            assertFalse(p1.isTerminated());
+            assertTrue(p1.isShutdown());
+            Thread.sleep(SHORT_DELAY_MS);
+            assertFalse(task.isCancelled());
+            assertTrue(task.cancel(true));
+            assertTrue(task.isDone());
+            Thread.sleep(SHORT_DELAY_MS);
+            assertTrue(p1.isTerminated());
+        }
+        catch(Exception ex) {
+            unexpectedException();
+        }
+        finally {
+            joinPool(p1);
+        }
+    }
+
+    /**
+     * completed submit of callable returns result
+     */
+    public void testSubmitCallable() {
+        ExecutorService e = new CustomExecutor(2);
+        try {
+            Future future = e.submit(new StringTask());
+            String result = (String)future.get();
+            assertSame(TEST_STRING, result);
+        }
+        catch (ExecutionException ex) {
+            unexpectedException();
+        }
+        catch (InterruptedException ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * completed submit of runnable returns successfully
+     */
+    public void testSubmitRunnable() {
+        ExecutorService e = new CustomExecutor(2);
+        try {
+            Future future = e.submit(new NoOpRunnable());
+            future.get();
+            assertTrue(future.isDone());
+        }
+        catch (ExecutionException ex) {
+            unexpectedException();
+        }
+        catch (InterruptedException ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * completed submit of (runnable, result) returns result
+     */
+    public void testSubmitRunnable2() {
+        ExecutorService e = new CustomExecutor(2);
+        try {
+            Future future = e.submit(new NoOpRunnable(), TEST_STRING);
+            String result = (String)future.get();
+            assertSame(TEST_STRING, result);
+        }
+        catch (ExecutionException ex) {
+            unexpectedException();
+        }
+        catch (InterruptedException ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAny(null) throws NPE
+     */
+    public void testInvokeAny1() {
+        ExecutorService e = new CustomExecutor(2);
+        try {
+            e.invokeAny(null);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAny(empty collection) throws IAE
+     */
+    public void testInvokeAny2() {
+        ExecutorService e = new CustomExecutor(2);
+        try {
+            e.invokeAny(new ArrayList());
+        } catch (IllegalArgumentException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAny(c) throws NPE if c has null elements
+     */
+    public void testInvokeAny3() {
+        ExecutorService e = new CustomExecutor(2);
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(null);
+            e.invokeAny(l);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAny(c) throws ExecutionException if no task completes
+     */
+    public void testInvokeAny4() {
+        ExecutorService e = new CustomExecutor(2);
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new NPETask());
+            e.invokeAny(l);
+        } catch (ExecutionException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAny(c) returns result of some task
+     */
+    public void testInvokeAny5() {
+        ExecutorService e = new CustomExecutor(2);
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(new StringTask());
+            String result = (String)e.invokeAny(l);
+            assertSame(TEST_STRING, result);
+        } catch (ExecutionException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAll(null) throws NPE
+     */
+    public void testInvokeAll1() {
+        ExecutorService e = new CustomExecutor(2);
+        try {
+            e.invokeAll(null);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAll(empty collection) returns empty collection
+     */
+    public void testInvokeAll2() {
+        ExecutorService e = new CustomExecutor(2);
+        try {
+            List r = e.invokeAll(new ArrayList());
+            assertTrue(r.isEmpty());
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAll(c) throws NPE if c has null elements
+     */
+    public void testInvokeAll3() {
+        ExecutorService e = new CustomExecutor(2);
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(null);
+            e.invokeAll(l);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * get of invokeAll(c) throws exception on failed task
+     */
+    public void testInvokeAll4() {
+        ExecutorService e = new CustomExecutor(2);
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new NPETask());
+            List result = e.invokeAll(l);
+            assertEquals(1, result.size());
+            for (Iterator it = result.iterator(); it.hasNext();)
+                ((Future)it.next()).get();
+        } catch(ExecutionException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAll(c) returns results of all completed tasks
+     */
+    public void testInvokeAll5() {
+        ExecutorService e = new CustomExecutor(2);
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(new StringTask());
+            List result = e.invokeAll(l);
+            assertEquals(2, result.size());
+            for (Iterator it = result.iterator(); it.hasNext();)
+                assertSame(TEST_STRING, ((Future)it.next()).get());
+        } catch (ExecutionException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAny(null) throws NPE
+     */
+    public void testTimedInvokeAny1() {
+        ExecutorService e = new CustomExecutor(2);
+        try {
+            e.invokeAny(null, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAny(,,null) throws NPE
+     */
+    public void testTimedInvokeAnyNullTimeUnit() {
+        ExecutorService e = new CustomExecutor(2);
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            e.invokeAny(l, MEDIUM_DELAY_MS, null);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAny(empty collection) throws IAE
+     */
+    public void testTimedInvokeAny2() {
+        ExecutorService e = new CustomExecutor(2);
+        try {
+            e.invokeAny(new ArrayList(), MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+        } catch (IllegalArgumentException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAny(c) throws NPE if c has null elements
+     */
+    public void testTimedInvokeAny3() {
+        ExecutorService e = new CustomExecutor(2);
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(null);
+            e.invokeAny(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            ex.printStackTrace();
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAny(c) throws ExecutionException if no task completes
+     */
+    public void testTimedInvokeAny4() {
+        ExecutorService e = new CustomExecutor(2);
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new NPETask());
+            e.invokeAny(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+        } catch(ExecutionException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAny(c) returns result of some task
+     */
+    public void testTimedInvokeAny5() {
+        ExecutorService e = new CustomExecutor(2);
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(new StringTask());
+            String result = (String)e.invokeAny(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+            assertSame(TEST_STRING, result);
+        } catch (ExecutionException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAll(null) throws NPE
+     */
+    public void testTimedInvokeAll1() {
+        ExecutorService e = new CustomExecutor(2);
+        try {
+            e.invokeAll(null, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAll(,,null) throws NPE
+     */
+    public void testTimedInvokeAllNullTimeUnit() {
+        ExecutorService e = new CustomExecutor(2);
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            e.invokeAll(l, MEDIUM_DELAY_MS, null);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAll(empty collection) returns empty collection
+     */
+    public void testTimedInvokeAll2() {
+        ExecutorService e = new CustomExecutor(2);
+        try {
+            List r = e.invokeAll(new ArrayList(), MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+            assertTrue(r.isEmpty());
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAll(c) throws NPE if c has null elements
+     */
+    public void testTimedInvokeAll3() {
+        ExecutorService e = new CustomExecutor(2);
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(null);
+            e.invokeAll(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * get of element of invokeAll(c) throws exception on failed task
+     */
+    public void testTimedInvokeAll4() {
+        ExecutorService e = new CustomExecutor(2);
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new NPETask());
+            List result = e.invokeAll(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+            assertEquals(1, result.size());
+            for (Iterator it = result.iterator(); it.hasNext();)
+                ((Future)it.next()).get();
+        } catch(ExecutionException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAll(c) returns results of all completed tasks
+     */
+    public void testTimedInvokeAll5() {
+        ExecutorService e = new CustomExecutor(2);
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(new StringTask());
+            List result = e.invokeAll(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+            assertEquals(2, result.size());
+            for (Iterator it = result.iterator(); it.hasNext();)
+                assertSame(TEST_STRING, ((Future)it.next()).get());
+        } catch (ExecutionException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAll(c) cancels tasks not completed by timeout
+     */
+    public void testTimedInvokeAll6() {
+        ExecutorService e = new CustomExecutor(2);
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(Executors.callable(new MediumPossiblyInterruptedRunnable(), TEST_STRING));
+            l.add(new StringTask());
+            List result = e.invokeAll(l, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
+            assertEquals(3, result.size());
+            Iterator it = result.iterator();
+            Future f1 = (Future)it.next();
+            Future f2 = (Future)it.next();
+            Future f3 = (Future)it.next();
+            assertTrue(f1.isDone());
+            assertTrue(f2.isDone());
+            assertTrue(f3.isDone());
+            assertFalse(f1.isCancelled());
+            assertTrue(f2.isCancelled());
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/ScheduledExecutorTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/ScheduledExecutorTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/ScheduledExecutorTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,1150 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.atomic.*;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Iterator;
+
+public class ScheduledExecutorTest extends JSR166TestCase {
+    public static void main(String[] args) {
+	junit.textui.TestRunner.run (suite());
+    }
+    public static Test suite() {
+	return new TestSuite(ScheduledExecutorTest.class);
+    }
+
+
+    /**
+     * execute successfully executes a runnable
+     */
+    public void testExecute() {
+	try {
+            TrackedShortRunnable runnable =new TrackedShortRunnable();
+            ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
+	    p1.execute(runnable);
+	    assertFalse(runnable.done);
+	    Thread.sleep(SHORT_DELAY_MS);
+	    try { p1.shutdown(); } catch(SecurityException ok) { return; }
+	    try {
+                Thread.sleep(MEDIUM_DELAY_MS);
+            } catch(InterruptedException e){
+                unexpectedException();
+            }
+	    assertTrue(runnable.done);
+            try { p1.shutdown(); } catch(SecurityException ok) { return; }
+            joinPool(p1);
+        }
+	catch(Exception e){
+            unexpectedException();
+        }
+
+    }
+
+
+    /**
+     * delayed schedule of callable successfully executes after delay
+     */
+    public void testSchedule1() {
+	try {
+            TrackedCallable callable = new TrackedCallable();
+            ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
+	    Future f = p1.schedule(callable, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
+	    assertFalse(callable.done);
+	    Thread.sleep(MEDIUM_DELAY_MS);
+	    assertTrue(callable.done);
+	    assertEquals(Boolean.TRUE, f.get());
+            try { p1.shutdown(); } catch(SecurityException ok) { return; }
+            joinPool(p1);
+	} catch(RejectedExecutionException e){}
+	catch(Exception e){
+            e.printStackTrace();
+            unexpectedException();
+        }
+    }
+
+    /**
+     *  delayed schedule of runnable successfully executes after delay
+     */
+    public void testSchedule3() {
+	try {
+            TrackedShortRunnable runnable = new TrackedShortRunnable();
+            ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
+	    p1.schedule(runnable, SMALL_DELAY_MS, TimeUnit.MILLISECONDS);
+	    Thread.sleep(SHORT_DELAY_MS);
+	    assertFalse(runnable.done);
+	    Thread.sleep(MEDIUM_DELAY_MS);
+	    assertTrue(runnable.done);
+            try { p1.shutdown(); } catch(SecurityException ok) { return; }
+            joinPool(p1);
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * scheduleAtFixedRate executes runnable after given initial delay
+     */
+    public void testSchedule4() {
+	try {
+            TrackedShortRunnable runnable = new TrackedShortRunnable();
+            ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
+	    ScheduledFuture h = p1.scheduleAtFixedRate(runnable, SHORT_DELAY_MS, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
+	    assertFalse(runnable.done);
+	    Thread.sleep(MEDIUM_DELAY_MS);
+	    assertTrue(runnable.done);
+            h.cancel(true);
+            joinPool(p1);
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    static class RunnableCounter implements Runnable {
+        AtomicInteger count = new AtomicInteger(0);
+        public void run() { count.getAndIncrement(); }
+    }
+
+    /**
+     * scheduleWithFixedDelay executes runnable after given initial delay
+     */
+    public void testSchedule5() {
+	try {
+            TrackedShortRunnable runnable = new TrackedShortRunnable();
+            ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
+	    ScheduledFuture h = p1.scheduleWithFixedDelay(runnable, SHORT_DELAY_MS, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
+	    assertFalse(runnable.done);
+	    Thread.sleep(MEDIUM_DELAY_MS);
+	    assertTrue(runnable.done);
+            h.cancel(true);
+            joinPool(p1);
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * scheduleAtFixedRate executes series of tasks at given rate
+     */
+    public void testFixedRateSequence() {
+	try {
+            ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
+            RunnableCounter counter = new RunnableCounter();
+	    ScheduledFuture h =
+                p1.scheduleAtFixedRate(counter, 0, 1, TimeUnit.MILLISECONDS);
+	    Thread.sleep(SMALL_DELAY_MS);
+            h.cancel(true);
+            int c = counter.count.get();
+            // By time scaling conventions, we must have at least
+            // an execution per SHORT delay, but no more than one SHORT more
+            assertTrue(c >= SMALL_DELAY_MS / SHORT_DELAY_MS);
+            assertTrue(c <= SMALL_DELAY_MS + SHORT_DELAY_MS);
+            joinPool(p1);
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * scheduleWithFixedDelay executes series of tasks with given period
+     */
+    public void testFixedDelaySequence() {
+	try {
+            ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
+            RunnableCounter counter = new RunnableCounter();
+	    ScheduledFuture h =
+                p1.scheduleWithFixedDelay(counter, 0, 1, TimeUnit.MILLISECONDS);
+	    Thread.sleep(SMALL_DELAY_MS);
+            h.cancel(true);
+            int c = counter.count.get();
+            assertTrue(c >= SMALL_DELAY_MS / SHORT_DELAY_MS);
+            assertTrue(c <= SMALL_DELAY_MS + SHORT_DELAY_MS);
+            joinPool(p1);
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     *  execute (null) throws NPE
+     */
+    public void testExecuteNull() {
+        ScheduledThreadPoolExecutor se = null;
+        try {
+	    se = new ScheduledThreadPoolExecutor(1);
+	    se.execute(null);
+            shouldThrow();
+	} catch(NullPointerException success){}
+	catch(Exception e){
+            unexpectedException();
+        }
+
+	joinPool(se);
+    }
+
+    /**
+     * schedule (null) throws NPE
+     */
+    public void testScheduleNull() {
+        ScheduledThreadPoolExecutor se = new ScheduledThreadPoolExecutor(1);
+	try {
+            TrackedCallable callable = null;
+	    Future f = se.schedule(callable, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
+            shouldThrow();
+	} catch(NullPointerException success){}
+	catch(Exception e){
+            unexpectedException();
+        }
+	joinPool(se);
+    }
+
+    /**
+     * execute throws RejectedExecutionException if shutdown
+     */
+    public void testSchedule1_RejectedExecutionException() {
+        ScheduledThreadPoolExecutor se = new ScheduledThreadPoolExecutor(1);
+        try {
+            se.shutdown();
+            se.schedule(new NoOpRunnable(),
+                        MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+            shouldThrow();
+        } catch(RejectedExecutionException success){
+        } catch (SecurityException ok) {
+        }
+
+        joinPool(se);
+
+    }
+
+    /**
+     * schedule throws RejectedExecutionException if shutdown
+     */
+    public void testSchedule2_RejectedExecutionException() {
+        ScheduledThreadPoolExecutor se = new ScheduledThreadPoolExecutor(1);
+        try {
+            se.shutdown();
+            se.schedule(new NoOpCallable(),
+                        MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+            shouldThrow();
+        } catch(RejectedExecutionException success){
+        } catch (SecurityException ok) {
+        }
+        joinPool(se);
+    }
+
+    /**
+     * schedule callable throws RejectedExecutionException if shutdown
+     */
+     public void testSchedule3_RejectedExecutionException() {
+         ScheduledThreadPoolExecutor se = new ScheduledThreadPoolExecutor(1);
+         try {
+            se.shutdown();
+            se.schedule(new NoOpCallable(),
+                        MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+            shouldThrow();
+        } catch(RejectedExecutionException success){
+        } catch (SecurityException ok) {
+        }
+         joinPool(se);
+    }
+
+    /**
+     *  scheduleAtFixedRate throws RejectedExecutionException if shutdown
+     */
+    public void testScheduleAtFixedRate1_RejectedExecutionException() {
+        ScheduledThreadPoolExecutor se = new ScheduledThreadPoolExecutor(1);
+        try {
+            se.shutdown();
+            se.scheduleAtFixedRate(new NoOpRunnable(),
+                                   MEDIUM_DELAY_MS, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+            shouldThrow();
+        } catch(RejectedExecutionException success){
+        } catch (SecurityException ok) {
+        }
+        joinPool(se);
+    }
+
+    /**
+     * scheduleWithFixedDelay throws RejectedExecutionException if shutdown
+     */
+    public void testScheduleWithFixedDelay1_RejectedExecutionException() {
+        ScheduledThreadPoolExecutor se = new ScheduledThreadPoolExecutor(1);
+        try {
+            se.shutdown();
+            se.scheduleWithFixedDelay(new NoOpRunnable(),
+                                      MEDIUM_DELAY_MS, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+            shouldThrow();
+        } catch(RejectedExecutionException success){
+        } catch (SecurityException ok) {
+        }
+        joinPool(se);
+    }
+
+    /**
+     *  getActiveCount increases but doesn't overestimate, when a
+     *  thread becomes active
+     */
+    public void testGetActiveCount() {
+        ScheduledThreadPoolExecutor p2 = new ScheduledThreadPoolExecutor(2);
+        assertEquals(0, p2.getActiveCount());
+        p2.execute(new SmallRunnable());
+        try {
+            Thread.sleep(SHORT_DELAY_MS);
+        } catch(Exception e){
+            unexpectedException();
+        }
+        assertEquals(1, p2.getActiveCount());
+        joinPool(p2);
+    }
+
+    /**
+     *    getCompletedTaskCount increases, but doesn't overestimate,
+     *   when tasks complete
+     */
+    public void testGetCompletedTaskCount() {
+        ScheduledThreadPoolExecutor p2 = new ScheduledThreadPoolExecutor(2);
+        assertEquals(0, p2.getCompletedTaskCount());
+        p2.execute(new SmallRunnable());
+        try {
+            Thread.sleep(MEDIUM_DELAY_MS);
+        } catch(Exception e){
+            unexpectedException();
+        }
+        assertEquals(1, p2.getCompletedTaskCount());
+        joinPool(p2);
+    }
+
+    /**
+     *  getCorePoolSize returns size given in constructor if not otherwise set
+     */
+    public void testGetCorePoolSize() {
+        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
+        assertEquals(1, p1.getCorePoolSize());
+        joinPool(p1);
+    }
+
+    /**
+     *    getLargestPoolSize increases, but doesn't overestimate, when
+     *   multiple threads active
+     */
+    public void testGetLargestPoolSize() {
+        ScheduledThreadPoolExecutor p2 = new ScheduledThreadPoolExecutor(2);
+        assertEquals(0, p2.getLargestPoolSize());
+        p2.execute(new SmallRunnable());
+        p2.execute(new SmallRunnable());
+        try {
+            Thread.sleep(SHORT_DELAY_MS);
+        } catch(Exception e){
+            unexpectedException();
+        }
+        assertEquals(2, p2.getLargestPoolSize());
+        joinPool(p2);
+    }
+
+    /**
+     *   getPoolSize increases, but doesn't overestimate, when threads
+     *   become active
+     */
+    public void testGetPoolSize() {
+        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
+        assertEquals(0, p1.getPoolSize());
+        p1.execute(new SmallRunnable());
+        assertEquals(1, p1.getPoolSize());
+        joinPool(p1);
+    }
+
+    /**
+     *    getTaskCount increases, but doesn't overestimate, when tasks
+     *    submitted
+     */
+    public void testGetTaskCount() {
+        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
+        assertEquals(0, p1.getTaskCount());
+        for(int i = 0; i < 5; i++)
+            p1.execute(new SmallRunnable());
+        try {
+            Thread.sleep(SHORT_DELAY_MS);
+        } catch(Exception e){
+            unexpectedException();
+        }
+        assertEquals(5, p1.getTaskCount());
+        joinPool(p1);
+    }
+
+    /**
+     * getThreadFactory returns factory in constructor if not set
+     */
+    public void testGetThreadFactory() {
+        ThreadFactory tf = new SimpleThreadFactory();
+	ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1, tf);
+        assertSame(tf, p.getThreadFactory());
+        joinPool(p);
+    }
+
+    /**
+     * setThreadFactory sets the thread factory returned by getThreadFactory
+     */
+    public void testSetThreadFactory() {
+        ThreadFactory tf = new SimpleThreadFactory();
+	ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
+        p.setThreadFactory(tf);
+        assertSame(tf, p.getThreadFactory());
+        joinPool(p);
+    }
+
+    /**
+     * setThreadFactory(null) throws NPE
+     */
+    public void testSetThreadFactoryNull() {
+	ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
+        try {
+            p.setThreadFactory(null);
+            shouldThrow();
+        } catch (NullPointerException success) {
+        } finally {
+            joinPool(p);
+        }
+    }
+
+    /**
+     *   is isShutDown is false before shutdown, true after
+     */
+    public void testIsShutdown() {
+
+	ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
+        try {
+            assertFalse(p1.isShutdown());
+        }
+        finally {
+            try { p1.shutdown(); } catch(SecurityException ok) { return; }
+        }
+	assertTrue(p1.isShutdown());
+    }
+
+
+    /**
+     *   isTerminated is false before termination, true after
+     */
+    public void testIsTerminated() {
+	ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
+        try {
+            p1.execute(new SmallRunnable());
+        } finally {
+            try { p1.shutdown(); } catch(SecurityException ok) { return; }
+        }
+        try {
+	    assertTrue(p1.awaitTermination(LONG_DELAY_MS, TimeUnit.MILLISECONDS));
+            assertTrue(p1.isTerminated());
+	} catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     *  isTerminating is not true when running or when terminated
+     */
+    public void testIsTerminating() {
+	ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
+        assertFalse(p1.isTerminating());
+        try {
+            p1.execute(new SmallRunnable());
+            assertFalse(p1.isTerminating());
+        } finally {
+            try { p1.shutdown(); } catch(SecurityException ok) { return; }
+        }
+        try {
+	    assertTrue(p1.awaitTermination(LONG_DELAY_MS, TimeUnit.MILLISECONDS));
+            assertTrue(p1.isTerminated());
+            assertFalse(p1.isTerminating());
+	} catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * getQueue returns the work queue, which contains queued tasks
+     */
+    public void testGetQueue() {
+        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
+        ScheduledFuture[] tasks = new ScheduledFuture[5];
+        for(int i = 0; i < 5; i++){
+            tasks[i] = p1.schedule(new SmallPossiblyInterruptedRunnable(), 1, TimeUnit.MILLISECONDS);
+        }
+        try {
+            Thread.sleep(SHORT_DELAY_MS);
+            BlockingQueue q = p1.getQueue();
+            assertTrue(q.contains(tasks[4]));
+            assertFalse(q.contains(tasks[0]));
+        } catch(Exception e) {
+            unexpectedException();
+        } finally {
+            joinPool(p1);
+        }
+    }
+
+    /**
+     * remove(task) removes queued task, and fails to remove active task
+     */
+    public void testRemove() {
+        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
+        ScheduledFuture[] tasks = new ScheduledFuture[5];
+        for(int i = 0; i < 5; i++){
+            tasks[i] = p1.schedule(new SmallPossiblyInterruptedRunnable(), 1, TimeUnit.MILLISECONDS);
+        }
+        try {
+            Thread.sleep(SHORT_DELAY_MS);
+            BlockingQueue q = p1.getQueue();
+            assertFalse(p1.remove((Runnable)tasks[0]));
+            assertTrue(q.contains((Runnable)tasks[4]));
+            assertTrue(q.contains((Runnable)tasks[3]));
+            assertTrue(p1.remove((Runnable)tasks[4]));
+            assertFalse(p1.remove((Runnable)tasks[4]));
+            assertFalse(q.contains((Runnable)tasks[4]));
+            assertTrue(q.contains((Runnable)tasks[3]));
+            assertTrue(p1.remove((Runnable)tasks[3]));
+            assertFalse(q.contains((Runnable)tasks[3]));
+        } catch(Exception e) {
+            unexpectedException();
+        } finally {
+            joinPool(p1);
+        }
+    }
+
+    /**
+     *  purge removes cancelled tasks from the queue
+     */
+    public void testPurge() {
+        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
+        ScheduledFuture[] tasks = new ScheduledFuture[5];
+        for(int i = 0; i < 5; i++){
+            tasks[i] = p1.schedule(new SmallPossiblyInterruptedRunnable(), SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
+        }
+        try {
+            int max = 5;
+            if (tasks[4].cancel(true)) --max;
+            if (tasks[3].cancel(true)) --max;
+            // There must eventually be an interference-free point at
+            // which purge will not fail. (At worst, when queue is empty.)
+            int k;
+            for (k = 0; k < SMALL_DELAY_MS; ++k) {
+                p1.purge();
+                long count = p1.getTaskCount();
+                if (count >= 0 && count <= max)
+                    break;
+                Thread.sleep(1);
+            }
+            assertTrue(k < SMALL_DELAY_MS);
+        } catch(Exception e) {
+            unexpectedException();
+        } finally {
+            joinPool(p1);
+        }
+    }
+
+    /**
+     *  shutDownNow returns a list containing tasks that were not run
+     */
+    public void testShutDownNow() {
+	ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
+        for(int i = 0; i < 5; i++)
+            p1.schedule(new SmallPossiblyInterruptedRunnable(), SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
+        List l;
+        try {
+            l = p1.shutdownNow();
+        } catch (SecurityException ok) {
+            return;
+        }
+	assertTrue(p1.isShutdown());
+	assertTrue(l.size() > 0 && l.size() <= 5);
+        joinPool(p1);
+    }
+
+    /**
+     * In default setting, shutdown cancels periodic but not delayed
+     * tasks at shutdown
+     */
+    public void testShutDown1() {
+        try {
+            ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
+            assertTrue(p1.getExecuteExistingDelayedTasksAfterShutdownPolicy());
+            assertFalse(p1.getContinueExistingPeriodicTasksAfterShutdownPolicy());
+
+            ScheduledFuture[] tasks = new ScheduledFuture[5];
+            for(int i = 0; i < 5; i++)
+                tasks[i] = p1.schedule(new NoOpRunnable(), SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
+            try { p1.shutdown(); } catch(SecurityException ok) { return; }
+            BlockingQueue q = p1.getQueue();
+            for (Iterator it = q.iterator(); it.hasNext();) {
+                ScheduledFuture t = (ScheduledFuture)it.next();
+                assertFalse(t.isCancelled());
+            }
+            assertTrue(p1.isShutdown());
+            Thread.sleep(SMALL_DELAY_MS);
+            for (int i = 0; i < 5; ++i) {
+                assertTrue(tasks[i].isDone());
+                assertFalse(tasks[i].isCancelled());
+            }
+
+        }
+        catch(Exception ex) {
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * If setExecuteExistingDelayedTasksAfterShutdownPolicy is false,
+     * delayed tasks are cancelled at shutdown
+     */
+    public void testShutDown2() {
+        try {
+            ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
+            p1.setExecuteExistingDelayedTasksAfterShutdownPolicy(false);
+            ScheduledFuture[] tasks = new ScheduledFuture[5];
+            for(int i = 0; i < 5; i++)
+                tasks[i] = p1.schedule(new NoOpRunnable(), SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
+            try { p1.shutdown(); } catch(SecurityException ok) { return; }
+            assertTrue(p1.isShutdown());
+            BlockingQueue q = p1.getQueue();
+            assertTrue(q.isEmpty());
+            Thread.sleep(SMALL_DELAY_MS);
+            assertTrue(p1.isTerminated());
+        }
+        catch(Exception ex) {
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * If setContinueExistingPeriodicTasksAfterShutdownPolicy is set false,
+     * periodic tasks are not cancelled at shutdown
+     */
+    public void testShutDown3() {
+        try {
+            ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
+            p1.setContinueExistingPeriodicTasksAfterShutdownPolicy(false);
+            ScheduledFuture task =
+                p1.scheduleAtFixedRate(new NoOpRunnable(), 5, 5, TimeUnit.MILLISECONDS);
+            try { p1.shutdown(); } catch(SecurityException ok) { return; }
+            assertTrue(p1.isShutdown());
+            BlockingQueue q = p1.getQueue();
+            assertTrue(q.isEmpty());
+            Thread.sleep(SHORT_DELAY_MS);
+            assertTrue(p1.isTerminated());
+        }
+        catch(Exception ex) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * if setContinueExistingPeriodicTasksAfterShutdownPolicy is true,
+     * periodic tasks are cancelled at shutdown
+     */
+    public void testShutDown4() {
+        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
+        try {
+            p1.setContinueExistingPeriodicTasksAfterShutdownPolicy(true);
+            ScheduledFuture task =
+                p1.scheduleAtFixedRate(new NoOpRunnable(), 1, 1, TimeUnit.MILLISECONDS);
+            assertFalse(task.isCancelled());
+            try { p1.shutdown(); } catch(SecurityException ok) { return; }
+            assertFalse(task.isCancelled());
+            assertFalse(p1.isTerminated());
+            assertTrue(p1.isShutdown());
+            Thread.sleep(SHORT_DELAY_MS);
+            assertFalse(task.isCancelled());
+            assertTrue(task.cancel(true));
+            assertTrue(task.isDone());
+            Thread.sleep(SHORT_DELAY_MS);
+            assertTrue(p1.isTerminated());
+        }
+        catch(Exception ex) {
+            unexpectedException();
+        }
+        finally {
+            joinPool(p1);
+        }
+    }
+
+    /**
+     * completed submit of callable returns result
+     */
+    public void testSubmitCallable() {
+        ExecutorService e = new ScheduledThreadPoolExecutor(2);
+        try {
+            Future future = e.submit(new StringTask());
+            String result = (String)future.get();
+            assertSame(TEST_STRING, result);
+        }
+        catch (ExecutionException ex) {
+            unexpectedException();
+        }
+        catch (InterruptedException ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * completed submit of runnable returns successfully
+     */
+    public void testSubmitRunnable() {
+        ExecutorService e = new ScheduledThreadPoolExecutor(2);
+        try {
+            Future future = e.submit(new NoOpRunnable());
+            future.get();
+            assertTrue(future.isDone());
+        }
+        catch (ExecutionException ex) {
+            unexpectedException();
+        }
+        catch (InterruptedException ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * completed submit of (runnable, result) returns result
+     */
+    public void testSubmitRunnable2() {
+        ExecutorService e = new ScheduledThreadPoolExecutor(2);
+        try {
+            Future future = e.submit(new NoOpRunnable(), TEST_STRING);
+            String result = (String)future.get();
+            assertSame(TEST_STRING, result);
+        }
+        catch (ExecutionException ex) {
+            unexpectedException();
+        }
+        catch (InterruptedException ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAny(null) throws NPE
+     */
+    public void testInvokeAny1() {
+        ExecutorService e = new ScheduledThreadPoolExecutor(2);
+        try {
+            e.invokeAny(null);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAny(empty collection) throws IAE
+     */
+    public void testInvokeAny2() {
+        ExecutorService e = new ScheduledThreadPoolExecutor(2);
+        try {
+            e.invokeAny(new ArrayList());
+        } catch (IllegalArgumentException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAny(c) throws NPE if c has null elements
+     */
+    public void testInvokeAny3() {
+        ExecutorService e = new ScheduledThreadPoolExecutor(2);
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(null);
+            e.invokeAny(l);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAny(c) throws ExecutionException if no task completes
+     */
+    public void testInvokeAny4() {
+        ExecutorService e = new ScheduledThreadPoolExecutor(2);
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new NPETask());
+            e.invokeAny(l);
+        } catch (ExecutionException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAny(c) returns result of some task
+     */
+    public void testInvokeAny5() {
+        ExecutorService e = new ScheduledThreadPoolExecutor(2);
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(new StringTask());
+            String result = (String)e.invokeAny(l);
+            assertSame(TEST_STRING, result);
+        } catch (ExecutionException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAll(null) throws NPE
+     */
+    public void testInvokeAll1() {
+        ExecutorService e = new ScheduledThreadPoolExecutor(2);
+        try {
+            e.invokeAll(null);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAll(empty collection) returns empty collection
+     */
+    public void testInvokeAll2() {
+        ExecutorService e = new ScheduledThreadPoolExecutor(2);
+        try {
+            List r = e.invokeAll(new ArrayList());
+            assertTrue(r.isEmpty());
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAll(c) throws NPE if c has null elements
+     */
+    public void testInvokeAll3() {
+        ExecutorService e = new ScheduledThreadPoolExecutor(2);
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(null);
+            e.invokeAll(l);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * get of invokeAll(c) throws exception on failed task
+     */
+    public void testInvokeAll4() {
+        ExecutorService e = new ScheduledThreadPoolExecutor(2);
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new NPETask());
+            List result = e.invokeAll(l);
+            assertEquals(1, result.size());
+            for (Iterator it = result.iterator(); it.hasNext();)
+                ((Future)it.next()).get();
+        } catch(ExecutionException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAll(c) returns results of all completed tasks
+     */
+    public void testInvokeAll5() {
+        ExecutorService e = new ScheduledThreadPoolExecutor(2);
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(new StringTask());
+            List result = e.invokeAll(l);
+            assertEquals(2, result.size());
+            for (Iterator it = result.iterator(); it.hasNext();)
+                assertSame(TEST_STRING, ((Future)it.next()).get());
+        } catch (ExecutionException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAny(null) throws NPE
+     */
+    public void testTimedInvokeAny1() {
+        ExecutorService e = new ScheduledThreadPoolExecutor(2);
+        try {
+            e.invokeAny(null, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAny(,,null) throws NPE
+     */
+    public void testTimedInvokeAnyNullTimeUnit() {
+        ExecutorService e = new ScheduledThreadPoolExecutor(2);
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            e.invokeAny(l, MEDIUM_DELAY_MS, null);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAny(empty collection) throws IAE
+     */
+    public void testTimedInvokeAny2() {
+        ExecutorService e = new ScheduledThreadPoolExecutor(2);
+        try {
+            e.invokeAny(new ArrayList(), MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+        } catch (IllegalArgumentException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAny(c) throws NPE if c has null elements
+     */
+    public void testTimedInvokeAny3() {
+        ExecutorService e = new ScheduledThreadPoolExecutor(2);
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(null);
+            e.invokeAny(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            ex.printStackTrace();
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAny(c) throws ExecutionException if no task completes
+     */
+    public void testTimedInvokeAny4() {
+        ExecutorService e = new ScheduledThreadPoolExecutor(2);
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new NPETask());
+            e.invokeAny(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+        } catch(ExecutionException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAny(c) returns result of some task
+     */
+    public void testTimedInvokeAny5() {
+        ExecutorService e = new ScheduledThreadPoolExecutor(2);
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(new StringTask());
+            String result = (String)e.invokeAny(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+            assertSame(TEST_STRING, result);
+        } catch (ExecutionException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAll(null) throws NPE
+     */
+    public void testTimedInvokeAll1() {
+        ExecutorService e = new ScheduledThreadPoolExecutor(2);
+        try {
+            e.invokeAll(null, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAll(,,null) throws NPE
+     */
+    public void testTimedInvokeAllNullTimeUnit() {
+        ExecutorService e = new ScheduledThreadPoolExecutor(2);
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            e.invokeAll(l, MEDIUM_DELAY_MS, null);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAll(empty collection) returns empty collection
+     */
+    public void testTimedInvokeAll2() {
+        ExecutorService e = new ScheduledThreadPoolExecutor(2);
+        try {
+            List r = e.invokeAll(new ArrayList(), MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+            assertTrue(r.isEmpty());
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAll(c) throws NPE if c has null elements
+     */
+    public void testTimedInvokeAll3() {
+        ExecutorService e = new ScheduledThreadPoolExecutor(2);
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(null);
+            e.invokeAll(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * get of element of invokeAll(c) throws exception on failed task
+     */
+    public void testTimedInvokeAll4() {
+        ExecutorService e = new ScheduledThreadPoolExecutor(2);
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new NPETask());
+            List result = e.invokeAll(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+            assertEquals(1, result.size());
+            for (Iterator it = result.iterator(); it.hasNext();)
+                ((Future)it.next()).get();
+        } catch(ExecutionException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAll(c) returns results of all completed tasks
+     */
+    public void testTimedInvokeAll5() {
+        ExecutorService e = new ScheduledThreadPoolExecutor(2);
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(new StringTask());
+            List result = e.invokeAll(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+            assertEquals(2, result.size());
+            for (Iterator it = result.iterator(); it.hasNext();)
+                assertSame(TEST_STRING, (String)((Future)it.next()).get());
+        } catch (ExecutionException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAll(c) cancels tasks not completed by timeout
+     */
+    public void testTimedInvokeAll6() {
+        ExecutorService e = new ScheduledThreadPoolExecutor(2);
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(Executors.callable(new MediumPossiblyInterruptedRunnable(), TEST_STRING));
+            l.add(new StringTask());
+            List result = e.invokeAll(l, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
+            assertEquals(3, result.size());
+            Iterator it = result.iterator();
+            Future f1 = (Future)it.next();
+            Future f2 = (Future)it.next();
+            Future f3 = (Future)it.next();
+            assertTrue(f1.isDone());
+            assertTrue(f2.isDone());
+            assertTrue(f3.isDone());
+            assertFalse(f1.isCancelled());
+            assertTrue(f2.isCancelled());
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/SemaphoreTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/SemaphoreTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/SemaphoreTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,922 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import java.io.*;
+import java.util.Collection;
+
+public class SemaphoreTest extends JSR166TestCase {
+    public static void main(String[] args) {
+        junit.textui.TestRunner.run (suite());
+    }
+    public static Test suite() {
+        return new TestSuite(SemaphoreTest.class);
+    }
+
+    /**
+     * Subclass to expose protected methods
+     */
+    static class PublicSemaphore extends Semaphore {
+        PublicSemaphore(int p, boolean f) { super(p, f); }
+        public Collection getQueuedThreads() {
+            return super.getQueuedThreads();
+        }
+        public void reducePermits(int p) {
+            super.reducePermits(p);
+        }
+    }
+
+    /**
+     * A runnable calling acquire
+     */
+    class InterruptibleLockRunnable implements Runnable {
+        final Semaphore lock;
+        InterruptibleLockRunnable(Semaphore l) { lock = l; }
+        public void run() {
+            try {
+                lock.acquire();
+            } catch(InterruptedException success){}
+        }
+    }
+
+
+    /**
+     * A runnable calling acquire that expects to be
+     * interrupted
+     */
+    class InterruptedLockRunnable implements Runnable {
+        final Semaphore lock;
+        InterruptedLockRunnable(Semaphore l) { lock = l; }
+        public void run() {
+            try {
+                lock.acquire();
+                threadShouldThrow();
+            } catch(InterruptedException success){}
+        }
+    }
+
+    /**
+     * Zero, negative, and positive initial values are allowed in constructor
+     */
+    public void testConstructor() {
+        Semaphore s0 = new Semaphore(0, false);
+        assertEquals(0, s0.availablePermits());
+        assertFalse(s0.isFair());
+        Semaphore s1 = new Semaphore(-1, false);
+        assertEquals(-1, s1.availablePermits());
+        assertFalse(s1.isFair());
+        Semaphore s2 = new Semaphore(-1, false);
+        assertEquals(-1, s2.availablePermits());
+        assertFalse(s2.isFair());
+    }
+
+    /**
+     * Constructor without fairness argument behaves as nonfair
+     */
+    public void testConstructor2() {
+        Semaphore s0 = new Semaphore(0);
+        assertEquals(0, s0.availablePermits());
+        assertFalse(s0.isFair());
+        Semaphore s1 = new Semaphore(-1);
+        assertEquals(-1, s1.availablePermits());
+        assertFalse(s1.isFair());
+        Semaphore s2 = new Semaphore(-1);
+        assertEquals(-1, s2.availablePermits());
+        assertFalse(s2.isFair());
+    }
+
+    /**
+     * tryAcquire succeeds when sufficient permits, else fails
+     */
+    public void testTryAcquireInSameThread() {
+        Semaphore s = new Semaphore(2, false);
+        assertEquals(2, s.availablePermits());
+        assertTrue(s.tryAcquire());
+        assertTrue(s.tryAcquire());
+        assertEquals(0, s.availablePermits());
+        assertFalse(s.tryAcquire());
+    }
+
+    /**
+     * Acquire and release of semaphore succeed if initially available
+     */
+    public void testAcquireReleaseInSameThread() {
+        Semaphore s = new Semaphore(1, false);
+        try {
+            s.acquire();
+            s.release();
+            s.acquire();
+            s.release();
+            s.acquire();
+            s.release();
+            s.acquire();
+            s.release();
+            s.acquire();
+            s.release();
+            assertEquals(1, s.availablePermits());
+        } catch( InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * Uninterruptible acquire and release of semaphore succeed if
+     * initially available
+     */
+    public void testAcquireUninterruptiblyReleaseInSameThread() {
+        Semaphore s = new Semaphore(1, false);
+        try {
+            s.acquireUninterruptibly();
+            s.release();
+            s.acquireUninterruptibly();
+            s.release();
+            s.acquireUninterruptibly();
+            s.release();
+            s.acquireUninterruptibly();
+            s.release();
+            s.acquireUninterruptibly();
+            s.release();
+            assertEquals(1, s.availablePermits());
+        } finally {
+        }
+    }
+
+    /**
+     * Timed Acquire and release of semaphore succeed if
+     * initially available
+     */
+    public void testTimedAcquireReleaseInSameThread() {
+        Semaphore s = new Semaphore(1, false);
+        try {
+            assertTrue(s.tryAcquire(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+            s.release();
+            assertTrue(s.tryAcquire(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+            s.release();
+            assertTrue(s.tryAcquire(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+            s.release();
+            assertTrue(s.tryAcquire(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+            s.release();
+            assertTrue(s.tryAcquire(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+            s.release();
+            assertEquals(1, s.availablePermits());
+        } catch( InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * A release in one thread enables an acquire in another thread
+     */
+    public void testAcquireReleaseInDifferentThreads() {
+        final Semaphore s = new Semaphore(0, false);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        s.acquire();
+                        s.release();
+                        s.release();
+                        s.acquire();
+                    } catch(InterruptedException ie){
+                        threadUnexpectedException();
+                    }
+                }
+            });
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            s.release();
+            s.release();
+            s.acquire();
+            s.acquire();
+            s.release();
+            t.join();
+        } catch( InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * A release in one thread enables an uninterruptible acquire in another thread
+     */
+    public void testUninterruptibleAcquireReleaseInDifferentThreads() {
+        final Semaphore s = new Semaphore(0, false);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    s.acquireUninterruptibly();
+                    s.release();
+                    s.release();
+                    s.acquireUninterruptibly();
+                }
+            });
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            s.release();
+            s.release();
+            s.acquireUninterruptibly();
+            s.acquireUninterruptibly();
+            s.release();
+            t.join();
+        } catch( InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     *  A release in one thread enables a timed acquire in another thread
+     */
+    public void testTimedAcquireReleaseInDifferentThreads() {
+        final Semaphore s = new Semaphore(1, false);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        s.release();
+                        threadAssertTrue(s.tryAcquire(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+                        s.release();
+                        threadAssertTrue(s.tryAcquire(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+
+                    } catch(InterruptedException ie){
+                        threadUnexpectedException();
+                    }
+                }
+            });
+        try {
+            t.start();
+            assertTrue(s.tryAcquire(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+            s.release();
+            assertTrue(s.tryAcquire(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+            s.release();
+            s.release();
+            t.join();
+        } catch( InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * A waiting acquire blocks interruptibly
+     */
+    public void testAcquire_InterruptedException() {
+        final Semaphore s = new Semaphore(0, false);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        s.acquire();
+                        threadShouldThrow();
+                    } catch(InterruptedException success){}
+                }
+            });
+        t.start();
+        try {
+            Thread.sleep(SHORT_DELAY_MS);
+            t.interrupt();
+            t.join();
+        } catch(InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     *  A waiting timed acquire blocks interruptibly
+     */
+    public void testTryAcquire_InterruptedException() {
+        final Semaphore s = new Semaphore(0, false);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        s.tryAcquire(MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+                        threadShouldThrow();
+                    } catch(InterruptedException success){
+                    }
+                }
+            });
+        t.start();
+        try {
+            Thread.sleep(SHORT_DELAY_MS);
+            t.interrupt();
+            t.join();
+        } catch(InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * hasQueuedThreads reports whether there are waiting threads
+     */
+    public void testHasQueuedThreads() {
+//        final Semaphore lock = new Semaphore(1, false);
+        final Semaphore lock = new Semaphore(1, true);
+        Thread t1 = new Thread(new InterruptedLockRunnable(lock));
+        Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
+        try {
+            assertFalse(lock.hasQueuedThreads());
+            lock.acquireUninterruptibly();
+            t1.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertTrue(lock.hasQueuedThreads());
+            t2.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertTrue(lock.hasQueuedThreads());
+            t1.interrupt();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertTrue(lock.hasQueuedThreads());
+            lock.release();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertFalse(lock.hasQueuedThreads());
+            t1.join();
+            t2.join();
+        } catch(Exception e){
+            e.printStackTrace();
+            unexpectedException();
+        }
+    }
+
+    /**
+     * getQueueLength reports number of waiting threads
+     */
+    public void testGetQueueLength() {
+//        final Semaphore lock = new Semaphore(1, false);
+        final Semaphore lock = new Semaphore(1, true);
+        Thread t1 = new Thread(new InterruptedLockRunnable(lock));
+        Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
+        try {
+            assertEquals(0, lock.getQueueLength());
+            lock.acquireUninterruptibly();
+            t1.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertEquals(1, lock.getQueueLength());
+            t2.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertEquals(2, lock.getQueueLength());
+            t1.interrupt();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertEquals(1, lock.getQueueLength());
+            lock.release();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertEquals(0, lock.getQueueLength());
+            t1.join();
+            t2.join();
+        } catch(Exception e){
+            e.printStackTrace();
+            unexpectedException();
+        }
+    }
+
+    /**
+     * getQueuedThreads includes waiting threads
+     */
+    public void testGetQueuedThreads() {
+//	final PublicSemaphore lock = new PublicSemaphore(1, false);
+        final PublicSemaphore lock = new PublicSemaphore(1, true);
+        Thread t1 = new Thread(new InterruptedLockRunnable(lock));
+        Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
+        try {
+            assertTrue(lock.getQueuedThreads().isEmpty());
+            lock.acquireUninterruptibly();
+            assertTrue(lock.getQueuedThreads().isEmpty());
+            t1.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertTrue(lock.getQueuedThreads().contains(t1));
+            t2.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertTrue(lock.getQueuedThreads().contains(t1));
+            assertTrue(lock.getQueuedThreads().contains(t2));
+            t1.interrupt();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertFalse(lock.getQueuedThreads().contains(t1));
+            assertTrue(lock.getQueuedThreads().contains(t2));
+            lock.release();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertTrue(lock.getQueuedThreads().isEmpty());
+            t1.join();
+            t2.join();
+        } catch(Exception e){
+            e.printStackTrace();
+            unexpectedException();
+        }
+    }
+
+    /**
+     * drainPermits reports and removes given number of permits
+     */
+    public void testDrainPermits() {
+        Semaphore s = new Semaphore(0, false);
+        assertEquals(0, s.availablePermits());
+        assertEquals(0, s.drainPermits());
+        s.release(10);
+        assertEquals(10, s.availablePermits());
+        assertEquals(10, s.drainPermits());
+        assertEquals(0, s.availablePermits());
+        assertEquals(0, s.drainPermits());
+    }
+
+    /**
+     * reducePermits reduces number of permits
+     */
+    public void testReducePermits() {
+        PublicSemaphore s = new PublicSemaphore(10, false);
+        assertEquals(10, s.availablePermits());
+        s.reducePermits(1);
+        assertEquals(9, s.availablePermits());
+        s.reducePermits(10);
+        assertEquals(-1, s.availablePermits());
+    }
+
+    /**
+     * a deserialized serialized semaphore has same number of permits
+     */
+    public void testSerialization() {
+        Semaphore l = new Semaphore(3, false);
+        try {
+            l.acquire();
+            l.release();
+            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
+            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
+            out.writeObject(l);
+            out.close();
+
+            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
+            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
+            Semaphore r = (Semaphore) in.readObject();
+            assertEquals(3, r.availablePermits());
+            assertFalse(r.isFair());
+            r.acquire();
+            r.release();
+        } catch(Exception e){
+            e.printStackTrace();
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * Zero, negative, and positive initial values are allowed in constructor
+     */
+    public void testConstructor_fair() {
+        Semaphore s0 = new Semaphore(0, true);
+        assertEquals(0, s0.availablePermits());
+        assertTrue(s0.isFair());
+        Semaphore s1 = new Semaphore(-1, true);
+        assertEquals(-1, s1.availablePermits());
+        Semaphore s2 = new Semaphore(-1, true);
+        assertEquals(-1, s2.availablePermits());
+    }
+
+    /**
+     * tryAcquire succeeds when sufficient permits, else fails
+     */
+    public void testTryAcquireInSameThread_fair() {
+        Semaphore s = new Semaphore(2, true);
+        assertEquals(2, s.availablePermits());
+        assertTrue(s.tryAcquire());
+        assertTrue(s.tryAcquire());
+        assertEquals(0, s.availablePermits());
+        assertFalse(s.tryAcquire());
+    }
+
+    /**
+     * tryAcquire(n) succeeds when sufficient permits, else fails
+     */
+    public void testTryAcquireNInSameThread_fair() {
+        Semaphore s = new Semaphore(2, true);
+        assertEquals(2, s.availablePermits());
+        assertTrue(s.tryAcquire(2));
+        assertEquals(0, s.availablePermits());
+        assertFalse(s.tryAcquire());
+    }
+
+    /**
+     * Acquire and release of semaphore succeed if initially available
+     */
+    public void testAcquireReleaseInSameThread_fair() {
+        Semaphore s = new Semaphore(1, true);
+        try {
+            s.acquire();
+            s.release();
+            s.acquire();
+            s.release();
+            s.acquire();
+            s.release();
+            s.acquire();
+            s.release();
+            s.acquire();
+            s.release();
+            assertEquals(1, s.availablePermits());
+        } catch( InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * Acquire(n) and release(n) of semaphore succeed if initially available
+     */
+    public void testAcquireReleaseNInSameThread_fair() {
+        Semaphore s = new Semaphore(1, true);
+        try {
+            s.release(1);
+            s.acquire(1);
+            s.release(2);
+            s.acquire(2);
+            s.release(3);
+            s.acquire(3);
+            s.release(4);
+            s.acquire(4);
+            s.release(5);
+            s.acquire(5);
+            assertEquals(1, s.availablePermits());
+	} catch( InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * Acquire(n) and release(n) of semaphore succeed if initially available
+     */
+    public void testAcquireUninterruptiblyReleaseNInSameThread_fair() {
+        Semaphore s = new Semaphore(1, true);
+        try {
+            s.release(1);
+            s.acquireUninterruptibly(1);
+            s.release(2);
+            s.acquireUninterruptibly(2);
+            s.release(3);
+            s.acquireUninterruptibly(3);
+            s.release(4);
+            s.acquireUninterruptibly(4);
+            s.release(5);
+            s.acquireUninterruptibly(5);
+            assertEquals(1, s.availablePermits());
+	} finally {
+        }
+    }
+
+    /**
+     * release(n) in one thread enables timed acquire(n) in another thread
+     */
+    public void testTimedAcquireReleaseNInSameThread_fair() {
+        Semaphore s = new Semaphore(1, true);
+        try {
+            s.release(1);
+            assertTrue(s.tryAcquire(1, SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+            s.release(2);
+            assertTrue(s.tryAcquire(2, SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+            s.release(3);
+            assertTrue(s.tryAcquire(3, SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+            s.release(4);
+            assertTrue(s.tryAcquire(4, SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+            s.release(5);
+            assertTrue(s.tryAcquire(5, SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+            assertEquals(1, s.availablePermits());
+	} catch( InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * release in one thread enables timed acquire in another thread
+     */
+    public void testTimedAcquireReleaseInSameThread_fair() {
+        Semaphore s = new Semaphore(1, true);
+        try {
+            assertTrue(s.tryAcquire(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+            s.release();
+            assertTrue(s.tryAcquire(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+            s.release();
+            assertTrue(s.tryAcquire(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+            s.release();
+            assertTrue(s.tryAcquire(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+            s.release();
+            assertTrue(s.tryAcquire(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+            s.release();
+            assertEquals(1, s.availablePermits());
+        } catch( InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * A release in one thread enables an acquire in another thread
+     */
+    public void testAcquireReleaseInDifferentThreads_fair() {
+        final Semaphore s = new Semaphore(0, true);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        s.acquire();
+                        s.acquire();
+                        s.acquire();
+                        s.acquire();
+                    } catch(InterruptedException ie){
+                        threadUnexpectedException();
+                    }
+                }
+            });
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            s.release();
+            s.release();
+            s.release();
+            s.release();
+            s.release();
+            s.release();
+            t.join();
+            assertEquals(2, s.availablePermits());
+        } catch( InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * release(n) in one thread enables acquire(n) in another thread
+     */
+    public void testAcquireReleaseNInDifferentThreads_fair() {
+        final Semaphore s = new Semaphore(0, true);
+	Thread t = new Thread(new Runnable() {
+		public void run() {
+		    try {
+			s.acquire();
+                        s.release(2);
+                        s.acquire();
+		    } catch(InterruptedException ie){
+                        threadUnexpectedException();
+                    }
+		}
+	    });
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            s.release(2);
+            s.acquire(2);
+            s.release(1);
+            t.join();
+	} catch( InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * release(n) in one thread enables acquire(n) in another thread
+     */
+    public void testAcquireReleaseNInDifferentThreads_fair2() {
+        final Semaphore s = new Semaphore(0, true);
+	Thread t = new Thread(new Runnable() {
+		public void run() {
+		    try {
+                        s.acquire(2);
+                        s.acquire(2);
+                        s.release(4);
+		    } catch(InterruptedException ie){
+                        threadUnexpectedException();
+                    }
+		}
+	    });
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            s.release(6);
+            s.acquire(2);
+            s.acquire(2);
+            s.release(2);
+            t.join();
+	} catch( InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * release in one thread enables timed acquire in another thread
+     */
+    public void testTimedAcquireReleaseInDifferentThreads_fair() {
+        final Semaphore s = new Semaphore(1, true);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        threadAssertTrue(s.tryAcquire(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+                        threadAssertTrue(s.tryAcquire(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+                        threadAssertTrue(s.tryAcquire(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+                        threadAssertTrue(s.tryAcquire(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+                        threadAssertTrue(s.tryAcquire(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+
+                    } catch(InterruptedException ie){
+                        threadUnexpectedException();
+                    }
+                }
+            });
+        t.start();
+        try {
+            s.release();
+            s.release();
+            s.release();
+            s.release();
+            s.release();
+            t.join();
+        } catch( InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * release(n) in one thread enables timed acquire(n) in another thread
+     */
+    public void testTimedAcquireReleaseNInDifferentThreads_fair() {
+        final Semaphore s = new Semaphore(2, true);
+	Thread t = new Thread(new Runnable() {
+		public void run() {
+		    try {
+                        threadAssertTrue(s.tryAcquire(2, SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+                        s.release(2);
+                        threadAssertTrue(s.tryAcquire(2, SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+                        s.release(2);
+		    } catch(InterruptedException ie){
+                        threadUnexpectedException();
+                    }
+		}
+	    });
+	t.start();
+        try {
+            assertTrue(s.tryAcquire(2, SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+            s.release(2);
+            assertTrue(s.tryAcquire(2, SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+            s.release(2);
+            t.join();
+	} catch( InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * A waiting acquire blocks interruptibly
+     */
+    public void testAcquire_InterruptedException_fair() {
+        final Semaphore s = new Semaphore(0, true);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        s.acquire();
+                        threadShouldThrow();
+                    } catch(InterruptedException success){}
+                }
+            });
+        t.start();
+        try {
+            Thread.sleep(SHORT_DELAY_MS);
+            t.interrupt();
+            t.join();
+        } catch(InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * A waiting acquire(n) blocks interruptibly
+     */
+    public void testAcquireN_InterruptedException_fair() {
+	final Semaphore s = new Semaphore(2, true);
+	Thread t = new Thread(new Runnable() {
+		public void run() {
+		    try {
+			s.acquire(3);
+			threadShouldThrow();
+		    } catch(InterruptedException success){}
+		}
+	    });
+	t.start();
+	try {
+	    Thread.sleep(SHORT_DELAY_MS);
+            t.interrupt();
+            t.join();
+        } catch(InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     *  A waiting tryAcquire blocks interruptibly
+     */
+    public void testTryAcquire_InterruptedException_fair() {
+        final Semaphore s = new Semaphore(0, true);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        s.tryAcquire(MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+                        threadShouldThrow();
+                    } catch(InterruptedException success){
+                    }
+                }
+            });
+        t.start();
+        try {
+            Thread.sleep(SHORT_DELAY_MS);
+            t.interrupt();
+            t.join();
+        } catch(InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     *  A waiting tryAcquire(n) blocks interruptibly
+     */
+    public void testTryAcquireN_InterruptedException_fair() {
+	final Semaphore s = new Semaphore(1, true);
+	Thread t = new Thread(new Runnable() {
+		public void run() {
+		    try {
+			s.tryAcquire(4, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+			threadShouldThrow();
+		    } catch(InterruptedException success){
+                    }
+		}
+	    });
+	t.start();
+	try {
+	    Thread.sleep(SHORT_DELAY_MS);
+            t.interrupt();
+            t.join();
+        } catch(InterruptedException e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * getQueueLength reports number of waiting threads
+     */
+    public void testGetQueueLength_fair() {
+        final Semaphore lock = new Semaphore(1, true);
+        Thread t1 = new Thread(new InterruptedLockRunnable(lock));
+        Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
+        try {
+            assertEquals(0, lock.getQueueLength());
+            lock.acquireUninterruptibly();
+            t1.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertEquals(1, lock.getQueueLength());
+            t2.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertEquals(2, lock.getQueueLength());
+            t1.interrupt();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertEquals(1, lock.getQueueLength());
+            lock.release();
+            Thread.sleep(SHORT_DELAY_MS);
+            assertEquals(0, lock.getQueueLength());
+            t1.join();
+            t2.join();
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * a deserialized serialized semaphore has same number of permits
+     */
+    public void testSerialization_fair() {
+        Semaphore l = new Semaphore(3, true);
+
+        try {
+            l.acquire();
+            l.release();
+            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
+            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
+            out.writeObject(l);
+            out.close();
+
+            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
+            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
+            Semaphore r = (Semaphore) in.readObject();
+            assertEquals(3, r.availablePermits());
+            assertTrue(r.isFair());
+            r.acquire();
+            r.release();
+        } catch(Exception e){
+            e.printStackTrace();
+            unexpectedException();
+        }
+    }
+
+    /**
+     * toString indicates current number of permits
+     */
+    public void testToString() {
+        Semaphore s = new Semaphore(0);
+        String us = s.toString();
+        assertTrue(us.indexOf("Permits = 0") >= 0);
+        s.release();
+        String s1 = s.toString();
+        assertTrue(s1.indexOf("Permits = 1") >= 0);
+        s.release();
+        String s2 = s.toString();
+        assertTrue(s2.indexOf("Permits = 2") >= 0);
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/SynchronousQueueTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/SynchronousQueueTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/SynchronousQueueTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,899 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import java.io.*;
+import edu.emory.mathcs.backport.java.util.*;
+import java.util.Arrays;
+import java.util.NoSuchElementException;
+import java.util.Iterator;
+import java.util.ArrayList;
+
+public class SynchronousQueueTest extends JSR166TestCase {
+
+    public static void main(String[] args) {
+	junit.textui.TestRunner.run (suite());
+    }
+
+    public static Test suite() {
+	return new TestSuite(SynchronousQueueTest.class);
+    }
+
+    /**
+     * A SynchronousQueue is both empty and full
+     */
+    public void testEmptyFull() {
+        SynchronousQueue q = new SynchronousQueue();
+        assertTrue(q.isEmpty());
+	assertEquals(0, q.size());
+        assertEquals(0, q.remainingCapacity());
+        assertFalse(q.offer(zero));
+    }
+
+    /**
+     * A fair SynchronousQueue is both empty and full
+     */
+    public void testFairEmptyFull() {
+        SynchronousQueue q = new SynchronousQueue(true);
+        assertTrue(q.isEmpty());
+	assertEquals(0, q.size());
+        assertEquals(0, q.remainingCapacity());
+        assertFalse(q.offer(zero));
+    }
+
+    /**
+     * offer(null) throws NPE
+     */
+    public void testOfferNull() {
+	try {
+            SynchronousQueue q = new SynchronousQueue();
+            q.offer(null);
+            shouldThrow();
+        } catch (NullPointerException success) { }
+    }
+
+    /**
+     * add(null) throws NPE
+     */
+    public void testAddNull() {
+	try {
+            SynchronousQueue q = new SynchronousQueue();
+            q.add(null);
+            shouldThrow();
+        } catch (NullPointerException success) { }
+    }
+
+    /**
+     * offer fails if no active taker
+     */
+    public void testOffer() {
+        SynchronousQueue q = new SynchronousQueue();
+        assertFalse(q.offer(one));
+    }
+
+    /**
+     * add throws ISE if no active taker
+     */
+    public void testAdd() {
+	try {
+            SynchronousQueue q = new SynchronousQueue();
+            assertEquals(0, q.remainingCapacity());
+            q.add(one);
+            shouldThrow();
+        } catch (IllegalStateException success){
+	}
+    }
+
+    /**
+     * addAll(null) throws NPE
+     */
+    public void testAddAll1() {
+        try {
+            SynchronousQueue q = new SynchronousQueue();
+            q.addAll(null);
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * addAll(this) throws IAE
+     */
+    public void testAddAllSelf() {
+        try {
+            SynchronousQueue q = new SynchronousQueue();
+            q.addAll(q);
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success) {}
+    }
+
+    /**
+     * addAll of a collection with null elements throws NPE
+     */
+    public void testAddAll2() {
+        try {
+            SynchronousQueue q = new SynchronousQueue();
+            Integer[] ints = new Integer[1];
+            q.addAll(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+    /**
+     * addAll throws ISE if no active taker
+     */
+    public void testAddAll4() {
+        try {
+            SynchronousQueue q = new SynchronousQueue();
+            Integer[] ints = new Integer[1];
+            for (int i = 0; i < 1; ++i)
+                ints[i] = new Integer(i);
+            q.addAll(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (IllegalStateException success) {}
+    }
+
+    /**
+     * put(null) throws NPE
+     */
+    public void testPutNull() {
+	try {
+            SynchronousQueue q = new SynchronousQueue();
+            q.put(null);
+            shouldThrow();
+        }
+        catch (NullPointerException success){
+	}
+        catch (InterruptedException ie) {
+	    unexpectedException();
+        }
+     }
+
+    /**
+     * put blocks interruptibly if no active taker
+     */
+    public void testBlockingPut() {
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        SynchronousQueue q = new SynchronousQueue();
+                        q.put(zero);
+                        threadShouldThrow();
+                    } catch (InterruptedException ie){
+                    }
+                }});
+        t.start();
+        try {
+           Thread.sleep(SHORT_DELAY_MS);
+           t.interrupt();
+           t.join();
+        }
+        catch (InterruptedException ie) {
+	    unexpectedException();
+        }
+    }
+
+    /**
+     * put blocks waiting for take
+     */
+    public void testPutWithTake() {
+        final SynchronousQueue q = new SynchronousQueue();
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    int added = 0;
+                    try {
+                        q.put(new Object());
+                        ++added;
+                        q.put(new Object());
+                        ++added;
+                        q.put(new Object());
+                        ++added;
+                        q.put(new Object());
+                        ++added;
+			threadShouldThrow();
+                    } catch (InterruptedException e){
+                        assertTrue(added >= 1);
+                    }
+                }
+            });
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            q.take();
+            Thread.sleep(SHORT_DELAY_MS);
+            t.interrupt();
+            t.join();
+        } catch (Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * timed offer times out if elements not taken
+     */
+    public void testTimedOffer() {
+        final SynchronousQueue q = new SynchronousQueue();
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+
+                        threadAssertFalse(q.offer(new Object(), SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+                        q.offer(new Object(), LONG_DELAY_MS, TimeUnit.MILLISECONDS);
+			threadShouldThrow();
+                    } catch (InterruptedException success){}
+                }
+            });
+
+        try {
+            t.start();
+            Thread.sleep(SMALL_DELAY_MS);
+            t.interrupt();
+            t.join();
+        } catch (Exception e){
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * take blocks interruptibly when empty
+     */
+    public void testTakeFromEmpty() {
+        final SynchronousQueue q = new SynchronousQueue();
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        q.take();
+			threadShouldThrow();
+                    } catch (InterruptedException success){ }
+                }
+            });
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            t.interrupt();
+            t.join();
+        } catch (Exception e){
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * put blocks interruptibly if no active taker
+     */
+    public void testFairBlockingPut() {
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        SynchronousQueue q = new SynchronousQueue(true);
+                        q.put(zero);
+                        threadShouldThrow();
+                    } catch (InterruptedException ie){
+                    }
+                }});
+        t.start();
+        try {
+           Thread.sleep(SHORT_DELAY_MS);
+           t.interrupt();
+           t.join();
+        }
+        catch (InterruptedException ie) {
+	    unexpectedException();
+        }
+    }
+
+    /**
+     * put blocks waiting for take
+     */
+    public void testFairPutWithTake() {
+        final SynchronousQueue q = new SynchronousQueue(true);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    int added = 0;
+                    try {
+                        q.put(new Object());
+                        ++added;
+                        q.put(new Object());
+                        ++added;
+                        q.put(new Object());
+                        ++added;
+                        q.put(new Object());
+                        ++added;
+			threadShouldThrow();
+                    } catch (InterruptedException e){
+                        assertTrue(added >= 1);
+                    }
+                }
+            });
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            q.take();
+            Thread.sleep(SHORT_DELAY_MS);
+            t.interrupt();
+            t.join();
+        } catch (Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * timed offer times out if elements not taken
+     */
+    public void testFairTimedOffer() {
+        final SynchronousQueue q = new SynchronousQueue(true);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+
+                        threadAssertFalse(q.offer(new Object(), SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+                        q.offer(new Object(), LONG_DELAY_MS, TimeUnit.MILLISECONDS);
+			threadShouldThrow();
+                    } catch (InterruptedException success){}
+                }
+            });
+
+        try {
+            t.start();
+            Thread.sleep(SMALL_DELAY_MS);
+            t.interrupt();
+            t.join();
+        } catch (Exception e){
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * take blocks interruptibly when empty
+     */
+    public void testFairTakeFromEmpty() {
+        final SynchronousQueue q = new SynchronousQueue(true);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        q.take();
+			threadShouldThrow();
+                    } catch (InterruptedException success){ }
+                }
+            });
+        try {
+            t.start();
+            Thread.sleep(SHORT_DELAY_MS);
+            t.interrupt();
+            t.join();
+        } catch (Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * poll fails unless active taker
+     */
+    public void testPoll() {
+        SynchronousQueue q = new SynchronousQueue();
+	assertNull(q.poll());
+    }
+
+    /**
+     * timed pool with zero timeout times out if no active taker
+     */
+    public void testTimedPoll0() {
+        try {
+            SynchronousQueue q = new SynchronousQueue();
+            assertNull(q.poll(0, TimeUnit.MILLISECONDS));
+        } catch (InterruptedException e){
+	    unexpectedException();
+	}
+    }
+
+    /**
+     * timed pool with nonzero timeout times out if no active taker
+     */
+    public void testTimedPoll() {
+        try {
+            SynchronousQueue q = new SynchronousQueue();
+            assertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+        } catch (InterruptedException e){
+	    unexpectedException();
+	}
+    }
+
+    /**
+     * Interrupted timed poll throws InterruptedException instead of
+     * returning timeout status
+     */
+    public void testInterruptedTimedPoll() {
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        SynchronousQueue q = new SynchronousQueue();
+                        assertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+                    } catch (InterruptedException success){
+                    }
+                }});
+        t.start();
+        try {
+           Thread.sleep(SHORT_DELAY_MS);
+           t.interrupt();
+           t.join();
+        }
+        catch (InterruptedException ie) {
+	    unexpectedException();
+        }
+    }
+
+    /**
+     *  timed poll before a delayed offer fails; after offer succeeds;
+     *  on interruption throws
+     */
+    public void testTimedPollWithOffer() {
+        final SynchronousQueue q = new SynchronousQueue();
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        threadAssertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+                        q.poll(LONG_DELAY_MS, TimeUnit.MILLISECONDS);
+                        q.poll(LONG_DELAY_MS, TimeUnit.MILLISECONDS);
+			threadShouldThrow();
+                    } catch (InterruptedException success) { }
+                }
+            });
+        try {
+            t.start();
+            Thread.sleep(SMALL_DELAY_MS);
+            assertTrue(q.offer(zero, SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+            t.interrupt();
+            t.join();
+        } catch (Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * Interrupted timed poll throws InterruptedException instead of
+     * returning timeout status
+     */
+    public void testFairInterruptedTimedPoll() {
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        SynchronousQueue q = new SynchronousQueue(true);
+                        assertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+                    } catch (InterruptedException success){
+                    }
+                }});
+        t.start();
+        try {
+           Thread.sleep(SHORT_DELAY_MS);
+           t.interrupt();
+           t.join();
+        }
+        catch (InterruptedException ie) {
+	    unexpectedException();
+        }
+    }
+
+    /**
+     *  timed poll before a delayed offer fails; after offer succeeds;
+     *  on interruption throws
+     */
+    public void testFairTimedPollWithOffer() {
+        final SynchronousQueue q = new SynchronousQueue(true);
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        threadAssertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+                        q.poll(LONG_DELAY_MS, TimeUnit.MILLISECONDS);
+                        q.poll(LONG_DELAY_MS, TimeUnit.MILLISECONDS);
+			threadShouldThrow();
+                    } catch (InterruptedException success) { }
+                }
+            });
+        try {
+            t.start();
+            Thread.sleep(SMALL_DELAY_MS);
+            assertTrue(q.offer(zero, SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
+            t.interrupt();
+            t.join();
+        } catch (Exception e){
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * peek returns null
+     */
+    public void testPeek() {
+        SynchronousQueue q = new SynchronousQueue();
+	assertNull(q.peek());
+    }
+
+    /**
+     * element throws NSEE
+     */
+    public void testElement() {
+        SynchronousQueue q = new SynchronousQueue();
+        try {
+            q.element();
+            shouldThrow();
+        }
+        catch (NoSuchElementException success) {}
+    }
+
+    /**
+     * remove throws NSEE if no active taker
+     */
+    public void testRemove() {
+        SynchronousQueue q = new SynchronousQueue();
+        try {
+            q.remove();
+            shouldThrow();
+        } catch (NoSuchElementException success){
+	}
+    }
+
+    /**
+     * remove(x) returns false
+     */
+    public void testRemoveElement() {
+        SynchronousQueue q = new SynchronousQueue();
+        assertFalse(q.remove(zero));
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * contains returns false
+     */
+    public void testContains() {
+        SynchronousQueue q = new SynchronousQueue();
+        assertFalse(q.contains(zero));
+    }
+
+    /**
+     * clear ensures isEmpty
+     */
+    public void testClear() {
+        SynchronousQueue q = new SynchronousQueue();
+        q.clear();
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * containsAll returns false unless empty
+     */
+    public void testContainsAll() {
+        SynchronousQueue q = new SynchronousQueue();
+        Integer[] empty = new Integer[0];
+        assertTrue(q.containsAll(Arrays.asList(empty)));
+        Integer[] ints = new Integer[1]; ints[0] = zero;
+        assertFalse(q.containsAll(Arrays.asList(ints)));
+    }
+
+    /**
+     * retainAll returns false
+     */
+    public void testRetainAll() {
+        SynchronousQueue q = new SynchronousQueue();
+        Integer[] empty = new Integer[0];
+        assertFalse(q.retainAll(Arrays.asList(empty)));
+        Integer[] ints = new Integer[1]; ints[0] = zero;
+        assertFalse(q.retainAll(Arrays.asList(ints)));
+    }
+
+    /**
+     * removeAll returns false
+     */
+    public void testRemoveAll() {
+        SynchronousQueue q = new SynchronousQueue();
+        Integer[] empty = new Integer[0];
+        assertFalse(q.removeAll(Arrays.asList(empty)));
+        Integer[] ints = new Integer[1]; ints[0] = zero;
+        assertFalse(q.containsAll(Arrays.asList(ints)));
+    }
+
+
+    /**
+     * toArray is empty
+     */
+    public void testToArray() {
+        SynchronousQueue q = new SynchronousQueue();
+	Object[] o = q.toArray();
+        assertEquals(o.length, 0);
+    }
+
+    /**
+     * toArray(a) is nulled at position 0
+     */
+    public void testToArray2() {
+        SynchronousQueue q = new SynchronousQueue();
+	Integer[] ints = new Integer[1];
+        assertNull(ints[0]);
+    }
+
+    /**
+     * toArray(null) throws NPE
+     */
+    public void testToArray_BadArg() {
+	try {
+            SynchronousQueue q = new SynchronousQueue();
+	    Object o[] = q.toArray(null);
+	    shouldThrow();
+	} catch(NullPointerException success){}
+    }
+
+
+    /**
+     * iterator does not traverse any elements
+     */
+    public void testIterator() {
+        SynchronousQueue q = new SynchronousQueue();
+	Iterator it = q.iterator();
+        assertFalse(it.hasNext());
+        try {
+            Object x = it.next();
+            shouldThrow();
+        }
+        catch (NoSuchElementException success) {}
+    }
+
+    /**
+     * iterator remove throws ISE
+     */
+    public void testIteratorRemove() {
+        SynchronousQueue q = new SynchronousQueue();
+	Iterator it = q.iterator();
+        try {
+            it.remove();
+            shouldThrow();
+        }
+        catch (IllegalStateException success) {}
+    }
+
+    /**
+     * toString returns a non-null string
+     */
+    public void testToString() {
+        SynchronousQueue q = new SynchronousQueue();
+        String s = q.toString();
+        assertNotNull(s);
+    }
+
+
+    /**
+     * offer transfers elements across Executor tasks
+     */
+    public void testOfferInExecutor() {
+        final SynchronousQueue q = new SynchronousQueue();
+        ExecutorService executor = Executors.newFixedThreadPool(2);
+        final Integer one = new Integer(1);
+
+        executor.execute(new Runnable() {
+            public void run() {
+                threadAssertFalse(q.offer(one));
+                try {
+                    threadAssertTrue(q.offer(one, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS));
+                    threadAssertEquals(0, q.remainingCapacity());
+                }
+                catch (InterruptedException e) {
+                    threadUnexpectedException();
+                }
+            }
+        });
+
+        executor.execute(new Runnable() {
+            public void run() {
+                try {
+                    Thread.sleep(SMALL_DELAY_MS);
+                    threadAssertEquals(one, q.take());
+                }
+                catch (InterruptedException e) {
+                    threadUnexpectedException();
+                }
+            }
+        });
+
+        joinPool(executor);
+
+    }
+
+    /**
+     * poll retrieves elements across Executor threads
+     */
+    public void testPollInExecutor() {
+        final SynchronousQueue q = new SynchronousQueue();
+        ExecutorService executor = Executors.newFixedThreadPool(2);
+        executor.execute(new Runnable() {
+            public void run() {
+                threadAssertNull(q.poll());
+                try {
+                    threadAssertTrue(null != q.poll(MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS));
+                    threadAssertTrue(q.isEmpty());
+                }
+                catch (InterruptedException e) {
+                    threadUnexpectedException();
+                }
+            }
+        });
+
+        executor.execute(new Runnable() {
+            public void run() {
+                try {
+                    Thread.sleep(SMALL_DELAY_MS);
+                    q.put(new Integer(1));
+                }
+                catch (InterruptedException e) {
+                    threadUnexpectedException();
+                }
+            }
+        });
+
+        joinPool(executor);
+    }
+
+    /**
+     * a deserialized serialized queue is usable
+     */
+    public void testSerialization() {
+        SynchronousQueue q = new SynchronousQueue();
+        try {
+            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
+            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
+            out.writeObject(q);
+            out.close();
+
+            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
+            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
+            SynchronousQueue r = (SynchronousQueue)in.readObject();
+            assertEquals(q.size(), r.size());
+            while (!q.isEmpty())
+                assertEquals(q.remove(), r.remove());
+        } catch(Exception e){
+            e.printStackTrace();
+            unexpectedException();
+        }
+    }
+
+    /**
+     * drainTo(null) throws NPE
+     */
+    public void testDrainToNull() {
+        SynchronousQueue q = new SynchronousQueue();
+        try {
+            q.drainTo(null);
+            shouldThrow();
+        } catch(NullPointerException success) {
+        }
+    }
+
+    /**
+     * drainTo(this) throws IAE
+     */
+    public void testDrainToSelf() {
+        SynchronousQueue q = new SynchronousQueue();
+        try {
+            q.drainTo(q);
+            shouldThrow();
+        } catch(IllegalArgumentException success) {
+        }
+    }
+
+    /**
+     * drainTo(c) of empty queue doesn't transfer elements
+     */
+    public void testDrainTo() {
+        SynchronousQueue q = new SynchronousQueue();
+        ArrayList l = new ArrayList();
+        q.drainTo(l);
+        assertEquals(q.size(), 0);
+        assertEquals(l.size(), 0);
+    }
+
+    /**
+     * drainTo empties queue, unblocking a waiting put.
+     */
+    public void testDrainToWithActivePut() {
+        final SynchronousQueue q = new SynchronousQueue();
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        q.put(new Integer(1));
+                    } catch (InterruptedException ie){
+                        threadUnexpectedException();
+                    }
+                }
+            });
+        try {
+            t.start();
+            ArrayList l = new ArrayList();
+            Thread.sleep(SHORT_DELAY_MS);
+            q.drainTo(l);
+            assertTrue(l.size() <= 1);
+            if (l.size() > 0)
+                assertEquals(l.get(0), new Integer(1));
+            t.join();
+            assertTrue(l.size() <= 1);
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * drainTo(null, n) throws NPE
+     */
+    public void testDrainToNullN() {
+        SynchronousQueue q = new SynchronousQueue();
+        try {
+            q.drainTo(null, 0);
+            shouldThrow();
+        } catch(NullPointerException success) {
+        }
+    }
+
+    /**
+     * drainTo(this, n) throws IAE
+     */
+    public void testDrainToSelfN() {
+        SynchronousQueue q = new SynchronousQueue();
+        try {
+            q.drainTo(q, 0);
+            shouldThrow();
+        } catch(IllegalArgumentException success) {
+        }
+    }
+
+    /**
+     * drainTo(c, n) empties up to n elements of queue into c
+     */
+    public void testDrainToN() {
+        final SynchronousQueue q = new SynchronousQueue();
+        Thread t1 = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        q.put(one);
+                    } catch (InterruptedException ie){
+                        threadUnexpectedException();
+                    }
+                }
+            });
+        Thread t2 = new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        q.put(two);
+                    } catch (InterruptedException ie){
+                        threadUnexpectedException();
+                    }
+                }
+            });
+
+        try {
+            t1.start();
+            t2.start();
+            ArrayList l = new ArrayList();
+            Thread.sleep(SHORT_DELAY_MS);
+            q.drainTo(l, 1);
+            assertTrue(l.size() == 1);
+            q.drainTo(l, 1);
+            assertTrue(l.size() == 2);
+            assertTrue(l.contains(one));
+            assertTrue(l.contains(two));
+            t1.join();
+            t2.join();
+        } catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/SystemTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/SystemTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/SystemTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,80 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.*;
+
+public class SystemTest extends JSR166TestCase {
+    public static void main(String[] args) {
+        junit.textui.TestRunner.run(suite());
+    }
+
+    public static Test suite() {
+        return new TestSuite(SystemTest.class);
+    }
+
+    /**
+     * Worst case rounding for millisecs; set for 60 cycle millis clock.
+     * This value might need to be changed os JVMs with coarser
+     *  System.currentTimeMillis clocks.
+     */
+    static final long MILLIS_ROUND = 17;
+
+    /**
+     * Nanos between readings of millis is no longer than millis (plus
+     * possible rounding).
+     * This shows only that nano timing not (much) worse than milli.
+     */
+    public void testNanoTime1() {
+        try {
+            long m1 = System.currentTimeMillis();
+            Thread.sleep(1);
+            long n1 = Utils.nanoTime();
+            Thread.sleep(SHORT_DELAY_MS);
+            long n2 = Utils.nanoTime();
+            Thread.sleep(1);
+            long m2 = System.currentTimeMillis();
+            long millis = m2 - m1;
+            long nanos = n2 - n1;
+            assertTrue(nanos >= 0);
+            long nanosAsMillis = nanos / 1000000;
+            assertTrue(nanosAsMillis <= millis + MILLIS_ROUND);
+        }
+        catch(InterruptedException ie) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * Millis between readings of nanos is less than nanos, adjusting
+     * for rounding.
+     * This shows only that nano timing not (much) worse than milli.
+     */
+    public void testNanoTime2() {
+        try {
+            long n1 = Utils.nanoTime();
+            Thread.sleep(1);
+            long m1 = System.currentTimeMillis();
+            Thread.sleep(SHORT_DELAY_MS);
+            long m2 = System.currentTimeMillis();
+            Thread.sleep(1);
+            long n2 = Utils.nanoTime();
+            long millis = m2 - m1;
+            long nanos = n2 - n1;
+
+            assertTrue(nanos >= 0);
+            long nanosAsMillis = nanos / 1000000;
+            assertTrue(millis <= nanosAsMillis + MILLIS_ROUND);
+        }
+        catch(InterruptedException ie) {
+            unexpectedException();
+        }
+    }
+
+}
+

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/ThreadLocalTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/ThreadLocalTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/ThreadLocalTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,106 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.concurrent.Semaphore;
+
+public class ThreadLocalTest extends JSR166TestCase {
+    public static void main(String[] args) {
+	junit.textui.TestRunner.run(suite());
+    }
+
+    public static Test suite() {
+	return new TestSuite(ThreadLocalTest.class);
+    }
+
+    static ThreadLocal tl = new ThreadLocal() {
+            public Object initialValue() {
+                return one;
+            }
+        };
+
+    static InheritableThreadLocal itl =
+        new InheritableThreadLocal() {
+            protected Object initialValue() {
+                return zero;
+            }
+
+            protected Object childValue(Object parentValue) {
+                return new Integer(((Integer)parentValue).intValue() + 1);
+            }
+        };
+
+//    /**
+//     * remove causes next access to return initial value
+//     */
+//    public void testRemove() {
+//        assertEquals(tl.get(), one);
+//        tl.set(two);
+//        assertEquals(tl.get(), two);
+//        tl.remove();
+//        assertEquals(tl.get(), one);
+//    }
+//
+//    /**
+//     * remove in InheritableThreadLocal causes next access to return
+//     * initial value
+//     */
+//    public void testRemoveITL() {
+//        assertEquals(itl.get(), zero);
+//        itl.set(two);
+//        assertEquals(itl.get(), two);
+//        itl.remove();
+//        assertEquals(itl.get(), zero);
+//    }
+
+    private class ITLThread extends Thread {
+        final int[] x;
+        ITLThread(int[] array) { x = array; }
+        public void run() {
+            Thread child = null;
+            if (((Integer)itl.get()).intValue() < x.length - 1) {
+                child = new ITLThread(x);
+                child.start();
+            }
+            Thread.currentThread().yield();
+
+            int threadId = ((Integer)itl.get()).intValue();
+            for (int j = 0; j < threadId; j++) {
+                x[threadId]++;
+                Thread.currentThread().yield();
+            }
+
+            if (child != null) { // Wait for child (if any)
+                try {
+                    child.join();
+                } catch(InterruptedException e) {
+                    threadUnexpectedException();
+                }
+            }
+        }
+    }
+
+    /**
+     * InheritableThreadLocal propagates generic values.
+     */
+    public void testGenericITL() {
+        final int threadCount = 10;
+        final int x[] = new int[threadCount];
+        Thread progenitor = new ITLThread(x);
+        try {
+            progenitor.start();
+            progenitor.join();
+            for(int i = 0; i < threadCount; i++) {
+                assertEquals(i, x[i]);
+            }
+        } catch(InterruptedException e) {
+            unexpectedException();
+        }
+    }
+}
+

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/ThreadPoolExecutorSubclassTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/ThreadPoolExecutorSubclassTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/ThreadPoolExecutorSubclassTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,1720 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
+
+import junit.framework.*;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Iterator;
+import edu.emory.mathcs.backport.java.util.concurrent.helpers.*;
+
+public class ThreadPoolExecutorSubclassTest extends JSR166TestCase {
+    public static void main(String[] args) {
+	junit.textui.TestRunner.run (suite());
+    }
+    public static Test suite() {
+        return new TestSuite(ThreadPoolExecutorTest.class);
+    }
+
+    static class CustomTask implements RunnableFuture {
+        final Callable callable;
+        final ReentrantLock lock = new ReentrantLock();
+        final Condition cond = lock.newCondition();
+        boolean done;
+        boolean cancelled;
+        Object result;
+        Thread thread;
+        Exception exception;
+        CustomTask(Callable c) { callable = c; }
+        CustomTask(final Runnable r, final Object res) { callable = new Callable() {
+            public Object call() throws Exception { r.run(); return res; }};
+        }
+        public boolean isDone() {
+            lock.lock(); try { return done; } finally { lock.unlock() ; }
+        }
+        public boolean isCancelled() {
+            lock.lock(); try { return cancelled; } finally { lock.unlock() ; }
+        }
+        public boolean cancel(boolean mayInterrupt) {
+            lock.lock();
+            try {
+                if (!done) {
+                    cancelled = true;
+                    done = true;
+                    if (mayInterrupt && thread != null)
+                        thread.interrupt();
+                    return true;
+                }
+                return false;
+            }
+            finally { lock.unlock() ; }
+        }
+        public void run() {
+            boolean runme;
+            lock.lock();
+            try {
+                runme = !done;
+                if (!runme)
+                    thread = Thread.currentThread();
+            }
+            finally { lock.unlock() ; }
+            if (!runme) return;
+            Object v = null;
+            Exception e = null;
+            try {
+                v = callable.call();
+            }
+            catch(Exception ex) {
+                e = ex;
+            }
+            lock.lock();
+            try {
+                result = v;
+                exception = e;
+                done = true;
+                thread = null;
+                cond.signalAll();
+            }
+            finally { lock.unlock(); }
+        }
+        public Object get() throws InterruptedException, ExecutionException {
+            lock.lock();
+            try {
+                while (!done)
+                    cond.await();
+                if (exception != null)
+                    throw new ExecutionException(exception);
+                return result;
+            }
+            finally { lock.unlock(); }
+        }
+        public Object get(long timeout, TimeUnit unit)
+            throws InterruptedException, ExecutionException, TimeoutException{
+            long nanos = unit.toNanos(timeout);
+            lock.lock();
+            try {
+                long deadline = Utils.nanoTime() + nanos;
+                for (;;) {
+                    if (done) break;
+                    if (nanos < 0)
+                        throw new TimeoutException();
+                    cond.await(nanos, TimeUnit.NANOSECONDS);
+                    nanos = deadline - Utils.nanoTime();
+                }
+                if (exception != null)
+                    throw new ExecutionException(exception);
+                return result;
+            }
+            finally { lock.unlock(); }
+        }
+    }
+
+
+    static class CustomTPE extends ThreadPoolExecutor {
+        protected RunnableFuture newTaskFor(Callable c) {
+            return new CustomTask(c);
+        }
+        protected RunnableFuture newTaskFor(Runnable r, Object v) {
+            return new CustomTask(r, v);
+        }
+
+        CustomTPE(int corePoolSize,
+                  int maximumPoolSize,
+                  long keepAliveTime,
+                  TimeUnit unit,
+                  BlockingQueue workQueue) {
+            super(corePoolSize, maximumPoolSize, keepAliveTime, unit,
+                  workQueue);
+        }
+        CustomTPE(int corePoolSize,
+                  int maximumPoolSize,
+                  long keepAliveTime,
+                  TimeUnit unit,
+                  BlockingQueue workQueue,
+                  ThreadFactory threadFactory) {
+        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
+             threadFactory);
+        }
+
+        CustomTPE(int corePoolSize,
+                  int maximumPoolSize,
+                  long keepAliveTime,
+                  TimeUnit unit,
+                  BlockingQueue workQueue,
+                  RejectedExecutionHandler handler) {
+        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
+              handler);
+        }
+        CustomTPE(int corePoolSize,
+                  int maximumPoolSize,
+                  long keepAliveTime,
+                  TimeUnit unit,
+                  BlockingQueue workQueue,
+                  ThreadFactory threadFactory,
+                  RejectedExecutionHandler handler) {
+            super(corePoolSize, maximumPoolSize, keepAliveTime, unit,
+              workQueue, threadFactory, handler);
+        }
+
+        volatile boolean beforeCalled = false;
+        volatile boolean afterCalled = false;
+        volatile boolean terminatedCalled = false;
+        public CustomTPE() {
+            super(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new SynchronousQueue());
+        }
+        protected void beforeExecute(Thread t, Runnable r) {
+            beforeCalled = true;
+        }
+        protected void afterExecute(Runnable r, Throwable t) {
+            afterCalled = true;
+        }
+        protected void terminated() {
+            terminatedCalled = true;
+        }
+
+    }
+
+    static class FailingThreadFactory implements ThreadFactory{
+        int calls = 0;
+        public Thread newThread(Runnable r){
+            if (++calls > 1) return null;
+            return new Thread(r);
+        }
+    }
+
+
+    /**
+     *  execute successfully executes a runnable
+     */
+    public void testExecute() {
+        ThreadPoolExecutor p1 = new CustomTPE(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            p1.execute(new Runnable() {
+                    public void run() {
+                        try {
+                            Thread.sleep(SHORT_DELAY_MS);
+                        } catch(InterruptedException e){
+                            threadUnexpectedException();
+                        }
+                    }
+                });
+	    Thread.sleep(SMALL_DELAY_MS);
+        } catch(InterruptedException e){
+            unexpectedException();
+        }
+        joinPool(p1);
+    }
+
+    /**
+     *  getActiveCount increases but doesn't overestimate, when a
+     *  thread becomes active
+     */
+    public void testGetActiveCount() {
+        ThreadPoolExecutor p2 = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        assertEquals(0, p2.getActiveCount());
+        p2.execute(new MediumRunnable());
+        try {
+            Thread.sleep(SHORT_DELAY_MS);
+        } catch(Exception e){
+            unexpectedException();
+        }
+        assertEquals(1, p2.getActiveCount());
+        joinPool(p2);
+    }
+
+    /**
+     *  prestartCoreThread starts a thread if under corePoolSize, else doesn't
+     */
+    public void testPrestartCoreThread() {
+        ThreadPoolExecutor p2 = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        assertEquals(0, p2.getPoolSize());
+        assertTrue(p2.prestartCoreThread());
+        assertEquals(1, p2.getPoolSize());
+        assertTrue(p2.prestartCoreThread());
+        assertEquals(2, p2.getPoolSize());
+        assertFalse(p2.prestartCoreThread());
+        assertEquals(2, p2.getPoolSize());
+        joinPool(p2);
+    }
+
+    /**
+     *  prestartAllCoreThreads starts all corePoolSize threads
+     */
+    public void testPrestartAllCoreThreads() {
+        ThreadPoolExecutor p2 = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        assertEquals(0, p2.getPoolSize());
+        p2.prestartAllCoreThreads();
+        assertEquals(2, p2.getPoolSize());
+        p2.prestartAllCoreThreads();
+        assertEquals(2, p2.getPoolSize());
+        joinPool(p2);
+    }
+
+    /**
+     *   getCompletedTaskCount increases, but doesn't overestimate,
+     *   when tasks complete
+     */
+    public void testGetCompletedTaskCount() {
+        ThreadPoolExecutor p2 = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        assertEquals(0, p2.getCompletedTaskCount());
+        p2.execute(new ShortRunnable());
+        try {
+            Thread.sleep(SMALL_DELAY_MS);
+        } catch(Exception e){
+            unexpectedException();
+        }
+        assertEquals(1, p2.getCompletedTaskCount());
+        try { p2.shutdown(); } catch(SecurityException ok) { return; }
+        joinPool(p2);
+    }
+
+    /**
+     *   getCorePoolSize returns size given in constructor if not otherwise set
+     */
+    public void testGetCorePoolSize() {
+        ThreadPoolExecutor p1 = new CustomTPE(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        assertEquals(1, p1.getCorePoolSize());
+        joinPool(p1);
+    }
+
+    /**
+     *   getKeepAliveTime returns value given in constructor if not otherwise set
+     */
+    public void testGetKeepAliveTime() {
+        ThreadPoolExecutor p2 = new CustomTPE(2, 2, 1000, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        assertEquals(1, p2.getKeepAliveTime(TimeUnit.SECONDS));
+        joinPool(p2);
+    }
+
+
+    /**
+     * getThreadFactory returns factory in constructor if not set
+     */
+    public void testGetThreadFactory() {
+        ThreadFactory tf = new SimpleThreadFactory();
+        ThreadPoolExecutor p = new CustomTPE(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10), tf, new NoOpREHandler());
+        assertSame(tf, p.getThreadFactory());
+        joinPool(p);
+    }
+
+    /**
+     * setThreadFactory sets the thread factory returned by getThreadFactory
+     */
+    public void testSetThreadFactory() {
+        ThreadPoolExecutor p = new CustomTPE(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        ThreadFactory tf = new SimpleThreadFactory();
+        p.setThreadFactory(tf);
+        assertSame(tf, p.getThreadFactory());
+        joinPool(p);
+    }
+
+
+    /**
+     * setThreadFactory(null) throws NPE
+     */
+    public void testSetThreadFactoryNull() {
+        ThreadPoolExecutor p = new CustomTPE(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            p.setThreadFactory(null);
+            shouldThrow();
+        } catch (NullPointerException success) {
+        } finally {
+            joinPool(p);
+        }
+    }
+
+    /**
+     * getRejectedExecutionHandler returns handler in constructor if not set
+     */
+    public void testGetRejectedExecutionHandler() {
+        RejectedExecutionHandler h = new NoOpREHandler();
+        ThreadPoolExecutor p = new CustomTPE(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10), h);
+        assertSame(h, p.getRejectedExecutionHandler());
+        joinPool(p);
+    }
+
+    /**
+     * setRejectedExecutionHandler sets the handler returned by
+     * getRejectedExecutionHandler
+     */
+    public void testSetRejectedExecutionHandler() {
+        ThreadPoolExecutor p = new CustomTPE(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        RejectedExecutionHandler h = new NoOpREHandler();
+        p.setRejectedExecutionHandler(h);
+        assertSame(h, p.getRejectedExecutionHandler());
+        joinPool(p);
+    }
+
+
+    /**
+     * setRejectedExecutionHandler(null) throws NPE
+     */
+    public void testSetRejectedExecutionHandlerNull() {
+        ThreadPoolExecutor p = new CustomTPE(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            p.setRejectedExecutionHandler(null);
+            shouldThrow();
+        } catch (NullPointerException success) {
+        } finally {
+            joinPool(p);
+        }
+    }
+
+
+    /**
+     *   getLargestPoolSize increases, but doesn't overestimate, when
+     *   multiple threads active
+     */
+    public void testGetLargestPoolSize() {
+        ThreadPoolExecutor p2 = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            assertEquals(0, p2.getLargestPoolSize());
+            p2.execute(new MediumRunnable());
+            p2.execute(new MediumRunnable());
+            Thread.sleep(SHORT_DELAY_MS);
+            assertEquals(2, p2.getLargestPoolSize());
+        } catch(Exception e){
+            unexpectedException();
+        }
+        joinPool(p2);
+    }
+
+    /**
+     *   getMaximumPoolSize returns value given in constructor if not
+     *   otherwise set
+     */
+    public void testGetMaximumPoolSize() {
+        ThreadPoolExecutor p2 = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        assertEquals(2, p2.getMaximumPoolSize());
+        joinPool(p2);
+    }
+
+    /**
+     *   getPoolSize increases, but doesn't overestimate, when threads
+     *   become active
+     */
+    public void testGetPoolSize() {
+        ThreadPoolExecutor p1 = new CustomTPE(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        assertEquals(0, p1.getPoolSize());
+        p1.execute(new MediumRunnable());
+        assertEquals(1, p1.getPoolSize());
+        joinPool(p1);
+    }
+
+    /**
+     *  getTaskCount increases, but doesn't overestimate, when tasks submitted
+     */
+    public void testGetTaskCount() {
+        ThreadPoolExecutor p1 = new CustomTPE(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            assertEquals(0, p1.getTaskCount());
+            p1.execute(new MediumRunnable());
+            Thread.sleep(SHORT_DELAY_MS);
+            assertEquals(1, p1.getTaskCount());
+        } catch(Exception e){
+            unexpectedException();
+        }
+        joinPool(p1);
+    }
+
+    /**
+     *   isShutDown is false before shutdown, true after
+     */
+    public void testIsShutdown() {
+
+	ThreadPoolExecutor p1 = new CustomTPE(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        assertFalse(p1.isShutdown());
+        try { p1.shutdown(); } catch(SecurityException ok) { return; }
+	assertTrue(p1.isShutdown());
+        joinPool(p1);
+    }
+
+
+    /**
+     *  isTerminated is false before termination, true after
+     */
+    public void testIsTerminated() {
+	ThreadPoolExecutor p1 = new CustomTPE(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        assertFalse(p1.isTerminated());
+        try {
+            p1.execute(new MediumRunnable());
+        } finally {
+            try { p1.shutdown(); } catch(SecurityException ok) { return; }
+        }
+	try {
+	    assertTrue(p1.awaitTermination(LONG_DELAY_MS, TimeUnit.MILLISECONDS));
+            assertTrue(p1.isTerminated());
+	} catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     *  isTerminating is not true when running or when terminated
+     */
+    public void testIsTerminating() {
+	ThreadPoolExecutor p1 = new CustomTPE(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        assertFalse(p1.isTerminating());
+        try {
+            p1.execute(new SmallRunnable());
+            assertFalse(p1.isTerminating());
+        } finally {
+            try { p1.shutdown(); } catch(SecurityException ok) { return; }
+        }
+        try {
+	    assertTrue(p1.awaitTermination(LONG_DELAY_MS, TimeUnit.MILLISECONDS));
+            assertTrue(p1.isTerminated());
+            assertFalse(p1.isTerminating());
+	} catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * getQueue returns the work queue, which contains queued tasks
+     */
+    public void testGetQueue() {
+        BlockingQueue q = new ArrayBlockingQueue(10);
+        ThreadPoolExecutor p1 = new CustomTPE(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, q);
+        FutureTask[] tasks = new FutureTask[5];
+        for(int i = 0; i < 5; i++){
+            tasks[i] = new FutureTask(new MediumPossiblyInterruptedRunnable(), Boolean.TRUE);
+            p1.execute(tasks[i]);
+        }
+        try {
+            Thread.sleep(SHORT_DELAY_MS);
+            BlockingQueue wq = p1.getQueue();
+            assertSame(q, wq);
+            assertFalse(wq.contains(tasks[0]));
+            assertTrue(wq.contains(tasks[4]));
+            for (int i = 1; i < 5; ++i)
+                tasks[i].cancel(true);
+            p1.shutdownNow();
+        } catch(Exception e) {
+            unexpectedException();
+        } finally {
+            joinPool(p1);
+        }
+    }
+
+    /**
+     * remove(task) removes queued task, and fails to remove active task
+     */
+    public void testRemove() {
+        BlockingQueue q = new ArrayBlockingQueue(10);
+        ThreadPoolExecutor p1 = new CustomTPE(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, q);
+        FutureTask[] tasks = new FutureTask[5];
+        for(int i = 0; i < 5; i++){
+            tasks[i] = new FutureTask(new MediumPossiblyInterruptedRunnable(), Boolean.TRUE);
+            p1.execute(tasks[i]);
+        }
+        try {
+            Thread.sleep(SHORT_DELAY_MS);
+            assertFalse(p1.remove(tasks[0]));
+            assertTrue(q.contains(tasks[4]));
+            assertTrue(q.contains(tasks[3]));
+            assertTrue(p1.remove(tasks[4]));
+            assertFalse(p1.remove(tasks[4]));
+            assertFalse(q.contains(tasks[4]));
+            assertTrue(q.contains(tasks[3]));
+            assertTrue(p1.remove(tasks[3]));
+            assertFalse(q.contains(tasks[3]));
+        } catch(Exception e) {
+            unexpectedException();
+        } finally {
+            joinPool(p1);
+        }
+    }
+
+    /**
+     *   purge removes cancelled tasks from the queue
+     */
+    public void testPurge() {
+        ThreadPoolExecutor p1 = new CustomTPE(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        FutureTask[] tasks = new FutureTask[5];
+        for(int i = 0; i < 5; i++){
+            tasks[i] = new FutureTask(new MediumPossiblyInterruptedRunnable(), Boolean.TRUE);
+            p1.execute(tasks[i]);
+        }
+        tasks[4].cancel(true);
+        tasks[3].cancel(true);
+        p1.purge();
+        long count = p1.getTaskCount();
+        assertTrue(count >= 2 && count < 5);
+        joinPool(p1);
+    }
+
+    /**
+     *  shutDownNow returns a list containing tasks that were not run
+     */
+    public void testShutDownNow() {
+	ThreadPoolExecutor p1 = new CustomTPE(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        List l;
+        try {
+            for(int i = 0; i < 5; i++)
+                p1.execute(new MediumPossiblyInterruptedRunnable());
+        }
+        finally {
+            try {
+                l = p1.shutdownNow();
+            } catch (SecurityException ok) { return; }
+
+        }
+	assertTrue(p1.isShutdown());
+	assertTrue(l.size() <= 4);
+    }
+
+    // Exception Tests
+
+
+    /**
+     * Constructor throws if corePoolSize argument is less than zero
+     */
+    public void testConstructor1() {
+        try {
+            new CustomTPE(-1,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success){}
+    }
+
+    /**
+     * Constructor throws if maximumPoolSize is less than zero
+     */
+    public void testConstructor2() {
+        try {
+            new CustomTPE(1,-1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success){}
+    }
+
+    /**
+     * Constructor throws if maximumPoolSize is equal to zero
+     */
+    public void testConstructor3() {
+        try {
+            new CustomTPE(1,0,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success){}
+    }
+
+    /**
+     * Constructor throws if keepAliveTime is less than zero
+     */
+    public void testConstructor4() {
+        try {
+            new CustomTPE(1,2,-1L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success){}
+    }
+
+    /**
+     * Constructor throws if corePoolSize is greater than the maximumPoolSize
+     */
+    public void testConstructor5() {
+        try {
+            new CustomTPE(2,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success){}
+    }
+
+    /**
+     * Constructor throws if workQueue is set to null
+     */
+    public void testConstructorNullPointerException() {
+        try {
+            new CustomTPE(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,null);
+            shouldThrow();
+        }
+        catch (NullPointerException success){}
+    }
+
+
+
+    /**
+     * Constructor throws if corePoolSize argument is less than zero
+     */
+    public void testConstructor6() {
+        try {
+            new CustomTPE(-1,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10),new SimpleThreadFactory());
+            shouldThrow();
+        } catch (IllegalArgumentException success){}
+    }
+
+    /**
+     * Constructor throws if maximumPoolSize is less than zero
+     */
+    public void testConstructor7() {
+        try {
+            new CustomTPE(1,-1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10),new SimpleThreadFactory());
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success){}
+    }
+
+    /**
+     * Constructor throws if maximumPoolSize is equal to zero
+     */
+    public void testConstructor8() {
+        try {
+            new CustomTPE(1,0,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10),new SimpleThreadFactory());
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success){}
+    }
+
+    /**
+     * Constructor throws if keepAliveTime is less than zero
+     */
+    public void testConstructor9() {
+        try {
+            new CustomTPE(1,2,-1L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10),new SimpleThreadFactory());
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success){}
+    }
+
+    /**
+     * Constructor throws if corePoolSize is greater than the maximumPoolSize
+     */
+    public void testConstructor10() {
+        try {
+            new CustomTPE(2,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10),new SimpleThreadFactory());
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success){}
+    }
+
+    /**
+     * Constructor throws if workQueue is set to null
+     */
+    public void testConstructorNullPointerException2() {
+        try {
+            new CustomTPE(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,null,new SimpleThreadFactory());
+            shouldThrow();
+        }
+        catch (NullPointerException success){}
+    }
+
+    /**
+     * Constructor throws if threadFactory is set to null
+     */
+    public void testConstructorNullPointerException3() {
+        try {
+            ThreadFactory f = null;
+            new CustomTPE(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue(10),f);
+            shouldThrow();
+        }
+        catch (NullPointerException success){}
+    }
+
+
+    /**
+     * Constructor throws if corePoolSize argument is less than zero
+     */
+    public void testConstructor11() {
+        try {
+            new CustomTPE(-1,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10),new NoOpREHandler());
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success){}
+    }
+
+    /**
+     * Constructor throws if maximumPoolSize is less than zero
+     */
+    public void testConstructor12() {
+        try {
+            new CustomTPE(1,-1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10),new NoOpREHandler());
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success){}
+    }
+
+    /**
+     * Constructor throws if maximumPoolSize is equal to zero
+     */
+    public void testConstructor13() {
+        try {
+            new CustomTPE(1,0,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10),new NoOpREHandler());
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success){}
+    }
+
+    /**
+     * Constructor throws if keepAliveTime is less than zero
+     */
+    public void testConstructor14() {
+        try {
+            new CustomTPE(1,2,-1L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10),new NoOpREHandler());
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success){}
+    }
+
+    /**
+     * Constructor throws if corePoolSize is greater than the maximumPoolSize
+     */
+    public void testConstructor15() {
+        try {
+            new CustomTPE(2,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10),new NoOpREHandler());
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success){}
+    }
+
+    /**
+     * Constructor throws if workQueue is set to null
+     */
+    public void testConstructorNullPointerException4() {
+        try {
+            new CustomTPE(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,null,new NoOpREHandler());
+            shouldThrow();
+        }
+        catch (NullPointerException success){}
+    }
+
+    /**
+     * Constructor throws if handler is set to null
+     */
+    public void testConstructorNullPointerException5() {
+        try {
+            RejectedExecutionHandler r = null;
+            new CustomTPE(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue(10),r);
+            shouldThrow();
+        }
+        catch (NullPointerException success){}
+    }
+
+
+    /**
+     * Constructor throws if corePoolSize argument is less than zero
+     */
+    public void testConstructor16() {
+        try {
+            new CustomTPE(-1,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10),new SimpleThreadFactory(),new NoOpREHandler());
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success){}
+    }
+
+    /**
+     * Constructor throws if maximumPoolSize is less than zero
+     */
+    public void testConstructor17() {
+        try {
+            new CustomTPE(1,-1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10),new SimpleThreadFactory(),new NoOpREHandler());
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success){}
+    }
+
+    /**
+     * Constructor throws if maximumPoolSize is equal to zero
+     */
+    public void testConstructor18() {
+        try {
+            new CustomTPE(1,0,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10),new SimpleThreadFactory(),new NoOpREHandler());
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success){}
+    }
+
+    /**
+     * Constructor throws if keepAliveTime is less than zero
+     */
+    public void testConstructor19() {
+        try {
+            new CustomTPE(1,2,-1L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10),new SimpleThreadFactory(),new NoOpREHandler());
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success){}
+    }
+
+    /**
+     * Constructor throws if corePoolSize is greater than the maximumPoolSize
+     */
+    public void testConstructor20() {
+        try {
+            new CustomTPE(2,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10),new SimpleThreadFactory(),new NoOpREHandler());
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success){}
+    }
+
+    /**
+     * Constructor throws if workQueue is set to null
+     */
+    public void testConstructorNullPointerException6() {
+        try {
+            new CustomTPE(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,null,new SimpleThreadFactory(),new NoOpREHandler());
+            shouldThrow();
+        }
+        catch (NullPointerException success){}
+    }
+
+    /**
+     * Constructor throws if handler is set to null
+     */
+    public void testConstructorNullPointerException7() {
+        try {
+            RejectedExecutionHandler r = null;
+            new CustomTPE(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue(10),new SimpleThreadFactory(),r);
+            shouldThrow();
+        }
+        catch (NullPointerException success){}
+    }
+
+    /**
+     * Constructor throws if ThreadFactory is set top null
+     */
+    public void testConstructorNullPointerException8() {
+        try {
+            ThreadFactory f = null;
+            new CustomTPE(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue(10),f,new NoOpREHandler());
+            shouldThrow();
+        }
+        catch (NullPointerException successdn8){}
+    }
+
+
+    /**
+     *  execute throws RejectedExecutionException
+     *  if saturated.
+     */
+    public void testSaturatedExecute() {
+        ThreadPoolExecutor p = new CustomTPE(1,1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(1));
+        try {
+
+            for(int i = 0; i < 5; ++i){
+                p.execute(new MediumRunnable());
+            }
+            shouldThrow();
+        } catch(RejectedExecutionException success){}
+        joinPool(p);
+    }
+
+    /**
+     *  executor using CallerRunsPolicy runs task if saturated.
+     */
+    public void testSaturatedExecute2() {
+        RejectedExecutionHandler h = new CustomTPE.CallerRunsPolicy();
+        ThreadPoolExecutor p = new CustomTPE(1,1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(1), h);
+        try {
+
+            TrackedNoOpRunnable[] tasks = new TrackedNoOpRunnable[5];
+            for(int i = 0; i < 5; ++i){
+                tasks[i] = new TrackedNoOpRunnable();
+            }
+            TrackedLongRunnable mr = new TrackedLongRunnable();
+            p.execute(mr);
+            for(int i = 0; i < 5; ++i){
+                p.execute(tasks[i]);
+            }
+            for(int i = 1; i < 5; ++i) {
+                assertTrue(tasks[i].done);
+            }
+            try { p.shutdownNow(); } catch(SecurityException ok) { return; }
+        } catch(RejectedExecutionException ex){
+            unexpectedException();
+        } finally {
+            joinPool(p);
+        }
+    }
+
+    /**
+     *  executor using DiscardPolicy drops task if saturated.
+     */
+    public void testSaturatedExecute3() {
+        RejectedExecutionHandler h = new CustomTPE.DiscardPolicy();
+        ThreadPoolExecutor p = new CustomTPE(1,1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(1), h);
+        try {
+
+            TrackedNoOpRunnable[] tasks = new TrackedNoOpRunnable[5];
+            for(int i = 0; i < 5; ++i){
+                tasks[i] = new TrackedNoOpRunnable();
+            }
+            p.execute(new TrackedLongRunnable());
+            for(int i = 0; i < 5; ++i){
+                p.execute(tasks[i]);
+            }
+            for(int i = 0; i < 5; ++i){
+                assertFalse(tasks[i].done);
+            }
+            try { p.shutdownNow(); } catch(SecurityException ok) { return; }
+        } catch(RejectedExecutionException ex){
+            unexpectedException();
+        } finally {
+            joinPool(p);
+        }
+    }
+
+    /**
+     *  executor using DiscardOldestPolicy drops oldest task if saturated.
+     */
+    public void testSaturatedExecute4() {
+        RejectedExecutionHandler h = new CustomTPE.DiscardOldestPolicy();
+        ThreadPoolExecutor p = new CustomTPE(1,1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(1), h);
+        try {
+            p.execute(new TrackedLongRunnable());
+            TrackedLongRunnable r2 = new TrackedLongRunnable();
+            p.execute(r2);
+            assertTrue(p.getQueue().contains(r2));
+            TrackedNoOpRunnable r3 = new TrackedNoOpRunnable();
+            p.execute(r3);
+            assertFalse(p.getQueue().contains(r2));
+            assertTrue(p.getQueue().contains(r3));
+            try { p.shutdownNow(); } catch(SecurityException ok) { return; }
+        } catch(RejectedExecutionException ex){
+            unexpectedException();
+        } finally {
+            joinPool(p);
+        }
+    }
+
+    /**
+     *  execute throws RejectedExecutionException if shutdown
+     */
+    public void testRejectedExecutionExceptionOnShutdown() {
+        ThreadPoolExecutor tpe =
+            new CustomTPE(1,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue(1));
+        try { tpe.shutdown(); } catch(SecurityException ok) { return; }
+	try {
+	    tpe.execute(new NoOpRunnable());
+	    shouldThrow();
+	} catch(RejectedExecutionException success){}
+
+	joinPool(tpe);
+    }
+
+    /**
+     *  execute using CallerRunsPolicy drops task on shutdown
+     */
+    public void testCallerRunsOnShutdown() {
+        RejectedExecutionHandler h = new CustomTPE.CallerRunsPolicy();
+        ThreadPoolExecutor p = new CustomTPE(1,1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(1), h);
+
+        try { p.shutdown(); } catch(SecurityException ok) { return; }
+	try {
+            TrackedNoOpRunnable r = new TrackedNoOpRunnable();
+	    p.execute(r);
+            assertFalse(r.done);
+	} catch(RejectedExecutionException success){
+            unexpectedException();
+        } finally {
+            joinPool(p);
+        }
+    }
+
+    /**
+     *  execute using DiscardPolicy drops task on shutdown
+     */
+    public void testDiscardOnShutdown() {
+        RejectedExecutionHandler h = new CustomTPE.DiscardPolicy();
+        ThreadPoolExecutor p = new CustomTPE(1,1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(1), h);
+
+        try { p.shutdown(); } catch(SecurityException ok) { return; }
+	try {
+            TrackedNoOpRunnable r = new TrackedNoOpRunnable();
+	    p.execute(r);
+            assertFalse(r.done);
+	} catch(RejectedExecutionException success){
+            unexpectedException();
+        } finally {
+            joinPool(p);
+        }
+    }
+
+
+    /**
+     *  execute using DiscardOldestPolicy drops task on shutdown
+     */
+    public void testDiscardOldestOnShutdown() {
+        RejectedExecutionHandler h = new CustomTPE.DiscardOldestPolicy();
+        ThreadPoolExecutor p = new CustomTPE(1,1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(1), h);
+
+        try { p.shutdown(); } catch(SecurityException ok) { return; }
+	try {
+            TrackedNoOpRunnable r = new TrackedNoOpRunnable();
+	    p.execute(r);
+            assertFalse(r.done);
+	} catch(RejectedExecutionException success){
+            unexpectedException();
+        } finally {
+            joinPool(p);
+        }
+    }
+
+
+    /**
+     *  execute (null) throws NPE
+     */
+    public void testExecuteNull() {
+        ThreadPoolExecutor tpe = null;
+        try {
+	    tpe = new CustomTPE(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue(10));
+	    tpe.execute(null);
+            shouldThrow();
+	} catch(NullPointerException success){}
+
+	joinPool(tpe);
+    }
+
+    /**
+     *  setCorePoolSize of negative value throws IllegalArgumentException
+     */
+    public void testCorePoolSizeIllegalArgumentException() {
+	ThreadPoolExecutor tpe = null;
+	try {
+	    tpe = new CustomTPE(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue(10));
+	} catch(Exception e){}
+	try {
+	    tpe.setCorePoolSize(-1);
+	    shouldThrow();
+	} catch(IllegalArgumentException success){
+        } finally {
+            try { tpe.shutdown(); } catch(SecurityException ok) { return; }
+        }
+        joinPool(tpe);
+    }
+
+    /**
+     *  setMaximumPoolSize(int) throws IllegalArgumentException if
+     *  given a value less the core pool size
+     */
+    public void testMaximumPoolSizeIllegalArgumentException() {
+        ThreadPoolExecutor tpe = null;
+        try {
+            tpe = new CustomTPE(2,3,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue(10));
+        } catch(Exception e){}
+        try {
+            tpe.setMaximumPoolSize(1);
+            shouldThrow();
+        } catch(IllegalArgumentException success){
+        } finally {
+            try { tpe.shutdown(); } catch(SecurityException ok) { return; }
+        }
+        joinPool(tpe);
+    }
+
+    /**
+     *  setMaximumPoolSize throws IllegalArgumentException
+     *  if given a negative value
+     */
+    public void testMaximumPoolSizeIllegalArgumentException2() {
+        ThreadPoolExecutor tpe = null;
+        try {
+            tpe = new CustomTPE(2,3,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue(10));
+        } catch(Exception e){}
+        try {
+            tpe.setMaximumPoolSize(-1);
+            shouldThrow();
+        } catch(IllegalArgumentException success){
+        } finally {
+            try { tpe.shutdown(); } catch(SecurityException ok) { return; }
+        }
+        joinPool(tpe);
+    }
+
+
+    /**
+     *  setKeepAliveTime  throws IllegalArgumentException
+     *  when given a negative value
+     */
+    public void testKeepAliveTimeIllegalArgumentException() {
+	ThreadPoolExecutor tpe = null;
+        try {
+            tpe = new CustomTPE(2,3,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue(10));
+        } catch(Exception e){}
+
+	try {
+            tpe.setKeepAliveTime(-1,TimeUnit.MILLISECONDS);
+            shouldThrow();
+        } catch(IllegalArgumentException success){
+        } finally {
+            try { tpe.shutdown(); } catch(SecurityException ok) { return; }
+        }
+        joinPool(tpe);
+    }
+
+    /**
+     * terminated() is called on termination
+     */
+    public void testTerminated() {
+        CustomTPE tpe = new CustomTPE();
+        try { tpe.shutdown(); } catch(SecurityException ok) { return; }
+        assertTrue(tpe.terminatedCalled);
+        joinPool(tpe);
+    }
+
+    /**
+     * beforeExecute and afterExecute are called when executing task
+     */
+    public void testBeforeAfter() {
+        CustomTPE tpe = new CustomTPE();
+        try {
+            TrackedNoOpRunnable r = new TrackedNoOpRunnable();
+            tpe.execute(r);
+            Thread.sleep(SHORT_DELAY_MS);
+            assertTrue(r.done);
+            assertTrue(tpe.beforeCalled);
+            assertTrue(tpe.afterCalled);
+            try { tpe.shutdown(); } catch(SecurityException ok) { return; }
+        }
+        catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(tpe);
+        }
+    }
+
+    /**
+     * completed submit of callable returns result
+     */
+    public void testSubmitCallable() {
+        ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            Future future = e.submit(new StringTask());
+            String result = (String)future.get();
+            assertSame(TEST_STRING, result);
+        }
+        catch (ExecutionException ex) {
+            unexpectedException();
+        }
+        catch (InterruptedException ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * completed submit of runnable returns successfully
+     */
+    public void testSubmitRunnable() {
+        ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            Future future = e.submit(new NoOpRunnable());
+            future.get();
+            assertTrue(future.isDone());
+        }
+        catch (ExecutionException ex) {
+            unexpectedException();
+        }
+        catch (InterruptedException ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * completed submit of (runnable, result) returns result
+     */
+    public void testSubmitRunnable2() {
+        ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            Future future = e.submit(new NoOpRunnable(), TEST_STRING);
+            String result = (String)future.get();
+            assertSame(TEST_STRING, result);
+        }
+        catch (ExecutionException ex) {
+            unexpectedException();
+        }
+        catch (InterruptedException ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+
+
+
+
+    /**
+     * invokeAny(null) throws NPE
+     */
+    public void testInvokeAny1() {
+        ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            e.invokeAny(null);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAny(empty collection) throws IAE
+     */
+    public void testInvokeAny2() {
+        ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            e.invokeAny(new ArrayList());
+        } catch (IllegalArgumentException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAny(c) throws NPE if c has null elements
+     */
+    public void testInvokeAny3() {
+        ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(null);
+            e.invokeAny(l);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAny(c) throws ExecutionException if no task completes
+     */
+    public void testInvokeAny4() {
+        ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new NPETask());
+            e.invokeAny(l);
+        } catch (ExecutionException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAny(c) returns result of some task
+     */
+    public void testInvokeAny5() {
+        ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(new StringTask());
+            String result = (String)e.invokeAny(l);
+            assertSame(TEST_STRING, result);
+        } catch (ExecutionException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAll(null) throws NPE
+     */
+    public void testInvokeAll1() {
+        ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            e.invokeAll(null);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAll(empty collection) returns empty collection
+     */
+    public void testInvokeAll2() {
+        ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            List r = e.invokeAll(new ArrayList());
+            assertTrue(r.isEmpty());
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAll(c) throws NPE if c has null elements
+     */
+    public void testInvokeAll3() {
+        ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(null);
+            e.invokeAll(l);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * get of element of invokeAll(c) throws exception on failed task
+     */
+    public void testInvokeAll4() {
+        ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new NPETask());
+            List result = e.invokeAll(l);
+            assertEquals(1, result.size());
+            for (Iterator it = result.iterator(); it.hasNext();)
+                ((Future)it.next()).get();
+        } catch(ExecutionException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAll(c) returns results of all completed tasks
+     */
+    public void testInvokeAll5() {
+        ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(new StringTask());
+            List result = e.invokeAll(l);
+            assertEquals(2, result.size());
+            for (Iterator it = result.iterator(); it.hasNext();)
+                assertSame(TEST_STRING, ((Future)it.next()).get());
+        } catch (ExecutionException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+
+
+    /**
+     * timed invokeAny(null) throws NPE
+     */
+    public void testTimedInvokeAny1() {
+        ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            e.invokeAny(null, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAny(,,null) throws NPE
+     */
+    public void testTimedInvokeAnyNullTimeUnit() {
+        ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            e.invokeAny(l, MEDIUM_DELAY_MS, null);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAny(empty collection) throws IAE
+     */
+    public void testTimedInvokeAny2() {
+        ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            e.invokeAny(new ArrayList(), MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+        } catch (IllegalArgumentException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAny(c) throws NPE if c has null elements
+     */
+    public void testTimedInvokeAny3() {
+        ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(null);
+            e.invokeAny(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            ex.printStackTrace();
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAny(c) throws ExecutionException if no task completes
+     */
+    public void testTimedInvokeAny4() {
+        ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new NPETask());
+            e.invokeAny(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+        } catch(ExecutionException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAny(c) returns result of some task
+     */
+    public void testTimedInvokeAny5() {
+        ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(new StringTask());
+            String result = (String)e.invokeAny(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+            assertSame(TEST_STRING, result);
+        } catch (ExecutionException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAll(null) throws NPE
+     */
+    public void testTimedInvokeAll1() {
+        ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            e.invokeAll(null, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAll(,,null) throws NPE
+     */
+    public void testTimedInvokeAllNullTimeUnit() {
+        ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            e.invokeAll(l, MEDIUM_DELAY_MS, null);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAll(empty collection) returns empty collection
+     */
+    public void testTimedInvokeAll2() {
+        ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            List r = e.invokeAll(new ArrayList(), MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+            assertTrue(r.isEmpty());
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAll(c) throws NPE if c has null elements
+     */
+    public void testTimedInvokeAll3() {
+        ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(null);
+            e.invokeAll(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * get of element of invokeAll(c) throws exception on failed task
+     */
+    public void testTimedInvokeAll4() {
+        ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new NPETask());
+            List result = e.invokeAll(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+            assertEquals(1, result.size());
+            for (Iterator it = result.iterator(); it.hasNext();)
+                ((Future)it.next()).get();
+        } catch(ExecutionException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAll(c) returns results of all completed tasks
+     */
+    public void testTimedInvokeAll5() {
+        ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(new StringTask());
+            List result = e.invokeAll(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+            assertEquals(2, result.size());
+            for (Iterator it = result.iterator(); it.hasNext();)
+                assertSame(TEST_STRING, ((Future)it.next()).get());
+        } catch (ExecutionException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAll(c) cancels tasks not completed by timeout
+     */
+    public void testTimedInvokeAll6() {
+        ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(Executors.callable(new MediumPossiblyInterruptedRunnable(), TEST_STRING));
+            l.add(new StringTask());
+            List result = e.invokeAll(l, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
+            assertEquals(3, result.size());
+            Iterator it = result.iterator();
+            Future f1 = (Future)it.next();
+            Future f2 = (Future)it.next();
+            Future f3 = (Future)it.next();
+            assertTrue(f1.isDone());
+            assertTrue(f2.isDone());
+            assertTrue(f3.isDone());
+            assertFalse(f1.isCancelled());
+            assertTrue(f2.isCancelled());
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * Execution continues if there is at least one thread even if
+     * thread factory fails to create more
+     */
+    public void testFailingThreadFactory() {
+        ExecutorService e = new CustomTPE(100, 100, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new LinkedBlockingQueue(), new FailingThreadFactory());
+        try {
+            ArrayList l = new ArrayList();
+            for (int k = 0; k < 100; ++k) {
+                e.execute(new NoOpRunnable());
+            }
+            Thread.sleep(LONG_DELAY_MS);
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * allowsCoreThreadTimeOut is by default false.
+     */
+    public void testAllowsCoreThreadTimeOut() {
+        ThreadPoolExecutor tpe = new CustomTPE(2, 2, 1000, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        assertFalse(tpe.allowsCoreThreadTimeOut());
+        joinPool(tpe);
+    }
+
+    /**
+     * allowCoreThreadTimeOut(true) causes idle threads to time out
+     */
+    public void testAllowCoreThreadTimeOut_true() {
+        ThreadPoolExecutor tpe = new CustomTPE(2, 10, 10, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        tpe.allowCoreThreadTimeOut(true);
+        tpe.execute(new NoOpRunnable());
+        try {
+            Thread.sleep(MEDIUM_DELAY_MS);
+            assertEquals(0, tpe.getPoolSize());
+        } catch(InterruptedException e){
+            unexpectedException();
+        } finally {
+            joinPool(tpe);
+        }
+    }
+
+    /**
+     * allowCoreThreadTimeOut(false) causes idle threads not to time out
+     */
+    public void testAllowCoreThreadTimeOut_false() {
+        ThreadPoolExecutor tpe = new CustomTPE(2, 10, 10, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        tpe.allowCoreThreadTimeOut(false);
+        tpe.execute(new NoOpRunnable());
+        try {
+            Thread.sleep(MEDIUM_DELAY_MS);
+            assertTrue(tpe.getPoolSize() >= 1);
+        } catch(InterruptedException e){
+            unexpectedException();
+        } finally {
+            joinPool(tpe);
+        }
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/ThreadPoolExecutorTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/ThreadPoolExecutorTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/ThreadPoolExecutorTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,1613 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import edu.emory.mathcs.backport.java.util.concurrent.atomic.*;
+import junit.framework.*;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Iterator;
+
+public class ThreadPoolExecutorTest extends JSR166TestCase {
+    public static void main(String[] args) {
+	junit.textui.TestRunner.run (suite());
+    }
+    public static Test suite() {
+        return new TestSuite(ThreadPoolExecutorTest.class);
+    }
+
+    static class ExtendedTPE extends ThreadPoolExecutor {
+        volatile boolean beforeCalled = false;
+        volatile boolean afterCalled = false;
+        volatile boolean terminatedCalled = false;
+        public ExtendedTPE() {
+            super(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new SynchronousQueue());
+        }
+        protected void beforeExecute(Thread t, Runnable r) {
+            beforeCalled = true;
+        }
+        protected void afterExecute(Runnable r, Throwable t) {
+            afterCalled = true;
+        }
+        protected void terminated() {
+            terminatedCalled = true;
+        }
+    }
+
+    static class FailingThreadFactory implements ThreadFactory{
+        int calls = 0;
+        public Thread newThread(Runnable r){
+            if (++calls > 1) return null;
+            return new Thread(r);
+        }
+    }
+
+
+    /**
+     *  execute successfully executes a runnable
+     */
+    public void testExecute() {
+        ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            p1.execute(new Runnable() {
+                    public void run() {
+                        try {
+                            Thread.sleep(SHORT_DELAY_MS);
+                        } catch(InterruptedException e){
+                            threadUnexpectedException();
+                        }
+                    }
+                });
+	    Thread.sleep(SMALL_DELAY_MS);
+        } catch(InterruptedException e){
+            unexpectedException();
+        }
+        joinPool(p1);
+    }
+
+    /**
+     *  getActiveCount increases but doesn't overestimate, when a
+     *  thread becomes active
+     */
+    public void testGetActiveCount() {
+        ThreadPoolExecutor p2 = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        assertEquals(0, p2.getActiveCount());
+        p2.execute(new MediumRunnable());
+        try {
+            Thread.sleep(SHORT_DELAY_MS);
+        } catch(Exception e){
+            unexpectedException();
+        }
+        assertEquals(1, p2.getActiveCount());
+        joinPool(p2);
+    }
+
+    /**
+     *  prestartCoreThread starts a thread if under corePoolSize, else doesn't
+     */
+    public void testPrestartCoreThread() {
+        ThreadPoolExecutor p2 = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        assertEquals(0, p2.getPoolSize());
+        assertTrue(p2.prestartCoreThread());
+        assertEquals(1, p2.getPoolSize());
+        assertTrue(p2.prestartCoreThread());
+        assertEquals(2, p2.getPoolSize());
+        assertFalse(p2.prestartCoreThread());
+        assertEquals(2, p2.getPoolSize());
+        joinPool(p2);
+    }
+
+    /**
+     *  prestartAllCoreThreads starts all corePoolSize threads
+     */
+    public void testPrestartAllCoreThreads() {
+        ThreadPoolExecutor p2 = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        assertEquals(0, p2.getPoolSize());
+        p2.prestartAllCoreThreads();
+        assertEquals(2, p2.getPoolSize());
+        p2.prestartAllCoreThreads();
+        assertEquals(2, p2.getPoolSize());
+        joinPool(p2);
+    }
+
+    /**
+     *   getCompletedTaskCount increases, but doesn't overestimate,
+     *   when tasks complete
+     */
+    public void testGetCompletedTaskCount() {
+        ThreadPoolExecutor p2 = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        assertEquals(0, p2.getCompletedTaskCount());
+        p2.execute(new ShortRunnable());
+        try {
+            Thread.sleep(SMALL_DELAY_MS);
+        } catch(Exception e){
+            unexpectedException();
+        }
+        assertEquals(1, p2.getCompletedTaskCount());
+        try { p2.shutdown(); } catch(SecurityException ok) { return; }
+        joinPool(p2);
+    }
+
+    /**
+     *   getCorePoolSize returns size given in constructor if not otherwise set
+     */
+    public void testGetCorePoolSize() {
+        ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        assertEquals(1, p1.getCorePoolSize());
+        joinPool(p1);
+    }
+
+    /**
+     *   getKeepAliveTime returns value given in constructor if not otherwise set
+     */
+    public void testGetKeepAliveTime() {
+        ThreadPoolExecutor p2 = new ThreadPoolExecutor(2, 2, 1000, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        assertEquals(1, p2.getKeepAliveTime(TimeUnit.SECONDS));
+        joinPool(p2);
+    }
+
+
+    /**
+     * getThreadFactory returns factory in constructor if not set
+     */
+    public void testGetThreadFactory() {
+        ThreadFactory tf = new SimpleThreadFactory();
+        ThreadPoolExecutor p = new ThreadPoolExecutor(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10), tf, new NoOpREHandler());
+        assertSame(tf, p.getThreadFactory());
+        joinPool(p);
+    }
+
+    /**
+     * setThreadFactory sets the thread factory returned by getThreadFactory
+     */
+    public void testSetThreadFactory() {
+        ThreadPoolExecutor p = new ThreadPoolExecutor(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        ThreadFactory tf = new SimpleThreadFactory();
+        p.setThreadFactory(tf);
+        assertSame(tf, p.getThreadFactory());
+        joinPool(p);
+    }
+
+
+    /**
+     * setThreadFactory(null) throws NPE
+     */
+    public void testSetThreadFactoryNull() {
+        ThreadPoolExecutor p = new ThreadPoolExecutor(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            p.setThreadFactory(null);
+            shouldThrow();
+        } catch (NullPointerException success) {
+        } finally {
+            joinPool(p);
+        }
+    }
+
+    /**
+     * getRejectedExecutionHandler returns handler in constructor if not set
+     */
+    public void testGetRejectedExecutionHandler() {
+        RejectedExecutionHandler h = new NoOpREHandler();
+        ThreadPoolExecutor p = new ThreadPoolExecutor(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10), h);
+        assertSame(h, p.getRejectedExecutionHandler());
+        joinPool(p);
+    }
+
+    /**
+     * setRejectedExecutionHandler sets the handler returned by
+     * getRejectedExecutionHandler
+     */
+    public void testSetRejectedExecutionHandler() {
+        ThreadPoolExecutor p = new ThreadPoolExecutor(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        RejectedExecutionHandler h = new NoOpREHandler();
+        p.setRejectedExecutionHandler(h);
+        assertSame(h, p.getRejectedExecutionHandler());
+        joinPool(p);
+    }
+
+
+    /**
+     * setRejectedExecutionHandler(null) throws NPE
+     */
+    public void testSetRejectedExecutionHandlerNull() {
+        ThreadPoolExecutor p = new ThreadPoolExecutor(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            p.setRejectedExecutionHandler(null);
+            shouldThrow();
+        } catch (NullPointerException success) {
+        } finally {
+            joinPool(p);
+        }
+    }
+
+
+    /**
+     *   getLargestPoolSize increases, but doesn't overestimate, when
+     *   multiple threads active
+     */
+    public void testGetLargestPoolSize() {
+        ThreadPoolExecutor p2 = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            assertEquals(0, p2.getLargestPoolSize());
+            p2.execute(new MediumRunnable());
+            p2.execute(new MediumRunnable());
+            Thread.sleep(SHORT_DELAY_MS);
+            assertEquals(2, p2.getLargestPoolSize());
+        } catch(Exception e){
+            unexpectedException();
+        }
+        joinPool(p2);
+    }
+
+    /**
+     *   getMaximumPoolSize returns value given in constructor if not
+     *   otherwise set
+     */
+    public void testGetMaximumPoolSize() {
+        ThreadPoolExecutor p2 = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        assertEquals(2, p2.getMaximumPoolSize());
+        joinPool(p2);
+    }
+
+    /**
+     *   getPoolSize increases, but doesn't overestimate, when threads
+     *   become active
+     */
+    public void testGetPoolSize() {
+        ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        assertEquals(0, p1.getPoolSize());
+        p1.execute(new MediumRunnable());
+        assertEquals(1, p1.getPoolSize());
+        joinPool(p1);
+    }
+
+    /**
+     *  getTaskCount increases, but doesn't overestimate, when tasks submitted
+     */
+    public void testGetTaskCount() {
+        ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            assertEquals(0, p1.getTaskCount());
+            p1.execute(new MediumRunnable());
+            Thread.sleep(SHORT_DELAY_MS);
+            assertEquals(1, p1.getTaskCount());
+        } catch(Exception e){
+            unexpectedException();
+        }
+        joinPool(p1);
+    }
+
+    /**
+     *   isShutDown is false before shutdown, true after
+     */
+    public void testIsShutdown() {
+
+	ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        assertFalse(p1.isShutdown());
+        try { p1.shutdown(); } catch(SecurityException ok) { return; }
+	assertTrue(p1.isShutdown());
+        joinPool(p1);
+    }
+
+
+    /**
+     *  isTerminated is false before termination, true after
+     */
+    public void testIsTerminated() {
+	ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        assertFalse(p1.isTerminated());
+        try {
+            p1.execute(new MediumRunnable());
+        } finally {
+            try { p1.shutdown(); } catch(SecurityException ok) { return; }
+        }
+	try {
+	    assertTrue(p1.awaitTermination(LONG_DELAY_MS, TimeUnit.MILLISECONDS));
+            assertTrue(p1.isTerminated());
+	} catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     *  isTerminating is not true when running or when terminated
+     */
+    public void testIsTerminating() {
+	ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        assertFalse(p1.isTerminating());
+        try {
+            p1.execute(new SmallRunnable());
+            assertFalse(p1.isTerminating());
+        } finally {
+            try { p1.shutdown(); } catch(SecurityException ok) { return; }
+        }
+        try {
+	    assertTrue(p1.awaitTermination(LONG_DELAY_MS, TimeUnit.MILLISECONDS));
+            assertTrue(p1.isTerminated());
+            assertFalse(p1.isTerminating());
+	} catch(Exception e){
+            unexpectedException();
+        }
+    }
+
+    /**
+     * getQueue returns the work queue, which contains queued tasks
+     */
+    public void testGetQueue() {
+        BlockingQueue q = new ArrayBlockingQueue(10);
+        ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, q);
+        FutureTask[] tasks = new FutureTask[5];
+        for(int i = 0; i < 5; i++){
+            tasks[i] = new FutureTask(new MediumPossiblyInterruptedRunnable(), Boolean.TRUE);
+            p1.execute(tasks[i]);
+        }
+        try {
+            Thread.sleep(SHORT_DELAY_MS);
+            BlockingQueue wq = p1.getQueue();
+            assertSame(q, wq);
+            assertFalse(wq.contains(tasks[0]));
+            assertTrue(wq.contains(tasks[4]));
+            for (int i = 1; i < 5; ++i)
+                tasks[i].cancel(true);
+            p1.shutdownNow();
+        } catch(Exception e) {
+            unexpectedException();
+        } finally {
+            joinPool(p1);
+        }
+    }
+
+    /**
+     * remove(task) removes queued task, and fails to remove active task
+     */
+    public void testRemove() {
+        BlockingQueue q = new ArrayBlockingQueue(10);
+        ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, q);
+        FutureTask[] tasks = new FutureTask[5];
+        for(int i = 0; i < 5; i++){
+            tasks[i] = new FutureTask(new MediumPossiblyInterruptedRunnable(), Boolean.TRUE);
+            p1.execute(tasks[i]);
+        }
+        try {
+            Thread.sleep(SHORT_DELAY_MS);
+            assertFalse(p1.remove(tasks[0]));
+            assertTrue(q.contains(tasks[4]));
+            assertTrue(q.contains(tasks[3]));
+            assertTrue(p1.remove(tasks[4]));
+            assertFalse(p1.remove(tasks[4]));
+            assertFalse(q.contains(tasks[4]));
+            assertTrue(q.contains(tasks[3]));
+            assertTrue(p1.remove(tasks[3]));
+            assertFalse(q.contains(tasks[3]));
+        } catch(Exception e) {
+            unexpectedException();
+        } finally {
+            joinPool(p1);
+        }
+    }
+
+    /**
+     *   purge removes cancelled tasks from the queue
+     */
+    public void testPurge() {
+        ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        FutureTask[] tasks = new FutureTask[5];
+        for(int i = 0; i < 5; i++){
+            tasks[i] = new FutureTask(new MediumPossiblyInterruptedRunnable(), Boolean.TRUE);
+            p1.execute(tasks[i]);
+        }
+        tasks[4].cancel(true);
+        tasks[3].cancel(true);
+        p1.purge();
+        long count = p1.getTaskCount();
+        assertTrue(count >= 2 && count < 5);
+        joinPool(p1);
+    }
+
+    /**
+     *  shutDownNow returns a list containing tasks that were not run
+     */
+    public void testShutDownNow() {
+	ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        List l;
+        try {
+            for(int i = 0; i < 5; i++)
+                p1.execute(new MediumPossiblyInterruptedRunnable());
+        }
+        finally {
+            try {
+                l = p1.shutdownNow();
+            } catch (SecurityException ok) { return; }
+
+        }
+	assertTrue(p1.isShutdown());
+	assertTrue(l.size() <= 4);
+    }
+
+    // Exception Tests
+
+
+    /**
+     * Constructor throws if corePoolSize argument is less than zero
+     */
+    public void testConstructor1() {
+        try {
+            new ThreadPoolExecutor(-1,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success){}
+    }
+
+    /**
+     * Constructor throws if maximumPoolSize is less than zero
+     */
+    public void testConstructor2() {
+        try {
+            new ThreadPoolExecutor(1,-1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success){}
+    }
+
+    /**
+     * Constructor throws if maximumPoolSize is equal to zero
+     */
+    public void testConstructor3() {
+        try {
+            new ThreadPoolExecutor(1,0,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success){}
+    }
+
+    /**
+     * Constructor throws if keepAliveTime is less than zero
+     */
+    public void testConstructor4() {
+        try {
+            new ThreadPoolExecutor(1,2,-1L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success){}
+    }
+
+    /**
+     * Constructor throws if corePoolSize is greater than the maximumPoolSize
+     */
+    public void testConstructor5() {
+        try {
+            new ThreadPoolExecutor(2,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success){}
+    }
+
+    /**
+     * Constructor throws if workQueue is set to null
+     */
+    public void testConstructorNullPointerException() {
+        try {
+            new ThreadPoolExecutor(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,null);
+            shouldThrow();
+        }
+        catch (NullPointerException success){}
+    }
+
+
+
+    /**
+     * Constructor throws if corePoolSize argument is less than zero
+     */
+    public void testConstructor6() {
+        try {
+            new ThreadPoolExecutor(-1,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10),new SimpleThreadFactory());
+            shouldThrow();
+        } catch (IllegalArgumentException success){}
+    }
+
+    /**
+     * Constructor throws if maximumPoolSize is less than zero
+     */
+    public void testConstructor7() {
+        try {
+            new ThreadPoolExecutor(1,-1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10),new SimpleThreadFactory());
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success){}
+    }
+
+    /**
+     * Constructor throws if maximumPoolSize is equal to zero
+     */
+    public void testConstructor8() {
+        try {
+            new ThreadPoolExecutor(1,0,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10),new SimpleThreadFactory());
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success){}
+    }
+
+    /**
+     * Constructor throws if keepAliveTime is less than zero
+     */
+    public void testConstructor9() {
+        try {
+            new ThreadPoolExecutor(1,2,-1L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10),new SimpleThreadFactory());
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success){}
+    }
+
+    /**
+     * Constructor throws if corePoolSize is greater than the maximumPoolSize
+     */
+    public void testConstructor10() {
+        try {
+            new ThreadPoolExecutor(2,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10),new SimpleThreadFactory());
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success){}
+    }
+
+    /**
+     * Constructor throws if workQueue is set to null
+     */
+    public void testConstructorNullPointerException2() {
+        try {
+            new ThreadPoolExecutor(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,null,new SimpleThreadFactory());
+            shouldThrow();
+        }
+        catch (NullPointerException success){}
+    }
+
+    /**
+     * Constructor throws if threadFactory is set to null
+     */
+    public void testConstructorNullPointerException3() {
+        try {
+            ThreadFactory f = null;
+            new ThreadPoolExecutor(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue(10),f);
+            shouldThrow();
+        }
+        catch (NullPointerException success){}
+    }
+
+
+    /**
+     * Constructor throws if corePoolSize argument is less than zero
+     */
+    public void testConstructor11() {
+        try {
+            new ThreadPoolExecutor(-1,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10),new NoOpREHandler());
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success){}
+    }
+
+    /**
+     * Constructor throws if maximumPoolSize is less than zero
+     */
+    public void testConstructor12() {
+        try {
+            new ThreadPoolExecutor(1,-1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10),new NoOpREHandler());
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success){}
+    }
+
+    /**
+     * Constructor throws if maximumPoolSize is equal to zero
+     */
+    public void testConstructor13() {
+        try {
+            new ThreadPoolExecutor(1,0,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10),new NoOpREHandler());
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success){}
+    }
+
+    /**
+     * Constructor throws if keepAliveTime is less than zero
+     */
+    public void testConstructor14() {
+        try {
+            new ThreadPoolExecutor(1,2,-1L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10),new NoOpREHandler());
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success){}
+    }
+
+    /**
+     * Constructor throws if corePoolSize is greater than the maximumPoolSize
+     */
+    public void testConstructor15() {
+        try {
+            new ThreadPoolExecutor(2,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10),new NoOpREHandler());
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success){}
+    }
+
+    /**
+     * Constructor throws if workQueue is set to null
+     */
+    public void testConstructorNullPointerException4() {
+        try {
+            new ThreadPoolExecutor(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,null,new NoOpREHandler());
+            shouldThrow();
+        }
+        catch (NullPointerException success){}
+    }
+
+    /**
+     * Constructor throws if handler is set to null
+     */
+    public void testConstructorNullPointerException5() {
+        try {
+            RejectedExecutionHandler r = null;
+            new ThreadPoolExecutor(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue(10),r);
+            shouldThrow();
+        }
+        catch (NullPointerException success){}
+    }
+
+
+    /**
+     * Constructor throws if corePoolSize argument is less than zero
+     */
+    public void testConstructor16() {
+        try {
+            new ThreadPoolExecutor(-1,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10),new SimpleThreadFactory(),new NoOpREHandler());
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success){}
+    }
+
+    /**
+     * Constructor throws if maximumPoolSize is less than zero
+     */
+    public void testConstructor17() {
+        try {
+            new ThreadPoolExecutor(1,-1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10),new SimpleThreadFactory(),new NoOpREHandler());
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success){}
+    }
+
+    /**
+     * Constructor throws if maximumPoolSize is equal to zero
+     */
+    public void testConstructor18() {
+        try {
+            new ThreadPoolExecutor(1,0,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10),new SimpleThreadFactory(),new NoOpREHandler());
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success){}
+    }
+
+    /**
+     * Constructor throws if keepAliveTime is less than zero
+     */
+    public void testConstructor19() {
+        try {
+            new ThreadPoolExecutor(1,2,-1L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10),new SimpleThreadFactory(),new NoOpREHandler());
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success){}
+    }
+
+    /**
+     * Constructor throws if corePoolSize is greater than the maximumPoolSize
+     */
+    public void testConstructor20() {
+        try {
+            new ThreadPoolExecutor(2,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10),new SimpleThreadFactory(),new NoOpREHandler());
+            shouldThrow();
+        }
+        catch (IllegalArgumentException success){}
+    }
+
+    /**
+     * Constructor throws if workQueue is set to null
+     */
+    public void testConstructorNullPointerException6() {
+        try {
+            new ThreadPoolExecutor(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,null,new SimpleThreadFactory(),new NoOpREHandler());
+            shouldThrow();
+        }
+        catch (NullPointerException success){}
+    }
+
+    /**
+     * Constructor throws if handler is set to null
+     */
+    public void testConstructorNullPointerException7() {
+        try {
+            RejectedExecutionHandler r = null;
+            new ThreadPoolExecutor(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue(10),new SimpleThreadFactory(),r);
+            shouldThrow();
+        }
+        catch (NullPointerException success){}
+    }
+
+    /**
+     * Constructor throws if ThreadFactory is set top null
+     */
+    public void testConstructorNullPointerException8() {
+        try {
+            ThreadFactory f = null;
+            new ThreadPoolExecutor(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue(10),f,new NoOpREHandler());
+            shouldThrow();
+        }
+        catch (NullPointerException successdn8){}
+    }
+
+
+    /**
+     *  execute throws RejectedExecutionException
+     *  if saturated.
+     */
+    public void testSaturatedExecute() {
+        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(1));
+        try {
+
+            for(int i = 0; i < 5; ++i){
+                p.execute(new MediumRunnable());
+            }
+            shouldThrow();
+        } catch(RejectedExecutionException success){}
+        joinPool(p);
+    }
+
+    /**
+     *  executor using CallerRunsPolicy runs task if saturated.
+     */
+    public void testSaturatedExecute2() {
+        RejectedExecutionHandler h = new ThreadPoolExecutor.CallerRunsPolicy();
+        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(1), h);
+        try {
+
+            TrackedNoOpRunnable[] tasks = new TrackedNoOpRunnable[5];
+            for(int i = 0; i < 5; ++i){
+                tasks[i] = new TrackedNoOpRunnable();
+            }
+            TrackedLongRunnable mr = new TrackedLongRunnable();
+            p.execute(mr);
+            for(int i = 0; i < 5; ++i){
+                p.execute(tasks[i]);
+            }
+            for(int i = 1; i < 5; ++i) {
+                assertTrue(tasks[i].done);
+            }
+            try { p.shutdownNow(); } catch(SecurityException ok) { return; }
+        } catch(RejectedExecutionException ex){
+            unexpectedException();
+        } finally {
+            joinPool(p);
+        }
+    }
+
+    /**
+     *  executor using DiscardPolicy drops task if saturated.
+     */
+    public void testSaturatedExecute3() {
+        RejectedExecutionHandler h = new ThreadPoolExecutor.DiscardPolicy();
+        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(1), h);
+        try {
+
+            TrackedNoOpRunnable[] tasks = new TrackedNoOpRunnable[5];
+            for(int i = 0; i < 5; ++i){
+                tasks[i] = new TrackedNoOpRunnable();
+            }
+            p.execute(new TrackedLongRunnable());
+            for(int i = 0; i < 5; ++i){
+                p.execute(tasks[i]);
+            }
+            for(int i = 0; i < 5; ++i){
+                assertFalse(tasks[i].done);
+            }
+            try { p.shutdownNow(); } catch(SecurityException ok) { return; }
+        } catch(RejectedExecutionException ex){
+            unexpectedException();
+        } finally {
+            joinPool(p);
+        }
+    }
+
+    /**
+     *  executor using DiscardOldestPolicy drops oldest task if saturated.
+     */
+    public void testSaturatedExecute4() {
+        RejectedExecutionHandler h = new ThreadPoolExecutor.DiscardOldestPolicy();
+        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(1), h);
+        try {
+            p.execute(new TrackedLongRunnable());
+            TrackedLongRunnable r2 = new TrackedLongRunnable();
+            p.execute(r2);
+            assertTrue(p.getQueue().contains(r2));
+            TrackedNoOpRunnable r3 = new TrackedNoOpRunnable();
+            p.execute(r3);
+            assertFalse(p.getQueue().contains(r2));
+            assertTrue(p.getQueue().contains(r3));
+            try { p.shutdownNow(); } catch(SecurityException ok) { return; }
+        } catch(RejectedExecutionException ex){
+            unexpectedException();
+        } finally {
+            joinPool(p);
+        }
+    }
+
+    /**
+     *  execute throws RejectedExecutionException if shutdown
+     */
+    public void testRejectedExecutionExceptionOnShutdown() {
+        ThreadPoolExecutor tpe =
+            new ThreadPoolExecutor(1,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue(1));
+        try { tpe.shutdown(); } catch(SecurityException ok) { return; }
+	try {
+	    tpe.execute(new NoOpRunnable());
+	    shouldThrow();
+	} catch(RejectedExecutionException success){}
+
+	joinPool(tpe);
+    }
+
+    /**
+     *  execute using CallerRunsPolicy drops task on shutdown
+     */
+    public void testCallerRunsOnShutdown() {
+        RejectedExecutionHandler h = new ThreadPoolExecutor.CallerRunsPolicy();
+        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(1), h);
+
+        try { p.shutdown(); } catch(SecurityException ok) { return; }
+	try {
+            TrackedNoOpRunnable r = new TrackedNoOpRunnable();
+	    p.execute(r);
+            assertFalse(r.done);
+	} catch(RejectedExecutionException success){
+            unexpectedException();
+        } finally {
+            joinPool(p);
+        }
+    }
+
+    /**
+     *  execute using DiscardPolicy drops task on shutdown
+     */
+    public void testDiscardOnShutdown() {
+        RejectedExecutionHandler h = new ThreadPoolExecutor.DiscardPolicy();
+        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(1), h);
+
+        try { p.shutdown(); } catch(SecurityException ok) { return; }
+	try {
+            TrackedNoOpRunnable r = new TrackedNoOpRunnable();
+	    p.execute(r);
+            assertFalse(r.done);
+	} catch(RejectedExecutionException success){
+            unexpectedException();
+        } finally {
+            joinPool(p);
+        }
+    }
+
+
+    /**
+     *  execute using DiscardOldestPolicy drops task on shutdown
+     */
+    public void testDiscardOldestOnShutdown() {
+        RejectedExecutionHandler h = new ThreadPoolExecutor.DiscardOldestPolicy();
+        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(1), h);
+
+        try { p.shutdown(); } catch(SecurityException ok) { return; }
+	try {
+            TrackedNoOpRunnable r = new TrackedNoOpRunnable();
+	    p.execute(r);
+            assertFalse(r.done);
+	} catch(RejectedExecutionException success){
+            unexpectedException();
+        } finally {
+            joinPool(p);
+        }
+    }
+
+
+    /**
+     *  execute (null) throws NPE
+     */
+    public void testExecuteNull() {
+        ThreadPoolExecutor tpe = null;
+        try {
+	    tpe = new ThreadPoolExecutor(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue(10));
+	    tpe.execute(null);
+            shouldThrow();
+	} catch(NullPointerException success){}
+
+	joinPool(tpe);
+    }
+
+    /**
+     *  setCorePoolSize of negative value throws IllegalArgumentException
+     */
+    public void testCorePoolSizeIllegalArgumentException() {
+	ThreadPoolExecutor tpe = null;
+	try {
+	    tpe = new ThreadPoolExecutor(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue(10));
+	} catch(Exception e){}
+	try {
+	    tpe.setCorePoolSize(-1);
+	    shouldThrow();
+	} catch(IllegalArgumentException success){
+        } finally {
+            try { tpe.shutdown(); } catch(SecurityException ok) { return; }
+        }
+        joinPool(tpe);
+    }
+
+    /**
+     *  setMaximumPoolSize(int) throws IllegalArgumentException if
+     *  given a value less the core pool size
+     */
+    public void testMaximumPoolSizeIllegalArgumentException() {
+        ThreadPoolExecutor tpe = null;
+        try {
+            tpe = new ThreadPoolExecutor(2,3,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue(10));
+        } catch(Exception e){}
+        try {
+            tpe.setMaximumPoolSize(1);
+            shouldThrow();
+        } catch(IllegalArgumentException success){
+        } finally {
+            try { tpe.shutdown(); } catch(SecurityException ok) { return; }
+        }
+        joinPool(tpe);
+    }
+
+    /**
+     *  setMaximumPoolSize throws IllegalArgumentException
+     *  if given a negative value
+     */
+    public void testMaximumPoolSizeIllegalArgumentException2() {
+        ThreadPoolExecutor tpe = null;
+        try {
+            tpe = new ThreadPoolExecutor(2,3,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue(10));
+        } catch(Exception e){}
+        try {
+            tpe.setMaximumPoolSize(-1);
+            shouldThrow();
+        } catch(IllegalArgumentException success){
+        } finally {
+            try { tpe.shutdown(); } catch(SecurityException ok) { return; }
+        }
+        joinPool(tpe);
+    }
+
+
+    /**
+     *  setKeepAliveTime  throws IllegalArgumentException
+     *  when given a negative value
+     */
+    public void testKeepAliveTimeIllegalArgumentException() {
+	ThreadPoolExecutor tpe = null;
+        try {
+            tpe = new ThreadPoolExecutor(2,3,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue(10));
+        } catch(Exception e){}
+
+	try {
+            tpe.setKeepAliveTime(-1,TimeUnit.MILLISECONDS);
+            shouldThrow();
+        } catch(IllegalArgumentException success){
+        } finally {
+            try { tpe.shutdown(); } catch(SecurityException ok) { return; }
+        }
+        joinPool(tpe);
+    }
+
+    /**
+     * terminated() is called on termination
+     */
+    public void testTerminated() {
+        ExtendedTPE tpe = new ExtendedTPE();
+        try { tpe.shutdown(); } catch(SecurityException ok) { return; }
+        assertTrue(tpe.terminatedCalled);
+        joinPool(tpe);
+    }
+
+    /**
+     * beforeExecute and afterExecute are called when executing task
+     */
+    public void testBeforeAfter() {
+        ExtendedTPE tpe = new ExtendedTPE();
+        try {
+            TrackedNoOpRunnable r = new TrackedNoOpRunnable();
+            tpe.execute(r);
+            Thread.sleep(SHORT_DELAY_MS);
+            assertTrue(r.done);
+            assertTrue(tpe.beforeCalled);
+            assertTrue(tpe.afterCalled);
+            try { tpe.shutdown(); } catch(SecurityException ok) { return; }
+        }
+        catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(tpe);
+        }
+    }
+
+    /**
+     * completed submit of callable returns result
+     */
+    public void testSubmitCallable() {
+        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            Future future = e.submit(new StringTask());
+            String result = (String)future.get();
+            assertSame(TEST_STRING, result);
+        }
+        catch (ExecutionException ex) {
+            unexpectedException();
+        }
+        catch (InterruptedException ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * completed submit of runnable returns successfully
+     */
+    public void testSubmitRunnable() {
+        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            Future future = e.submit(new NoOpRunnable());
+            future.get();
+            assertTrue(future.isDone());
+        }
+        catch (ExecutionException ex) {
+            unexpectedException();
+        }
+        catch (InterruptedException ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * completed submit of (runnable, result) returns result
+     */
+    public void testSubmitRunnable2() {
+        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            Future future = e.submit(new NoOpRunnable(), TEST_STRING);
+            String result = (String)future.get();
+            assertSame(TEST_STRING, result);
+        }
+        catch (ExecutionException ex) {
+            unexpectedException();
+        }
+        catch (InterruptedException ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+
+
+
+
+    /**
+     * invokeAny(null) throws NPE
+     */
+    public void testInvokeAny1() {
+        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            e.invokeAny(null);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAny(empty collection) throws IAE
+     */
+    public void testInvokeAny2() {
+        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            e.invokeAny(new ArrayList());
+        } catch (IllegalArgumentException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAny(c) throws NPE if c has null elements
+     */
+    public void testInvokeAny3() {
+        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(null);
+            e.invokeAny(l);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAny(c) throws ExecutionException if no task completes
+     */
+    public void testInvokeAny4() {
+        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new NPETask());
+            e.invokeAny(l);
+        } catch (ExecutionException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAny(c) returns result of some task
+     */
+    public void testInvokeAny5() {
+        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(new StringTask());
+            String result = (String)e.invokeAny(l);
+            assertSame(TEST_STRING, result);
+        } catch (ExecutionException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAll(null) throws NPE
+     */
+    public void testInvokeAll1() {
+        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            e.invokeAll(null);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAll(empty collection) returns empty collection
+     */
+    public void testInvokeAll2() {
+        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            List r = e.invokeAll(new ArrayList());
+            assertTrue(r.isEmpty());
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAll(c) throws NPE if c has null elements
+     */
+    public void testInvokeAll3() {
+        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(null);
+            e.invokeAll(l);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * get of element of invokeAll(c) throws exception on failed task
+     */
+    public void testInvokeAll4() {
+        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new NPETask());
+            List result = e.invokeAll(l);
+            assertEquals(1, result.size());
+            for (Iterator it = result.iterator(); it.hasNext();)
+                ((Future)it.next()).get();
+        } catch(ExecutionException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * invokeAll(c) returns results of all completed tasks
+     */
+    public void testInvokeAll5() {
+        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(new StringTask());
+            List result = e.invokeAll(l);
+            assertEquals(2, result.size());
+            for (Iterator it = result.iterator(); it.hasNext();)
+                assertSame(TEST_STRING, ((Future)it.next()).get());
+        } catch (ExecutionException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+
+
+    /**
+     * timed invokeAny(null) throws NPE
+     */
+    public void testTimedInvokeAny1() {
+        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            e.invokeAny(null, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAny(,,null) throws NPE
+     */
+    public void testTimedInvokeAnyNullTimeUnit() {
+        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            e.invokeAny(l, MEDIUM_DELAY_MS, null);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAny(empty collection) throws IAE
+     */
+    public void testTimedInvokeAny2() {
+        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            e.invokeAny(new ArrayList(), MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+        } catch (IllegalArgumentException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAny(c) throws NPE if c has null elements
+     */
+    public void testTimedInvokeAny3() {
+        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(null);
+            e.invokeAny(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            ex.printStackTrace();
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAny(c) throws ExecutionException if no task completes
+     */
+    public void testTimedInvokeAny4() {
+        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new NPETask());
+            e.invokeAny(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+        } catch(ExecutionException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAny(c) returns result of some task
+     */
+    public void testTimedInvokeAny5() {
+        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(new StringTask());
+            String result = (String)e.invokeAny(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+            assertSame(TEST_STRING, result);
+        } catch (ExecutionException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAll(null) throws NPE
+     */
+    public void testTimedInvokeAll1() {
+        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            e.invokeAll(null, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAll(,,null) throws NPE
+     */
+    public void testTimedInvokeAllNullTimeUnit() {
+        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            e.invokeAll(l, MEDIUM_DELAY_MS, null);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAll(empty collection) returns empty collection
+     */
+    public void testTimedInvokeAll2() {
+        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            List r = e.invokeAll(new ArrayList(), MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+            assertTrue(r.isEmpty());
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAll(c) throws NPE if c has null elements
+     */
+    public void testTimedInvokeAll3() {
+        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(null);
+            e.invokeAll(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+        } catch (NullPointerException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * get of element of invokeAll(c) throws exception on failed task
+     */
+    public void testTimedInvokeAll4() {
+        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new NPETask());
+            List result = e.invokeAll(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+            assertEquals(1, result.size());
+            for (Iterator it = result.iterator(); it.hasNext();)
+                ((Future)it.next()).get();
+        } catch(ExecutionException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAll(c) returns results of all completed tasks
+     */
+    public void testTimedInvokeAll5() {
+        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(new StringTask());
+            List result = e.invokeAll(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
+            assertEquals(2, result.size());
+            for (Iterator it = result.iterator(); it.hasNext();)
+                assertSame(TEST_STRING, ((Future)it.next()).get());
+        } catch (ExecutionException success) {
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * timed invokeAll(c) cancels tasks not completed by timeout
+     */
+    public void testTimedInvokeAll6() {
+        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        try {
+            ArrayList l = new ArrayList();
+            l.add(new StringTask());
+            l.add(Executors.callable(new MediumPossiblyInterruptedRunnable(), TEST_STRING));
+            l.add(new StringTask());
+            List result = e.invokeAll(l, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
+            assertEquals(3, result.size());
+            Iterator it = result.iterator();
+            Future f1 = (Future)it.next();
+            Future f2 = (Future)it.next();
+            Future f3 = (Future)it.next();
+            assertTrue(f1.isDone());
+            assertTrue(f2.isDone());
+            assertTrue(f3.isDone());
+            assertFalse(f1.isCancelled());
+            assertTrue(f2.isCancelled());
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * Execution continues if there is at least one thread even if
+     * thread factory fails to create more
+     */
+    public void testFailingThreadFactory() {
+        ExecutorService e = new ThreadPoolExecutor(100, 100, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new LinkedBlockingQueue(), new FailingThreadFactory());
+        try {
+            ArrayList l = new ArrayList();
+            for (int k = 0; k < 100; ++k) {
+                e.execute(new NoOpRunnable());
+            }
+            Thread.sleep(LONG_DELAY_MS);
+        } catch(Exception ex) {
+            unexpectedException();
+        } finally {
+            joinPool(e);
+        }
+    }
+
+    /**
+     * allowsCoreThreadTimeOut is by default false.
+     */
+    public void testAllowsCoreThreadTimeOut() {
+        ThreadPoolExecutor tpe = new ThreadPoolExecutor(2, 2, 1000, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        assertFalse(tpe.allowsCoreThreadTimeOut());
+        joinPool(tpe);
+    }
+
+    /**
+     * allowCoreThreadTimeOut(true) causes idle threads to time out
+     */
+    public void testAllowCoreThreadTimeOut_true() {
+        ThreadPoolExecutor tpe = new ThreadPoolExecutor(2, 10, 10, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        tpe.allowCoreThreadTimeOut(true);
+        tpe.execute(new NoOpRunnable());
+        try {
+            Thread.sleep(MEDIUM_DELAY_MS);
+            assertEquals(0, tpe.getPoolSize());
+        } catch(InterruptedException e){
+            unexpectedException();
+        } finally {
+            joinPool(tpe);
+        }
+    }
+
+    /**
+     * allowCoreThreadTimeOut(false) causes idle threads not to time out
+     */
+    public void testAllowCoreThreadTimeOut_false() {
+        ThreadPoolExecutor tpe = new ThreadPoolExecutor(2, 10, 10, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10));
+        tpe.allowCoreThreadTimeOut(false);
+        tpe.execute(new NoOpRunnable());
+        try {
+            Thread.sleep(MEDIUM_DELAY_MS);
+            assertTrue(tpe.getPoolSize() >= 1);
+        } catch(InterruptedException e){
+            unexpectedException();
+        } finally {
+            joinPool(tpe);
+        }
+    }
+
+    /**
+     * execute allows the same task to be submitted multiple times, even
+     * if rejected
+     */
+    public void testRejectedRecycledTask() {
+        final int nTasks = 1000;
+        final AtomicInteger nRun = new AtomicInteger(0);
+        final Runnable recycledTask = new Runnable() {
+                public void run() {
+                    nRun.getAndIncrement();
+                } };
+        final ThreadPoolExecutor p =
+            new ThreadPoolExecutor(1, 30, 60, TimeUnit.SECONDS,
+                                   new ArrayBlockingQueue(30));
+        try {
+            for (int i = 0; i < nTasks; ++i) {
+                for (;;) {
+                    try {
+                        p.execute(recycledTask);
+                        break;
+                    }
+                    catch (RejectedExecutionException ignore) {
+                    }
+                }
+            }
+            Thread.sleep(5000); // enough time to run all tasks
+            assertEquals(nRun.get(), nTasks);
+        } catch(Exception ex) {
+            ex.printStackTrace();
+            unexpectedException();
+        } finally {
+            p.shutdown();
+        }
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/ThreadTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/ThreadTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/ThreadTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,68 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+import junit.framework.*;
+
+public class ThreadTest extends JSR166TestCase {
+//    public static void main(String[] args) {
+//	junit.textui.TestRunner.run(suite());
+//    }
+//
+//    public static Test suite() {
+//	return new TestSuite(ThreadTest.class);
+//    }
+
+//    static class MyHandler implements Thread.UncaughtExceptionHandler {
+//        public void uncaughtException(Thread t, Throwable e) {
+//            e.printStackTrace();
+//        }
+//    }
+
+//    /**
+//     * getUncaughtExceptionHandler returns ThreadGroup unless set,
+//     * otherwise returning value of last setUncaughtExceptionHandler.
+//     */
+//    public void testGetAndSetUncaughtExceptionHandler() {
+//        // these must be done all at once to avoid state
+//        // dependencies across tests
+//        Thread current = Thread.currentThread();
+//        ThreadGroup tg = current.getThreadGroup();
+//        MyHandler eh = new MyHandler();
+//	assertEquals(tg, current.getUncaughtExceptionHandler());
+//        current.setUncaughtExceptionHandler(eh);
+//	assertEquals(eh, current.getUncaughtExceptionHandler());
+//        current.setUncaughtExceptionHandler(null);
+//	assertEquals(tg, current.getUncaughtExceptionHandler());
+//    }
+//
+//    /**
+//     * getDefaultUncaughtExceptionHandler returns value of last
+//     * setDefaultUncaughtExceptionHandler.
+//     */
+//    public void testGetAndSetDefaultUncaughtExceptionHandler() {
+//        assertEquals(null, Thread.getDefaultUncaughtExceptionHandler());
+//        // failure due to securityException is OK.
+//        // Would be nice to explicitly test both ways, but cannot yet.
+//        try {
+//            Thread current = Thread.currentThread();
+//            ThreadGroup tg = current.getThreadGroup();
+//            MyHandler eh = new MyHandler();
+//            Thread.setDefaultUncaughtExceptionHandler(eh);
+//            assertEquals(eh, Thread.getDefaultUncaughtExceptionHandler());
+//            Thread.setDefaultUncaughtExceptionHandler(null);
+//        }
+//        catch(SecurityException ok) {
+//        }
+//        assertEquals(null, Thread.getDefaultUncaughtExceptionHandler());
+//    }
+
+
+    // How to test actually using UEH within junit?
+
+}
+

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/TimeUnitTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/TimeUnitTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/TimeUnitTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,482 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import java.io.*;
+
+public class TimeUnitTest extends JSR166TestCase {
+    public static void main(String[] args) {
+	junit.textui.TestRunner.run(suite());
+    }
+
+    public static Test suite() {
+	return new TestSuite(TimeUnitTest.class);
+    }
+
+    // (loops to 88888 check increments at all time divisions.)
+
+    /**
+     * convert correctly converts sample values across the units
+     */
+    public void testConvert() {
+        for (long t = 0; t < 88888; ++t) {
+            assertEquals(t*60*60*24,
+                         TimeUnit.SECONDS.convert(t,
+                                                  TimeUnit.DAYS));
+            assertEquals(t*60*60,
+                         TimeUnit.SECONDS.convert(t,
+                                                  TimeUnit.HOURS));
+            assertEquals(t*60,
+                         TimeUnit.SECONDS.convert(t,
+                                                  TimeUnit.MINUTES));
+            assertEquals(t,
+                         TimeUnit.SECONDS.convert(t,
+                                                  TimeUnit.SECONDS));
+            assertEquals(t,
+                         TimeUnit.SECONDS.convert(1000L*t,
+                                                  TimeUnit.MILLISECONDS));
+            assertEquals(t,
+                         TimeUnit.SECONDS.convert(1000000L*t,
+                                                  TimeUnit.MICROSECONDS));
+            assertEquals(t,
+                         TimeUnit.SECONDS.convert(1000000000L*t,
+                                                  TimeUnit.NANOSECONDS));
+
+
+            assertEquals(1000L*t*60*60*24,
+                         TimeUnit.MILLISECONDS.convert(t,
+                                                  TimeUnit.DAYS));
+            assertEquals(1000L*t*60*60,
+                         TimeUnit.MILLISECONDS.convert(t,
+                                                  TimeUnit.HOURS));
+            assertEquals(1000L*t*60,
+                         TimeUnit.MILLISECONDS.convert(t,
+                                                  TimeUnit.MINUTES));
+            assertEquals(1000L*t,
+                         TimeUnit.MILLISECONDS.convert(t,
+                                                  TimeUnit.SECONDS));
+            assertEquals(t,
+                         TimeUnit.MILLISECONDS.convert(t,
+                                                  TimeUnit.MILLISECONDS));
+            assertEquals(t,
+                         TimeUnit.MILLISECONDS.convert(1000L*t,
+                                                  TimeUnit.MICROSECONDS));
+            assertEquals(t,
+                         TimeUnit.MILLISECONDS.convert(1000000L*t,
+                                                  TimeUnit.NANOSECONDS));
+
+            assertEquals(1000000L*t*60*60*24,
+                         TimeUnit.MICROSECONDS.convert(t,
+                                                  TimeUnit.DAYS));
+            assertEquals(1000000L*t*60*60,
+                         TimeUnit.MICROSECONDS.convert(t,
+                                                  TimeUnit.HOURS));
+            assertEquals(1000000L*t*60,
+                         TimeUnit.MICROSECONDS.convert(t,
+                                                  TimeUnit.MINUTES));
+            assertEquals(1000000L*t,
+                         TimeUnit.MICROSECONDS.convert(t,
+                                                  TimeUnit.SECONDS));
+            assertEquals(1000L*t,
+                         TimeUnit.MICROSECONDS.convert(t,
+                                                  TimeUnit.MILLISECONDS));
+            assertEquals(t,
+                         TimeUnit.MICROSECONDS.convert(t,
+                                                  TimeUnit.MICROSECONDS));
+            assertEquals(t,
+                         TimeUnit.MICROSECONDS.convert(1000L*t,
+                                                  TimeUnit.NANOSECONDS));
+
+            assertEquals(1000000000L*t*60*60*24,
+                         TimeUnit.NANOSECONDS.convert(t,
+                                                  TimeUnit.DAYS));
+            assertEquals(1000000000L*t*60*60,
+                         TimeUnit.NANOSECONDS.convert(t,
+                                                  TimeUnit.HOURS));
+            assertEquals(1000000000L*t*60,
+                         TimeUnit.NANOSECONDS.convert(t,
+                                                  TimeUnit.MINUTES));
+            assertEquals(1000000000L*t,
+                         TimeUnit.NANOSECONDS.convert(t,
+                                                  TimeUnit.SECONDS));
+            assertEquals(1000000L*t,
+                         TimeUnit.NANOSECONDS.convert(t,
+                                                  TimeUnit.MILLISECONDS));
+            assertEquals(1000L*t,
+                         TimeUnit.NANOSECONDS.convert(t,
+                                                  TimeUnit.MICROSECONDS));
+            assertEquals(t,
+                         TimeUnit.NANOSECONDS.convert(t,
+                                                  TimeUnit.NANOSECONDS));
+        }
+    }
+
+    /**
+     * toNanos correctly converts sample values in different units to
+     * nanoseconds
+     */
+    public void testToNanos() {
+        for (long t = 0; t < 88888; ++t) {
+            assertEquals(t*1000000000L*60*60*24,
+                         TimeUnit.DAYS.toNanos(t));
+            assertEquals(t*1000000000L*60*60,
+                         TimeUnit.HOURS.toNanos(t));
+            assertEquals(t*1000000000L*60,
+                         TimeUnit.MINUTES.toNanos(t));
+            assertEquals(1000000000L*t,
+                         TimeUnit.SECONDS.toNanos(t));
+            assertEquals(1000000L*t,
+                         TimeUnit.MILLISECONDS.toNanos(t));
+            assertEquals(1000L*t,
+                         TimeUnit.MICROSECONDS.toNanos(t));
+            assertEquals(t,
+                         TimeUnit.NANOSECONDS.toNanos(t));
+        }
+    }
+
+    /**
+     * toMicros correctly converts sample values in different units to
+     * microseconds
+     */
+    public void testToMicros() {
+        for (long t = 0; t < 88888; ++t) {
+            assertEquals(t*1000000L*60*60*24,
+                         TimeUnit.DAYS.toMicros(t));
+            assertEquals(t*1000000L*60*60,
+                         TimeUnit.HOURS.toMicros(t));
+            assertEquals(t*1000000L*60,
+                         TimeUnit.MINUTES.toMicros(t));
+            assertEquals(1000000L*t,
+                         TimeUnit.SECONDS.toMicros(t));
+            assertEquals(1000L*t,
+                         TimeUnit.MILLISECONDS.toMicros(t));
+            assertEquals(t,
+                         TimeUnit.MICROSECONDS.toMicros(t));
+            assertEquals(t,
+                         TimeUnit.NANOSECONDS.toMicros(t*1000L));
+        }
+    }
+
+    /**
+     * toMillis correctly converts sample values in different units to
+     * milliseconds
+     */
+    public void testToMillis() {
+        for (long t = 0; t < 88888; ++t) {
+            assertEquals(t*1000L*60*60*24,
+                         TimeUnit.DAYS.toMillis(t));
+            assertEquals(t*1000L*60*60,
+                         TimeUnit.HOURS.toMillis(t));
+            assertEquals(t*1000L*60,
+                         TimeUnit.MINUTES.toMillis(t));
+            assertEquals(1000L*t,
+                         TimeUnit.SECONDS.toMillis(t));
+            assertEquals(t,
+                         TimeUnit.MILLISECONDS.toMillis(t));
+            assertEquals(t,
+                         TimeUnit.MICROSECONDS.toMillis(t*1000L));
+            assertEquals(t,
+                         TimeUnit.NANOSECONDS.toMillis(t*1000000L));
+        }
+    }
+
+    /**
+     * toSeconds correctly converts sample values in different units to
+     * seconds
+     */
+    public void testToSeconds() {
+        for (long t = 0; t < 88888; ++t) {
+            assertEquals(t*60*60*24,
+                         TimeUnit.DAYS.toSeconds(t));
+            assertEquals(t*60*60,
+                         TimeUnit.HOURS.toSeconds(t));
+            assertEquals(t*60,
+                         TimeUnit.MINUTES.toSeconds(t));
+            assertEquals(t,
+                         TimeUnit.SECONDS.toSeconds(t));
+            assertEquals(t,
+                         TimeUnit.MILLISECONDS.toSeconds(t*1000L));
+            assertEquals(t,
+                         TimeUnit.MICROSECONDS.toSeconds(t*1000000L));
+            assertEquals(t,
+                         TimeUnit.NANOSECONDS.toSeconds(t*1000000000L));
+        }
+    }
+
+    /**
+     * toMinutes correctly converts sample values in different units to
+     * minutes
+     */
+    public void testToMinutes() {
+        for (long t = 0; t < 88888; ++t) {
+            assertEquals(t*60*24,
+                         TimeUnit.DAYS.toMinutes(t));
+            assertEquals(t*60,
+                         TimeUnit.HOURS.toMinutes(t));
+            assertEquals(t,
+                         TimeUnit.MINUTES.toMinutes(t));
+            assertEquals(t,
+                         TimeUnit.SECONDS.toMinutes(t*60));
+            assertEquals(t,
+                         TimeUnit.MILLISECONDS.toMinutes(t*1000L*60));
+            assertEquals(t,
+                         TimeUnit.MICROSECONDS.toMinutes(t*1000000L*60));
+            assertEquals(t,
+                         TimeUnit.NANOSECONDS.toMinutes(t*1000000000L*60));
+        }
+    }
+
+    /**
+     * toHours correctly converts sample values in different units to
+     * hours
+     */
+    public void testToHours() {
+        for (long t = 0; t < 88888; ++t) {
+            assertEquals(t*24,
+                         TimeUnit.DAYS.toHours(t));
+            assertEquals(t,
+                         TimeUnit.HOURS.toHours(t));
+            assertEquals(t,
+                         TimeUnit.MINUTES.toHours(t*60));
+            assertEquals(t,
+                         TimeUnit.SECONDS.toHours(t*60*60));
+            assertEquals(t,
+                         TimeUnit.MILLISECONDS.toHours(t*1000L*60*60));
+            assertEquals(t,
+                         TimeUnit.MICROSECONDS.toHours(t*1000000L*60*60));
+            assertEquals(t,
+                         TimeUnit.NANOSECONDS.toHours(t*1000000000L*60*60));
+        }
+    }
+
+    /**
+     * toDays correctly converts sample values in different units to
+     * days
+     */
+    public void testToDays() {
+        for (long t = 0; t < 88888; ++t) {
+            assertEquals(t,
+                         TimeUnit.DAYS.toDays(t));
+            assertEquals(t,
+                         TimeUnit.HOURS.toDays(t*24));
+            assertEquals(t,
+                         TimeUnit.MINUTES.toDays(t*60*24));
+            assertEquals(t,
+                         TimeUnit.SECONDS.toDays(t*60*60*24));
+            assertEquals(t,
+                         TimeUnit.MILLISECONDS.toDays(t*1000L*60*60*24));
+            assertEquals(t,
+                         TimeUnit.MICROSECONDS.toDays(t*1000000L*60*60*24));
+            assertEquals(t,
+                         TimeUnit.NANOSECONDS.toDays(t*1000000000L*60*60*24));
+        }
+    }
+
+
+    /**
+     * convert saturates positive too-large values to Long.MAX_VALUE
+     * and negative to LONG.MIN_VALUE
+     */
+    public void testConvertSaturate() {
+        assertEquals(Long.MAX_VALUE,
+                     TimeUnit.NANOSECONDS.convert(Long.MAX_VALUE / 2,
+                                                  TimeUnit.SECONDS));
+        assertEquals(Long.MIN_VALUE,
+                     TimeUnit.NANOSECONDS.convert(-Long.MAX_VALUE / 4,
+                                                  TimeUnit.SECONDS));
+        assertEquals(Long.MAX_VALUE,
+                     TimeUnit.NANOSECONDS.convert(Long.MAX_VALUE / 2,
+                                                  TimeUnit.MINUTES));
+        assertEquals(Long.MIN_VALUE,
+                     TimeUnit.NANOSECONDS.convert(-Long.MAX_VALUE / 4,
+                                                  TimeUnit.MINUTES));
+        assertEquals(Long.MAX_VALUE,
+                     TimeUnit.NANOSECONDS.convert(Long.MAX_VALUE / 2,
+                                                  TimeUnit.HOURS));
+        assertEquals(Long.MIN_VALUE,
+                     TimeUnit.NANOSECONDS.convert(-Long.MAX_VALUE / 4,
+                                                  TimeUnit.HOURS));
+        assertEquals(Long.MAX_VALUE,
+                     TimeUnit.NANOSECONDS.convert(Long.MAX_VALUE / 2,
+                                                  TimeUnit.DAYS));
+        assertEquals(Long.MIN_VALUE,
+                     TimeUnit.NANOSECONDS.convert(-Long.MAX_VALUE / 4,
+                                                  TimeUnit.DAYS));
+
+    }
+
+    /**
+     * toNanos saturates positive too-large values to Long.MAX_VALUE
+     * and negative to LONG.MIN_VALUE
+     */
+    public void testToNanosSaturate() {
+            assertEquals(Long.MAX_VALUE,
+                         TimeUnit.MILLISECONDS.toNanos(Long.MAX_VALUE / 2));
+            assertEquals(Long.MIN_VALUE,
+                         TimeUnit.MILLISECONDS.toNanos(-Long.MAX_VALUE / 3));
+    }
+
+
+    /**
+     * toString returns string containing common name of unit
+     */
+    public void testToString() {
+        String s = TimeUnit.SECONDS.toString();
+        assertTrue(s.indexOf("ECOND") >= 0);
+    }
+
+
+    /**
+     *  Timed wait without holding lock throws
+     *  IllegalMonitorStateException
+     */
+    public void testTimedWait_IllegalMonitorException() {
+	//created a new thread with anonymous runnable
+
+        Thread t = new Thread(new Runnable() {
+                public void run() {
+                    Object o = new Object();
+                    TimeUnit tu = TimeUnit.MILLISECONDS;
+                    try {
+                        tu.timedWait(o,LONG_DELAY_MS);
+                        threadShouldThrow();
+                    }
+                    catch (InterruptedException ie) {
+                        threadUnexpectedException();
+                    }
+                    catch(IllegalMonitorStateException success) {
+                    }
+
+                }
+            });
+        t.start();
+        try {
+            Thread.sleep(SHORT_DELAY_MS);
+            t.interrupt();
+            t.join();
+        } catch(Exception e) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * timedWait throws InterruptedException when interrupted
+     */
+    public void testTimedWait() {
+	Thread t = new Thread(new Runnable() {
+		public void run() {
+		    Object o = new Object();
+
+		    TimeUnit tu = TimeUnit.MILLISECONDS;
+		    try {
+			synchronized(o) {
+			    tu.timedWait(o,MEDIUM_DELAY_MS);
+			}
+                        threadShouldThrow();
+		    }
+		    catch(InterruptedException success) {}
+		    catch(IllegalMonitorStateException failure) {
+			threadUnexpectedException();
+		    }
+		}
+	    });
+	t.start();
+        try {
+            Thread.sleep(SHORT_DELAY_MS);
+            t.interrupt();
+            t.join();
+        } catch(Exception e) {
+            unexpectedException();
+        }
+    }
+
+
+    /**
+     * timedJoin throws InterruptedException when interrupted
+     */
+    public void testTimedJoin() {
+	Thread t = new Thread(new Runnable() {
+		public void run() {
+		    TimeUnit tu = TimeUnit.MILLISECONDS;
+		    try {
+			Thread s = new Thread(new Runnable() {
+                                public void run() {
+                                    try {
+                                        Thread.sleep(MEDIUM_DELAY_MS);
+                                    } catch(InterruptedException success){}
+                                }
+                            });
+			s.start();
+			tu.timedJoin(s,MEDIUM_DELAY_MS);
+                        threadShouldThrow();
+		    }
+		    catch(Exception e) {}
+		}
+	    });
+	t.start();
+        try {
+            Thread.sleep(SHORT_DELAY_MS);
+            t.interrupt();
+            t.join();
+        } catch(Exception e) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     *  timedSleep throws InterruptedException when interrupted
+     */
+    public void testTimedSleep() {
+	//created a new thread with anonymous runnable
+
+	Thread t = new Thread(new Runnable() {
+		public void run() {
+		    TimeUnit tu = TimeUnit.MILLISECONDS;
+		    try {
+			tu.sleep(MEDIUM_DELAY_MS);
+                        threadShouldThrow();
+		    }
+		    catch(InterruptedException success) {}
+		}
+	    });
+	t.start();
+        try {
+            Thread.sleep(SHORT_DELAY_MS);
+            t.interrupt();
+            t.join();
+        } catch(Exception e) {
+            unexpectedException();
+        }
+    }
+
+    /**
+     * a deserialized serialized unit is equal
+     */
+    public void testSerialization() {
+        TimeUnit q = TimeUnit.MILLISECONDS;
+
+        try {
+            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
+            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
+            out.writeObject(q);
+            out.close();
+
+            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
+            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
+            TimeUnit r = (TimeUnit)in.readObject();
+
+            assertEquals(q.toString(), r.toString());
+        } catch(Exception e){
+            e.printStackTrace();
+            unexpectedException();
+        }
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/TreeMapTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/TreeMapTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/TreeMapTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,1071 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import java.io.*;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.Random;
+import java.util.BitSet;
+import java.util.NoSuchElementException;
+
+public class TreeMapTest extends JSR166TestCase {
+    public static void main(String[] args) {
+	junit.textui.TestRunner.run (suite());
+    }
+    public static Test suite() {
+	return new TestSuite(TreeMapTest.class);
+    }
+
+    /**
+     * Create a map from Integers 1-5 to Strings "A"-"E".
+     */
+    private static TreeMap map5() {
+	TreeMap map = new TreeMap();
+        assertTrue(map.isEmpty());
+	map.put(one, "A");
+	map.put(five, "E");
+	map.put(three, "C");
+	map.put(two, "B");
+	map.put(four, "D");
+        assertFalse(map.isEmpty());
+        assertEquals(5, map.size());
+	return map;
+    }
+
+    /**
+     *  clear removes all pairs
+     */
+    public void testClear() {
+        TreeMap map = map5();
+	map.clear();
+	assertEquals(map.size(), 0);
+    }
+
+    /**
+     *
+     */
+    public void testConstructFromSorted() {
+        TreeMap map = map5();
+        TreeMap map2 = new TreeMap(map);
+        assertEquals(map, map2);
+    }
+
+    /**
+     *  Maps with same contents are equal
+     */
+    public void testEquals() {
+        TreeMap map1 = map5();
+        TreeMap map2 = map5();
+        assertEquals(map1, map2);
+        assertEquals(map2, map1);
+	map1.clear();
+        assertFalse(map1.equals(map2));
+        assertFalse(map2.equals(map1));
+    }
+
+    /**
+     *  containsKey returns true for contained key
+     */
+    public void testContainsKey() {
+        TreeMap map = map5();
+	assertTrue(map.containsKey(one));
+        assertFalse(map.containsKey(zero));
+    }
+
+    /**
+     *  containsValue returns true for held values
+     */
+    public void testContainsValue() {
+        TreeMap map = map5();
+	assertTrue(map.containsValue("A"));
+        assertFalse(map.containsValue("Z"));
+    }
+
+    /**
+     *  get returns the correct element at the given key,
+     *  or null if not present
+     */
+    public void testGet() {
+        TreeMap map = map5();
+	assertEquals("A", (String)map.get(one));
+        TreeMap empty = new TreeMap();
+        assertNull(empty.get(one));
+    }
+
+    /**
+     *  isEmpty is true of empty map and false for non-empty
+     */
+    public void testIsEmpty() {
+        TreeMap empty = new TreeMap();
+        TreeMap map = map5();
+	assertTrue(empty.isEmpty());
+        assertFalse(map.isEmpty());
+    }
+
+    /**
+     *   firstKey returns first key
+     */
+    public void testFirstKey() {
+        TreeMap map = map5();
+	assertEquals(one, map.firstKey());
+    }
+
+    /**
+     *   lastKey returns last key
+     */
+    public void testLastKey() {
+        TreeMap map = map5();
+	assertEquals(five, map.lastKey());
+    }
+
+
+    /**
+     *  keySet.toArray returns contains all keys
+     */
+    public void testKeySetToArray() {
+        TreeMap map = map5();
+	Set s = map.keySet();
+        Object[] ar = s.toArray();
+        assertTrue(s.containsAll(Arrays.asList(ar)));
+	assertEquals(5, ar.length);
+        ar[0] = m10;
+        assertFalse(s.containsAll(Arrays.asList(ar)));
+    }
+
+    /**
+     *  descendingkeySet.toArray returns contains all keys
+     */
+    public void testDescendingKeySetToArray() {
+        TreeMap map = map5();
+	Set s = map.descendingKeySet();
+        Object[] ar = s.toArray();
+	assertEquals(5, ar.length);
+        assertTrue(s.containsAll(Arrays.asList(ar)));
+        ar[0] = m10;
+        assertFalse(s.containsAll(Arrays.asList(ar)));
+    }
+
+    /**
+     *   keySet returns a Set containing all the keys
+     */
+    public void testKeySet() {
+        TreeMap map = map5();
+	Set s = map.keySet();
+	assertEquals(5, s.size());
+	assertTrue(s.contains(one));
+	assertTrue(s.contains(two));
+	assertTrue(s.contains(three));
+	assertTrue(s.contains(four));
+	assertTrue(s.contains(five));
+    }
+
+    /**
+     *   keySet is ordered
+     */
+    public void testKeySetOrder() {
+        TreeMap map = map5();
+	Set s = map.keySet();
+        Iterator i = s.iterator();
+        Integer last = (Integer)i.next();
+        assertEquals(last, one);
+        while (i.hasNext()) {
+            Integer k = (Integer)i.next();
+            assertTrue(last.compareTo(k) < 0);
+            last = k;
+        }
+    }
+
+    /**
+     *   descendingKeySet is ordered
+     */
+    public void testDescendingKeySetOrder() {
+        TreeMap map = map5();
+	Set s = map.descendingKeySet();
+        Iterator i = s.iterator();
+        Integer last = (Integer)i.next();
+        assertEquals(last, five);
+        while (i.hasNext()) {
+            Integer k = (Integer)i.next();
+            assertTrue(last.compareTo(k) > 0);
+            last = k;
+        }
+    }
+
+    /**
+     * values collection contains all values
+     */
+    public void testValues() {
+        TreeMap map = map5();
+	Collection s = map.values();
+	assertEquals(5, s.size());
+	assertTrue(s.contains("A"));
+	assertTrue(s.contains("B"));
+	assertTrue(s.contains("C"));
+	assertTrue(s.contains("D"));
+	assertTrue(s.contains("E"));
+    }
+
+    /**
+     * entrySet contains all pairs
+     */
+    public void testEntrySet() {
+        TreeMap map = map5();
+	Set s = map.entrySet();
+	assertEquals(5, s.size());
+        Iterator it = s.iterator();
+        while (it.hasNext()) {
+            Map.Entry e = (Map.Entry) it.next();
+            assertTrue(
+                       (e.getKey().equals(one) && e.getValue().equals("A")) ||
+                       (e.getKey().equals(two) && e.getValue().equals("B")) ||
+                       (e.getKey().equals(three) && e.getValue().equals("C")) ||
+                       (e.getKey().equals(four) && e.getValue().equals("D")) ||
+                       (e.getKey().equals(five) && e.getValue().equals("E")));
+        }
+    }
+
+    /**
+     * descendingEntrySet contains all pairs
+     */
+    public void testDescendingEntrySet() {
+        TreeMap map = map5();
+	Set s = map.descendingMap().entrySet();
+	assertEquals(5, s.size());
+        Iterator it = s.iterator();
+        while (it.hasNext()) {
+            Map.Entry e = (Map.Entry) it.next();
+            assertTrue(
+                       (e.getKey().equals(one) && e.getValue().equals("A")) ||
+                       (e.getKey().equals(two) && e.getValue().equals("B")) ||
+                       (e.getKey().equals(three) && e.getValue().equals("C")) ||
+                       (e.getKey().equals(four) && e.getValue().equals("D")) ||
+                       (e.getKey().equals(five) && e.getValue().equals("E")));
+        }
+    }
+
+    /**
+     *  entrySet.toArray contains all entries
+     */
+    public void testEntrySetToArray() {
+        TreeMap map = map5();
+	Set s = map.entrySet();
+        Object[] ar = s.toArray();
+        assertEquals(5, ar.length);
+        for (int i = 0; i < 5; ++i) {
+            assertTrue(map.containsKey(((Map.Entry)(ar[i])).getKey()));
+            assertTrue(map.containsValue(((Map.Entry)(ar[i])).getValue()));
+        }
+    }
+
+    /**
+     *  descendingEntrySet.toArray contains all entries
+     */
+    public void testDescendingEntrySetToArray() {
+        TreeMap map = map5();
+	Set s = map.descendingMap().entrySet();
+        Object[] ar = s.toArray();
+        assertEquals(5, ar.length);
+        for (int i = 0; i < 5; ++i) {
+            assertTrue(map.containsKey(((Map.Entry)(ar[i])).getKey()));
+            assertTrue(map.containsValue(((Map.Entry)(ar[i])).getValue()));
+        }
+    }
+
+    /**
+     *   putAll  adds all key-value pairs from the given map
+     */
+    public void testPutAll() {
+        TreeMap empty = new TreeMap();
+        TreeMap map = map5();
+	empty.putAll(map);
+	assertEquals(5, empty.size());
+	assertTrue(empty.containsKey(one));
+	assertTrue(empty.containsKey(two));
+	assertTrue(empty.containsKey(three));
+	assertTrue(empty.containsKey(four));
+	assertTrue(empty.containsKey(five));
+    }
+
+    /**
+     *   remove removes the correct key-value pair from the map
+     */
+    public void testRemove() {
+        TreeMap map = map5();
+	map.remove(five);
+	assertEquals(4, map.size());
+	assertFalse(map.containsKey(five));
+    }
+
+    /**
+     * lowerEntry returns preceding entry.
+     */
+    public void testLowerEntry() {
+        TreeMap map = map5();
+        Map.Entry e1 = map.lowerEntry(three);
+        assertEquals(two, e1.getKey());
+
+        Map.Entry e2 = map.lowerEntry(six);
+        assertEquals(five, e2.getKey());
+
+        Map.Entry e3 = map.lowerEntry(one);
+        assertNull(e3);
+
+        Map.Entry e4 = map.lowerEntry(zero);
+        assertNull(e4);
+
+    }
+
+    /**
+     * higherEntry returns next entry.
+     */
+    public void testHigherEntry() {
+        TreeMap map = map5();
+        Map.Entry e1 = map.higherEntry(three);
+        assertEquals(four, e1.getKey());
+
+        Map.Entry e2 = map.higherEntry(zero);
+        assertEquals(one, e2.getKey());
+
+        Map.Entry e3 = map.higherEntry(five);
+        assertNull(e3);
+
+        Map.Entry e4 = map.higherEntry(six);
+        assertNull(e4);
+
+    }
+
+    /**
+     * floorEntry returns preceding entry.
+     */
+    public void testFloorEntry() {
+        TreeMap map = map5();
+        Map.Entry e1 = map.floorEntry(three);
+        assertEquals(three, e1.getKey());
+
+        Map.Entry e2 = map.floorEntry(six);
+        assertEquals(five, e2.getKey());
+
+        Map.Entry e3 = map.floorEntry(one);
+        assertEquals(one, e3.getKey());
+
+        Map.Entry e4 = map.floorEntry(zero);
+        assertNull(e4);
+
+    }
+
+    /**
+     * ceilingEntry returns next entry.
+     */
+    public void testCeilingEntry() {
+        TreeMap map = map5();
+        Map.Entry e1 = map.ceilingEntry(three);
+        assertEquals(three, e1.getKey());
+
+        Map.Entry e2 = map.ceilingEntry(zero);
+        assertEquals(one, e2.getKey());
+
+        Map.Entry e3 = map.ceilingEntry(five);
+        assertEquals(five, e3.getKey());
+
+        Map.Entry e4 = map.ceilingEntry(six);
+        assertNull(e4);
+
+    }
+
+
+    /**
+     * lowerKey returns preceding element
+     */
+    public void testLowerKey() {
+        TreeMap q = map5();
+        Object e1 = q.lowerKey(three);
+        assertEquals(two, e1);
+
+        Object e2 = q.lowerKey(six);
+        assertEquals(five, e2);
+
+        Object e3 = q.lowerKey(one);
+        assertNull(e3);
+
+        Object e4 = q.lowerKey(zero);
+        assertNull(e4);
+
+    }
+
+    /**
+     * higherKey returns next element
+     */
+    public void testHigherKey() {
+        TreeMap q = map5();
+        Object e1 = q.higherKey(three);
+        assertEquals(four, e1);
+
+        Object e2 = q.higherKey(zero);
+        assertEquals(one, e2);
+
+        Object e3 = q.higherKey(five);
+        assertNull(e3);
+
+        Object e4 = q.higherKey(six);
+        assertNull(e4);
+
+    }
+
+    /**
+     * floorKey returns preceding element
+     */
+    public void testFloorKey() {
+        TreeMap q = map5();
+        Object e1 = q.floorKey(three);
+        assertEquals(three, e1);
+
+        Object e2 = q.floorKey(six);
+        assertEquals(five, e2);
+
+        Object e3 = q.floorKey(one);
+        assertEquals(one, e3);
+
+        Object e4 = q.floorKey(zero);
+        assertNull(e4);
+
+    }
+
+    /**
+     * ceilingKey returns next element
+     */
+    public void testCeilingKey() {
+        TreeMap q = map5();
+        Object e1 = q.ceilingKey(three);
+        assertEquals(three, e1);
+
+        Object e2 = q.ceilingKey(zero);
+        assertEquals(one, e2);
+
+        Object e3 = q.ceilingKey(five);
+        assertEquals(five, e3);
+
+        Object e4 = q.ceilingKey(six);
+        assertNull(e4);
+
+    }
+
+    /**
+     * pollFirstEntry returns entries in order
+     */
+    public void testPollFirstEntry() {
+        TreeMap map = map5();
+        Map.Entry e = map.pollFirstEntry();
+        assertEquals(one, e.getKey());
+        assertEquals("A", e.getValue());
+        e = map.pollFirstEntry();
+        assertEquals(two, e.getKey());
+        map.put(one, "A");
+        e = map.pollFirstEntry();
+        assertEquals(one, e.getKey());
+        assertEquals("A", e.getValue());
+        e = map.pollFirstEntry();
+        assertEquals(three, e.getKey());
+        map.remove(four);
+        e = map.pollFirstEntry();
+        assertEquals(five, e.getKey());
+        try {
+            e.setValue("A");
+            shouldThrow();
+        } catch (Exception ok) {
+        }
+        e = map.pollFirstEntry();
+        assertNull(e);
+    }
+
+    /**
+     * pollLastEntry returns entries in order
+     */
+    public void testPollLastEntry() {
+        TreeMap map = map5();
+        Map.Entry e = map.pollLastEntry();
+        assertEquals(five, e.getKey());
+        assertEquals("E", e.getValue());
+        e = map.pollLastEntry();
+        assertEquals(four, e.getKey());
+        map.put(five, "E");
+        e = map.pollLastEntry();
+        assertEquals(five, e.getKey());
+        assertEquals("E", e.getValue());
+        e = map.pollLastEntry();
+        assertEquals(three, e.getKey());
+        map.remove(two);
+        e = map.pollLastEntry();
+        assertEquals(one, e.getKey());
+        try {
+            e.setValue("E");
+            shouldThrow();
+        } catch (Exception ok) {
+        }
+        e = map.pollLastEntry();
+        assertNull(e);
+    }
+
+    /**
+     *   size returns the correct values
+     */
+    public void testSize() {
+        TreeMap map = map5();
+        TreeMap empty = new TreeMap();
+	assertEquals(0, empty.size());
+	assertEquals(5, map.size());
+    }
+
+    /**
+     * toString contains toString of elements
+     */
+    public void testToString() {
+        TreeMap map = map5();
+        String s = map.toString();
+        for (int i = 1; i <= 5; ++i) {
+            assertTrue(s.indexOf(String.valueOf(i)) >= 0);
+        }
+    }
+
+    // Exception tests
+
+    /**
+     * get(null) of nonempty map throws NPE
+     */
+    public void testGet_NullPointerException() {
+        try {
+            TreeMap c = map5();
+            c.get(null);
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * containsKey(null) of nonempty map throws NPE
+     */
+    public void testContainsKey_NullPointerException() {
+        try {
+            TreeMap c = map5();
+            c.containsKey(null);
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * remove(null) throws NPE for nonempty map
+     */
+    public void testRemove1_NullPointerException() {
+        try {
+            TreeMap c = new TreeMap();
+            c.put("sadsdf", "asdads");
+            c.remove(null);
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * A deserialized map equals original
+     */
+    public void testSerialization() {
+        TreeMap q = map5();
+
+        try {
+            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
+            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
+            out.writeObject(q);
+            out.close();
+
+            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
+            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
+            TreeMap r = (TreeMap)in.readObject();
+            assertEquals(q.size(), r.size());
+            assertTrue(q.equals(r));
+            assertTrue(r.equals(q));
+        } catch(Exception e){
+            e.printStackTrace();
+            unexpectedException();
+        }
+    }
+
+    /**
+     * subMap returns map with keys in requested range
+     */
+    public void testSubMapContents() {
+        TreeMap map = map5();
+        NavigableMap sm = map.subMap(two, true, four, false);
+        assertEquals(two, sm.firstKey());
+        assertEquals(three, sm.lastKey());
+        assertEquals(2, sm.size());
+        assertFalse(sm.containsKey(one));
+        assertTrue(sm.containsKey(two));
+        assertTrue(sm.containsKey(three));
+        assertFalse(sm.containsKey(four));
+        assertFalse(sm.containsKey(five));
+        Iterator i = sm.keySet().iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(two, k);
+        k = (Integer)(i.next());
+        assertEquals(three, k);
+        assertFalse(i.hasNext());
+        Iterator r = sm.descendingKeySet().iterator();
+        k = (Integer)(r.next());
+        assertEquals(three, k);
+        k = (Integer)(r.next());
+        assertEquals(two, k);
+        assertFalse(r.hasNext());
+
+        Iterator j = sm.keySet().iterator();
+        j.next();
+        j.remove();
+        assertFalse(map.containsKey(two));
+        assertEquals(4, map.size());
+        assertEquals(1, sm.size());
+        assertEquals(three, sm.firstKey());
+        assertEquals(three, sm.lastKey());
+        assertTrue(sm.remove(three) != null);
+        assertTrue(sm.isEmpty());
+        assertEquals(3, map.size());
+    }
+
+    public void testSubMapContents2() {
+        TreeMap map = map5();
+        NavigableMap sm = map.subMap(two, true, three, false);
+        assertEquals(1, sm.size());
+        assertEquals(two, sm.firstKey());
+        assertEquals(two, sm.lastKey());
+        assertFalse(sm.containsKey(one));
+        assertTrue(sm.containsKey(two));
+        assertFalse(sm.containsKey(three));
+        assertFalse(sm.containsKey(four));
+        assertFalse(sm.containsKey(five));
+        Iterator i = sm.keySet().iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(two, k);
+        assertFalse(i.hasNext());
+        Iterator r = sm.descendingKeySet().iterator();
+        k = (Integer)(r.next());
+        assertEquals(two, k);
+        assertFalse(r.hasNext());
+
+        Iterator j = sm.keySet().iterator();
+        j.next();
+        j.remove();
+        assertFalse(map.containsKey(two));
+        assertEquals(4, map.size());
+        assertEquals(0, sm.size());
+        assertTrue(sm.isEmpty());
+        assertTrue(sm.remove(three) == null);
+        assertEquals(4, map.size());
+    }
+
+    /**
+     * headMap returns map with keys in requested range
+     */
+    public void testHeadMapContents() {
+        TreeMap map = map5();
+        NavigableMap sm = map.headMap(four, false);
+        assertTrue(sm.containsKey(one));
+        assertTrue(sm.containsKey(two));
+        assertTrue(sm.containsKey(three));
+        assertFalse(sm.containsKey(four));
+        assertFalse(sm.containsKey(five));
+        Iterator i = sm.keySet().iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(one, k);
+        k = (Integer)(i.next());
+        assertEquals(two, k);
+        k = (Integer)(i.next());
+        assertEquals(three, k);
+        assertFalse(i.hasNext());
+        sm.clear();
+        assertTrue(sm.isEmpty());
+        assertEquals(2, map.size());
+        assertEquals(four, map.firstKey());
+    }
+
+    /**
+     * headMap returns map with keys in requested range
+     */
+    public void testTailMapContents() {
+        TreeMap map = map5();
+        NavigableMap sm = map.tailMap(two, true);
+        assertFalse(sm.containsKey(one));
+        assertTrue(sm.containsKey(two));
+        assertTrue(sm.containsKey(three));
+        assertTrue(sm.containsKey(four));
+        assertTrue(sm.containsKey(five));
+        Iterator i = sm.keySet().iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(two, k);
+        k = (Integer)(i.next());
+        assertEquals(three, k);
+        k = (Integer)(i.next());
+        assertEquals(four, k);
+        k = (Integer)(i.next());
+        assertEquals(five, k);
+        assertFalse(i.hasNext());
+        Iterator r = sm.descendingKeySet().iterator();
+        k = (Integer)(r.next());
+        assertEquals(five, k);
+        k = (Integer)(r.next());
+        assertEquals(four, k);
+        k = (Integer)(r.next());
+        assertEquals(three, k);
+        k = (Integer)(r.next());
+        assertEquals(two, k);
+        assertFalse(r.hasNext());
+
+        Iterator ei = sm.entrySet().iterator();
+        Map.Entry e;
+        e = (Map.Entry)(ei.next());
+        assertEquals(two, e.getKey());
+        assertEquals("B", e.getValue());
+        e = (Map.Entry)(ei.next());
+        assertEquals(three, e.getKey());
+        assertEquals("C", e.getValue());
+        e = (Map.Entry)(ei.next());
+        assertEquals(four, e.getKey());
+        assertEquals("D", e.getValue());
+        e = (Map.Entry)(ei.next());
+        assertEquals(five, e.getKey());
+        assertEquals("E", e.getValue());
+        assertFalse(i.hasNext());
+
+        NavigableMap ssm = sm.tailMap(four, true);
+        assertEquals(four, ssm.firstKey());
+        assertEquals(five, ssm.lastKey());
+        assertTrue(ssm.remove(four) != null);
+        assertEquals(1, ssm.size());
+        assertEquals(3, sm.size());
+        assertEquals(4, map.size());
+    }
+
+    Random rnd = new Random(666);
+    BitSet bs;
+
+    /**
+     * Submaps of submaps subdivide correctly
+     */
+    public void testRecursiveSubMaps() {
+        int mapSize = 1000;
+        Class cl = TreeMap.class;
+        NavigableMap map = newMap(cl);
+        bs = new BitSet(mapSize);
+
+        populate(map, mapSize);
+        check(map,                 0, mapSize - 1, true);
+        check(map.descendingMap(), 0, mapSize - 1, false);
+
+        mutateMap(map, 0, mapSize - 1);
+        check(map,                 0, mapSize - 1, true);
+        check(map.descendingMap(), 0, mapSize - 1, false);
+
+        bashSubMap(map.subMap(new Integer(0), true, new Integer(mapSize), false),
+                   0, mapSize - 1, true);
+    }
+
+    static NavigableMap newMap(Class cl) {
+        NavigableMap result = null;
+        try {
+            result = (NavigableMap) cl.newInstance();
+        } catch(Exception e) {
+            fail();
+        }
+        assertEquals(result.size(), 0);
+        assertFalse(result.keySet().iterator().hasNext());
+        return result;
+    }
+
+    void populate(NavigableMap map, int limit) {
+        for (int i = 0, n = 2 * limit / 3; i < n; i++) {
+            int key = rnd.nextInt(limit);
+            put(map, key);
+        }
+    }
+
+    void mutateMap(NavigableMap map, int min, int max) {
+        int size = map.size();
+        int rangeSize = max - min + 1;
+
+        // Remove a bunch of entries directly
+        for (int i = 0, n = rangeSize / 2; i < n; i++) {
+            remove(map, min - 5 + rnd.nextInt(rangeSize + 10));
+        }
+
+        // Remove a bunch of entries with iterator
+        for(Iterator it = map.keySet().iterator(); it.hasNext(); ) {
+            if (rnd.nextBoolean()) {
+                bs.clear(((Integer)it.next()).intValue());
+                it.remove();
+            }
+        }
+
+        // Add entries till we're back to original size
+        while (map.size() < size) {
+            int key = min + rnd.nextInt(rangeSize);
+            assertTrue(key >= min && key<= max);
+            put(map, key);
+        }
+    }
+
+    void mutateSubMap(NavigableMap map, int min, int max) {
+        int size = map.size();
+        int rangeSize = max - min + 1;
+
+        // Remove a bunch of entries directly
+        for (int i = 0, n = rangeSize / 2; i < n; i++) {
+            remove(map, min - 5 + rnd.nextInt(rangeSize + 10));
+        }
+
+        // Remove a bunch of entries with iterator
+        for(Iterator it = map.keySet().iterator(); it.hasNext(); ) {
+            if (rnd.nextBoolean()) {
+                bs.clear(((Integer)it.next()).intValue());
+                it.remove();
+            }
+        }
+
+        // Add entries till we're back to original size
+        while (map.size() < size) {
+            int key = min - 5 + rnd.nextInt(rangeSize + 10);
+            if (key >= min && key<= max) {
+                put(map, key);
+            } else {
+                try {
+                    map.put(new Integer(key), new Integer(2 * key));
+                    fail();
+                } catch(IllegalArgumentException e) {
+                    // expected
+                }
+            }
+        }
+    }
+
+    void put(NavigableMap map, int key) {
+        if (map.put(new Integer(key), new Integer(2 * key)) == null)
+            bs.set(key);
+    }
+
+    void remove(NavigableMap map, int key) {
+        if (map.remove(new Integer(key)) != null)
+            bs.clear(key);
+    }
+
+    void bashSubMap(NavigableMap map,
+                    int min, int max, boolean ascending) {
+        check(map, min, max, ascending);
+        check(map.descendingMap(), min, max, !ascending);
+
+        mutateSubMap(map, min, max);
+        check(map, min, max, ascending);
+        check(map.descendingMap(), min, max, !ascending);
+
+        // Recurse
+        if (max - min < 2)
+            return;
+        int midPoint = (min + max) / 2;
+
+        // headMap - pick direction and endpoint inclusion randomly
+        boolean incl = rnd.nextBoolean();
+        NavigableMap hm = map.headMap(new Integer(midPoint), incl);
+        if (ascending) {
+            if (rnd.nextBoolean())
+                bashSubMap(hm, min, midPoint - (incl ? 0 : 1), true);
+            else
+                bashSubMap(hm.descendingMap(), min, midPoint - (incl ? 0 : 1),
+                           false);
+        } else {
+            if (rnd.nextBoolean())
+                bashSubMap(hm, midPoint + (incl ? 0 : 1), max, false);
+            else
+                bashSubMap(hm.descendingMap(), midPoint + (incl ? 0 : 1), max,
+                           true);
+        }
+
+        // tailMap - pick direction and endpoint inclusion randomly
+        incl = rnd.nextBoolean();
+        NavigableMap tm = map.tailMap(new Integer(midPoint),incl);
+        if (ascending) {
+            if (rnd.nextBoolean())
+                bashSubMap(tm, midPoint + (incl ? 0 : 1), max, true);
+            else
+                bashSubMap(tm.descendingMap(), midPoint + (incl ? 0 : 1), max,
+                           false);
+        } else {
+            if (rnd.nextBoolean()) {
+                bashSubMap(tm, min, midPoint - (incl ? 0 : 1), false);
+            } else {
+                bashSubMap(tm.descendingMap(), min, midPoint - (incl ? 0 : 1),
+                           true);
+            }
+        }
+
+        // subMap - pick direction and endpoint inclusion randomly
+        int rangeSize = max - min + 1;
+        int[] endpoints = new int[2];
+        endpoints[0] = min + rnd.nextInt(rangeSize);
+        endpoints[1] = min + rnd.nextInt(rangeSize);
+        Arrays.sort(endpoints);
+        boolean lowIncl = rnd.nextBoolean();
+        boolean highIncl = rnd.nextBoolean();
+        if (ascending) {
+            NavigableMap sm = map.subMap(
+                new Integer(endpoints[0]), lowIncl, new Integer(endpoints[1]), highIncl);
+            if (rnd.nextBoolean())
+                bashSubMap(sm, endpoints[0] + (lowIncl ? 0 : 1),
+                           endpoints[1] - (highIncl ? 0 : 1), true);
+            else
+                bashSubMap(sm.descendingMap(), endpoints[0] + (lowIncl ? 0 : 1),
+                           endpoints[1] - (highIncl ? 0 : 1), false);
+        } else {
+            NavigableMap sm = map.subMap(
+                new Integer(endpoints[1]), highIncl, new Integer(endpoints[0]), lowIncl);
+            if (rnd.nextBoolean())
+                bashSubMap(sm, endpoints[0] + (lowIncl ? 0 : 1),
+                           endpoints[1] - (highIncl ? 0 : 1), false);
+            else
+                bashSubMap(sm.descendingMap(), endpoints[0] + (lowIncl ? 0 : 1),
+                           endpoints[1] - (highIncl ? 0 : 1), true);
+        }
+    }
+
+    /**
+     * min and max are both inclusive.  If max < min, interval is empty.
+     */
+    void check(NavigableMap map,
+                      final int min, final int max, final boolean ascending) {
+       class ReferenceSet {
+            int lower(int key) {
+                return ascending ? lowerAscending(key) : higherAscending(key);
+            }
+            int floor(int key) {
+                return ascending ? floorAscending(key) : ceilingAscending(key);
+            }
+            int ceiling(int key) {
+                return ascending ? ceilingAscending(key) : floorAscending(key);
+            }
+            int higher(int key) {
+                return ascending ? higherAscending(key) : lowerAscending(key);
+            }
+            int first() {
+                return ascending ? firstAscending() : lastAscending();
+            }
+            int last() {
+                return ascending ? lastAscending() : firstAscending();
+            }
+            int lowerAscending(int key) {
+                return floorAscending(key - 1);
+            }
+            int floorAscending(int key) {
+                if (key < min)
+                    return -1;
+                else if (key > max)
+                    key = max;
+
+                // BitSet should support this! Test would run much faster
+                while (key >= min) {
+                    if (bs.get(key))
+                        return(key);
+                    key--;
+                }
+                return -1;
+            }
+            int ceilingAscending(int key) {
+                if (key < min)
+                    key = min;
+                else if (key > max)
+                    return -1;
+                int result = bs.nextSetBit(key);
+                return result > max ? -1 : result;
+            }
+            int higherAscending(int key) {
+                return ceilingAscending(key + 1);
+            }
+            private int firstAscending() {
+                int result = ceilingAscending(min);
+                return result > max ? -1 : result;
+            }
+            private int lastAscending() {
+                int result = floorAscending(max);
+                return result < min ? -1 : result;
+            }
+        }
+        ReferenceSet rs = new ReferenceSet();
+
+        // Test contents using containsKey
+        int size = 0;
+        for (int i = min; i <= max; i++) {
+            boolean bsContainsI = bs.get(i);
+            assertEquals(bsContainsI, map.containsKey(new Integer(i)));
+            if (bsContainsI)
+                size++;
+        }
+        assertEquals(map.size(), size);
+
+        // Test contents using contains keySet iterator
+        int size2 = 0;
+        int previousKey = -1;
+        for (Iterator itr = map.keySet().iterator(); itr.hasNext();) {
+            int key = ((Integer)itr.next()).intValue();
+            assertTrue(bs.get(key));
+            size2++;
+            assertTrue(previousKey < 0 ||
+                (ascending ? key - previousKey > 0 : key - previousKey < 0));
+            previousKey = key;
+        }
+        assertEquals(size2, size);
+
+        // Test navigation ops
+        for (int key = min - 1; key <= max + 1; key++) {
+            assertEq((Integer)map.lowerKey(new Integer(key)), rs.lower(key));
+            assertEq((Integer)map.floorKey(new Integer(key)), rs.floor(key));
+            assertEq((Integer)map.higherKey(new Integer(key)), rs.higher(key));
+            assertEq((Integer)map.ceilingKey(new Integer(key)), rs.ceiling(key));
+        }
+
+        // Test extrema
+        if (map.size() != 0) {
+            assertEq((Integer)map.firstKey(), rs.first());
+            assertEq((Integer)map.lastKey(), rs.last());
+        } else {
+            assertEq(new Integer(rs.first()), -1);
+            assertEq(new Integer(rs.last()),  -1);
+            try {
+                map.firstKey();
+                fail();
+            } catch(NoSuchElementException e) {
+                // expected
+            }
+            try {
+                map.lastKey();
+                fail();
+            } catch(NoSuchElementException e) {
+                // expected
+            }
+        }
+    }
+
+    static void assertEq(Integer i, int j) {
+        if (i == null)
+            assertEquals(j, -1);
+        else
+            assertEquals(i.intValue(), j);
+    }
+
+    static boolean eq(Integer i, int j) {
+        return i == null ? j == -1 : i.intValue() == j;
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/TreeSetTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/TreeSetTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/TreeSetTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,1015 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import java.io.*;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.SortedSet;
+import java.util.NoSuchElementException;
+import java.util.Random;
+import java.util.BitSet;
+
+public class TreeSetTest extends JSR166TestCase {
+    public static void main(String[] args) {
+	junit.textui.TestRunner.run (suite());
+    }
+    public static Test suite() {
+	return new TestSuite(TreeSetTest.class);
+    }
+
+    static class MyReverseComparator implements Comparator {
+        public int compare(Object x, Object y) {
+            int i = ((Integer)x).intValue();
+            int j = ((Integer)y).intValue();
+            if (i < j) return 1;
+            if (i > j) return -1;
+            return 0;
+        }
+    }
+
+    /**
+     * The number of elements to place in collections, arrays, etc.
+     */
+    static final int SIZE = 20;
+
+    /**
+     * Create a set of given size containing consecutive
+     * Integers 0 ... n.
+     */
+    private TreeSet populatedSet(int n) {
+        TreeSet q = new TreeSet();
+        assertTrue(q.isEmpty());
+	for(int i = n-1; i >= 0; i-=2)
+	    assertTrue(q.add(new Integer(i)));
+	for(int i = (n & 1); i < n; i+=2)
+	    assertTrue(q.add(new Integer(i)));
+        assertFalse(q.isEmpty());
+	assertEquals(n, q.size());
+        return q;
+    }
+
+    /**
+     * Create set of first 5 ints
+     */
+    private TreeSet set5() {
+        TreeSet q = new TreeSet();
+        assertTrue(q.isEmpty());
+        q.add(one);
+        q.add(two);
+        q.add(three);
+        q.add(four);
+        q.add(five);
+	assertEquals(5, q.size());
+        return q;
+    }
+
+    /**
+     * A new set has unbounded capacity
+     */
+    public void testConstructor1() {
+        assertEquals(0, new TreeSet().size());
+    }
+
+    /**
+     * Initializing from null Collection throws NPE
+     */
+    public void testConstructor3() {
+        try {
+            TreeSet q = new TreeSet((Collection)null);
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Initializing from Collection of null elements throws NPE
+     */
+    public void testConstructor4() {
+        try {
+            Integer[] ints = new Integer[SIZE];
+            TreeSet q = new TreeSet(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Initializing from Collection with some null elements throws NPE
+     */
+    public void testConstructor5() {
+        try {
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE-1; ++i)
+                ints[i] = new Integer(i);
+            TreeSet q = new TreeSet(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Set contains all elements of collection used to initialize
+     */
+    public void testConstructor6() {
+        try {
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE; ++i)
+                ints[i] = new Integer(i);
+            TreeSet q = new TreeSet(Arrays.asList(ints));
+            for (int i = 0; i < SIZE; ++i)
+                assertEquals(ints[i], q.pollFirst());
+        }
+        finally {}
+    }
+
+    /**
+     * The comparator used in constructor is used
+     */
+    public void testConstructor7() {
+        try {
+            MyReverseComparator cmp = new MyReverseComparator();
+            TreeSet q = new TreeSet(cmp);
+            assertEquals(cmp, q.comparator());
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE; ++i)
+                ints[i] = new Integer(i);
+            q.addAll(Arrays.asList(ints));
+            for (int i = SIZE-1; i >= 0; --i)
+                assertEquals(ints[i], q.pollFirst());
+        }
+        finally {}
+    }
+
+    /**
+     * isEmpty is true before add, false after
+     */
+    public void testEmpty() {
+        TreeSet q = new TreeSet();
+        assertTrue(q.isEmpty());
+        q.add(new Integer(1));
+        assertFalse(q.isEmpty());
+        q.add(new Integer(2));
+        q.pollFirst();
+        q.pollFirst();
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * size changes when elements added and removed
+     */
+    public void testSize() {
+        TreeSet q = populatedSet(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(SIZE-i, q.size());
+            q.pollFirst();
+        }
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, q.size());
+            q.add(new Integer(i));
+        }
+    }
+
+    /**
+     * add(null) throws NPE if nonempty
+     */
+    public void testAddNull() {
+	try {
+            TreeSet q = populatedSet(SIZE);
+            q.add(null);
+            shouldThrow();
+        } catch (NullPointerException success) { }
+    }
+
+    /**
+     * Add of comparable element succeeds
+     */
+    public void testAdd() {
+        TreeSet q = new TreeSet();
+        assertTrue(q.add(zero));
+        assertTrue(q.add(one));
+    }
+
+    /**
+     * Add of duplicate element fails
+     */
+    public void testAddDup() {
+        TreeSet q = new TreeSet();
+        assertTrue(q.add(zero));
+        assertFalse(q.add(zero));
+    }
+
+    /**
+     * Add of non-Comparable throws CCE
+     */
+    public void testAddNonComparable() {
+        try {
+            TreeSet q = new TreeSet();
+            q.add(new Object());
+            q.add(new Object());
+            q.add(new Object());
+            shouldThrow();
+        }
+        catch(ClassCastException success) {}
+    }
+
+    /**
+     * addAll(null) throws NPE
+     */
+    public void testAddAll1() {
+        try {
+            TreeSet q = new TreeSet();
+            q.addAll(null);
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+    /**
+     * addAll of a collection with null elements throws NPE
+     */
+    public void testAddAll2() {
+        try {
+            TreeSet q = new TreeSet();
+            Integer[] ints = new Integer[SIZE];
+            q.addAll(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+    /**
+     * addAll of a collection with any null elements throws NPE after
+     * possibly adding some elements
+     */
+    public void testAddAll3() {
+        try {
+            TreeSet q = new TreeSet();
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE-1; ++i)
+                ints[i] = new Integer(i);
+            q.addAll(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Set contains all elements of successful addAll
+     */
+    public void testAddAll5() {
+        try {
+            Integer[] empty = new Integer[0];
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE; ++i)
+                ints[i] = new Integer(SIZE-1-i);
+            TreeSet q = new TreeSet();
+            assertFalse(q.addAll(Arrays.asList(empty)));
+            assertTrue(q.addAll(Arrays.asList(ints)));
+            for (int i = 0; i < SIZE; ++i)
+                assertEquals(new Integer(i), q.pollFirst());
+        }
+        finally {}
+    }
+
+    /**
+     * pollFirst succeeds unless empty
+     */
+    public void testPollFirst() {
+        TreeSet q = populatedSet(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.pollFirst()).intValue());
+        }
+	assertNull(q.pollFirst());
+    }
+
+    /**
+     * pollLast succeeds unless empty
+     */
+    public void testPollLast() {
+        TreeSet q = populatedSet(SIZE);
+        for (int i = SIZE-1; i >= 0; --i) {
+            assertEquals(i, ((Integer)q.pollLast()).intValue());
+        }
+	assertNull(q.pollFirst());
+    }
+
+
+    /**
+     * remove(x) removes x and returns true if present
+     */
+    public void testRemoveElement() {
+        TreeSet q = populatedSet(SIZE);
+        for (int i = 1; i < SIZE; i+=2) {
+            assertTrue(q.remove(new Integer(i)));
+        }
+        for (int i = 0; i < SIZE; i+=2) {
+            assertTrue(q.remove(new Integer(i)));
+            assertFalse(q.remove(new Integer(i+1)));
+        }
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * contains(x) reports true when elements added but not yet removed
+     */
+    public void testContains() {
+        TreeSet q = populatedSet(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(q.contains(new Integer(i)));
+            q.pollFirst();
+            assertFalse(q.contains(new Integer(i)));
+        }
+    }
+
+    /**
+     * clear removes all elements
+     */
+    public void testClear() {
+        TreeSet q = populatedSet(SIZE);
+        q.clear();
+        assertTrue(q.isEmpty());
+        assertEquals(0, q.size());
+        q.add(new Integer(1));
+        assertFalse(q.isEmpty());
+        q.clear();
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * containsAll(c) is true when c contains a subset of elements
+     */
+    public void testContainsAll() {
+        TreeSet q = populatedSet(SIZE);
+        TreeSet p = new TreeSet();
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(q.containsAll(p));
+            assertFalse(p.containsAll(q));
+            p.add(new Integer(i));
+        }
+        assertTrue(p.containsAll(q));
+    }
+
+    /**
+     * retainAll(c) retains only those elements of c and reports true if changed
+     */
+    public void testRetainAll() {
+        TreeSet q = populatedSet(SIZE);
+        TreeSet p = populatedSet(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            boolean changed = q.retainAll(p);
+            if (i == 0)
+                assertFalse(changed);
+            else
+                assertTrue(changed);
+
+            assertTrue(q.containsAll(p));
+            assertEquals(SIZE-i, q.size());
+            p.pollFirst();
+        }
+    }
+
+    /**
+     * removeAll(c) removes only those elements of c and reports true if changed
+     */
+    public void testRemoveAll() {
+        for (int i = 1; i < SIZE; ++i) {
+            TreeSet q = populatedSet(SIZE);
+            TreeSet p = populatedSet(i);
+            assertTrue(q.removeAll(p));
+            assertEquals(SIZE-i, q.size());
+            for (int j = 0; j < i; ++j) {
+                Integer I = (Integer)(p.pollFirst());
+                assertFalse(q.contains(I));
+            }
+        }
+    }
+
+
+
+    /**
+     * lower returns preceding element
+     */
+    public void testLower() {
+        TreeSet q = set5();
+        Object e1 = q.lower(three);
+        assertEquals(two, e1);
+
+        Object e2 = q.lower(six);
+        assertEquals(five, e2);
+
+        Object e3 = q.lower(one);
+        assertNull(e3);
+
+        Object e4 = q.lower(zero);
+        assertNull(e4);
+
+    }
+
+    /**
+     * higher returns next element
+     */
+    public void testHigher() {
+        TreeSet q = set5();
+        Object e1 = q.higher(three);
+        assertEquals(four, e1);
+
+        Object e2 = q.higher(zero);
+        assertEquals(one, e2);
+
+        Object e3 = q.higher(five);
+        assertNull(e3);
+
+        Object e4 = q.higher(six);
+        assertNull(e4);
+
+    }
+
+    /**
+     * floor returns preceding element
+     */
+    public void testFloor() {
+        TreeSet q = set5();
+        Object e1 = q.floor(three);
+        assertEquals(three, e1);
+
+        Object e2 = q.floor(six);
+        assertEquals(five, e2);
+
+        Object e3 = q.floor(one);
+        assertEquals(one, e3);
+
+        Object e4 = q.floor(zero);
+        assertNull(e4);
+
+    }
+
+    /**
+     * ceiling returns next element
+     */
+    public void testCeiling() {
+        TreeSet q = set5();
+        Object e1 = q.ceiling(three);
+        assertEquals(three, e1);
+
+        Object e2 = q.ceiling(zero);
+        assertEquals(one, e2);
+
+        Object e3 = q.ceiling(five);
+        assertEquals(five, e3);
+
+        Object e4 = q.ceiling(six);
+        assertNull(e4);
+
+    }
+
+    /**
+     * toArray contains all elements
+     */
+    public void testToArray() {
+        TreeSet q = populatedSet(SIZE);
+	Object[] o = q.toArray();
+        Arrays.sort(o);
+	for(int i = 0; i < o.length; i++)
+	    assertEquals(o[i], q.pollFirst());
+    }
+
+    /**
+     * toArray(a) contains all elements
+     */
+    public void testToArray2() {
+        TreeSet q = populatedSet(SIZE);
+	Integer[] ints = new Integer[SIZE];
+	ints = (Integer[])q.toArray(ints);
+        Arrays.sort(ints);
+        for(int i = 0; i < ints.length; i++)
+            assertEquals(ints[i], q.pollFirst());
+    }
+
+    /**
+     * iterator iterates through all elements
+     */
+    public void testIterator() {
+        TreeSet q = populatedSet(SIZE);
+        int i = 0;
+	Iterator it = q.iterator();
+        while(it.hasNext()) {
+            assertTrue(q.contains(it.next()));
+            ++i;
+        }
+        assertEquals(i, SIZE);
+    }
+
+    /**
+     * iterator of empty set has no elements
+     */
+    public void testEmptyIterator() {
+        TreeSet q = new TreeSet();
+        int i = 0;
+	Iterator it = q.iterator();
+        while(it.hasNext()) {
+            assertTrue(q.contains(it.next()));
+            ++i;
+        }
+        assertEquals(i, 0);
+    }
+
+    /**
+     * iterator.remove removes current element
+     */
+    public void testIteratorRemove () {
+        final TreeSet q = new TreeSet();
+        q.add(new Integer(2));
+        q.add(new Integer(1));
+        q.add(new Integer(3));
+
+        Iterator it = q.iterator();
+        it.next();
+        it.remove();
+
+        it = q.iterator();
+        assertEquals(it.next(), new Integer(2));
+        assertEquals(it.next(), new Integer(3));
+        assertFalse(it.hasNext());
+    }
+
+
+    /**
+     * toString contains toStrings of elements
+     */
+    public void testToString() {
+        TreeSet q = populatedSet(SIZE);
+        String s = q.toString();
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(s.indexOf(String.valueOf(i)) >= 0);
+        }
+    }
+
+    /**
+     * A deserialized serialized set has same elements
+     */
+    public void testSerialization() {
+        TreeSet q = populatedSet(SIZE);
+        try {
+            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
+            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
+            out.writeObject(q);
+            out.close();
+
+            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
+            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
+            TreeSet r = (TreeSet)in.readObject();
+            assertEquals(q.size(), r.size());
+            while (!q.isEmpty())
+                assertEquals(q.pollFirst(), r.pollFirst());
+        } catch(Exception e){
+            e.printStackTrace();
+            unexpectedException();
+        }
+    }
+
+    /**
+     * subSet returns set with keys in requested range
+     */
+    public void testSubSetContents() {
+        TreeSet set = set5();
+        SortedSet sm = set.subSet(two, four);
+        assertEquals(two, sm.first());
+        assertEquals(three, sm.last());
+        assertEquals(2, sm.size());
+        assertFalse(sm.contains(one));
+        assertTrue(sm.contains(two));
+        assertTrue(sm.contains(three));
+        assertFalse(sm.contains(four));
+        assertFalse(sm.contains(five));
+        Iterator i = sm.iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(two, k);
+        k = (Integer)(i.next());
+        assertEquals(three, k);
+        assertFalse(i.hasNext());
+        Iterator j = sm.iterator();
+        j.next();
+        j.remove();
+        assertFalse(set.contains(two));
+        assertEquals(4, set.size());
+        assertEquals(1, sm.size());
+        assertEquals(three, sm.first());
+        assertEquals(three, sm.last());
+        assertTrue(sm.remove(three));
+        assertTrue(sm.isEmpty());
+        assertEquals(3, set.size());
+    }
+
+    public void testSubSetContents2() {
+        TreeSet set = set5();
+        SortedSet sm = set.subSet(two, three);
+        assertEquals(1, sm.size());
+        assertEquals(two, sm.first());
+        assertEquals(two, sm.last());
+        assertFalse(sm.contains(one));
+        assertTrue(sm.contains(two));
+        assertFalse(sm.contains(three));
+        assertFalse(sm.contains(four));
+        assertFalse(sm.contains(five));
+        Iterator i = sm.iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(two, k);
+        assertFalse(i.hasNext());
+        Iterator j = sm.iterator();
+        j.next();
+        j.remove();
+        assertFalse(set.contains(two));
+        assertEquals(4, set.size());
+        assertEquals(0, sm.size());
+        assertTrue(sm.isEmpty());
+        assertFalse(sm.remove(three));
+        assertEquals(4, set.size());
+    }
+
+    /**
+     * headSet returns set with keys in requested range
+     */
+    public void testHeadSetContents() {
+        TreeSet set = set5();
+        SortedSet sm = set.headSet(four);
+        assertTrue(sm.contains(one));
+        assertTrue(sm.contains(two));
+        assertTrue(sm.contains(three));
+        assertFalse(sm.contains(four));
+        assertFalse(sm.contains(five));
+        Iterator i = sm.iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(one, k);
+        k = (Integer)(i.next());
+        assertEquals(two, k);
+        k = (Integer)(i.next());
+        assertEquals(three, k);
+        assertFalse(i.hasNext());
+        sm.clear();
+        assertTrue(sm.isEmpty());
+        assertEquals(2, set.size());
+        assertEquals(four, set.first());
+    }
+
+    /**
+     * tailSet returns set with keys in requested range
+     */
+    public void testTailSetContents() {
+        TreeSet set = set5();
+        SortedSet sm = set.tailSet(two);
+        assertFalse(sm.contains(one));
+        assertTrue(sm.contains(two));
+        assertTrue(sm.contains(three));
+        assertTrue(sm.contains(four));
+        assertTrue(sm.contains(five));
+        Iterator i = sm.iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(two, k);
+        k = (Integer)(i.next());
+        assertEquals(three, k);
+        k = (Integer)(i.next());
+        assertEquals(four, k);
+        k = (Integer)(i.next());
+        assertEquals(five, k);
+        assertFalse(i.hasNext());
+
+        SortedSet ssm = sm.tailSet(four);
+        assertEquals(four, ssm.first());
+        assertEquals(five, ssm.last());
+        assertTrue(ssm.remove(four));
+        assertEquals(1, ssm.size());
+        assertEquals(3, sm.size());
+        assertEquals(4, set.size());
+    }
+
+    Random rnd = new Random(666);
+    BitSet bs;
+
+    /**
+     * Subsets of subsets subdivide correctly
+     */
+    public void testRecursiveSubSets() {
+        int setSize = 1000;
+        Class cl = TreeSet.class;
+
+        NavigableSet set = newSet(cl);
+        bs = new BitSet(setSize);
+
+        populate(set, setSize);
+        check(set,                 0, setSize - 1, true);
+        check(set.descendingSet(), 0, setSize - 1, false);
+
+        mutateSet(set, 0, setSize - 1);
+        check(set,                 0, setSize - 1, true);
+        check(set.descendingSet(), 0, setSize - 1, false);
+
+        bashSubSet(set.subSet(new Integer(0), true, new Integer(setSize), false),
+                   0, setSize - 1, true);
+    }
+
+    static NavigableSet newSet(Class cl) {
+        NavigableSet result = null;
+        try {
+            result = (NavigableSet) cl.newInstance();
+        } catch(Exception e) {
+            fail();
+        }
+        assertEquals(result.size(), 0);
+        assertFalse(result.iterator().hasNext());
+        return result;
+    }
+
+    void populate(NavigableSet set, int limit) {
+        for (int i = 0, n = 2 * limit / 3; i < n; i++) {
+            int element = rnd.nextInt(limit);
+            put(set, element);
+        }
+    }
+
+    void mutateSet(NavigableSet set, int min, int max) {
+        int size = set.size();
+        int rangeSize = max - min + 1;
+
+        // Remove a bunch of entries directly
+        for (int i = 0, n = rangeSize / 2; i < n; i++) {
+            remove(set, min - 5 + rnd.nextInt(rangeSize + 10));
+        }
+
+        // Remove a bunch of entries with iterator
+        for(Iterator it = set.iterator(); it.hasNext(); ) {
+            if (rnd.nextBoolean()) {
+                bs.clear(((Integer)it.next()).intValue());
+                it.remove();
+            }
+        }
+
+        // Add entries till we're back to original size
+        while (set.size() < size) {
+            int element = min + rnd.nextInt(rangeSize);
+            assertTrue(element >= min && element<= max);
+            put(set, element);
+        }
+    }
+
+    void mutateSubSet(NavigableSet set, int min, int max) {
+        int size = set.size();
+        int rangeSize = max - min + 1;
+
+        // Remove a bunch of entries directly
+        for (int i = 0, n = rangeSize / 2; i < n; i++) {
+            remove(set, min - 5 + rnd.nextInt(rangeSize + 10));
+        }
+
+        // Remove a bunch of entries with iterator
+        for(Iterator it = set.iterator(); it.hasNext(); ) {
+            if (rnd.nextBoolean()) {
+                bs.clear(((Integer)it.next()).intValue());
+                it.remove();
+            }
+        }
+
+        // Add entries till we're back to original size
+        while (set.size() < size) {
+            int element = min - 5 + rnd.nextInt(rangeSize + 10);
+            if (element >= min && element<= max) {
+                put(set, element);
+            } else {
+                try {
+                    set.add(new Integer(element));
+                    fail();
+                } catch(IllegalArgumentException e) {
+                    // expected
+                }
+            }
+        }
+    }
+
+    void put(NavigableSet set, int element) {
+        if (set.add(new Integer(element)))
+            bs.set(element);
+    }
+
+    void remove(NavigableSet set, int element) {
+        if (set.remove(new Integer(element)))
+            bs.clear(element);
+    }
+
+    void bashSubSet(NavigableSet set,
+                    int min, int max, boolean ascending) {
+        check(set, min, max, ascending);
+        check(set.descendingSet(), min, max, !ascending);
+
+        mutateSubSet(set, min, max);
+        check(set, min, max, ascending);
+        check(set.descendingSet(), min, max, !ascending);
+
+        // Recurse
+        if (max - min < 2)
+            return;
+        int midPoint = (min + max) / 2;
+
+        // headSet - pick direction and endpoint inclusion randomly
+        boolean incl = rnd.nextBoolean();
+        NavigableSet hm = set.headSet(new Integer(midPoint), incl);
+        if (ascending) {
+            if (rnd.nextBoolean())
+                bashSubSet(hm, min, midPoint - (incl ? 0 : 1), true);
+            else
+                bashSubSet(hm.descendingSet(), min, midPoint - (incl ? 0 : 1),
+                           false);
+        } else {
+            if (rnd.nextBoolean())
+                bashSubSet(hm, midPoint + (incl ? 0 : 1), max, false);
+            else
+                bashSubSet(hm.descendingSet(), midPoint + (incl ? 0 : 1), max,
+                           true);
+        }
+
+        // tailSet - pick direction and endpoint inclusion randomly
+        incl = rnd.nextBoolean();
+        NavigableSet tm = set.tailSet(new Integer(midPoint),incl);
+        if (ascending) {
+            if (rnd.nextBoolean())
+                bashSubSet(tm, midPoint + (incl ? 0 : 1), max, true);
+            else
+                bashSubSet(tm.descendingSet(), midPoint + (incl ? 0 : 1), max,
+                           false);
+        } else {
+            if (rnd.nextBoolean()) {
+                bashSubSet(tm, min, midPoint - (incl ? 0 : 1), false);
+            } else {
+                bashSubSet(tm.descendingSet(), min, midPoint - (incl ? 0 : 1),
+                           true);
+            }
+        }
+
+        // subSet - pick direction and endpoint inclusion randomly
+        int rangeSize = max - min + 1;
+        int[] endpoints = new int[2];
+        endpoints[0] = min + rnd.nextInt(rangeSize);
+        endpoints[1] = min + rnd.nextInt(rangeSize);
+        Arrays.sort(endpoints);
+        boolean lowIncl = rnd.nextBoolean();
+        boolean highIncl = rnd.nextBoolean();
+        if (ascending) {
+            NavigableSet sm = set.subSet(
+                new Integer(endpoints[0]), lowIncl, new Integer(endpoints[1]), highIncl);
+            if (rnd.nextBoolean())
+                bashSubSet(sm, endpoints[0] + (lowIncl ? 0 : 1),
+                           endpoints[1] - (highIncl ? 0 : 1), true);
+            else
+                bashSubSet(sm.descendingSet(), endpoints[0] + (lowIncl ? 0 : 1),
+                           endpoints[1] - (highIncl ? 0 : 1), false);
+        } else {
+            NavigableSet sm = set.subSet(
+                new Integer(endpoints[1]), highIncl, new Integer(endpoints[0]), lowIncl);
+            if (rnd.nextBoolean())
+                bashSubSet(sm, endpoints[0] + (lowIncl ? 0 : 1),
+                           endpoints[1] - (highIncl ? 0 : 1), false);
+            else
+                bashSubSet(sm.descendingSet(), endpoints[0] + (lowIncl ? 0 : 1),
+                           endpoints[1] - (highIncl ? 0 : 1), true);
+        }
+    }
+
+    /**
+     * min and max are both inclusive.  If max < min, interval is empty.
+     */
+    void check(NavigableSet set,
+                      final int min, final int max, final boolean ascending) {
+       class ReferenceSet {
+            int lower(int element) {
+                return ascending ?
+                    lowerAscending(element) : higherAscending(element);
+            }
+            int floor(int element) {
+                return ascending ?
+                    floorAscending(element) : ceilingAscending(element);
+            }
+            int ceiling(int element) {
+                return ascending ?
+                    ceilingAscending(element) : floorAscending(element);
+            }
+            int higher(int element) {
+                return ascending ?
+                    higherAscending(element) : lowerAscending(element);
+            }
+            int first() {
+                return ascending ? firstAscending() : lastAscending();
+            }
+            int last() {
+                return ascending ? lastAscending() : firstAscending();
+            }
+            int lowerAscending(int element) {
+                return floorAscending(element - 1);
+            }
+            int floorAscending(int element) {
+                if (element < min)
+                    return -1;
+                else if (element > max)
+                    element = max;
+
+                // BitSet should support this! Test would run much faster
+                while (element >= min) {
+                    if (bs.get(element))
+                        return(element);
+                    element--;
+                }
+                return -1;
+            }
+            int ceilingAscending(int element) {
+                if (element < min)
+                    element = min;
+                else if (element > max)
+                    return -1;
+                int result = bs.nextSetBit(element);
+                return result > max ? -1 : result;
+            }
+            int higherAscending(int element) {
+                return ceilingAscending(element + 1);
+            }
+            private int firstAscending() {
+                int result = ceilingAscending(min);
+                return result > max ? -1 : result;
+            }
+            private int lastAscending() {
+                int result = floorAscending(max);
+                return result < min ? -1 : result;
+            }
+        }
+        ReferenceSet rs = new ReferenceSet();
+
+        // Test contents using containsElement
+        int size = 0;
+        for (int i = min; i <= max; i++) {
+            boolean bsContainsI = bs.get(i);
+            assertEquals(bsContainsI, set.contains(new Integer(i)));
+            if (bsContainsI)
+                size++;
+        }
+        assertEquals(set.size(), size);
+
+        // Test contents using contains elementSet iterator
+        int size2 = 0;
+        int previousElement = -1;
+        for (Iterator itr = set.iterator(); itr.hasNext();) {
+            int element = ((Integer)itr.next()).intValue();
+            assertTrue(bs.get(element));
+            size2++;
+            assertTrue(previousElement < 0 || (ascending ?
+                element - previousElement > 0 : element - previousElement < 0));
+            previousElement = element;
+        }
+        assertEquals(size2, size);
+
+        // Test navigation ops
+        for (int element = min - 1; element <= max + 1; element++) {
+            assertEq((Integer)set.lower(new Integer(element)), rs.lower(element));
+            assertEq((Integer)set.floor(new Integer(element)), rs.floor(element));
+            assertEq((Integer)set.higher(new Integer(element)), rs.higher(element));
+            assertEq((Integer)set.ceiling(new Integer(element)), rs.ceiling(element));
+        }
+
+        // Test extrema
+        if (set.size() != 0) {
+            assertEq((Integer)set.first(), rs.first());
+            assertEq((Integer)set.last(), rs.last());
+        } else {
+            assertEq(new Integer(rs.first()), -1);
+            assertEq(new Integer(rs.last()),  -1);
+            try {
+                set.first();
+                fail();
+            } catch(NoSuchElementException e) {
+                // expected
+            }
+            try {
+                set.last();
+                fail();
+            } catch(NoSuchElementException e) {
+                // expected
+            }
+        }
+    }
+
+    static void assertEq(Integer i, int j) {
+        if (i == null)
+            assertEquals(j, -1);
+        else
+            assertEquals(i.intValue(), j);
+    }
+
+    static boolean eq(Integer i, int j) {
+        return i == null ? j == -1 : i.intValue() == j;
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/TreeSubMapTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/TreeSubMapTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/TreeSubMapTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,1153 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import java.io.*;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedMap;
+import java.util.ArrayList;
+
+public class TreeSubMapTest extends JSR166TestCase {
+    public static void main(String[] args) {
+	junit.textui.TestRunner.run (suite());
+    }
+    public static Test suite() {
+	return new TestSuite(TreeSubMapTest.class);
+    }
+
+    /**
+     * Create a map from Integers 1-5 to Strings "A"-"E".
+     */
+    private static NavigableMap map5() {
+	TreeMap map = new TreeMap();
+        assertTrue(map.isEmpty());
+	map.put(zero, "Z");
+	map.put(one, "A");
+	map.put(five, "E");
+	map.put(three, "C");
+	map.put(two, "B");
+	map.put(four, "D");
+	map.put(seven, "F");
+        assertFalse(map.isEmpty());
+        assertEquals(7, map.size());
+        return map.subMap(one, true, seven, false);
+    }
+
+    private static NavigableMap map0() {
+	TreeMap map = new TreeMap();
+        assertTrue(map.isEmpty());
+        return map.tailMap(one, true);
+    }
+
+    /**
+     * Create a map from Integers -5 to -1 to Strings "A"-"E".
+     */
+    private static NavigableMap dmap5() {
+        TreeMap map = new TreeMap();
+        assertTrue(map.isEmpty());
+        map.put(m1, "A");
+        map.put(m5, "E");
+        map.put(m3, "C");
+        map.put(m2, "B");
+        map.put(m4, "D");
+        assertFalse(map.isEmpty());
+        assertEquals(5, map.size());
+        return map.descendingMap();
+    }
+
+    private static NavigableMap dmap0() {
+        TreeMap map = new TreeMap();
+        assertTrue(map.isEmpty());
+        return map;
+    }
+
+    /**
+     *  clear removes all pairs
+     */
+    public void testClear() {
+        NavigableMap map = map5();
+	map.clear();
+	assertEquals(map.size(), 0);
+    }
+
+
+    /**
+     *  Maps with same contents are equal
+     */
+    public void testEquals() {
+        NavigableMap map1 = map5();
+        NavigableMap map2 = map5();
+        assertEquals(map1, map2);
+        assertEquals(map2, map1);
+	map1.clear();
+        assertFalse(map1.equals(map2));
+        assertFalse(map2.equals(map1));
+    }
+
+    /**
+     *  containsKey returns true for contained key
+     */
+    public void testContainsKey() {
+        NavigableMap map = map5();
+	assertTrue(map.containsKey(one));
+        assertFalse(map.containsKey(zero));
+    }
+
+    /**
+     *  containsValue returns true for held values
+     */
+    public void testContainsValue() {
+        NavigableMap map = map5();
+	assertTrue(map.containsValue("A"));
+        assertFalse(map.containsValue("Z"));
+    }
+
+    /**
+     *  get returns the correct element at the given key,
+     *  or null if not present
+     */
+    public void testGet() {
+        NavigableMap map = map5();
+	assertEquals("A", (String)map.get(one));
+        NavigableMap empty = map0();
+        assertNull(empty.get(one));
+    }
+
+    /**
+     *  isEmpty is true of empty map and false for non-empty
+     */
+    public void testIsEmpty() {
+        NavigableMap empty = map0();
+        NavigableMap map = map5();
+	assertTrue(empty.isEmpty());
+        assertFalse(map.isEmpty());
+    }
+
+    /**
+     *   firstKey returns first key
+     */
+    public void testFirstKey() {
+        NavigableMap map = map5();
+	assertEquals(one, map.firstKey());
+    }
+
+    /**
+     *   lastKey returns last key
+     */
+    public void testLastKey() {
+        NavigableMap map = map5();
+	assertEquals(five, map.lastKey());
+    }
+
+
+    /**
+     *   keySet returns a Set containing all the keys
+     */
+    public void testKeySet() {
+        NavigableMap map = map5();
+	Set s = map.keySet();
+	assertEquals(5, s.size());
+	assertTrue(s.contains(one));
+	assertTrue(s.contains(two));
+	assertTrue(s.contains(three));
+	assertTrue(s.contains(four));
+	assertTrue(s.contains(five));
+    }
+
+    /**
+     *   keySet is ordered
+     */
+    public void testKeySetOrder() {
+        NavigableMap map = map5();
+	Set s = map.keySet();
+        Iterator i = s.iterator();
+        Integer last = (Integer)i.next();
+        assertEquals(last, one);
+        while (i.hasNext()) {
+            Integer k = (Integer)i.next();
+            assertTrue(last.compareTo(k) < 0);
+            last = k;
+        }
+    }
+
+    /**
+     * values collection contains all values
+     */
+    public void testValues() {
+        NavigableMap map = map5();
+	Collection s = map.values();
+	assertEquals(5, s.size());
+	assertTrue(s.contains("A"));
+	assertTrue(s.contains("B"));
+	assertTrue(s.contains("C"));
+	assertTrue(s.contains("D"));
+	assertTrue(s.contains("E"));
+    }
+
+    /**
+     * entrySet contains all pairs
+     */
+    public void testEntrySet() {
+        NavigableMap map = map5();
+	Set s = map.entrySet();
+	assertEquals(5, s.size());
+        Iterator it = s.iterator();
+        while (it.hasNext()) {
+            Map.Entry e = (Map.Entry) it.next();
+            assertTrue(
+                       (e.getKey().equals(one) && e.getValue().equals("A")) ||
+                       (e.getKey().equals(two) && e.getValue().equals("B")) ||
+                       (e.getKey().equals(three) && e.getValue().equals("C")) ||
+                       (e.getKey().equals(four) && e.getValue().equals("D")) ||
+                       (e.getKey().equals(five) && e.getValue().equals("E")));
+        }
+    }
+
+    /**
+     *   putAll  adds all key-value pairs from the given map
+     */
+    public void testPutAll() {
+        NavigableMap empty = map0();
+        NavigableMap map = map5();
+	empty.putAll(map);
+	assertEquals(5, empty.size());
+	assertTrue(empty.containsKey(one));
+	assertTrue(empty.containsKey(two));
+	assertTrue(empty.containsKey(three));
+	assertTrue(empty.containsKey(four));
+	assertTrue(empty.containsKey(five));
+    }
+
+    /**
+     *   remove removes the correct key-value pair from the map
+     */
+    public void testRemove() {
+        NavigableMap map = map5();
+	map.remove(five);
+	assertEquals(4, map.size());
+	assertFalse(map.containsKey(five));
+    }
+
+    /**
+     * lowerEntry returns preceding entry.
+     */
+    public void testLowerEntry() {
+        NavigableMap map = map5();
+        Map.Entry e1 = map.lowerEntry(three);
+        assertEquals(two, e1.getKey());
+
+        Map.Entry e2 = map.lowerEntry(six);
+        assertEquals(five, e2.getKey());
+
+        Map.Entry e3 = map.lowerEntry(one);
+        assertNull(e3);
+
+        Map.Entry e4 = map.lowerEntry(zero);
+        assertNull(e4);
+
+    }
+
+    /**
+     * higherEntry returns next entry.
+     */
+    public void testHigherEntry() {
+        NavigableMap map = map5();
+        Map.Entry e1 = map.higherEntry(three);
+        assertEquals(four, e1.getKey());
+
+        Map.Entry e2 = map.higherEntry(zero);
+        assertEquals(one, e2.getKey());
+
+        Map.Entry e3 = map.higherEntry(five);
+        assertNull(e3);
+
+        Map.Entry e4 = map.higherEntry(six);
+        assertNull(e4);
+
+    }
+
+    /**
+     * floorEntry returns preceding entry.
+     */
+    public void testFloorEntry() {
+        NavigableMap map = map5();
+        Map.Entry e1 = map.floorEntry(three);
+        assertEquals(three, e1.getKey());
+
+        Map.Entry e2 = map.floorEntry(six);
+        assertEquals(five, e2.getKey());
+
+        Map.Entry e3 = map.floorEntry(one);
+        assertEquals(one, e3.getKey());
+
+        Map.Entry e4 = map.floorEntry(zero);
+        assertNull(e4);
+
+    }
+
+    /**
+     * ceilingEntry returns next entry.
+     */
+    public void testCeilingEntry() {
+        NavigableMap map = map5();
+        Map.Entry e1 = map.ceilingEntry(three);
+        assertEquals(three, e1.getKey());
+
+        Map.Entry e2 = map.ceilingEntry(zero);
+        assertEquals(one, e2.getKey());
+
+        Map.Entry e3 = map.ceilingEntry(five);
+        assertEquals(five, e3.getKey());
+
+        Map.Entry e4 = map.ceilingEntry(six);
+        assertNull(e4);
+
+    }
+
+    /**
+     * pollFirstEntry returns entries in order
+     */
+    public void testPollFirstEntry() {
+        NavigableMap map = map5();
+        Map.Entry e = map.pollFirstEntry();
+        assertEquals(one, e.getKey());
+        assertEquals("A", e.getValue());
+        e = map.pollFirstEntry();
+        assertEquals(two, e.getKey());
+        map.put(one, "A");
+        e = map.pollFirstEntry();
+        assertEquals(one, e.getKey());
+        assertEquals("A", e.getValue());
+        e = map.pollFirstEntry();
+        assertEquals(three, e.getKey());
+        map.remove(four);
+        e = map.pollFirstEntry();
+        assertEquals(five, e.getKey());
+        try {
+            e.setValue("A");
+            shouldThrow();
+        } catch (Exception ok) {
+        }
+        assertTrue(map.isEmpty());
+        Map.Entry f = map.firstEntry();
+        assertNull(f);
+        e = map.pollFirstEntry();
+        assertNull(e);
+    }
+
+    /**
+     * pollLastEntry returns entries in order
+     */
+    public void testPollLastEntry() {
+        NavigableMap map = map5();
+        Map.Entry e = map.pollLastEntry();
+        assertEquals(five, e.getKey());
+        assertEquals("E", e.getValue());
+        e = map.pollLastEntry();
+        assertEquals(four, e.getKey());
+        map.put(five, "E");
+        e = map.pollLastEntry();
+        assertEquals(five, e.getKey());
+        assertEquals("E", e.getValue());
+        e = map.pollLastEntry();
+        assertEquals(three, e.getKey());
+        map.remove(two);
+        e = map.pollLastEntry();
+        assertEquals(one, e.getKey());
+        try {
+            e.setValue("E");
+            shouldThrow();
+        } catch (Exception ok) {
+        }
+        e = map.pollLastEntry();
+        assertNull(e);
+    }
+
+    /**
+     *   size returns the correct values
+     */
+    public void testSize() {
+        NavigableMap map = map5();
+        NavigableMap empty = map0();
+	assertEquals(0, empty.size());
+	assertEquals(5, map.size());
+    }
+
+    /**
+     * toString contains toString of elements
+     */
+    public void testToString() {
+        NavigableMap map = map5();
+        String s = map.toString();
+        for (int i = 1; i <= 5; ++i) {
+            assertTrue(s.indexOf(String.valueOf(i)) >= 0);
+        }
+    }
+
+    // Exception tests
+
+    /**
+     * get(null) of nonempty map throws NPE
+     */
+    public void testGet_NullPointerException() {
+        try {
+            NavigableMap c = map5();
+            c.get(null);
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * containsKey(null) of nonempty map throws NPE
+     */
+    public void testContainsKey_NullPointerException() {
+        try {
+            NavigableMap c = map5();
+            c.containsKey(null);
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * put(null,x) throws NPE
+     */
+    public void testPut1_NullPointerException() {
+        try {
+            NavigableMap c = map5();
+            c.put(null, "whatever");
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * remove(null) throws NPE
+     */
+    public void testRemove1_NullPointerException() {
+        try {
+            NavigableMap c = map5();
+            c.remove(null);
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * A deserialized map equals original
+     */
+    public void testSerialization() {
+        NavigableMap q = map5();
+
+        try {
+            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
+            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
+            out.writeObject(q);
+            out.close();
+
+            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
+            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
+            NavigableMap r = (NavigableMap)in.readObject();
+            assertFalse(r.isEmpty());
+            assertEquals(q.size(), r.size());
+            assertTrue(q.equals(r));
+            assertTrue(r.equals(q));
+        } catch(Exception e){
+            e.printStackTrace();
+            unexpectedException();
+        }
+    }
+
+
+
+    /**
+     * subMap returns map with keys in requested range
+     */
+    public void testSubMapContents() {
+        NavigableMap map = map5();
+        SortedMap sm = map.subMap(two, four);
+        assertEquals(two, sm.firstKey());
+        assertEquals(three, sm.lastKey());
+        assertEquals(2, sm.size());
+        assertFalse(sm.containsKey(one));
+        assertTrue(sm.containsKey(two));
+        assertTrue(sm.containsKey(three));
+        assertFalse(sm.containsKey(four));
+        assertFalse(sm.containsKey(five));
+        Iterator i = sm.keySet().iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(two, k);
+        k = (Integer)(i.next());
+        assertEquals(three, k);
+        assertFalse(i.hasNext());
+        Iterator j = sm.keySet().iterator();
+        j.next();
+        j.remove();
+        assertFalse(map.containsKey(two));
+        assertEquals(4, map.size());
+        assertEquals(1, sm.size());
+        assertEquals(three, sm.firstKey());
+        assertEquals(three, sm.lastKey());
+        assertTrue(sm.remove(three) != null);
+        assertTrue(sm.isEmpty());
+        assertEquals(3, map.size());
+    }
+
+    public void testSubMapContents2() {
+        NavigableMap map = map5();
+        SortedMap sm = map.subMap(two, three);
+        assertEquals(1, sm.size());
+        assertEquals(two, sm.firstKey());
+        assertEquals(two, sm.lastKey());
+        assertFalse(sm.containsKey(one));
+        assertTrue(sm.containsKey(two));
+        assertFalse(sm.containsKey(three));
+        assertFalse(sm.containsKey(four));
+        assertFalse(sm.containsKey(five));
+        Iterator i = sm.keySet().iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(two, k);
+        assertFalse(i.hasNext());
+        Iterator j = sm.keySet().iterator();
+        j.next();
+        j.remove();
+        assertFalse(map.containsKey(two));
+        assertEquals(4, map.size());
+        assertEquals(0, sm.size());
+        assertTrue(sm.isEmpty());
+        assertTrue(sm.remove(three) == null);
+        assertEquals(4, map.size());
+    }
+
+    /**
+     * headMap returns map with keys in requested range
+     */
+    public void testHeadMapContents() {
+        NavigableMap map = map5();
+        SortedMap sm = map.headMap(four);
+        assertTrue(sm.containsKey(one));
+        assertTrue(sm.containsKey(two));
+        assertTrue(sm.containsKey(three));
+        assertFalse(sm.containsKey(four));
+        assertFalse(sm.containsKey(five));
+        Iterator i = sm.keySet().iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(one, k);
+        k = (Integer)(i.next());
+        assertEquals(two, k);
+        k = (Integer)(i.next());
+        assertEquals(three, k);
+        assertFalse(i.hasNext());
+        sm.clear();
+        assertTrue(sm.isEmpty());
+        assertEquals(2, map.size());
+        assertEquals(four, map.firstKey());
+    }
+
+    /**
+     * headMap returns map with keys in requested range
+     */
+    public void testTailMapContents() {
+        NavigableMap map = map5();
+        SortedMap sm = map.tailMap(two);
+        assertFalse(sm.containsKey(one));
+        assertTrue(sm.containsKey(two));
+        assertTrue(sm.containsKey(three));
+        assertTrue(sm.containsKey(four));
+        assertTrue(sm.containsKey(five));
+        Iterator i = sm.keySet().iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(two, k);
+        k = (Integer)(i.next());
+        assertEquals(three, k);
+        k = (Integer)(i.next());
+        assertEquals(four, k);
+        k = (Integer)(i.next());
+        assertEquals(five, k);
+        assertFalse(i.hasNext());
+
+        Iterator ei = sm.entrySet().iterator();
+        Map.Entry e;
+        e = (Map.Entry)(ei.next());
+        assertEquals(two, e.getKey());
+        assertEquals("B", e.getValue());
+        e = (Map.Entry)(ei.next());
+        assertEquals(three, e.getKey());
+        assertEquals("C", e.getValue());
+        e = (Map.Entry)(ei.next());
+        assertEquals(four, e.getKey());
+        assertEquals("D", e.getValue());
+        e = (Map.Entry)(ei.next());
+        assertEquals(five, e.getKey());
+        assertEquals("E", e.getValue());
+        assertFalse(i.hasNext());
+
+        SortedMap ssm = sm.tailMap(four);
+        assertEquals(four, ssm.firstKey());
+        assertEquals(five, ssm.lastKey());
+        assertTrue(ssm.remove(four) != null);
+        assertEquals(1, ssm.size());
+        assertEquals(3, sm.size());
+        assertEquals(4, map.size());
+    }
+
+    /**
+     *  clear removes all pairs
+     */
+    public void testDescendingClear() {
+        NavigableMap map = dmap5();
+        map.clear();
+        assertEquals(map.size(), 0);
+    }
+
+
+    /**
+     *  Maps with same contents are equal
+     */
+    public void testDescendingEquals() {
+        NavigableMap map1 = dmap5();
+        NavigableMap map2 = dmap5();
+        assertEquals(map1, map2);
+        assertEquals(map2, map1);
+        map1.clear();
+        assertFalse(map1.equals(map2));
+        assertFalse(map2.equals(map1));
+    }
+
+    /**
+     *  containsKey returns true for contained key
+     */
+    public void testDescendingContainsKey() {
+        NavigableMap map = dmap5();
+        assertTrue(map.containsKey(m1));
+        assertFalse(map.containsKey(zero));
+    }
+
+    /**
+     *  containsValue returns true for held values
+     */
+    public void testDescendingContainsValue() {
+        NavigableMap map = dmap5();
+        assertTrue(map.containsValue("A"));
+        assertFalse(map.containsValue("Z"));
+    }
+
+    /**
+     *  get returns the correct element at the given key,
+     *  or null if not present
+     */
+    public void testDescendingGet() {
+        NavigableMap map = dmap5();
+        assertEquals("A", (String)map.get(m1));
+        NavigableMap empty = dmap0();
+        assertNull(empty.get(m1));
+    }
+
+    /**
+     *  isEmpty is true of empty map and false for non-empty
+     */
+    public void testDescendingIsEmpty() {
+        NavigableMap empty = dmap0();
+        NavigableMap map = dmap5();
+        assertTrue(empty.isEmpty());
+        assertFalse(map.isEmpty());
+    }
+
+    /**
+     *   firstKey returns first key
+     */
+    public void testDescendingFirstKey() {
+        NavigableMap map = dmap5();
+        assertEquals(m1, map.firstKey());
+    }
+
+    /**
+     *   lastKey returns last key
+     */
+    public void testDescendingLastKey() {
+        NavigableMap map = dmap5();
+        assertEquals(m5, map.lastKey());
+    }
+
+
+    /**
+     *   keySet returns a Set containing all the keys
+     */
+    public void testDescendingKeySet() {
+        NavigableMap map = dmap5();
+        Set s = map.keySet();
+        assertEquals(5, s.size());
+        assertTrue(s.contains(m1));
+        assertTrue(s.contains(m2));
+        assertTrue(s.contains(m3));
+        assertTrue(s.contains(m4));
+        assertTrue(s.contains(m5));
+    }
+
+    /**
+     *   keySet is ordered
+     */
+    public void testDescendingKeySetOrder() {
+        NavigableMap map = dmap5();
+        Set s = map.keySet();
+        Iterator i = s.iterator();
+        Integer last = (Integer)i.next();
+        assertEquals(last, m1);
+        while (i.hasNext()) {
+            Integer k = (Integer)i.next();
+            assertTrue(last.compareTo(k) > 0);
+            last = k;
+        }
+    }
+
+    /**
+     * values collection contains all values
+     */
+    public void testDescendingValues() {
+        NavigableMap map = dmap5();
+        Collection s = map.values();
+        assertEquals(5, s.size());
+        assertTrue(s.contains("A"));
+        assertTrue(s.contains("B"));
+        assertTrue(s.contains("C"));
+        assertTrue(s.contains("D"));
+        assertTrue(s.contains("E"));
+    }
+
+    /**
+     *  keySet.toArray returns contains all keys
+     */
+    public void testDescendingAscendingKeySetToArray() {
+        NavigableMap map = dmap5();
+        Set s = map.keySet();
+        Object[] ar = s.toArray();
+        assertTrue(s.containsAll(Arrays.asList(ar)));
+        assertEquals(5, ar.length);
+        ar[0] = m10;
+        assertFalse(s.containsAll(Arrays.asList(ar)));
+    }
+
+    /**
+     *  descendingkeySet.toArray returns contains all keys
+     */
+    public void testDescendingDescendingKeySetToArray() {
+        NavigableMap map = dmap5();
+        Set s = map.descendingKeySet();
+        Object[] ar = s.toArray();
+        assertEquals(5, ar.length);
+        assertTrue(s.containsAll(Arrays.asList(ar)));
+        ar[0] = m10;
+        assertFalse(s.containsAll(Arrays.asList(ar)));
+    }
+
+    /**
+     *  Values.toArray contains all values
+     */
+    public void testDescendingValuesToArray() {
+        NavigableMap map = dmap5();
+        Collection v = map.values();
+        Object[] ar = v.toArray();
+        ArrayList s = new ArrayList(Arrays.asList(ar));
+        assertEquals(5, ar.length);
+        assertTrue(s.contains("A"));
+        assertTrue(s.contains("B"));
+        assertTrue(s.contains("C"));
+        assertTrue(s.contains("D"));
+        assertTrue(s.contains("E"));
+    }
+
+
+    /**
+     * entrySet contains all pairs
+     */
+    public void testDescendingEntrySet() {
+        NavigableMap map = dmap5();
+        Set s = map.entrySet();
+        assertEquals(5, s.size());
+        Iterator it = s.iterator();
+        while (it.hasNext()) {
+            Map.Entry e = (Map.Entry) it.next();
+            assertTrue(
+                       (e.getKey().equals(m1) && e.getValue().equals("A")) ||
+                       (e.getKey().equals(m2) && e.getValue().equals("B")) ||
+                       (e.getKey().equals(m3) && e.getValue().equals("C")) ||
+                       (e.getKey().equals(m4) && e.getValue().equals("D")) ||
+                       (e.getKey().equals(m5) && e.getValue().equals("E")));
+        }
+    }
+
+    /**
+     *   putAll  adds all key-value pairs from the given map
+     */
+    public void testDescendingPutAll() {
+        NavigableMap empty = dmap0();
+        NavigableMap map = dmap5();
+        empty.putAll(map);
+        assertEquals(5, empty.size());
+        assertTrue(empty.containsKey(m1));
+        assertTrue(empty.containsKey(m2));
+        assertTrue(empty.containsKey(m3));
+        assertTrue(empty.containsKey(m4));
+        assertTrue(empty.containsKey(m5));
+    }
+
+
+    /**
+     *   remove removes the correct key-value pair from the map
+     */
+    public void testDescendingRemove() {
+        NavigableMap map = dmap5();
+        map.remove(m5);
+        assertEquals(4, map.size());
+        assertFalse(map.containsKey(m5));
+    }
+
+    /**
+     * lowerEntry returns preceding entry.
+     */
+    public void testDescendingLowerEntry() {
+        NavigableMap map = dmap5();
+        Map.Entry e1 = map.lowerEntry(m3);
+        assertEquals(m2, e1.getKey());
+
+        Map.Entry e2 = map.lowerEntry(m6);
+        assertEquals(m5, e2.getKey());
+
+        Map.Entry e3 = map.lowerEntry(m1);
+        assertNull(e3);
+
+        Map.Entry e4 = map.lowerEntry(zero);
+        assertNull(e4);
+
+    }
+
+    /**
+     * higherEntry returns next entry.
+     */
+    public void testDescendingHigherEntry() {
+        NavigableMap map = dmap5();
+        Map.Entry e1 = map.higherEntry(m3);
+        assertEquals(m4, e1.getKey());
+
+        Map.Entry e2 = map.higherEntry(zero);
+        assertEquals(m1, e2.getKey());
+
+        Map.Entry e3 = map.higherEntry(m5);
+        assertNull(e3);
+
+        Map.Entry e4 = map.higherEntry(m6);
+        assertNull(e4);
+
+    }
+
+    /**
+     * floorEntry returns preceding entry.
+     */
+    public void testDescendingFloorEntry() {
+        NavigableMap map = dmap5();
+        Map.Entry e1 = map.floorEntry(m3);
+        assertEquals(m3, e1.getKey());
+
+        Map.Entry e2 = map.floorEntry(m6);
+        assertEquals(m5, e2.getKey());
+
+        Map.Entry e3 = map.floorEntry(m1);
+        assertEquals(m1, e3.getKey());
+
+        Map.Entry e4 = map.floorEntry(zero);
+        assertNull(e4);
+
+    }
+
+    /**
+     * ceilingEntry returns next entry.
+     */
+    public void testDescendingCeilingEntry() {
+        NavigableMap map = dmap5();
+        Map.Entry e1 = map.ceilingEntry(m3);
+        assertEquals(m3, e1.getKey());
+
+        Map.Entry e2 = map.ceilingEntry(zero);
+        assertEquals(m1, e2.getKey());
+
+        Map.Entry e3 = map.ceilingEntry(m5);
+        assertEquals(m5, e3.getKey());
+
+        Map.Entry e4 = map.ceilingEntry(m6);
+        assertNull(e4);
+
+    }
+
+    /**
+     * pollFirstEntry returns entries in order
+     */
+    public void testDescendingPollFirstEntry() {
+        NavigableMap map = dmap5();
+        Map.Entry e = map.pollFirstEntry();
+        assertEquals(m1, e.getKey());
+        assertEquals("A", e.getValue());
+        e = map.pollFirstEntry();
+        assertEquals(m2, e.getKey());
+        map.put(m1, "A");
+        e = map.pollFirstEntry();
+        assertEquals(m1, e.getKey());
+        assertEquals("A", e.getValue());
+        e = map.pollFirstEntry();
+        assertEquals(m3, e.getKey());
+        map.remove(m4);
+        e = map.pollFirstEntry();
+        assertEquals(m5, e.getKey());
+        try {
+            e.setValue("A");
+            shouldThrow();
+        } catch (Exception ok) {
+        }
+        e = map.pollFirstEntry();
+        assertNull(e);
+    }
+
+    /**
+     * pollLastEntry returns entries in order
+     */
+    public void testDescendingPollLastEntry() {
+        NavigableMap map = dmap5();
+        Map.Entry e = map.pollLastEntry();
+        assertEquals(m5, e.getKey());
+        assertEquals("E", e.getValue());
+        e = map.pollLastEntry();
+        assertEquals(m4, e.getKey());
+        map.put(m5, "E");
+        e = map.pollLastEntry();
+        assertEquals(m5, e.getKey());
+        assertEquals("E", e.getValue());
+        e = map.pollLastEntry();
+        assertEquals(m3, e.getKey());
+        map.remove(m2);
+        e = map.pollLastEntry();
+        assertEquals(m1, e.getKey());
+        try {
+            e.setValue("E");
+            shouldThrow();
+        } catch (Exception ok) {
+        }
+        e = map.pollLastEntry();
+        assertNull(e);
+    }
+
+    /**
+     *   size returns the correct values
+     */
+    public void testDescendingSize() {
+        NavigableMap map = dmap5();
+        NavigableMap empty = dmap0();
+        assertEquals(0, empty.size());
+        assertEquals(5, map.size());
+    }
+
+    /**
+     * toString contains toString of elements
+     */
+    public void testDescendingToString() {
+        NavigableMap map = dmap5();
+        String s = map.toString();
+        for (int i = 1; i <= 5; ++i) {
+            assertTrue(s.indexOf(String.valueOf(i)) >= 0);
+        }
+    }
+
+    // Exception testDescendings
+
+    /**
+     * get(null) of nonempty map throws NPE
+     */
+    public void testDescendingGet_NullPointerException() {
+        try {
+            NavigableMap c = dmap5();
+            c.get(null);
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * put(null,x) throws NPE
+     */
+    public void testDescendingPut1_NullPointerException() {
+        try {
+            NavigableMap c = dmap5();
+            c.put(null, "whatever");
+            shouldThrow();
+        } catch(NullPointerException e){}
+    }
+
+    /**
+     * A deserialized map equals original
+     */
+    public void testDescendingSerialization() {
+        NavigableMap q = dmap5();
+
+        try {
+            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
+            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
+            out.writeObject(q);
+            out.close();
+
+            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
+            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
+            NavigableMap r = (NavigableMap)in.readObject();
+            assertEquals(q.size(), r.size());
+            assertTrue(q.equals(r));
+            assertTrue(r.equals(q));
+        } catch(Exception e){
+            e.printStackTrace();
+            unexpectedException();
+        }
+    }
+
+
+
+    /**
+     * subMap returns map with keys in requested range
+     */
+    public void testDescendingSubMapContents() {
+        NavigableMap map = dmap5();
+        SortedMap sm = map.subMap(m2, m4);
+        assertEquals(m2, sm.firstKey());
+        assertEquals(m3, sm.lastKey());
+        assertEquals(2, sm.size());
+        assertFalse(sm.containsKey(m1));
+        assertTrue(sm.containsKey(m2));
+        assertTrue(sm.containsKey(m3));
+        assertFalse(sm.containsKey(m4));
+        assertFalse(sm.containsKey(m5));
+        Iterator i = sm.keySet().iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(m2, k);
+        k = (Integer)(i.next());
+        assertEquals(m3, k);
+        assertFalse(i.hasNext());
+        Iterator j = sm.keySet().iterator();
+        j.next();
+        j.remove();
+        assertFalse(map.containsKey(m2));
+        assertEquals(4, map.size());
+        assertEquals(1, sm.size());
+        assertEquals(m3, sm.firstKey());
+        assertEquals(m3, sm.lastKey());
+        assertTrue(sm.remove(m3) != null);
+        assertTrue(sm.isEmpty());
+        assertEquals(3, map.size());
+    }
+
+    public void testDescendingSubMapContents2() {
+        NavigableMap map = dmap5();
+        SortedMap sm = map.subMap(m2, m3);
+        assertEquals(1, sm.size());
+        assertEquals(m2, sm.firstKey());
+        assertEquals(m2, sm.lastKey());
+        assertFalse(sm.containsKey(m1));
+        assertTrue(sm.containsKey(m2));
+        assertFalse(sm.containsKey(m3));
+        assertFalse(sm.containsKey(m4));
+        assertFalse(sm.containsKey(m5));
+        Iterator i = sm.keySet().iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(m2, k);
+        assertFalse(i.hasNext());
+        Iterator j = sm.keySet().iterator();
+        j.next();
+        j.remove();
+        assertFalse(map.containsKey(m2));
+        assertEquals(4, map.size());
+        assertEquals(0, sm.size());
+        assertTrue(sm.isEmpty());
+        assertTrue(sm.remove(m3) == null);
+        assertEquals(4, map.size());
+    }
+
+    /**
+     * headMap returns map with keys in requested range
+     */
+    public void testDescendingHeadMapContents() {
+        NavigableMap map = dmap5();
+        SortedMap sm = map.headMap(m4);
+        assertTrue(sm.containsKey(m1));
+        assertTrue(sm.containsKey(m2));
+        assertTrue(sm.containsKey(m3));
+        assertFalse(sm.containsKey(m4));
+        assertFalse(sm.containsKey(m5));
+        Iterator i = sm.keySet().iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(m1, k);
+        k = (Integer)(i.next());
+        assertEquals(m2, k);
+        k = (Integer)(i.next());
+        assertEquals(m3, k);
+        assertFalse(i.hasNext());
+        sm.clear();
+        assertTrue(sm.isEmpty());
+        assertEquals(2, map.size());
+        assertEquals(m4, map.firstKey());
+    }
+
+    /**
+     * headMap returns map with keys in requested range
+     */
+    public void testDescendingTailMapContents() {
+        NavigableMap map = dmap5();
+        SortedMap sm = map.tailMap(m2);
+        assertFalse(sm.containsKey(m1));
+        assertTrue(sm.containsKey(m2));
+        assertTrue(sm.containsKey(m3));
+        assertTrue(sm.containsKey(m4));
+        assertTrue(sm.containsKey(m5));
+        Iterator i = sm.keySet().iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(m2, k);
+        k = (Integer)(i.next());
+        assertEquals(m3, k);
+        k = (Integer)(i.next());
+        assertEquals(m4, k);
+        k = (Integer)(i.next());
+        assertEquals(m5, k);
+        assertFalse(i.hasNext());
+
+        Iterator ei = sm.entrySet().iterator();
+        Map.Entry e;
+        e = (Map.Entry)(ei.next());
+        assertEquals(m2, e.getKey());
+        assertEquals("B", e.getValue());
+        e = (Map.Entry)(ei.next());
+        assertEquals(m3, e.getKey());
+        assertEquals("C", e.getValue());
+        e = (Map.Entry)(ei.next());
+        assertEquals(m4, e.getKey());
+        assertEquals("D", e.getValue());
+        e = (Map.Entry)(ei.next());
+        assertEquals(m5, e.getKey());
+        assertEquals("E", e.getValue());
+        assertFalse(i.hasNext());
+
+        SortedMap ssm = sm.tailMap(m4);
+        assertEquals(m4, ssm.firstKey());
+        assertEquals(m5, ssm.lastKey());
+        assertTrue(ssm.remove(m4) != null);
+        assertEquals(1, ssm.size());
+        assertEquals(3, sm.size());
+        assertEquals(4, map.size());
+    }
+
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/src/TreeSubSetTest.java
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/src/TreeSubSetTest.java	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/src/TreeSubSetTest.java	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,1143 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+import junit.framework.*;
+import edu.emory.mathcs.backport.java.util.*;
+import edu.emory.mathcs.backport.java.util.concurrent.*;
+import java.io.*;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.SortedSet;
+
+public class TreeSubSetTest extends JSR166TestCase {
+    public static void main(String[] args) {
+	junit.textui.TestRunner.run (suite());
+    }
+    public static Test suite() {
+	return new TestSuite(TreeSubSetTest.class);
+    }
+
+    static class MyReverseComparator implements Comparator {
+        public int compare(Object x, Object y) {
+            int i = ((Integer)x).intValue();
+            int j = ((Integer)y).intValue();
+            if (i < j) return 1;
+            if (i > j) return -1;
+            return 0;
+        }
+    }
+
+    /**
+     * Create a set of given size containing consecutive
+     * Integers 0 ... n.
+     */
+    private NavigableSet populatedSet(int n) {
+        TreeSet q = new TreeSet();
+        assertTrue(q.isEmpty());
+
+	for(int i = n-1; i >= 0; i-=2)
+	    assertTrue(q.add(new Integer(i)));
+	for(int i = (n & 1); i < n; i+=2)
+	    assertTrue(q.add(new Integer(i)));
+        assertTrue(q.add(new Integer(-n)));
+        assertTrue(q.add(new Integer(n)));
+        NavigableSet s = q.subSet(new Integer(0), true, new Integer(n), false);
+        assertFalse(s.isEmpty());
+	assertEquals(n, s.size());
+        return s;
+    }
+
+    /**
+     * Create set of first 5 ints
+     */
+    private NavigableSet set5() {
+        TreeSet q = new TreeSet();
+        assertTrue(q.isEmpty());
+        q.add(one);
+        q.add(two);
+        q.add(three);
+        q.add(four);
+        q.add(five);
+        q.add(zero);
+        q.add(seven);
+        NavigableSet s = q.subSet(one, true, seven, false);
+        assertEquals(5, s.size());
+        return s;
+    }
+
+    private NavigableSet dset5() {
+        TreeSet q = new TreeSet();
+        assertTrue(q.isEmpty());
+        q.add(m1);
+        q.add(m2);
+        q.add(m3);
+        q.add(m4);
+        q.add(m5);
+        NavigableSet s = q.descendingSet();
+	assertEquals(5, s.size());
+        return s;
+    }
+
+    private static NavigableSet set0() {
+	TreeSet set = new TreeSet();
+        assertTrue(set.isEmpty());
+        return set.tailSet(m1, false);
+    }
+
+    private static NavigableSet dset0() {
+	TreeSet set = new TreeSet();
+        assertTrue(set.isEmpty());
+        return set;
+    }
+
+    /**
+     * A new set has unbounded capacity
+     */
+    public void testConstructor1() {
+        assertEquals(0, set0().size());
+    }
+
+
+    /**
+     * isEmpty is true before add, false after
+     */
+    public void testEmpty() {
+        NavigableSet q = set0();
+        assertTrue(q.isEmpty());
+        q.add(new Integer(1));
+        assertFalse(q.isEmpty());
+        q.add(new Integer(2));
+        q.pollFirst();
+        q.pollFirst();
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * size changes when elements added and removed
+     */
+    public void testSize() {
+        NavigableSet q = populatedSet(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(SIZE-i, q.size());
+            q.pollFirst();
+        }
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, q.size());
+            q.add(new Integer(i));
+        }
+    }
+
+    /**
+     * add(null) throws NPE
+     */
+    public void testAddNull() {
+	try {
+            NavigableSet q = set0();
+            q.add(null);
+            shouldThrow();
+        } catch (NullPointerException success) { }
+    }
+
+    /**
+     * Add of comparable element succeeds
+     */
+    public void testAdd() {
+        NavigableSet q = set0();
+        assertTrue(q.add(six));
+    }
+
+    /**
+     * Add of duplicate element fails
+     */
+    public void testAddDup() {
+        NavigableSet q = set0();
+        assertTrue(q.add(six));
+        assertFalse(q.add(six));
+    }
+
+    /**
+     * Add of non-Comparable throws CCE
+     */
+    public void testAddNonComparable() {
+        try {
+            NavigableSet q = set0();
+            q.add(new Object());
+            q.add(new Object());
+            q.add(new Object());
+            shouldThrow();
+        }
+        catch(ClassCastException success) {}
+    }
+
+
+    /**
+     * addAll(null) throws NPE
+     */
+    public void testAddAll1() {
+        try {
+            NavigableSet q = set0();
+            q.addAll(null);
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+    /**
+     * addAll of a collection with null elements throws NPE
+     */
+    public void testAddAll2() {
+        try {
+            NavigableSet q = set0();
+            Integer[] ints = new Integer[SIZE];
+            q.addAll(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+    /**
+     * addAll of a collection with any null elements throws NPE after
+     * possibly adding some elements
+     */
+    public void testAddAll3() {
+        try {
+            NavigableSet q = set0();
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE-1; ++i)
+                ints[i] = new Integer(i+SIZE);
+            q.addAll(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Set contains all elements of successful addAll
+     */
+    public void testAddAll5() {
+        try {
+            Integer[] empty = new Integer[0];
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE; ++i)
+                ints[i] = new Integer(SIZE-1- i);
+            NavigableSet q = set0();
+            assertFalse(q.addAll(Arrays.asList(empty)));
+            assertTrue(q.addAll(Arrays.asList(ints)));
+            for (int i = 0; i < SIZE; ++i)
+                assertEquals(new Integer(i), q.pollFirst());
+        }
+        finally {}
+    }
+
+    /**
+     * poll succeeds unless empty
+     */
+    public void testPoll() {
+        NavigableSet q = populatedSet(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.pollFirst()).intValue());
+        }
+	assertNull(q.pollFirst());
+    }
+
+    /**
+     * remove(x) removes x and returns true if present
+     */
+    public void testRemoveElement() {
+        NavigableSet q = populatedSet(SIZE);
+        for (int i = 1; i < SIZE; i+=2) {
+            assertTrue(q.remove(new Integer(i)));
+        }
+        for (int i = 0; i < SIZE; i+=2) {
+            assertTrue(q.remove(new Integer(i)));
+            assertFalse(q.remove(new Integer(i+1)));
+        }
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * contains(x) reports true when elements added but not yet removed
+     */
+    public void testContains() {
+        NavigableSet q = populatedSet(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(q.contains(new Integer(i)));
+            q.pollFirst();
+            assertFalse(q.contains(new Integer(i)));
+        }
+    }
+
+    /**
+     * clear removes all elements
+     */
+    public void testClear() {
+        NavigableSet q = populatedSet(SIZE);
+        q.clear();
+        assertTrue(q.isEmpty());
+        assertEquals(0, q.size());
+        q.add(new Integer(1));
+        assertFalse(q.isEmpty());
+        q.clear();
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * containsAll(c) is true when c contains a subset of elements
+     */
+    public void testContainsAll() {
+        NavigableSet q = populatedSet(SIZE);
+        NavigableSet p = set0();
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(q.containsAll(p));
+            assertFalse(p.containsAll(q));
+            p.add(new Integer(i));
+        }
+        assertTrue(p.containsAll(q));
+    }
+
+    /**
+     * retainAll(c) retains only those elements of c and reports true if changed
+     */
+    public void testRetainAll() {
+        NavigableSet q = populatedSet(SIZE);
+        NavigableSet p = populatedSet(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            boolean changed = q.retainAll(p);
+            if (i == 0)
+                assertFalse(changed);
+            else
+                assertTrue(changed);
+
+            assertTrue(q.containsAll(p));
+            assertEquals(SIZE-i, q.size());
+            p.pollFirst();
+        }
+    }
+
+    /**
+     * removeAll(c) removes only those elements of c and reports true if changed
+     */
+    public void testRemoveAll() {
+        for (int i = 1; i < SIZE; ++i) {
+            NavigableSet q = populatedSet(SIZE);
+            NavigableSet p = populatedSet(i);
+            assertTrue(q.removeAll(p));
+            assertEquals(SIZE-i, q.size());
+            for (int j = 0; j < i; ++j) {
+                Integer I = (Integer)(p.pollFirst());
+                assertFalse(q.contains(I));
+            }
+        }
+    }
+
+
+
+    /**
+     * lower returns preceding element
+     */
+    public void testLower() {
+        NavigableSet q = set5();
+        Object e1 = q.lower(three);
+        assertEquals(two, e1);
+
+        Object e2 = q.lower(six);
+        assertEquals(five, e2);
+
+        Object e3 = q.lower(one);
+        assertNull(e3);
+
+        Object e4 = q.lower(zero);
+        assertNull(e4);
+
+    }
+
+    /**
+     * higher returns next element
+     */
+    public void testHigher() {
+        NavigableSet q = set5();
+        Object e1 = q.higher(three);
+        assertEquals(four, e1);
+
+        Object e2 = q.higher(zero);
+        assertEquals(one, e2);
+
+        Object e3 = q.higher(five);
+        assertNull(e3);
+
+        Object e4 = q.higher(six);
+        assertNull(e4);
+
+    }
+
+    /**
+     * floor returns preceding element
+     */
+    public void testFloor() {
+        NavigableSet q = set5();
+        Object e1 = q.floor(three);
+        assertEquals(three, e1);
+
+        Object e2 = q.floor(six);
+        assertEquals(five, e2);
+
+        Object e3 = q.floor(one);
+        assertEquals(one, e3);
+
+        Object e4 = q.floor(zero);
+        assertNull(e4);
+
+    }
+
+    /**
+     * ceiling returns next element
+     */
+    public void testCeiling() {
+        NavigableSet q = set5();
+        Object e1 = q.ceiling(three);
+        assertEquals(three, e1);
+
+        Object e2 = q.ceiling(zero);
+        assertEquals(one, e2);
+
+        Object e3 = q.ceiling(five);
+        assertEquals(five, e3);
+
+        Object e4 = q.ceiling(six);
+        assertNull(e4);
+
+    }
+
+    /**
+     * toArray contains all elements
+     */
+    public void testToArray() {
+        NavigableSet q = populatedSet(SIZE);
+	Object[] o = q.toArray();
+        Arrays.sort(o);
+	for(int i = 0; i < o.length; i++)
+	    assertEquals(o[i], q.pollFirst());
+    }
+
+    /**
+     * toArray(a) contains all elements
+     */
+    public void testToArray2() {
+        NavigableSet q = populatedSet(SIZE);
+	Integer[] ints = new Integer[SIZE];
+	ints = (Integer[])q.toArray(ints);
+        Arrays.sort(ints);
+        for(int i = 0; i < ints.length; i++)
+            assertEquals(ints[i], q.pollFirst());
+    }
+
+    /**
+     * iterator iterates through all elements
+     */
+    public void testIterator() {
+        NavigableSet q = populatedSet(SIZE);
+        int i = 0;
+	Iterator it = q.iterator();
+        while(it.hasNext()) {
+            assertTrue(q.contains(it.next()));
+            ++i;
+        }
+        assertEquals(i, SIZE);
+    }
+
+    /**
+     * iterator of empty set has no elements
+     */
+    public void testEmptyIterator() {
+        NavigableSet q = set0();
+        int i = 0;
+	Iterator it = q.iterator();
+        while(it.hasNext()) {
+            assertTrue(q.contains(it.next()));
+            ++i;
+        }
+        assertEquals(i, 0);
+    }
+
+    /**
+     * iterator.remove removes current element
+     */
+    public void testIteratorRemove () {
+        final NavigableSet q = set0();
+        q.add(new Integer(2));
+        q.add(new Integer(1));
+        q.add(new Integer(3));
+
+        Iterator it = q.iterator();
+        it.next();
+        it.remove();
+
+        it = q.iterator();
+        assertEquals(it.next(), new Integer(2));
+        assertEquals(it.next(), new Integer(3));
+        assertFalse(it.hasNext());
+    }
+
+
+    /**
+     * toString contains toStrings of elements
+     */
+    public void testToString() {
+        NavigableSet q = populatedSet(SIZE);
+        String s = q.toString();
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(s.indexOf(String.valueOf(i)) >= 0);
+        }
+    }
+
+    /**
+     * A deserialized serialized set has same elements
+     */
+    public void testSerialization() {
+        NavigableSet q = populatedSet(SIZE);
+        try {
+            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
+            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
+            out.writeObject(q);
+            out.close();
+
+            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
+            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
+            NavigableSet r = (NavigableSet)in.readObject();
+            assertEquals(q.size(), r.size());
+            while (!q.isEmpty())
+                assertEquals(q.pollFirst(), r.pollFirst());
+        } catch(Exception e){
+            e.printStackTrace();
+            unexpectedException();
+        }
+    }
+
+    /**
+     * subSet returns set with keys in requested range
+     */
+    public void testSubSetContents() {
+        NavigableSet set = set5();
+        SortedSet sm = set.subSet(two, four);
+        assertEquals(two, sm.first());
+        assertEquals(three, sm.last());
+        assertEquals(2, sm.size());
+        assertFalse(sm.contains(one));
+        assertTrue(sm.contains(two));
+        assertTrue(sm.contains(three));
+        assertFalse(sm.contains(four));
+        assertFalse(sm.contains(five));
+        Iterator i = sm.iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(two, k);
+        k = (Integer)(i.next());
+        assertEquals(three, k);
+        assertFalse(i.hasNext());
+        Iterator j = sm.iterator();
+        j.next();
+        j.remove();
+        assertFalse(set.contains(two));
+        assertEquals(4, set.size());
+        assertEquals(1, sm.size());
+        assertEquals(three, sm.first());
+        assertEquals(three, sm.last());
+        assertTrue(sm.remove(three));
+        assertTrue(sm.isEmpty());
+        assertEquals(3, set.size());
+    }
+
+    public void testSubSetContents2() {
+        NavigableSet set = set5();
+        SortedSet sm = set.subSet(two, three);
+        assertEquals(1, sm.size());
+        assertEquals(two, sm.first());
+        assertEquals(two, sm.last());
+        assertFalse(sm.contains(one));
+        assertTrue(sm.contains(two));
+        assertFalse(sm.contains(three));
+        assertFalse(sm.contains(four));
+        assertFalse(sm.contains(five));
+        Iterator i = sm.iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(two, k);
+        assertFalse(i.hasNext());
+        Iterator j = sm.iterator();
+        j.next();
+        j.remove();
+        assertFalse(set.contains(two));
+        assertEquals(4, set.size());
+        assertEquals(0, sm.size());
+        assertTrue(sm.isEmpty());
+        assertFalse(sm.remove(three));
+        assertEquals(4, set.size());
+    }
+
+    /**
+     * headSet returns set with keys in requested range
+     */
+    public void testHeadSetContents() {
+        NavigableSet set = set5();
+        SortedSet sm = set.headSet(four);
+        assertTrue(sm.contains(one));
+        assertTrue(sm.contains(two));
+        assertTrue(sm.contains(three));
+        assertFalse(sm.contains(four));
+        assertFalse(sm.contains(five));
+        Iterator i = sm.iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(one, k);
+        k = (Integer)(i.next());
+        assertEquals(two, k);
+        k = (Integer)(i.next());
+        assertEquals(three, k);
+        assertFalse(i.hasNext());
+        sm.clear();
+        assertTrue(sm.isEmpty());
+        assertEquals(2, set.size());
+        assertEquals(four, set.first());
+    }
+
+    /**
+     * tailSet returns set with keys in requested range
+     */
+    public void testTailSetContents() {
+        NavigableSet set = set5();
+        SortedSet sm = set.tailSet(two);
+        assertFalse(sm.contains(one));
+        assertTrue(sm.contains(two));
+        assertTrue(sm.contains(three));
+        assertTrue(sm.contains(four));
+        assertTrue(sm.contains(five));
+        Iterator i = sm.iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(two, k);
+        k = (Integer)(i.next());
+        assertEquals(three, k);
+        k = (Integer)(i.next());
+        assertEquals(four, k);
+        k = (Integer)(i.next());
+        assertEquals(five, k);
+        assertFalse(i.hasNext());
+
+        SortedSet ssm = sm.tailSet(four);
+        assertEquals(four, ssm.first());
+        assertEquals(five, ssm.last());
+        assertTrue(ssm.remove(four));
+        assertEquals(1, ssm.size());
+        assertEquals(3, sm.size());
+        assertEquals(4, set.size());
+    }
+
+    /**
+     * size changes when elements added and removed
+     */
+    public void testDescendingSize() {
+        NavigableSet q = populatedSet(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(SIZE-i, q.size());
+            q.pollFirst();
+        }
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, q.size());
+            q.add(new Integer(i));
+        }
+    }
+
+    /**
+     * Add of comparable element succeeds
+     */
+    public void testDescendingAdd() {
+        NavigableSet q = dset0();
+        assertTrue(q.add(m6));
+    }
+
+    /**
+     * Add of duplicate element fails
+     */
+    public void testDescendingAddDup() {
+        NavigableSet q = dset0();
+        assertTrue(q.add(m6));
+        assertFalse(q.add(m6));
+    }
+
+    /**
+     * Add of non-Comparable throws CCE
+     */
+    public void testDescendingAddNonComparable() {
+        try {
+            NavigableSet q = dset0();
+            q.add(new Object());
+            q.add(new Object());
+            q.add(new Object());
+            shouldThrow();
+        }
+        catch(ClassCastException success) {}
+    }
+
+
+    /**
+     * addAll(null) throws NPE
+     */
+    public void testDescendingAddAll1() {
+        try {
+            NavigableSet q = dset0();
+            q.addAll(null);
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+    /**
+     * addAll of a collection with null elements throws NPE
+     */
+    public void testDescendingAddAll2() {
+        try {
+            NavigableSet q = dset0();
+            Integer[] ints = new Integer[SIZE];
+            q.addAll(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+    /**
+     * addAll of a collection with any null elements throws NPE after
+     * possibly adding some elements
+     */
+    public void testDescendingAddAll3() {
+        try {
+            NavigableSet q = dset0();
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE-1; ++i)
+                ints[i] = new Integer(i+SIZE);
+            q.addAll(Arrays.asList(ints));
+            shouldThrow();
+        }
+        catch (NullPointerException success) {}
+    }
+
+    /**
+     * Set contains all elements of successful addAll
+     */
+    public void testDescendingAddAll5() {
+        try {
+            Integer[] empty = new Integer[0];
+            Integer[] ints = new Integer[SIZE];
+            for (int i = 0; i < SIZE; ++i)
+                ints[i] = new Integer(SIZE-1- i);
+            NavigableSet q = dset0();
+            assertFalse(q.addAll(Arrays.asList(empty)));
+            assertTrue(q.addAll(Arrays.asList(ints)));
+            for (int i = 0; i < SIZE; ++i)
+                assertEquals(new Integer(i), q.pollFirst());
+        }
+        finally {}
+    }
+
+    /**
+     * poll succeeds unless empty
+     */
+    public void testDescendingPoll() {
+        NavigableSet q = populatedSet(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertEquals(i, ((Integer)q.pollFirst()).intValue());
+        }
+        assertNull(q.pollFirst());
+    }
+
+    /**
+     * remove(x) removes x and returns true if present
+     */
+    public void testDescendingRemoveElement() {
+        NavigableSet q = populatedSet(SIZE);
+        for (int i = 1; i < SIZE; i+=2) {
+            assertTrue(q.remove(new Integer(i)));
+        }
+        for (int i = 0; i < SIZE; i+=2) {
+            assertTrue(q.remove(new Integer(i)));
+            assertFalse(q.remove(new Integer(i+1)));
+        }
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * contains(x) reports true when elements added but not yet removed
+     */
+    public void testDescendingContains() {
+        NavigableSet q = populatedSet(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(q.contains(new Integer(i)));
+            q.pollFirst();
+            assertFalse(q.contains(new Integer(i)));
+        }
+    }
+
+    /**
+     * clear removes all elements
+     */
+    public void testDescendingClear() {
+        NavigableSet q = populatedSet(SIZE);
+        q.clear();
+        assertTrue(q.isEmpty());
+        assertEquals(0, q.size());
+        q.add(new Integer(1));
+        assertFalse(q.isEmpty());
+        q.clear();
+        assertTrue(q.isEmpty());
+    }
+
+    /**
+     * containsAll(c) is true when c contains a subset of elements
+     */
+    public void testDescendingContainsAll() {
+        NavigableSet q = populatedSet(SIZE);
+        NavigableSet p = dset0();
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(q.containsAll(p));
+            assertFalse(p.containsAll(q));
+            p.add(new Integer(i));
+        }
+        assertTrue(p.containsAll(q));
+    }
+
+    /**
+     * retainAll(c) retains only those elements of c and reports true if changed
+     */
+    public void testDescendingRetainAll() {
+        NavigableSet q = populatedSet(SIZE);
+        NavigableSet p = populatedSet(SIZE);
+        for (int i = 0; i < SIZE; ++i) {
+            boolean changed = q.retainAll(p);
+            if (i == 0)
+                assertFalse(changed);
+            else
+                assertTrue(changed);
+
+            assertTrue(q.containsAll(p));
+            assertEquals(SIZE-i, q.size());
+            p.pollFirst();
+        }
+    }
+
+    /**
+     * removeAll(c) removes only those elements of c and reports true if changed
+     */
+    public void testDescendingRemoveAll() {
+        for (int i = 1; i < SIZE; ++i) {
+            NavigableSet q = populatedSet(SIZE);
+            NavigableSet p = populatedSet(i);
+            assertTrue(q.removeAll(p));
+            assertEquals(SIZE-i, q.size());
+            for (int j = 0; j < i; ++j) {
+                Integer I = (Integer)(p.pollFirst());
+                assertFalse(q.contains(I));
+            }
+        }
+    }
+
+
+
+    /**
+     * lower returns preceding element
+     */
+    public void testDescendingLower() {
+        NavigableSet q = dset5();
+        Object e1 = q.lower(m3);
+        assertEquals(m2, e1);
+
+        Object e2 = q.lower(m6);
+        assertEquals(m5, e2);
+
+        Object e3 = q.lower(m1);
+        assertNull(e3);
+
+        Object e4 = q.lower(zero);
+        assertNull(e4);
+
+    }
+
+    /**
+     * higher returns next element
+     */
+    public void testDescendingHigher() {
+        NavigableSet q = dset5();
+        Object e1 = q.higher(m3);
+        assertEquals(m4, e1);
+
+        Object e2 = q.higher(zero);
+        assertEquals(m1, e2);
+
+        Object e3 = q.higher(m5);
+        assertNull(e3);
+
+        Object e4 = q.higher(m6);
+        assertNull(e4);
+
+    }
+
+    /**
+     * floor returns preceding element
+     */
+    public void testDescendingFloor() {
+        NavigableSet q = dset5();
+        Object e1 = q.floor(m3);
+        assertEquals(m3, e1);
+
+        Object e2 = q.floor(m6);
+        assertEquals(m5, e2);
+
+        Object e3 = q.floor(m1);
+        assertEquals(m1, e3);
+
+        Object e4 = q.floor(zero);
+        assertNull(e4);
+
+    }
+
+    /**
+     * ceiling returns next element
+     */
+    public void testDescendingCeiling() {
+        NavigableSet q = dset5();
+        Object e1 = q.ceiling(m3);
+        assertEquals(m3, e1);
+
+        Object e2 = q.ceiling(zero);
+        assertEquals(m1, e2);
+
+        Object e3 = q.ceiling(m5);
+        assertEquals(m5, e3);
+
+        Object e4 = q.ceiling(m6);
+        assertNull(e4);
+
+    }
+
+    /**
+     * toArray contains all elements
+     */
+    public void testDescendingToArray() {
+        NavigableSet q = populatedSet(SIZE);
+        Object[] o = q.toArray();
+        Arrays.sort(o);
+        for(int i = 0; i < o.length; i++)
+            assertEquals(o[i], q.pollFirst());
+    }
+
+    /**
+     * toArray(a) contains all elements
+     */
+    public void testDescendingToArray2() {
+        NavigableSet q = populatedSet(SIZE);
+        Integer[] ints = new Integer[SIZE];
+        ints = (Integer[])q.toArray(ints);
+        Arrays.sort(ints);
+        for(int i = 0; i < ints.length; i++)
+            assertEquals(ints[i], q.pollFirst());
+    }
+
+    /**
+     * iterator iterates through all elements
+     */
+    public void testDescendingIterator() {
+        NavigableSet q = populatedSet(SIZE);
+        int i = 0;
+        Iterator it = q.iterator();
+        while(it.hasNext()) {
+            assertTrue(q.contains(it.next()));
+            ++i;
+        }
+        assertEquals(i, SIZE);
+    }
+
+    /**
+     * iterator of empty set has no elements
+     */
+    public void testDescendingEmptyIterator() {
+        NavigableSet q = dset0();
+        int i = 0;
+        Iterator it = q.iterator();
+        while(it.hasNext()) {
+            assertTrue(q.contains(it.next()));
+            ++i;
+        }
+        assertEquals(i, 0);
+    }
+
+    /**
+     * iterator.remove removes current element
+     */
+    public void testDescendingIteratorRemove () {
+        final NavigableSet q = dset0();
+        q.add(new Integer(2));
+        q.add(new Integer(1));
+        q.add(new Integer(3));
+
+        Iterator it = q.iterator();
+        it.next();
+        it.remove();
+
+        it = q.iterator();
+        assertEquals(it.next(), new Integer(2));
+        assertEquals(it.next(), new Integer(3));
+        assertFalse(it.hasNext());
+    }
+
+
+    /**
+     * toString contains toStrings of elements
+     */
+    public void testDescendingToString() {
+        NavigableSet q = populatedSet(SIZE);
+        String s = q.toString();
+        for (int i = 0; i < SIZE; ++i) {
+            assertTrue(s.indexOf(String.valueOf(i)) >= 0);
+        }
+    }
+
+    /**
+     * A deserialized serialized set has same elements
+     */
+    public void testDescendingSerialization() {
+        NavigableSet q = populatedSet(SIZE);
+        try {
+            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
+            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
+            out.writeObject(q);
+            out.close();
+
+            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
+            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
+            NavigableSet r = (NavigableSet)in.readObject();
+            assertEquals(q.size(), r.size());
+            while (!q.isEmpty())
+                assertEquals(q.pollFirst(), r.pollFirst());
+        } catch(Exception e){
+            e.printStackTrace();
+            unexpectedException();
+        }
+    }
+
+    /**
+     * subSet returns set with keys in requested range
+     */
+    public void testDescendingSubSetContents() {
+        NavigableSet set = dset5();
+        SortedSet sm = set.subSet(m2, m4);
+        assertEquals(m2, sm.first());
+        assertEquals(m3, sm.last());
+        assertEquals(2, sm.size());
+        assertFalse(sm.contains(m1));
+        assertTrue(sm.contains(m2));
+        assertTrue(sm.contains(m3));
+        assertFalse(sm.contains(m4));
+        assertFalse(sm.contains(m5));
+        Iterator i = sm.iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(m2, k);
+        k = (Integer)(i.next());
+        assertEquals(m3, k);
+        assertFalse(i.hasNext());
+        Iterator j = sm.iterator();
+        j.next();
+        j.remove();
+        assertFalse(set.contains(m2));
+        assertEquals(4, set.size());
+        assertEquals(1, sm.size());
+        assertEquals(m3, sm.first());
+        assertEquals(m3, sm.last());
+        assertTrue(sm.remove(m3));
+        assertTrue(sm.isEmpty());
+        assertEquals(3, set.size());
+    }
+
+    public void testDescendingSubSetContents2() {
+        NavigableSet set = dset5();
+        SortedSet sm = set.subSet(m2, m3);
+        assertEquals(1, sm.size());
+        assertEquals(m2, sm.first());
+        assertEquals(m2, sm.last());
+        assertFalse(sm.contains(m1));
+        assertTrue(sm.contains(m2));
+        assertFalse(sm.contains(m3));
+        assertFalse(sm.contains(m4));
+        assertFalse(sm.contains(m5));
+        Iterator i = sm.iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(m2, k);
+        assertFalse(i.hasNext());
+        Iterator j = sm.iterator();
+        j.next();
+        j.remove();
+        assertFalse(set.contains(m2));
+        assertEquals(4, set.size());
+        assertEquals(0, sm.size());
+        assertTrue(sm.isEmpty());
+        assertFalse(sm.remove(m3));
+        assertEquals(4, set.size());
+    }
+
+    /**
+     * headSet returns set with keys in requested range
+     */
+    public void testDescendingHeadSetContents() {
+        NavigableSet set = dset5();
+        SortedSet sm = set.headSet(m4);
+        assertTrue(sm.contains(m1));
+        assertTrue(sm.contains(m2));
+        assertTrue(sm.contains(m3));
+        assertFalse(sm.contains(m4));
+        assertFalse(sm.contains(m5));
+        Iterator i = sm.iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(m1, k);
+        k = (Integer)(i.next());
+        assertEquals(m2, k);
+        k = (Integer)(i.next());
+        assertEquals(m3, k);
+        assertFalse(i.hasNext());
+        sm.clear();
+        assertTrue(sm.isEmpty());
+        assertEquals(2, set.size());
+        assertEquals(m4, set.first());
+    }
+
+    /**
+     * tailSet returns set with keys in requested range
+     */
+    public void testDescendingTailSetContents() {
+        NavigableSet set = dset5();
+        SortedSet sm = set.tailSet(m2);
+        assertFalse(sm.contains(m1));
+        assertTrue(sm.contains(m2));
+        assertTrue(sm.contains(m3));
+        assertTrue(sm.contains(m4));
+        assertTrue(sm.contains(m5));
+        Iterator i = sm.iterator();
+        Object k;
+        k = (Integer)(i.next());
+        assertEquals(m2, k);
+        k = (Integer)(i.next());
+        assertEquals(m3, k);
+        k = (Integer)(i.next());
+        assertEquals(m4, k);
+        k = (Integer)(i.next());
+        assertEquals(m5, k);
+        assertFalse(i.hasNext());
+
+        SortedSet ssm = sm.tailSet(m4);
+        assertEquals(m4, ssm.first());
+        assertEquals(m5, ssm.last());
+        assertTrue(ssm.remove(m4));
+        assertEquals(1, ssm.size());
+        assertEquals(3, sm.size());
+        assertEquals(4, set.size());
+    }
+}

Added: branches/backport-util-concurrent/upstream/2.2/test/tck/tck.jpx
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/test/tck/tck.jpx	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/test/tck/tck.jpx	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--JBuilder XML Project-->
+<project>
+  <property category="debug.0" name="SmartStepRedefineClasses" value="0"/>
+  <property category="generalFormatting" name="blockIndent" value="4"/>
+  <property category="generalFormatting2" name="blockIndent" value="4"/>
+  <property category="generalFormatting2" name="overrideBasicFormatting" value="1"/>
+  <property category="javaFormatting" name="packagePrefixGroups" value="java;javax;BLANK_LINE;java.awt;javax.swing;BLANK_LINE;org;(*)"/>
+  <property category="module" name="ProjectConvertedToEnsureModulesHaveSupportedFeatures" value="1"/>
+  <property category="module" name="ProjectConvertedToUseFilesAndDependenciesAsDefaultContent" value="1"/>
+  <property category="module" name="ProjectConvertedToUseProperModuleDefaults" value="1"/>
+  <property category="module" name="projectConvertedFromModuleExtensionsToModuleFileTypes" value="1"/>
+  <property category="runtime" name="DefaultConfiguration" value="-1"/>
+  <property category="runtime.0" name="BuildTargetOnRun" value="com.borland.jbuilder.build.ProjectBuilder$ProjectBuildAction;make"/>
+  <property category="runtime.0" name="ConfigurationName" value="jsr166 test"/>
+  <property category="runtime.0" name="RunnableType" value="com.borland.jbuilder.runtime.ApplicationRunner"/>
+  <property category="runtime.0" name="application.class" value="JSR166TestCase"/>
+  <property category="runtime.0" name="application.parameters" value="100"/>
+  <property category="runtime.0" name="application.vmparameters" value="-Xss256000"/>
+  <property category="serverservices" name="disabled.services" value=""/>
+  <property category="serverservices" name="single.server.name" value="Tomcat 4.0"/>
+  <property category="sys" name="AuthorLabel" value="@author"/>
+  <property category="sys" name="BackupPath" value="bak"/>
+  <property category="sys" name="CheckStable" value="1"/>
+  <property category="sys" name="Company" value=""/>
+  <property category="sys" name="CompanyLabel" value="Company:"/>
+  <property category="sys" name="Copyright" value="Copyright (c) 2004"/>
+  <property category="sys" name="CopyrightLabel" value="Copyright:"/>
+  <property category="sys" name="DefaultPath" value="src"/>
+  <property category="sys" name="Description" value=""/>
+  <property category="sys" name="DescriptionLabel" value="Description:"/>
+  <property category="sys" name="DocPath" value="doc"/>
+  <property category="sys" name="ExcludeClassEnabled" value="0"/>
+  <property category="sys" name="IncludeTestPath" value="1"/>
+  <property category="sys" name="InstanceVisibility" value="2"/>
+  <property category="sys" name="JDK" value="java version 1.4.2_04-b05"/>
+  <property category="sys" name="JvmVersion" value="1.2"/>
+  <property category="sys" name="LastTag" value="0"/>
+  <property category="sys" name="Libraries" value="JUnit;java.util.concurrent.1.4"/>
+  <property category="sys" name="MakeStable" value="0"/>
+  <property category="sys" name="OutPath" value="classes"/>
+  <property category="sys" name="SourcePath" value="src;test"/>
+  <property category="sys" name="SourceVersion" value="1.4"/>
+  <property category="sys" name="TestPath" value="test"/>
+  <property category="sys" name="Title" value=""/>
+  <property category="sys" name="TitleLabel" value="Title:"/>
+  <property category="sys" name="Version" value="1.0"/>
+  <property category="sys" name="VersionLabel" value="@version"/>
+  <property category="sys" name="WorkingDirectory" value="."/>
+  <node name="Application" type="Archive">
+    <property category="archiving" name="archiverClass" value="com.borland.jbuilder.wizard.archive.ApplicationArchiver"/>
+    <property category="archiving" name="libraryStates.1" value="3:junit"/>
+    <property category="archiving" name="libraryStates.2" value="3:java.util.concurrent.1.4"/>
+    <property category="archiving" name="manifestConfigFile" value="0"/>
+    <property category="archiving" name="targetCompressed" value="1"/>
+    <property category="archiving" name="targetPath" value="tck.jar"/>
+  </node>
+</project>

Added: branches/backport-util-concurrent/upstream/2.2/version.properties
===================================================================
--- branches/backport-util-concurrent/upstream/2.2/version.properties	                        (rev 0)
+++ branches/backport-util-concurrent/upstream/2.2/version.properties	2006-10-10 08:59:26 UTC (rev 2586)
@@ -0,0 +1,6 @@
+base.version=2.2
+base.tag=BUC_2_2
+base.date=5 Jun 2006
+prev.version=2.1
+prev.tag=BUC_2_1
+prev.date=30 Jan 2006




More information about the pkg-java-commits mailing list