[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 "test.ser""/>
+ <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 ? e==null : 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 ? e==null : 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 ? e==null : 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 ? e==null : 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 "bounded") 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<V> implements RunnableFuture<V> {...}
+ *
+ * protected <V> RunnableFuture<V> newTaskFor(Callable<V> c) {
+ * return new CustomTask<V>(c);
+ * }
+ * protected <V> RunnableFuture<V> newTaskFor(Runnable r, V v) {
+ * return new CustomTask<V>(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 "bounded buffer", 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 "close" or "shutdown" 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 "wait-free"
+ * 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) && 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) && 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<Handler> handlers
+ * = new CopyOnWriteArraySet<Handler>();
+ * 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 ? e==null : 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 ? e==null : 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 ? e2==null : 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<Runnable> tasks = new ArrayDeque<Runnable>();
+ * 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<Callable<Result>> solvers)
+ * throws InterruptedException, ExecutionException {
+ * CompletionService<Result> ecs
+ * = new ExecutorCompletionService<Result>(e);
+ * for (Callable<Result> s : solvers)
+ * ecs.submit(s);
+ * int n = solvers.size();
+ * for (int i = 0; i < 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<Callable<Result>> solvers)
+ * throws InterruptedException {
+ * CompletionService<Result> ecs
+ * = new ExecutorCompletionService<Result>(e);
+ * int n = solvers.size();
+ * List<Future<Result>> futures
+ * = new ArrayList<Future<Result>>(n);
+ * Result result = null;
+ * try {
+ * for (Callable<Result> s : solvers)
+ * futures.add(ecs.submit(s));
+ * for (int i = 0; i < n; ++i) {
+ * try {
+ * Result r = ecs.take().get();
+ * if (r != null) {
+ * result = r;
+ * break;
+ * }
+ * } catch (ExecutionException ignore) {}
+ * }
+ * }
+ * finally {
+ * for (Future<Result> 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 <= 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 <= 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 < 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 < 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<?></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<String> future
+ * = executor.submit(new Callable<String>() {
+ * 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<String> future =
+ * new FutureTask<String>(new Callable<String>() {
+ * 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<?> f = new FutureTask<Object>(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 && other.entry != this.entry)
+ * res = (seqNum < 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<?> 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<V> implements RunnableScheduledFuture<V> { ... }
+ *
+ * protected <V> RunnableScheduledFuture<V> decorateTask(
+ * Runnable r, RunnableScheduledFuture<V> task) {
+ * return new CustomTask<V>(r, task);
+ * }
+ *
+ * protected <V> RunnableScheduledFuture<V> decorateTask(
+ * Callable<V> c, RunnableScheduledFuture<V> task) {
+ * return new CustomTask<V>(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 < 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 < 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 < 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 < 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 "lock" 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 "barging" 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
+ * "barging" 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 "<em>spurious wakeup</em>" 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 > 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 "wait") 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 "<em>spurious
+ * wakeup</em>" 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 "<em>spurious wakeup</em>" 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 "<em>spurious wakeup</em>" 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 "<em>spurious wakeup</em>" 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 > 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)) > 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 "<em>spurious wakeup</em>" 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
+ * "hand-over-hand" or "chain locking": 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 "in-order" 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 "barging" 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 "barging" 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 "barging"
+ * 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 "best effort" 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