# HG changeset patch # User chegar # Date 1375432689 -3600 # Node ID bdf5c313d76fece9ae6e9cb7dbd40ec3cd575948 # Parent 8ac8b6677ba73b7c3598bde50aa1690d3b0d9616# Parent bbe43d712fe08e650808d774861b256ccb34e500 Merge diff -r 8ac8b6677ba7 -r bdf5c313d76f .hgtags --- a/.hgtags Thu Jul 25 17:32:23 2013 +0100 +++ b/.hgtags Fri Aug 02 09:38:09 2013 +0100 @@ -222,3 +222,4 @@ 711eb4aa87de68de78250e0549980936bab53d54 jdk8-b98 2d3875b0d18b3ad1c2bebf385a697e309e4005a4 jdk8-b99 3d34036aae4ea90b2ca59712d5a69db3221f0875 jdk8-b100 +edb01c460d4cab21ff0ff13512df7b746efaa0e7 jdk8-b101 diff -r 8ac8b6677ba7 -r bdf5c313d76f .hgtags-top-repo --- a/.hgtags-top-repo Thu Jul 25 17:32:23 2013 +0100 +++ b/.hgtags-top-repo Fri Aug 02 09:38:09 2013 +0100 @@ -222,3 +222,4 @@ 0d0c983a817bbe8518a5ff201306334a8de267f2 jdk8-b98 59dc9da813794c924a0383c2a6241af94defdfed jdk8-b99 d2dcb110e9dbaf9903c05b211df800e78e4b394e jdk8-b100 +9f74a220677dc265a724515d8e2617548cef62f1 jdk8-b101 diff -r 8ac8b6677ba7 -r bdf5c313d76f corba/.hgtags --- a/corba/.hgtags Thu Jul 25 17:32:23 2013 +0100 +++ b/corba/.hgtags Fri Aug 02 09:38:09 2013 +0100 @@ -222,3 +222,4 @@ 3370fb6146e47a6cc05a213fc213e12fc0a38d07 jdk8-b98 3f67804ab61303782df57e54989ef5e0e4629beb jdk8-b99 8d492f1dfd1b131a4c7886ee6b59528609f7e4fe jdk8-b100 +a013024b07475782f1fa8e196e950b34b4077663 jdk8-b101 diff -r 8ac8b6677ba7 -r bdf5c313d76f hotspot/.hgtags --- a/hotspot/.hgtags Thu Jul 25 17:32:23 2013 +0100 +++ b/hotspot/.hgtags Fri Aug 02 09:38:09 2013 +0100 @@ -363,3 +363,5 @@ 9f71e36a471ae4a668e08827d33035963ed10c08 hs25-b42 5787fac72e760c6a5fd9efa113b0c75caf554136 jdk8-b100 46487ba40ff225654d0c51787ed3839bafcbd9f3 hs25-b43 +f6921c876db192bba389cec062855a66372da01c jdk8-b101 +530fe88b3b2c710f42810b3580d86a0d83ad6c1c hs25-b44 diff -r 8ac8b6677ba7 -r bdf5c313d76f hotspot/make/bsd/makefiles/minimal1.make --- a/hotspot/make/bsd/makefiles/minimal1.make Thu Jul 25 17:32:23 2013 +0100 +++ b/hotspot/make/bsd/makefiles/minimal1.make Fri Aug 02 09:38:09 2013 +0100 @@ -24,16 +24,20 @@ TYPE=MINIMAL1 -INCLUDE_JVMTI ?= false -INCLUDE_FPROF ?= false -INCLUDE_VM_STRUCTS ?= false -INCLUDE_JNI_CHECK ?= false -INCLUDE_SERVICES ?= false -INCLUDE_MANAGEMENT ?= false -INCLUDE_ALL_GCS ?= false -INCLUDE_NMT ?= false -INCLUDE_TRACE ?= false -INCLUDE_CDS ?= false +# Force all variables to false, overriding any other +# setting that may have occurred in the makefiles. These +# can still be overridden by passing the variable as an +# argument to 'make' +INCLUDE_JVMTI := false +INCLUDE_FPROF := false +INCLUDE_VM_STRUCTS := false +INCLUDE_JNI_CHECK := false +INCLUDE_SERVICES := false +INCLUDE_MANAGEMENT := false +INCLUDE_ALL_GCS := false +INCLUDE_NMT := false +INCLUDE_TRACE := false +INCLUDE_CDS := false CXXFLAGS += -DMINIMAL_JVM -DCOMPILER1 -DVMTYPE=\"Minimal\" CFLAGS += -DMINIMAL_JVM -DCOMPILER1 -DVMTYPE=\"Minimal\" diff -r 8ac8b6677ba7 -r bdf5c313d76f hotspot/make/hotspot_version --- a/hotspot/make/hotspot_version Thu Jul 25 17:32:23 2013 +0100 +++ b/hotspot/make/hotspot_version Fri Aug 02 09:38:09 2013 +0100 @@ -35,7 +35,7 @@ HS_MAJOR_VER=25 HS_MINOR_VER=0 -HS_BUILD_NUMBER=43 +HS_BUILD_NUMBER=44 JDK_MAJOR_VER=1 JDK_MINOR_VER=8 diff -r 8ac8b6677ba7 -r bdf5c313d76f hotspot/make/linux/makefiles/minimal1.make --- a/hotspot/make/linux/makefiles/minimal1.make Thu Jul 25 17:32:23 2013 +0100 +++ b/hotspot/make/linux/makefiles/minimal1.make Fri Aug 02 09:38:09 2013 +0100 @@ -24,16 +24,20 @@ TYPE=MINIMAL1 -INCLUDE_JVMTI ?= false -INCLUDE_FPROF ?= false -INCLUDE_VM_STRUCTS ?= false -INCLUDE_JNI_CHECK ?= false -INCLUDE_SERVICES ?= false -INCLUDE_MANAGEMENT ?= false -INCLUDE_ALL_GCS ?= false -INCLUDE_NMT ?= false -INCLUDE_TRACE ?= false -INCLUDE_CDS ?= false +# Force all variables to false, overriding any other +# setting that may have occurred in the makefiles. These +# can still be overridden by passing the variable as an +# argument to 'make' +INCLUDE_JVMTI := false +INCLUDE_FPROF := false +INCLUDE_VM_STRUCTS := false +INCLUDE_JNI_CHECK := false +INCLUDE_SERVICES := false +INCLUDE_MANAGEMENT := false +INCLUDE_ALL_GCS := false +INCLUDE_NMT := false +INCLUDE_TRACE := false +INCLUDE_CDS := false CXXFLAGS += -DMINIMAL_JVM -DCOMPILER1 -DVMTYPE=\"Minimal\" CFLAGS += -DMINIMAL_JVM -DCOMPILER1 -DVMTYPE=\"Minimal\" diff -r 8ac8b6677ba7 -r bdf5c313d76f hotspot/src/cpu/sparc/vm/c2_globals_sparc.hpp --- a/hotspot/src/cpu/sparc/vm/c2_globals_sparc.hpp Thu Jul 25 17:32:23 2013 +0100 +++ b/hotspot/src/cpu/sparc/vm/c2_globals_sparc.hpp Fri Aug 02 09:38:09 2013 +0100 @@ -42,7 +42,7 @@ #else define_pd_global(bool, ProfileInterpreter, true); #endif // CC_INTERP -define_pd_global(bool, TieredCompilation, false); +define_pd_global(bool, TieredCompilation, trueInTiered); define_pd_global(intx, CompileThreshold, 10000); define_pd_global(intx, BackEdgeThreshold, 140000); diff -r 8ac8b6677ba7 -r bdf5c313d76f hotspot/src/cpu/x86/vm/c2_globals_x86.hpp --- a/hotspot/src/cpu/x86/vm/c2_globals_x86.hpp Thu Jul 25 17:32:23 2013 +0100 +++ b/hotspot/src/cpu/x86/vm/c2_globals_x86.hpp Fri Aug 02 09:38:09 2013 +0100 @@ -44,7 +44,7 @@ #else define_pd_global(bool, ProfileInterpreter, true); #endif // CC_INTERP -define_pd_global(bool, TieredCompilation, false); +define_pd_global(bool, TieredCompilation, trueInTiered); define_pd_global(intx, CompileThreshold, 10000); define_pd_global(intx, BackEdgeThreshold, 100000); diff -r 8ac8b6677ba7 -r bdf5c313d76f hotspot/src/share/vm/ci/ciReplay.cpp --- a/hotspot/src/share/vm/ci/ciReplay.cpp Thu Jul 25 17:32:23 2013 +0100 +++ b/hotspot/src/share/vm/ci/ciReplay.cpp Fri Aug 02 09:38:09 2013 +0100 @@ -299,7 +299,7 @@ Symbol* method_signature = parse_symbol(CHECK_NULL); Method* m = k->find_method(method_name, method_signature); if (m == NULL) { - report_error("can't find method"); + report_error("Can't find method"); } return m; } @@ -398,8 +398,8 @@ // compile void process_compile(TRAPS) { - // methodHandle method; Method* method = parse_method(CHECK); + if (had_error()) return; int entry_bci = parse_int("entry_bci"); const char* comp_level_label = "comp_level"; int comp_level = parse_int(comp_level_label); @@ -440,6 +440,7 @@ // void process_ciMethod(TRAPS) { Method* method = parse_method(CHECK); + if (had_error()) return; ciMethodRecord* rec = new_ciMethod(method); rec->invocation_counter = parse_int("invocation_counter"); rec->backedge_counter = parse_int("backedge_counter"); @@ -451,6 +452,7 @@ // ciMethodData orig # # ... data # # ... oops void process_ciMethodData(TRAPS) { Method* method = parse_method(CHECK); + if (had_error()) return; /* jsut copied from Method, to build interpret data*/ if (InstanceRefKlass::owns_pending_list_lock((JavaThread*)THREAD)) { return; diff -r 8ac8b6677ba7 -r bdf5c313d76f hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsOopClosures.hpp --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsOopClosures.hpp Thu Jul 25 17:32:23 2013 +0100 +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsOopClosures.hpp Fri Aug 02 09:38:09 2013 +0100 @@ -122,6 +122,22 @@ } }; +class Par_MarkRefsIntoClosure: public CMSOopsInGenClosure { + private: + const MemRegion _span; + CMSBitMap* _bitMap; + protected: + DO_OOP_WORK_DEFN + public: + Par_MarkRefsIntoClosure(MemRegion span, CMSBitMap* bitMap); + virtual void do_oop(oop* p); + virtual void do_oop(narrowOop* p); + + Prefetch::style prefetch_style() { + return Prefetch::do_read; + } +}; + // A variant of the above used in certain kinds of CMS // marking verification. class MarkRefsIntoVerifyClosure: public CMSOopsInGenClosure { diff -r 8ac8b6677ba7 -r bdf5c313d76f hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp Thu Jul 25 17:32:23 2013 +0100 +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp Fri Aug 02 09:38:09 2013 +0100 @@ -569,6 +569,7 @@ _restart_addr(NULL), _overflow_list(NULL), _stats(cmsGen), + _eden_chunk_lock(new Mutex(Mutex::leaf + 1, "CMS_eden_chunk_lock", true)), _eden_chunk_array(NULL), // may be set in ctor body _eden_chunk_capacity(0), // -- ditto -- _eden_chunk_index(0), // -- ditto -- @@ -732,7 +733,7 @@ assert(_eden_chunk_array != NULL || _eden_chunk_capacity == 0, "Error"); // Support for parallelizing survivor space rescan - if (CMSParallelRemarkEnabled && CMSParallelSurvivorRemarkEnabled) { + if ((CMSParallelRemarkEnabled && CMSParallelSurvivorRemarkEnabled) || CMSParallelInitialMarkEnabled) { const size_t max_plab_samples = ((DefNewGeneration*)_young_gen)->max_survivor_size()/MinTLABSize; @@ -2137,6 +2138,39 @@ } +void CMSCollector::print_eden_and_survivor_chunk_arrays() { + DefNewGeneration* dng = _young_gen->as_DefNewGeneration(); + EdenSpace* eden_space = dng->eden(); + ContiguousSpace* from_space = dng->from(); + ContiguousSpace* to_space = dng->to(); + // Eden + if (_eden_chunk_array != NULL) { + gclog_or_tty->print_cr("eden " PTR_FORMAT "-" PTR_FORMAT "-" PTR_FORMAT "(" SIZE_FORMAT ")", + eden_space->bottom(), eden_space->top(), + eden_space->end(), eden_space->capacity()); + gclog_or_tty->print_cr("_eden_chunk_index=" SIZE_FORMAT ", " + "_eden_chunk_capacity=" SIZE_FORMAT, + _eden_chunk_index, _eden_chunk_capacity); + for (size_t i = 0; i < _eden_chunk_index; i++) { + gclog_or_tty->print_cr("_eden_chunk_array[" SIZE_FORMAT "]=" PTR_FORMAT, + i, _eden_chunk_array[i]); + } + } + // Survivor + if (_survivor_chunk_array != NULL) { + gclog_or_tty->print_cr("survivor " PTR_FORMAT "-" PTR_FORMAT "-" PTR_FORMAT "(" SIZE_FORMAT ")", + from_space->bottom(), from_space->top(), + from_space->end(), from_space->capacity()); + gclog_or_tty->print_cr("_survivor_chunk_index=" SIZE_FORMAT ", " + "_survivor_chunk_capacity=" SIZE_FORMAT, + _survivor_chunk_index, _survivor_chunk_capacity); + for (size_t i = 0; i < _survivor_chunk_index; i++) { + gclog_or_tty->print_cr("_survivor_chunk_array[" SIZE_FORMAT "]=" PTR_FORMAT, + i, _survivor_chunk_array[i]); + } + } +} + void CMSCollector::getFreelistLocks() const { // Get locks for all free lists in all generations that this // collector is responsible for @@ -3549,6 +3583,31 @@ // CMS work +// The common parts of CMSParInitialMarkTask and CMSParRemarkTask. +class CMSParMarkTask : public AbstractGangTask { + protected: + CMSCollector* _collector; + int _n_workers; + CMSParMarkTask(const char* name, CMSCollector* collector, int n_workers) : + AbstractGangTask(name), + _collector(collector), + _n_workers(n_workers) {} + // Work method in support of parallel rescan ... of young gen spaces + void do_young_space_rescan(uint worker_id, OopsInGenClosure* cl, + ContiguousSpace* space, + HeapWord** chunk_array, size_t chunk_top); + void work_on_young_gen_roots(uint worker_id, OopsInGenClosure* cl); +}; + +// Parallel initial mark task +class CMSParInitialMarkTask: public CMSParMarkTask { + public: + CMSParInitialMarkTask(CMSCollector* collector, int n_workers) : + CMSParMarkTask("Scan roots and young gen for initial mark in parallel", + collector, n_workers) {} + void work(uint worker_id); +}; + // Checkpoint the roots into this generation from outside // this generation. [Note this initial checkpoint need only // be approximate -- we'll do a catch up phase subsequently.] @@ -3646,19 +3705,42 @@ // the klasses. The claimed marks need to be cleared before marking starts. ClassLoaderDataGraph::clear_claimed_marks(); - CMKlassClosure klass_closure(¬Older); + if (CMSPrintEdenSurvivorChunks) { + print_eden_and_survivor_chunk_arrays(); + } + { COMPILER2_PRESENT(DerivedPointerTableDeactivate dpt_deact;) - gch->rem_set()->prepare_for_younger_refs_iterate(false); // Not parallel. - gch->gen_process_strong_roots(_cmsGen->level(), - true, // younger gens are roots - true, // activate StrongRootsScope - false, // not scavenging - SharedHeap::ScanningOption(roots_scanning_options()), - ¬Older, - true, // walk all of code cache if (so & SO_CodeCache) - NULL, - &klass_closure); + if (CMSParallelInitialMarkEnabled && CollectedHeap::use_parallel_gc_threads()) { + // The parallel version. + FlexibleWorkGang* workers = gch->workers(); + assert(workers != NULL, "Need parallel worker threads."); + int n_workers = workers->active_workers(); + CMSParInitialMarkTask tsk(this, n_workers); + gch->set_par_threads(n_workers); + initialize_sequential_subtasks_for_young_gen_rescan(n_workers); + if (n_workers > 1) { + GenCollectedHeap::StrongRootsScope srs(gch); + workers->run_task(&tsk); + } else { + GenCollectedHeap::StrongRootsScope srs(gch); + tsk.work(0); + } + gch->set_par_threads(0); + } else { + // The serial version. + CMKlassClosure klass_closure(¬Older); + gch->rem_set()->prepare_for_younger_refs_iterate(false); // Not parallel. + gch->gen_process_strong_roots(_cmsGen->level(), + true, // younger gens are roots + true, // activate StrongRootsScope + false, // not scavenging + SharedHeap::ScanningOption(roots_scanning_options()), + ¬Older, + true, // walk all of code cache if (so & SO_CodeCache) + NULL, + &klass_closure); + } } // Clear mod-union table; it will be dirtied in the prologue of @@ -4417,7 +4499,9 @@ verify_overflow_empty(); _abort_preclean = false; if (CMSPrecleaningEnabled) { - _eden_chunk_index = 0; + if (!CMSEdenChunksRecordAlways) { + _eden_chunk_index = 0; + } size_t used = get_eden_used(); size_t capacity = get_eden_capacity(); // Don't start sampling unless we will get sufficiently @@ -4526,7 +4610,9 @@ if (!_start_sampling) { return; } - if (_eden_chunk_array) { + // When CMSEdenChunksRecordAlways is true, the eden chunk array + // is populated by the young generation. + if (_eden_chunk_array != NULL && !CMSEdenChunksRecordAlways) { if (_eden_chunk_index < _eden_chunk_capacity) { _eden_chunk_array[_eden_chunk_index] = *_top_addr; // take sample assert(_eden_chunk_array[_eden_chunk_index] <= *_end_addr, @@ -5010,6 +5096,10 @@ // Update the saved marks which may affect the root scans. gch->save_marks(); + if (CMSPrintEdenSurvivorChunks) { + print_eden_and_survivor_chunk_arrays(); + } + { COMPILER2_PRESENT(DerivedPointerTableDeactivate dpt_deact;) @@ -5116,10 +5206,53 @@ } } +void CMSParInitialMarkTask::work(uint worker_id) { + elapsedTimer _timer; + ResourceMark rm; + HandleMark hm; + + // ---------- scan from roots -------------- + _timer.start(); + GenCollectedHeap* gch = GenCollectedHeap::heap(); + Par_MarkRefsIntoClosure par_mri_cl(_collector->_span, &(_collector->_markBitMap)); + CMKlassClosure klass_closure(&par_mri_cl); + + // ---------- young gen roots -------------- + { + work_on_young_gen_roots(worker_id, &par_mri_cl); + _timer.stop(); + if (PrintCMSStatistics != 0) { + gclog_or_tty->print_cr( + "Finished young gen initial mark scan work in %dth thread: %3.3f sec", + worker_id, _timer.seconds()); + } + } + + // ---------- remaining roots -------------- + _timer.reset(); + _timer.start(); + gch->gen_process_strong_roots(_collector->_cmsGen->level(), + false, // yg was scanned above + false, // this is parallel code + false, // not scavenging + SharedHeap::ScanningOption(_collector->CMSCollector::roots_scanning_options()), + &par_mri_cl, + true, // walk all of code cache if (so & SO_CodeCache) + NULL, + &klass_closure); + assert(_collector->should_unload_classes() + || (_collector->CMSCollector::roots_scanning_options() & SharedHeap::SO_CodeCache), + "if we didn't scan the code cache, we have to be ready to drop nmethods with expired weak oops"); + _timer.stop(); + if (PrintCMSStatistics != 0) { + gclog_or_tty->print_cr( + "Finished remaining root initial mark scan work in %dth thread: %3.3f sec", + worker_id, _timer.seconds()); + } +} + // Parallel remark task -class CMSParRemarkTask: public AbstractGangTask { - CMSCollector* _collector; - int _n_workers; +class CMSParRemarkTask: public CMSParMarkTask { CompactibleFreeListSpace* _cms_space; // The per-thread work queues, available here for stealing. @@ -5133,10 +5266,9 @@ CompactibleFreeListSpace* cms_space, int n_workers, FlexibleWorkGang* workers, OopTaskQueueSet* task_queues): - AbstractGangTask("Rescan roots and grey objects in parallel"), - _collector(collector), + CMSParMarkTask("Rescan roots and grey objects in parallel", + collector, n_workers), _cms_space(cms_space), - _n_workers(n_workers), _task_queues(task_queues), _term(n_workers, task_queues) { } @@ -5150,11 +5282,6 @@ void work(uint worker_id); private: - // Work method in support of parallel rescan ... of young gen spaces - void do_young_space_rescan(int i, Par_MarkRefsIntoAndScanClosure* cl, - ContiguousSpace* space, - HeapWord** chunk_array, size_t chunk_top); - // ... of dirty cards in old space void do_dirty_card_rescan_tasks(CompactibleFreeListSpace* sp, int i, Par_MarkRefsIntoAndScanClosure* cl); @@ -5186,6 +5313,25 @@ } }; +void CMSParMarkTask::work_on_young_gen_roots(uint worker_id, OopsInGenClosure* cl) { + DefNewGeneration* dng = _collector->_young_gen->as_DefNewGeneration(); + EdenSpace* eden_space = dng->eden(); + ContiguousSpace* from_space = dng->from(); + ContiguousSpace* to_space = dng->to(); + + HeapWord** eca = _collector->_eden_chunk_array; + size_t ect = _collector->_eden_chunk_index; + HeapWord** sca = _collector->_survivor_chunk_array; + size_t sct = _collector->_survivor_chunk_index; + + assert(ect <= _collector->_eden_chunk_capacity, "out of bounds"); + assert(sct <= _collector->_survivor_chunk_capacity, "out of bounds"); + + do_young_space_rescan(worker_id, cl, to_space, NULL, 0); + do_young_space_rescan(worker_id, cl, from_space, sca, sct); + do_young_space_rescan(worker_id, cl, eden_space, eca, ect); +} + // work_queue(i) is passed to the closure // Par_MarkRefsIntoAndScanClosure. The "i" parameter // also is passed to do_dirty_card_rescan_tasks() and to @@ -5210,23 +5356,7 @@ // work first. // ---------- young gen roots -------------- { - DefNewGeneration* dng = _collector->_young_gen->as_DefNewGeneration(); - EdenSpace* eden_space = dng->eden(); - ContiguousSpace* from_space = dng->from(); - ContiguousSpace* to_space = dng->to(); - - HeapWord** eca = _collector->_eden_chunk_array; - size_t ect = _collector->_eden_chunk_index; - HeapWord** sca = _collector->_survivor_chunk_array; - size_t sct = _collector->_survivor_chunk_index; - - assert(ect <= _collector->_eden_chunk_capacity, "out of bounds"); - assert(sct <= _collector->_survivor_chunk_capacity, "out of bounds"); - - do_young_space_rescan(worker_id, &par_mrias_cl, to_space, NULL, 0); - do_young_space_rescan(worker_id, &par_mrias_cl, from_space, sca, sct); - do_young_space_rescan(worker_id, &par_mrias_cl, eden_space, eca, ect); - + work_on_young_gen_roots(worker_id, &par_mrias_cl); _timer.stop(); if (PrintCMSStatistics != 0) { gclog_or_tty->print_cr( @@ -5334,8 +5464,8 @@ // Note that parameter "i" is not used. void -CMSParRemarkTask::do_young_space_rescan(int i, - Par_MarkRefsIntoAndScanClosure* cl, ContiguousSpace* space, +CMSParMarkTask::do_young_space_rescan(uint worker_id, + OopsInGenClosure* cl, ContiguousSpace* space, HeapWord** chunk_array, size_t chunk_top) { // Until all tasks completed: // . claim an unclaimed task @@ -5530,6 +5660,32 @@ "Else our work is not yet done"); } +// Record object boundaries in _eden_chunk_array by sampling the eden +// top in the slow-path eden object allocation code path and record +// the boundaries, if CMSEdenChunksRecordAlways is true. If +// CMSEdenChunksRecordAlways is false, we use the other asynchronous +// sampling in sample_eden() that activates during the part of the +// preclean phase. +void CMSCollector::sample_eden_chunk() { + if (CMSEdenChunksRecordAlways && _eden_chunk_array != NULL) { + if (_eden_chunk_lock->try_lock()) { + // Record a sample. This is the critical section. The contents + // of the _eden_chunk_array have to be non-decreasing in the + // address order. + _eden_chunk_array[_eden_chunk_index] = *_top_addr; + assert(_eden_chunk_array[_eden_chunk_index] <= *_end_addr, + "Unexpected state of Eden"); + if (_eden_chunk_index == 0 || + ((_eden_chunk_array[_eden_chunk_index] > _eden_chunk_array[_eden_chunk_index-1]) && + (pointer_delta(_eden_chunk_array[_eden_chunk_index], + _eden_chunk_array[_eden_chunk_index-1]) >= CMSSamplingGrain))) { + _eden_chunk_index++; // commit sample + } + _eden_chunk_lock->unlock(); + } + } +} + // Return a thread-local PLAB recording array, as appropriate. void* CMSCollector::get_data_recorder(int thr_num) { if (_survivor_plab_array != NULL && @@ -5553,12 +5709,13 @@ // Merge the per-thread plab arrays into the global survivor chunk // array which will provide the partitioning of the survivor space -// for CMS rescan. +// for CMS initial scan and rescan. void CMSCollector::merge_survivor_plab_arrays(ContiguousSpace* surv, int no_of_gc_threads) { assert(_survivor_plab_array != NULL, "Error"); assert(_survivor_chunk_array != NULL, "Error"); - assert(_collectorState == FinalMarking, "Error"); + assert(_collectorState == FinalMarking || + (CMSParallelInitialMarkEnabled && _collectorState == InitialMarking), "Error"); for (int j = 0; j < no_of_gc_threads; j++) { _cursor[j] = 0; } @@ -5621,7 +5778,7 @@ } // Set up the space's par_seq_tasks structure for work claiming -// for parallel rescan of young gen. +// for parallel initial scan and rescan of young gen. // See ParRescanTask where this is currently used. void CMSCollector:: @@ -6748,6 +6905,28 @@ void MarkRefsIntoClosure::do_oop(oop* p) { MarkRefsIntoClosure::do_oop_work(p); } void MarkRefsIntoClosure::do_oop(narrowOop* p) { MarkRefsIntoClosure::do_oop_work(p); } +Par_MarkRefsIntoClosure::Par_MarkRefsIntoClosure( + MemRegion span, CMSBitMap* bitMap): + _span(span), + _bitMap(bitMap) +{ + assert(_ref_processor == NULL, "deliberately left NULL"); + assert(_bitMap->covers(_span), "_bitMap/_span mismatch"); +} + +void Par_MarkRefsIntoClosure::do_oop(oop obj) { + // if p points into _span, then mark corresponding bit in _markBitMap + assert(obj->is_oop(), "expected an oop"); + HeapWord* addr = (HeapWord*)obj; + if (_span.contains(addr)) { + // this should be made more efficient + _bitMap->par_mark(addr); + } +} + +void Par_MarkRefsIntoClosure::do_oop(oop* p) { Par_MarkRefsIntoClosure::do_oop_work(p); } +void Par_MarkRefsIntoClosure::do_oop(narrowOop* p) { Par_MarkRefsIntoClosure::do_oop_work(p); } + // A variant of the above, used for CMS marking verification. MarkRefsIntoVerifyClosure::MarkRefsIntoVerifyClosure( MemRegion span, CMSBitMap* verification_bm, CMSBitMap* cms_bm): @@ -9305,7 +9484,6 @@ return; } } - // Transfer some number of overflown objects to usual marking // stack. Return true if some objects were transferred. bool MarkRefsIntoAndScanClosure::take_from_overflow_list() { @@ -9377,4 +9555,3 @@ ShouldNotReachHere(); } } - diff -r 8ac8b6677ba7 -r bdf5c313d76f hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp Thu Jul 25 17:32:23 2013 +0100 +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp Fri Aug 02 09:38:09 2013 +0100 @@ -515,6 +515,8 @@ friend class ConcurrentMarkSweepThread; friend class ConcurrentMarkSweepGeneration; friend class CompactibleFreeListSpace; + friend class CMSParMarkTask; + friend class CMSParInitialMarkTask; friend class CMSParRemarkTask; friend class CMSConcMarkingTask; friend class CMSRefProcTaskProxy; @@ -749,6 +751,7 @@ Generation* _young_gen; // the younger gen HeapWord** _top_addr; // ... Top of Eden HeapWord** _end_addr; // ... End of Eden + Mutex* _eden_chunk_lock; HeapWord** _eden_chunk_array; // ... Eden partitioning array size_t _eden_chunk_index; // ... top (exclusive) of array size_t _eden_chunk_capacity; // ... max entries in array @@ -950,6 +953,7 @@ // Support for parallel remark of survivor space void* get_data_recorder(int thr_num); + void sample_eden_chunk(); CMSBitMap* markBitMap() { return &_markBitMap; } void directAllocated(HeapWord* start, size_t size); @@ -1027,6 +1031,8 @@ // Initialization errors bool completed_initialization() { return _completed_initialization; } + + void print_eden_and_survivor_chunk_arrays(); }; class CMSExpansionCause : public AllStatic { @@ -1317,6 +1323,10 @@ //Delegate to collector return collector()->get_data_recorder(thr_num); } + void sample_eden_chunk() { + //Delegate to collector + return collector()->sample_eden_chunk(); + } // Printing const char* name() const; diff -r 8ac8b6677ba7 -r bdf5c313d76f hotspot/src/share/vm/gc_implementation/g1/g1_globals.hpp --- a/hotspot/src/share/vm/gc_implementation/g1/g1_globals.hpp Thu Jul 25 17:32:23 2013 +0100 +++ b/hotspot/src/share/vm/gc_implementation/g1/g1_globals.hpp Fri Aug 02 09:38:09 2013 +0100 @@ -96,11 +96,6 @@ "the buffer will be enqueued for processing. A value of 0 " \ "specifies that mutator threads should not do such filtering.") \ \ - develop(intx, G1ExtraRegionSurvRate, 33, \ - "If the young survival rate is S, and there's room left in " \ - "to-space, we will allow regions whose survival rate is up to " \ - "S + (1 - S)*X, where X is this parameter (as a fraction.)") \ - \ develop(bool, G1SATBPrintStubs, false, \ "If true, print generated stubs for the SATB barrier") \ \ @@ -110,9 +105,6 @@ develop(bool, G1RSBarrierRegionFilter, true, \ "If true, generate region filtering code in RS barrier") \ \ - develop(bool, G1RSBarrierNullFilter, true, \ - "If true, generate null-pointer filtering code in RS barrier") \ - \ develop(bool, G1DeferredRSUpdate, true, \ "If true, use deferred RS updates") \ \ @@ -120,9 +112,6 @@ "If true, verify that no dirty cards remain after RS log " \ "processing.") \ \ - develop(bool, G1RSCountHisto, false, \ - "If true, print a histogram of RS occupancies after each pause") \ - \ diagnostic(bool, G1PrintRegionLivenessInfo, false, \ "Prints the liveness information for all regions in the heap " \ "at the end of a marking cycle.") \ @@ -169,9 +158,6 @@ product(uintx, G1ConcRSHotCardLimit, 4, \ "The threshold that defines (>=) a hot card.") \ \ - develop(bool, G1PrintOopAppls, false, \ - "When true, print applications of closures to external locs.") \ - \ develop(intx, G1RSetRegionEntriesBase, 256, \ "Max number of regions in a fine-grain table per MB.") \ \ diff -r 8ac8b6677ba7 -r bdf5c313d76f hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp --- a/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp Thu Jul 25 17:32:23 2013 +0100 +++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp Fri Aug 02 09:38:09 2013 +0100 @@ -314,6 +314,11 @@ region_size = MAX_REGION_SIZE; } + if (region_size != G1HeapRegionSize) { + // Update the flag to make sure that PrintFlagsFinal logs the correct value + FLAG_SET_ERGO(uintx, G1HeapRegionSize, region_size); + } + // And recalculate the log. region_size_log = log2_long((jlong) region_size); diff -r 8ac8b6677ba7 -r bdf5c313d76f hotspot/src/share/vm/memory/defNewGeneration.cpp --- a/hotspot/src/share/vm/memory/defNewGeneration.cpp Thu Jul 25 17:32:23 2013 +0100 +++ b/hotspot/src/share/vm/memory/defNewGeneration.cpp Fri Aug 02 09:38:09 2013 +0100 @@ -1033,6 +1033,9 @@ // have to use it here, as well. HeapWord* result = eden()->par_allocate(word_size); if (result != NULL) { + if (CMSEdenChunksRecordAlways && _next_gen != NULL) { + _next_gen->sample_eden_chunk(); + } return result; } do { @@ -1063,13 +1066,19 @@ // circular dependency at compile time. if (result == NULL) { result = allocate_from_space(word_size); + } else if (CMSEdenChunksRecordAlways && _next_gen != NULL) { + _next_gen->sample_eden_chunk(); } return result; } HeapWord* DefNewGeneration::par_allocate(size_t word_size, bool is_tlab) { - return eden()->par_allocate(word_size); + HeapWord* res = eden()->par_allocate(word_size); + if (CMSEdenChunksRecordAlways && _next_gen != NULL) { + _next_gen->sample_eden_chunk(); + } + return res; } void DefNewGeneration::gc_prologue(bool full) { diff -r 8ac8b6677ba7 -r bdf5c313d76f hotspot/src/share/vm/memory/generation.hpp --- a/hotspot/src/share/vm/memory/generation.hpp Thu Jul 25 17:32:23 2013 +0100 +++ b/hotspot/src/share/vm/memory/generation.hpp Fri Aug 02 09:38:09 2013 +0100 @@ -455,6 +455,7 @@ // expected to be GC worker thread-local, with the worker index // indicated by "thr_num". virtual void* get_data_recorder(int thr_num) { return NULL; } + virtual void sample_eden_chunk() {} // Some generations may require some cleanup actions before allowing // a verification. diff -r 8ac8b6677ba7 -r bdf5c313d76f hotspot/src/share/vm/memory/metaspace.cpp --- a/hotspot/src/share/vm/memory/metaspace.cpp Thu Jul 25 17:32:23 2013 +0100 +++ b/hotspot/src/share/vm/memory/metaspace.cpp Fri Aug 02 09:38:09 2013 +0100 @@ -2254,10 +2254,11 @@ void SpaceManager::deallocate(MetaWord* p, size_t word_size) { assert_lock_strong(_lock); + size_t raw_word_size = get_raw_word_size(word_size); size_t min_size = TreeChunk::min_size(); - assert(word_size >= min_size, + assert(raw_word_size >= min_size, err_msg("Should not deallocate dark matter " SIZE_FORMAT, word_size)); - block_freelists()->return_block(p, word_size); + block_freelists()->return_block(p, raw_word_size); } // Adds a chunk to the list of chunks in use. diff -r 8ac8b6677ba7 -r bdf5c313d76f hotspot/src/share/vm/memory/sharedHeap.cpp --- a/hotspot/src/share/vm/memory/sharedHeap.cpp Thu Jul 25 17:32:23 2013 +0100 +++ b/hotspot/src/share/vm/memory/sharedHeap.cpp Fri Aug 02 09:38:09 2013 +0100 @@ -65,7 +65,8 @@ } _sh = this; // ch is static, should be set only once. if ((UseParNewGC || - (UseConcMarkSweepGC && CMSParallelRemarkEnabled) || + (UseConcMarkSweepGC && (CMSParallelInitialMarkEnabled || + CMSParallelRemarkEnabled)) || UseG1GC) && ParallelGCThreads > 0) { _workers = new FlexibleWorkGang("Parallel GC Threads", ParallelGCThreads, diff -r 8ac8b6677ba7 -r bdf5c313d76f hotspot/src/share/vm/runtime/arguments.cpp --- a/hotspot/src/share/vm/runtime/arguments.cpp Thu Jul 25 17:32:23 2013 +0100 +++ b/hotspot/src/share/vm/runtime/arguments.cpp Fri Aug 02 09:38:09 2013 +0100 @@ -1891,6 +1891,10 @@ warning("Using MaxGCMinorPauseMillis as minor pause goal is deprecated" "and will likely be removed in future release"); } + if (FLAG_IS_CMDLINE(DefaultMaxRAMFraction)) { + warning("DefaultMaxRAMFraction is deprecated and will likely be removed in a future release. " + "Use MaxRAMFraction instead."); + } } // Check stack pages settings diff -r 8ac8b6677ba7 -r bdf5c313d76f hotspot/src/share/vm/runtime/globals.hpp --- a/hotspot/src/share/vm/runtime/globals.hpp Thu Jul 25 17:32:23 2013 +0100 +++ b/hotspot/src/share/vm/runtime/globals.hpp Fri Aug 02 09:38:09 2013 +0100 @@ -1689,6 +1689,9 @@ product(bool, CMSAbortSemantics, false, \ "Whether abort-on-overflow semantics is implemented") \ \ + product(bool, CMSParallelInitialMarkEnabled, true, \ + "Use the parallel initial mark.") \ + \ product(bool, CMSParallelRemarkEnabled, true, \ "Whether parallel remark enabled (only if ParNewGC)") \ \ @@ -1700,6 +1703,14 @@ "Whether to always record survivor space PLAB bdries" \ " (effective only if CMSParallelSurvivorRemarkEnabled)") \ \ + product(bool, CMSEdenChunksRecordAlways, true, \ + "Whether to always record eden chunks used for " \ + "the parallel initial mark or remark of eden" ) \ + \ + product(bool, CMSPrintEdenSurvivorChunks, false, \ + "Print the eden and the survivor chunks used for the parallel " \ + "initial mark or remark of the eden/survivor spaces") \ + \ product(bool, CMSConcurrentMTEnabled, true, \ "Whether multi-threaded concurrent work enabled (if ParNewGC)") \ \ diff -r 8ac8b6677ba7 -r bdf5c313d76f hotspot/test/gc/arguments/TestG1HeapRegionSize.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/gc/arguments/TestG1HeapRegionSize.java Fri Aug 02 09:38:09 2013 +0100 @@ -0,0 +1,64 @@ +/* +* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* This code is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License version 2 only, as +* published by the Free Software Foundation. +* +* This code is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +* version 2 for more details (a copy is included in the LICENSE file that +* accompanied this code). +* +* You should have received a copy of the GNU General Public License version +* 2 along with this work; if not, write to the Free Software Foundation, +* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +* +* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +* or visit www.oracle.com if you need additional information or have any +* questions. +*/ + +/* + * @test TestG1HeapRegionSize + * @key gc + * @bug 8021879 + * @summary Verify that the flag G1HeapRegionSize is updated properly + * @run main/othervm -Xmx64m TestG1HeapRegionSize 1048576 + * @run main/othervm -XX:G1HeapRegionSize=2m -Xmx64m TestG1HeapRegionSize 2097152 + * @run main/othervm -XX:G1HeapRegionSize=3m -Xmx64m TestG1HeapRegionSize 2097152 + * @run main/othervm -XX:G1HeapRegionSize=64m -Xmx256m TestG1HeapRegionSize 33554432 + */ + +import sun.management.ManagementFactoryHelper; +import com.sun.management.HotSpotDiagnosticMXBean; +import com.sun.management.VMOption; + +public class TestG1HeapRegionSize { + + public static void main(String[] args) { + HotSpotDiagnosticMXBean diagnostic = ManagementFactoryHelper.getDiagnosticMXBean(); + + VMOption option = diagnostic.getVMOption("UseG1GC"); + if (option.getValue().equals("false")) { + System.out.println("Skipping this test. It is only a G1 test."); + return; + } + + String expectedValue = getExpectedValue(args); + option = diagnostic.getVMOption("G1HeapRegionSize"); + if (!expectedValue.equals(option.getValue())) { + throw new RuntimeException("Wrong value for G1HeapRegionSize. Expected " + expectedValue + " but got " + option.getValue()); + } + } + + private static String getExpectedValue(String[] args) { + if (args.length != 1) { + throw new RuntimeException("Wrong number of arguments. Expected 1 but got " + args.length); + } + return args[0]; + } + +} diff -r 8ac8b6677ba7 -r bdf5c313d76f hotspot/test/gc/g1/TestPrintRegionRememberedSetInfo.java --- a/hotspot/test/gc/g1/TestPrintRegionRememberedSetInfo.java Thu Jul 25 17:32:23 2013 +0100 +++ b/hotspot/test/gc/g1/TestPrintRegionRememberedSetInfo.java Fri Aug 02 09:38:09 2013 +0100 @@ -27,7 +27,7 @@ * @bug 8014240 * @summary Test output of G1PrintRegionRememberedSetInfo * @library /testlibrary - * @build TestPrintRegionRememberedSetInfo + * @run main TestPrintRegionRememberedSetInfo * @author thomas.schatzl@oracle.com */ diff -r 8ac8b6677ba7 -r bdf5c313d76f hotspot/test/gc/startup_warnings/TestDefaultMaxRAMFraction.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/gc/startup_warnings/TestDefaultMaxRAMFraction.java Fri Aug 02 09:38:09 2013 +0100 @@ -0,0 +1,44 @@ +/* +* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* This code is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License version 2 only, as +* published by the Free Software Foundation. +* +* This code is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +* version 2 for more details (a copy is included in the LICENSE file that +* accompanied this code). +* +* You should have received a copy of the GNU General Public License version +* 2 along with this work; if not, write to the Free Software Foundation, +* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +* +* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +* or visit www.oracle.com if you need additional information or have any +* questions. +*/ + +/* +* @test TestDefaultMaxRAMFraction +* @key gc +* @bug 8021967 +* @summary Test that the deprecated TestDefaultMaxRAMFraction flag print a warning message +* @library /testlibrary +*/ + +import com.oracle.java.testlibrary.OutputAnalyzer; +import com.oracle.java.testlibrary.ProcessTools; + +public class TestDefaultMaxRAMFraction { + public static void main(String[] args) throws Exception { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:DefaultMaxRAMFraction=4", "-version"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldContain("warning: DefaultMaxRAMFraction is deprecated and will likely be removed in a future release. Use MaxRAMFraction instead."); + output.shouldNotContain("error"); + output.shouldHaveExitValue(0); + } + +} diff -r 8ac8b6677ba7 -r bdf5c313d76f hotspot/test/runtime/6929067/Test6929067.sh --- a/hotspot/test/runtime/6929067/Test6929067.sh Thu Jul 25 17:32:23 2013 +0100 +++ b/hotspot/test/runtime/6929067/Test6929067.sh Fri Aug 02 09:38:09 2013 +0100 @@ -3,6 +3,7 @@ ## ## @test Test6929067.sh ## @bug 6929067 +## @bug 8021296 ## @summary Stack guard pages should be removed when thread is detached ## @compile T.java ## @run shell Test6929067.sh @@ -21,6 +22,11 @@ OS=`uname -s` case "$OS" in Linux) + gcc_cmd=`which gcc` + if [ "x$gcc_cmd" == "x" ]; then + echo "WARNING: gcc not found. Cannot execute test." 2>&1 + exit 0; + fi NULL=/dev/null PS=":" FS="/" @@ -119,10 +125,10 @@ # Check to ensure you have a /usr/lib/libpthread.so if you don't please look # for /usr/lib/`uname -m`-linux-gnu version ensure to add that path to below compilation. -gcc -DLINUX ${COMP_FLAG} -o invoke \ - -I${COMPILEJAVA}/include -I${COMPILEJAVA}/include/linux \ - -L${COMPILEJAVA}/jre/lib/${ARCH}/${VMTYPE} \ - -ljvm -lpthread invoke.c +$gcc_cmd -DLINUX ${COMP_FLAG} -o invoke \ + -I${COMPILEJAVA}/include -I${COMPILEJAVA}/include/linux \ + -L${COMPILEJAVA}/jre/lib/${ARCH}/${VMTYPE} \ + -ljvm -lpthread invoke.c ./invoke exit $? diff -r 8ac8b6677ba7 -r bdf5c313d76f hotspot/test/runtime/7107135/Test7107135.sh --- a/hotspot/test/runtime/7107135/Test7107135.sh Thu Jul 25 17:32:23 2013 +0100 +++ b/hotspot/test/runtime/7107135/Test7107135.sh Fri Aug 02 09:38:09 2013 +0100 @@ -27,6 +27,7 @@ ## ## @test Test7107135.sh ## @bug 7107135 +## @bug 8021296 ## @summary Stack guard pages lost after loading library with executable stack. ## @run shell Test7107135.sh ## @@ -45,6 +46,11 @@ case "$OS" in Linux) echo "Testing on Linux" + gcc_cmd=`which gcc` + if [ "x$gcc_cmd" == "x" ]; then + echo "WARNING: gcc not found. Cannot execute test." 2>&1 + exit 0; + fi ;; *) NULL=NUL @@ -62,7 +68,10 @@ cp ${TESTSRC}${FS}*.java ${THIS_DIR} ${TESTJAVA}${FS}bin${FS}javac *.java -gcc -fPIC -shared -c -o test.o -I${TESTJAVA}${FS}include -I${TESTJAVA}${FS}include${FS}linux ${TESTSRC}${FS}test.c +$gcc_cmd -fPIC -shared -c -o test.o \ + -I${TESTJAVA}${FS}include -I${TESTJAVA}${FS}include${FS}linux \ + ${TESTSRC}${FS}test.c + ld -shared -z execstack -o libtest-rwx.so test.o ld -shared -z noexecstack -o libtest-rw.so test.o diff -r 8ac8b6677ba7 -r bdf5c313d76f hotspot/test/runtime/jsig/Test8017498.sh --- a/hotspot/test/runtime/jsig/Test8017498.sh Thu Jul 25 17:32:23 2013 +0100 +++ b/hotspot/test/runtime/jsig/Test8017498.sh Fri Aug 02 09:38:09 2013 +0100 @@ -27,6 +27,7 @@ ## @test Test8017498.sh ## @bug 8017498 ## @bug 8020791 +## @bug 8021296 ## @summary sigaction(sig) results in process hang/timed-out if sig is much greater than SIGRTMAX ## @run shell/timeout=30 Test8017498.sh ## @@ -45,6 +46,11 @@ case "$OS" in Linux) echo "Testing on Linux" + gcc_cmd=`which gcc` + if [ "x$gcc_cmd" == "x" ]; then + echo "WARNING: gcc not found. Cannot execute test." 2>&1 + exit 0; + fi if [ "$VM_BITS" = "64" ] then MY_LD_PRELOAD=${TESTJAVA}${FS}jre${FS}lib${FS}amd64${FS}libjsig.so @@ -64,15 +70,11 @@ cp ${TESTSRC}${FS}*.java ${THIS_DIR} ${TESTJAVA}${FS}bin${FS}javac *.java -gcc -DLINUX -fPIC -shared \ +$gcc_cmd -DLINUX -fPIC -shared \ -o ${TESTSRC}${FS}libTestJNI.so \ -I${TESTJAVA}${FS}include \ -I${TESTJAVA}${FS}include${FS}linux \ ${TESTSRC}${FS}TestJNI.c -if [ $? != 0 ] -then - echo "WARNING: the gcc command failed." 2>&1 -fi # run the java test in the background cmd="LD_PRELOAD=$MY_LD_PRELOAD \ diff -r 8ac8b6677ba7 -r bdf5c313d76f hotspot/test/runtime/jsig/TestJNI.c --- a/hotspot/test/runtime/jsig/TestJNI.c Thu Jul 25 17:32:23 2013 +0100 +++ b/hotspot/test/runtime/jsig/TestJNI.c Fri Aug 02 09:38:09 2013 +0100 @@ -21,7 +21,6 @@ * questions. */ -#define _GNU_SOURCE // for the definition of REG_RIP in ucontext.h #include #include #include @@ -32,11 +31,8 @@ #endif void sig_handler(int sig, siginfo_t *info, ucontext_t *context) { - int thrNum; printf( " HANDLER (1) " ); - // Move forward RIP to skip failing instruction - context->uc_mcontext.gregs[REG_RIP] += 6; } JNIEXPORT void JNICALL Java_TestJNI_doSomething(JNIEnv *env, jclass klass, jint val) { diff -r 8ac8b6677ba7 -r bdf5c313d76f jaxp/.hgtags --- a/jaxp/.hgtags Thu Jul 25 17:32:23 2013 +0100 +++ b/jaxp/.hgtags Fri Aug 02 09:38:09 2013 +0100 @@ -222,3 +222,4 @@ 15e5bb51bc0cd89304dc2f7f29b4c8002e632353 jdk8-b98 adf49c3ef83c160d53ece623049b2cdccaf78fc7 jdk8-b99 5d1974c1d7b9a86431bc253dc5a6a52d4586622e jdk8-b100 +0a7432f898e579ea35e8c51e3edab37f949168e4 jdk8-b101 diff -r 8ac8b6677ba7 -r bdf5c313d76f jaxp/src/com/sun/org/apache/xerces/internal/jaxp/SAXParserImpl.java --- a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/SAXParserImpl.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/SAXParserImpl.java Fri Aug 02 09:38:09 2013 +0100 @@ -112,7 +112,7 @@ /** Initial EntityResolver */ private final EntityResolver fInitEntityResolver; - private XMLSecurityPropertyManager fSecurityPropertyMgr; + private final XMLSecurityPropertyManager fSecurityPropertyMgr; /** * Create a SAX parser with the associated features @@ -130,8 +130,10 @@ SAXParserImpl(SAXParserFactoryImpl spf, Hashtable features, boolean secureProcessing) throws SAXException { + fSecurityPropertyMgr = new XMLSecurityPropertyManager(); + // Instantiate a SAXParser directly and not through SAX so that we use the right ClassLoader - xmlReader = new JAXPSAXParser(this); + xmlReader = new JAXPSAXParser(this, fSecurityPropertyMgr); // JAXP "namespaceAware" == SAX Namespaces feature // Note: there is a compatibility problem here with default values: @@ -150,7 +152,6 @@ xmlReader.setFeature0(XINCLUDE_FEATURE, true); } - fSecurityPropertyMgr = new XMLSecurityPropertyManager(); xmlReader.setProperty0(XML_SECURITY_PROPERTY_MANAGER, fSecurityPropertyMgr); // If the secure processing feature is on set a security manager. @@ -397,14 +398,30 @@ private final HashMap fInitFeatures = new HashMap(); private final HashMap fInitProperties = new HashMap(); private final SAXParserImpl fSAXParser; + private XMLSecurityPropertyManager fSecurityPropertyMgr; + public JAXPSAXParser() { - this(null); + this(null, null); } - JAXPSAXParser(SAXParserImpl saxParser) { + JAXPSAXParser(SAXParserImpl saxParser, XMLSecurityPropertyManager spm) { super(); fSAXParser = saxParser; + fSecurityPropertyMgr = spm; + + /** + * This class may be used directly. So initialize the security manager if + * it is null. + */ + if (fSecurityPropertyMgr == null) { + fSecurityPropertyMgr = new XMLSecurityPropertyManager(); + try { + super.setProperty(XML_SECURITY_PROPERTY_MANAGER, fSecurityPropertyMgr); + } catch (Exception ex) { + //shall not happen + } + } } /** @@ -542,9 +559,9 @@ setSchemaValidatorProperty(name, value); } /** Check to see if the property is managed by the property manager **/ - int index = fSAXParser.fSecurityPropertyMgr.getIndex(name); + int index = (fSecurityPropertyMgr != null) ? fSecurityPropertyMgr.getIndex(name) : -1; if (index > -1) { - fSAXParser.fSecurityPropertyMgr.setValue(index, + fSecurityPropertyMgr.setValue(index, XMLSecurityPropertyManager.State.APIPROPERTY, (String)value); } else { if (!fInitProperties.containsKey(name)) { @@ -564,9 +581,9 @@ // JAXP 1.2 support return fSAXParser.schemaLanguage; } - int index = fSAXParser.fSecurityPropertyMgr.getIndex(name); + int index = (fSecurityPropertyMgr != null) ? fSecurityPropertyMgr.getIndex(name) : -1; if (index > -1) { - return fSAXParser.fSecurityPropertyMgr.getValueByIndex(index); + return fSecurityPropertyMgr.getValueByIndex(index); } return super.getProperty(name); diff -r 8ac8b6677ba7 -r bdf5c313d76f jaxws/.hgtags --- a/jaxws/.hgtags Thu Jul 25 17:32:23 2013 +0100 +++ b/jaxws/.hgtags Fri Aug 02 09:38:09 2013 +0100 @@ -222,3 +222,4 @@ b1fb4612a2caea52b5661b87509e560fa044b194 jdk8-b98 8ef83d4b23c933935e28f59b282cea920b1b1f5f jdk8-b99 4fd722afae5c02f00bbd44c3a34425ee474afb1c jdk8-b100 +60b623a361642a0f5aef5f06dad9e5f279b9d9a9 jdk8-b101 diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/.hgtags --- a/jdk/.hgtags Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/.hgtags Fri Aug 02 09:38:09 2013 +0100 @@ -222,3 +222,4 @@ c4908732fef5235f1b98cafe0ce507771ef7892c jdk8-b98 6a099a36589bd933957272ba63e5263bede29971 jdk8-b99 5be9c5bfcfe9b2a40412b4fb364377d49de014eb jdk8-b100 +6901612328239fbd471d20823113c1cf3fdaebee jdk8-b101 diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/macosx/classes/com/apple/eawt/_AppMenuBarHandler.java --- a/jdk/src/macosx/classes/com/apple/eawt/_AppMenuBarHandler.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/macosx/classes/com/apple/eawt/_AppMenuBarHandler.java Fri Aug 02 09:38:09 2013 +0100 @@ -31,6 +31,7 @@ import javax.swing.*; import javax.swing.plaf.MenuBarUI; +import com.apple.laf.ScreenMenuBar; import sun.lwawt.macosx.CMenuBar; import com.apple.laf.AquaMenuBarUI; @@ -72,12 +73,15 @@ // scan the current frames, and see if any are foreground final Frame[] frames = Frame.getFrames(); for (final Frame frame : frames) { - if (frame.isVisible() && !isFrameMinimized(frame)) return; + if (frame.isVisible() && !isFrameMinimized(frame)) { + return; + } } // if we have no foreground frames, then we have to "kick" the menubar final JFrame pingFrame = new JFrame(); pingFrame.getRootPane().putClientProperty("Window.alpha", new Float(0.0f)); + pingFrame.setUndecorated(true); pingFrame.setVisible(true); pingFrame.toFront(); pingFrame.setVisible(false); @@ -101,7 +105,6 @@ // Aqua was not installed throw new IllegalStateException("Application.setDefaultMenuBar() only works with the Aqua Look and Feel"); } -/* TODO: disabled until ScreenMenuBar is working final AquaMenuBarUI aquaUI = (AquaMenuBarUI)ui; final ScreenMenuBar screenMenuBar = aquaUI.getScreenMenuBar(); @@ -118,8 +121,7 @@ } // grab the pointer to the CMenuBar, and retain it in native - nativeSetDefaultMenuBar(((CMenuBar)peer).getNativeMenuBarPeer()); -*/ + nativeSetDefaultMenuBar(((CMenuBar)peer).getModel()); } void setAboutMenuItemVisible(final boolean present) { diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/macosx/classes/sun/font/CStrike.java --- a/jdk/src/macosx/classes/sun/font/CStrike.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/macosx/classes/sun/font/CStrike.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,7 +31,7 @@ import sun.awt.SunHints; -public class CStrike extends FontStrike { +public final class CStrike extends FontStrike { // Creates the native strike private static native long createNativeStrikePtr(long nativeFontPtr, @@ -68,10 +68,10 @@ Rectangle2D.Float result, double x, double y); - private CFont nativeFont; + private final CFont nativeFont; private AffineTransform invDevTx; - private GlyphInfoCache glyphInfoCache; - private GlyphAdvanceCache glyphAdvanceCache; + private final GlyphInfoCache glyphInfoCache; + private final GlyphAdvanceCache glyphAdvanceCache; private long nativeStrikePtr; CStrike(final CFont font, final FontStrikeDesc inDesc) { @@ -84,11 +84,11 @@ // Normally the device transform should be the identity transform // for screen operations. The device transform only becomes // interesting when we are outputting between different dpi surfaces, - // like when we are printing to postscript. + // like when we are printing to postscript or use retina. if (inDesc.devTx != null && !inDesc.devTx.isIdentity()) { try { invDevTx = inDesc.devTx.createInverse(); - } catch (NoninvertibleTransformException e) { + } catch (NoninvertibleTransformException ignored) { // ignored, since device transforms should not be that // complicated, and if they are - there is nothing we can do, // so we won't worry about it. @@ -134,15 +134,13 @@ nativeStrikePtr = 0; } - // the fractional metrics default on our platform is OFF - private boolean useFractionalMetrics() { - return desc.fmHint == SunHints.INTVAL_FRACTIONALMETRICS_ON; - } + @Override public int getNumGlyphs() { return nativeFont.getNumGlyphs(); } + @Override StrikeMetrics getFontMetrics() { if (strikeMetrics == null) { StrikeMetrics metrics = getFontMetrics(getNativeStrikePtr()); @@ -155,74 +153,24 @@ return strikeMetrics; } - float getGlyphAdvance(int glyphCode) { - return getScaledAdvanceForAdvance(getCachedNativeGlyphAdvance(glyphCode)); - } - - float getCodePointAdvance(int cp) { - float advance = getCachedNativeGlyphAdvance(nativeFont.getMapper().charToGlyph(cp)); - - double glyphScaleX = desc.glyphTx.getScaleX(); - double devScaleX = desc.devTx.getScaleX(); - - if (devScaleX == 0) { - glyphScaleX = Math.sqrt(desc.glyphTx.getDeterminant()); - devScaleX = Math.sqrt(desc.devTx.getDeterminant()); - } - - if (devScaleX == 0) { - devScaleX = Double.NaN; // this an undefined graphics state - } - advance = (float) (advance * glyphScaleX / devScaleX); - return useFractionalMetrics() ? advance : Math.round(advance); - } - - // calculate an advance, and round if not using fractional metrics - private float getScaledAdvanceForAdvance(float advance) { - if (invDevTx != null) { - advance *= invDevTx.getScaleX(); - } - advance *= desc.glyphTx.getScaleX(); - return useFractionalMetrics() ? advance : Math.round(advance); + @Override + float getGlyphAdvance(final int glyphCode) { + return getCachedNativeGlyphAdvance(glyphCode); } - Point2D.Float getCharMetrics(char ch) { - return getScaledPointForAdvance(getCachedNativeGlyphAdvance(nativeFont.getMapper().charToGlyph(ch))); - } - - Point2D.Float getGlyphMetrics(int glyphCode) { - return getScaledPointForAdvance(getCachedNativeGlyphAdvance(glyphCode)); + @Override + float getCodePointAdvance(final int cp) { + return getGlyphAdvance(nativeFont.getMapper().charToGlyph(cp)); } - // calculate an advance point, and round if not using fractional metrics - private Point2D.Float getScaledPointForAdvance(float advance) { - Point2D.Float pt = new Point2D.Float(advance, 0); - - if (!desc.glyphTx.isIdentity()) { - return scalePoint(pt); - } - - if (!useFractionalMetrics()) { - pt.x = Math.round(pt.x); - } - return pt; + @Override + Point2D.Float getCharMetrics(final char ch) { + return getGlyphMetrics(nativeFont.getMapper().charToGlyph(ch)); } - private Point2D.Float scalePoint(Point2D.Float pt) { - if (invDevTx != null) { - // transform the point out of the device space first - invDevTx.transform(pt, pt); - } - desc.glyphTx.transform(pt, pt); - pt.x -= desc.glyphTx.getTranslateX(); - pt.y -= desc.glyphTx.getTranslateY(); - - if (!useFractionalMetrics()) { - pt.x = Math.round(pt.x); - pt.y = Math.round(pt.y); - } - - return pt; + @Override + Point2D.Float getGlyphMetrics(final int glyphCode) { + return new Point2D.Float(getGlyphAdvance(glyphCode), 0.0f); } Rectangle2D.Float getGlyphOutlineBounds(int glyphCode) { @@ -414,9 +362,7 @@ private SparseBitShiftingTwoLayerArray secondLayerCache; private HashMap generalCache; - public GlyphInfoCache(final Font2D nativeFont, - final FontStrikeDesc desc) - { + GlyphInfoCache(final Font2D nativeFont, final FontStrikeDesc desc) { super(nativeFont, desc); firstLayerCache = new long[FIRST_LAYER_SIZE]; } @@ -527,7 +473,7 @@ final int shift; final int secondLayerLength; - public SparseBitShiftingTwoLayerArray(final int size, final int shift) { + SparseBitShiftingTwoLayerArray(final int size, final int shift) { this.shift = shift; this.cache = new long[1 << shift][]; this.secondLayerLength = size >> shift; @@ -559,6 +505,12 @@ private SparseBitShiftingTwoLayerArray secondLayerCache; private HashMap generalCache; + // Empty non private constructor was added because access to this + // class shouldn't be emulated by a synthetic accessor method. + GlyphAdvanceCache() { + super(); + } + public synchronized float get(final int index) { if (index < 0) { if (-index < SECOND_LAYER_SIZE) { @@ -609,9 +561,7 @@ final int shift; final int secondLayerLength; - public SparseBitShiftingTwoLayerArray(final int size, - final int shift) - { + SparseBitShiftingTwoLayerArray(final int size, final int shift) { this.shift = shift; this.cache = new float[1 << shift][]; this.secondLayerLength = size >> shift; diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/macosx/classes/sun/lwawt/macosx/CDataTransferer.java --- a/jdk/src/macosx/classes/sun/lwawt/macosx/CDataTransferer.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CDataTransferer.java Fri Aug 02 09:38:09 2013 +0100 @@ -182,7 +182,11 @@ Long format = predefinedClipboardNameMap.get(str); if (format == null) { - format = new Long(registerFormatWithPasteboard(str)); + if (java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().isHeadlessInstance()) { + // Do not try to access native system for the unknown format + return -1L; + } + format = registerFormatWithPasteboard(str); predefinedClipboardNameMap.put(str, format); predefinedClipboardFormatMap.put(format, str); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/macosx/classes/sun/lwawt/macosx/CMenuComponent.java --- a/jdk/src/macosx/classes/sun/lwawt/macosx/CMenuComponent.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CMenuComponent.java Fri Aug 02 09:38:09 2013 +0100 @@ -43,7 +43,7 @@ return target; } - long getModel() { + public long getModel() { return modelPtr; } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java --- a/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Fri Aug 02 09:38:09 2013 +0100 @@ -47,7 +47,7 @@ import com.sun.awt.AWTUtilities; public class CPlatformWindow extends CFRetainedResource implements PlatformWindow { - private native long nativeCreateNSWindow(long nsViewPtr, long styleBits, double x, double y, double w, double h); + private native long nativeCreateNSWindow(long nsViewPtr,long ownerPtr, long styleBits, double x, double y, double w, double h); private static native void nativeSetNSWindowStyleBits(long nsWindowPtr, int mask, int data); private static native void nativeSetNSWindowMenuBar(long nsWindowPtr, long menuBarPtr); private static native Insets nativeGetNSWindowInsets(long nsWindowPtr); @@ -230,7 +230,8 @@ contentView = createContentView(); contentView.initialize(peer, responder); - final long nativeWindowPtr = nativeCreateNSWindow(contentView.getAWTView(), styleBits, 0, 0, 0, 0); + final long ownerPtr = owner != null ? owner.getNSWindowPtr() : 0L; + final long nativeWindowPtr = nativeCreateNSWindow(contentView.getAWTView(), ownerPtr, styleBits, 0, 0, 0, 0); setPtr(nativeWindowPtr); if (target instanceof javax.swing.RootPaneContainer) { diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/macosx/native/sun/awt/AWTWindow.h --- a/jdk/src/macosx/native/sun/awt/AWTWindow.h Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/macosx/native/sun/awt/AWTWindow.h Fri Aug 02 09:38:09 2013 +0100 @@ -44,6 +44,7 @@ jint styleBits; BOOL isEnabled; NSWindow *nsWindow; + AWTWindow *ownerWindow; } // An instance of either AWTWindow_Normal or AWTWindow_Panel @@ -51,12 +52,15 @@ @property (nonatomic, retain) JNFWeakJObjectWrapper *javaPlatformWindow; @property (nonatomic, retain) CMenuBar *javaMenuBar; +@property (nonatomic, retain) AWTWindow *ownerWindow; @property (nonatomic) NSSize javaMinSize; @property (nonatomic) NSSize javaMaxSize; @property (nonatomic) jint styleBits; @property (nonatomic) BOOL isEnabled; + - (id) initWithPlatformWindow:(JNFWeakJObjectWrapper *)javaPlatformWindow + ownerWindow:owner styleBits:(jint)styleBits frameRect:(NSRect)frameRect contentView:(NSView *)contentView; diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/macosx/native/sun/awt/AWTWindow.m --- a/jdk/src/macosx/native/sun/awt/AWTWindow.m Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/macosx/native/sun/awt/AWTWindow.m Fri Aug 02 09:38:09 2013 +0100 @@ -30,6 +30,7 @@ #import "sun_lwawt_macosx_CPlatformWindow.h" #import "com_apple_eawt_event_GestureHandler.h" #import "com_apple_eawt_FullScreenHandler.h" +#import "ApplicationDelegate.h" #import "AWTWindow.h" #import "AWTView.h" @@ -55,7 +56,7 @@ // doesn't provide information about "opposite" window, so we // have to do a bit of tracking. This variable points to a window // which had been the key window just before a new key window -// was set. It would be nil if the new key window isn't an AWT +// was set. It would be nil if the new key window isn't an AWT // window or the app currently has no key window. static AWTWindow* lastKeyWindow = nil; @@ -120,6 +121,7 @@ @synthesize javaMaxSize; @synthesize styleBits; @synthesize isEnabled; +@synthesize ownerWindow; - (void) updateMinMaxSize:(BOOL)resizable { if (resizable) { @@ -201,6 +203,7 @@ } - (id) initWithPlatformWindow:(JNFWeakJObjectWrapper *)platformWindow + ownerWindow:owner styleBits:(jint)bits frameRect:(NSRect)rect contentView:(NSView *)view @@ -245,6 +248,7 @@ self.isEnabled = YES; self.javaPlatformWindow = platformWindow; self.styleBits = bits; + self.ownerWindow = owner; [self setPropertiesForStyleBits:styleBits mask:MASK(_METHOD_PROP_BITMASK)]; return self; @@ -350,7 +354,7 @@ [self.javaPlatformWindow setJObject:nil withEnv:env]; self.nsWindow = nil; - + self.ownerWindow = nil; [super dealloc]; } @@ -539,11 +543,27 @@ AWT_ASSERT_APPKIT_THREAD; [AWTToolkit eventCountPlusPlus]; AWTWindow *opposite = [AWTWindow lastKeyWindow]; - if (!IS(self.styleBits, IS_DIALOG)) { - [CMenuBar activate:self.javaMenuBar modallyDisabled:NO]; - } else if ((opposite != NULL) && IS(self.styleBits, IS_MODAL)) { - [CMenuBar activate:opposite->javaMenuBar modallyDisabled:YES]; + + // Finds appropriate menubar in our hierarchy, + AWTWindow *awtWindow = self; + while (awtWindow.ownerWindow != nil) { + awtWindow = awtWindow.ownerWindow; } + + CMenuBar *menuBar = nil; + BOOL isDisabled = NO; + if ([awtWindow.nsWindow isVisible]){ + menuBar = awtWindow.javaMenuBar; + isDisabled = !awtWindow.isEnabled; + } + + if (menuBar == nil) { + menuBar = [[ApplicationDelegate sharedDelegate] defaultMenuBar]; + isDisabled = NO; + } + + [CMenuBar activate:menuBar modallyDisabled:isDisabled]; + [AWTWindow setLastKeyWindow:nil]; [self _deliverWindowFocusEvent:YES oppositeWindow: opposite]; @@ -555,6 +575,14 @@ [AWTToolkit eventCountPlusPlus]; [self.javaMenuBar deactivate]; + // In theory, this might cause flickering if the window gaining focus + // has its own menu. However, I couldn't reproduce it on practice, so + // perhaps this is a non issue. + CMenuBar* defaultMenu = [[ApplicationDelegate sharedDelegate] defaultMenuBar]; + if (defaultMenu != nil) { + [CMenuBar activate:defaultMenu modallyDisabled:NO]; + } + // the new key window NSWindow *keyWindow = [NSApp keyWindow]; AWTWindow *opposite = nil; @@ -741,7 +769,7 @@ * Signature: (JJIIII)J */ JNIEXPORT jlong JNICALL Java_sun_lwawt_macosx_CPlatformWindow_nativeCreateNSWindow -(JNIEnv *env, jobject obj, jlong contentViewPtr, jlong styleBits, jdouble x, jdouble y, jdouble w, jdouble h) +(JNIEnv *env, jobject obj, jlong contentViewPtr, jlong ownerPtr, jlong styleBits, jdouble x, jdouble y, jdouble w, jdouble h) { __block AWTWindow *window = nil; @@ -750,13 +778,14 @@ JNFWeakJObjectWrapper *platformWindow = [JNFWeakJObjectWrapper wrapperWithJObject:obj withEnv:env]; NSView *contentView = OBJC(contentViewPtr); NSRect frameRect = NSMakeRect(x, y, w, h); - + AWTWindow *owner = [OBJC(ownerPtr) delegate]; [ThreadUtilities performOnMainThreadWaiting:YES block:^(){ window = [[AWTWindow alloc] initWithPlatformWindow:platformWindow - styleBits:styleBits - frameRect:frameRect - contentView:contentView]; + ownerWindow:owner + styleBits:styleBits + frameRect:frameRect + contentView:contentView]; // the window is released is CPlatformWindow.nativeDispose() if (window) CFRetain(window.nsWindow); @@ -818,11 +847,19 @@ AWTWindow *window = (AWTWindow*)[nsWindow delegate]; - if ([nsWindow isKeyWindow]) [window.javaMenuBar deactivate]; + if ([nsWindow isKeyWindow]) { + [window.javaMenuBar deactivate]; + } + window.javaMenuBar = menuBar; + CMenuBar* actualMenuBar = menuBar; + if (actualMenuBar == nil) { + actualMenuBar = [[ApplicationDelegate sharedDelegate] defaultMenuBar]; + } + if ([nsWindow isKeyWindow]) { - [CMenuBar activate:window.javaMenuBar modallyDisabled:NO]; + [CMenuBar activate:actualMenuBar modallyDisabled:NO]; } }]; diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/macosx/native/sun/awt/CMenuBar.m --- a/jdk/src/macosx/native/sun/awt/CMenuBar.m Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/macosx/native/sun/awt/CMenuBar.m Fri Aug 02 09:38:09 2013 +0100 @@ -63,7 +63,7 @@ if (excludingAppleMenu && ![currMenu isJavaMenu]) { continue; } - + [currItem setSubmenu:nil]; [theMainMenu removeItemAtIndex:index]; } @@ -154,7 +154,10 @@ // Clean up extra items NSUInteger removedIndex, removedCount = [removedMenuArray count]; for (removedIndex=removedCount; removedIndex > 0; removedIndex--) { - [theMainMenu removeItemAtIndex:[[removedMenuArray objectAtIndex:(removedIndex-1)] integerValue]]; + NSUInteger index = [[removedMenuArray objectAtIndex:(removedIndex-1)] integerValue]; + NSMenuItem *currItem = [theMainMenu itemAtIndex:index]; + [currItem setSubmenu:nil]; + [theMainMenu removeItemAtIndex:index]; } i = cmenuIndex; diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/macosx/native/sun/awt/CMenuItem.m --- a/jdk/src/macosx/native/sun/awt/CMenuItem.m Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/macosx/native/sun/awt/CMenuItem.m Fri Aug 02 09:38:09 2013 +0100 @@ -70,9 +70,15 @@ JNIEnv *env = [ThreadUtilities getJNIEnv]; JNF_COCOA_ENTER(env); - // If we are called as a result of user pressing a shorcut, do nothing, + // If we are called as a result of user pressing a shortcut, do nothing, // because AVTView has already sent corresponding key event to the Java - // layer from performKeyEquivalent + // layer from performKeyEquivalent. + // There is an exception from the rule above, though: if a window with + // a menu gets minimized by user and there are no other windows to take + // focus, the window's menu won't be removed from the global menu bar. + // However, the Java layer won't handle invocation by a shortcut coming + // from this "frameless" menu, because there are no active windows. This + // means we have to handle it here. NSEvent *currEvent = [[NSApplication sharedApplication] currentEvent]; if ([currEvent type] == NSKeyDown) { NSString *menuKey = [sender keyEquivalent]; @@ -91,7 +97,8 @@ eventKey = [NSString stringWithCharacters: &newChar length: 1]; } - if ([menuKey isEqualToString:eventKey]) { + NSWindow *keyWindow = [NSApp keyWindow]; + if ([menuKey isEqualToString:eventKey] && keyWindow != nil) { return; } } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/macosx/native/sun/font/AWTStrike.h --- a/jdk/src/macosx/native/sun/font/AWTStrike.h Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/macosx/native/sun/font/AWTStrike.h Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,11 +31,12 @@ @interface AWTStrike : NSObject { @public AWTFont * fAWTFont; - CGFloat fSize; + CGFloat fSize; JRSFontRenderingStyle fStyle; - jint fAAStyle; + jint fAAStyle; CGAffineTransform fTx; + CGAffineTransform fDevTx; CGAffineTransform fAltTx; // alternate strike tx used for Sun2D CGAffineTransform fFontTx; } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/macosx/native/sun/font/AWTStrike.m --- a/jdk/src/macosx/native/sun/font/AWTStrike.m Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/macosx/native/sun/font/AWTStrike.m Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -65,6 +65,7 @@ invDevTx.b *= -1; invDevTx.c *= -1; fFontTx = CGAffineTransformConcat(CGAffineTransformConcat(tx, invDevTx), sInverseTX); + fDevTx = CGAffineTransformInvert(invDevTx); // the "font size" is the square root of the determinant of the matrix fSize = sqrt(abs(fFontTx.a * fFontTx.d - fFontTx.b * fFontTx.c)); @@ -148,7 +149,8 @@ { CGSize advance; JNF_COCOA_ENTER(env); - AWTFont *awtFont = ((AWTStrike *)jlong_to_ptr(awtStrikePtr))->fAWTFont; + AWTStrike *awtStrike = (AWTStrike *)jlong_to_ptr(awtStrikePtr); + AWTFont *awtFont = awtStrike->fAWTFont; // negative glyph codes are really unicodes, which were placed there by the mapper // to indicate we should use CoreText to substitute the character @@ -156,6 +158,10 @@ const CTFontRef fallback = CTS_CopyCTFallbackFontAndGlyphForJavaGlyphCode(awtFont, glyphCode, &glyph); CTFontGetAdvancesForGlyphs(fallback, kCTFontDefaultOrientation, &glyph, &advance, 1); CFRelease(fallback); + advance = CGSizeApplyAffineTransform(advance, awtStrike->fFontTx); + if (!JRSFontStyleUsesFractionalMetrics(awtStrike->fStyle)) { + advance.width = round(advance.width); + } JNF_COCOA_EXIT(env); return advance.width; diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/macosx/native/sun/font/CGGlyphImages.m --- a/jdk/src/macosx/native/sun/font/CGGlyphImages.m Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/macosx/native/sun/font/CGGlyphImages.m Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -455,6 +455,7 @@ #define CGGI_GLYPH_BBOX_PADDING 2.0f static inline GlyphInfo * CGGI_CreateNewGlyphInfoFrom(CGSize advance, CGRect bbox, + const AWTStrike *strike, const CGGI_RenderingMode *mode) { size_t pixelSize = mode->glyphDescriptor->pixelSize; @@ -477,6 +478,12 @@ width = 1; height = 1; } + advance = CGSizeApplyAffineTransform(advance, strike->fFontTx); + if (!JRSFontStyleUsesFractionalMetrics(strike->fStyle)) { + advance.width = round(advance.width); + advance.height = round(advance.height); + } + advance = CGSizeApplyAffineTransform(advance, strike->fDevTx); #ifdef USE_IMAGE_ALIGNED_MEMORY // create separate memory @@ -564,10 +571,10 @@ JRSFontGetBoundingBoxesForGlyphsAndStyle(fallback, &tx, style, &glyph, 1, &bbox); CGSize advance; - JRSFontGetAdvancesForGlyphsAndStyle(fallback, &tx, strike->fStyle, &glyph, 1, &advance); + CTFontGetAdvancesForGlyphs(fallback, kCTFontDefaultOrientation, &glyph, &advance, 1); // create the Sun2D GlyphInfo we are going to strike into - GlyphInfo *info = CGGI_CreateNewGlyphInfoFrom(advance, bbox, mode); + GlyphInfo *info = CGGI_CreateNewGlyphInfoFrom(advance, bbox, strike, mode); // fix the context size, just in case the substituted character is unexpectedly large CGGI_SizeCanvas(canvas, info->width, info->height, mode->cgFontMode); @@ -715,7 +722,7 @@ JRSFontRenderingStyle bboxCGMode = JRSFontAlignStyleForFractionalMeasurement(strike->fStyle); JRSFontGetBoundingBoxesForGlyphsAndStyle((CTFontRef)font->fFont, &tx, bboxCGMode, glyphs, len, bboxes); - JRSFontGetAdvancesForGlyphsAndStyle((CTFontRef)font->fFont, &tx, strike->fStyle, glyphs, len, advances); + CTFontGetAdvancesForGlyphs((CTFontRef)font->fFont, kCTFontDefaultOrientation, glyphs, advances, len); size_t maxWidth = 1; size_t maxHeight = 1; @@ -732,7 +739,7 @@ CGSize advance = advances[i]; CGRect bbox = bboxes[i]; - GlyphInfo *glyphInfo = CGGI_CreateNewGlyphInfoFrom(advance, bbox, mode); + GlyphInfo *glyphInfo = CGGI_CreateNewGlyphInfoFrom(advance, bbox, strike, mode); if (maxWidth < glyphInfo->width) maxWidth = glyphInfo->width; if (maxHeight < glyphInfo->height) maxHeight = glyphInfo->height; diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk.properties --- a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk.properties Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk.properties Fri Aug 02 09:38:09 2013 +0100 @@ -1,54 +1,54 @@ -# Refer to the note in basic.properties for a description as to what -# the mnemonics correspond to and how to calculate them. - - - -# GTK specific properties - -# GTK color chooser properties: -GTKColorChooserPanel.textAndMnemonic=>K Color Chooser -# mnemonic as a VK_ constant - -GTKColorChooserPanel.hue.textAndMnemonic=&Hue: - -GTKColorChooserPanel.red.textAndMnemonic=R&ed: - -GTKColorChooserPanel.saturation.textAndMnemonic=&Saturation: - -GTKColorChooserPanel.green.textAndMnemonic=&Green: - -GTKColorChooserPanel.value.textAndMnemonic=&Value: - -GTKColorChooserPanel.blue.textAndMnemonic=&Blue: - -GTKColorChooserPanel.color.textAndMnemonic=Color &Name: - - - -############ FILE CHOOSER STRINGS ############# - -FileChooser.acceptAllFileFilter.textAndMnemonic=All Files -FileChooser.newFolderButton.textAndMnemonic=&New Folder -FileChooser.newFolderDialog.textAndMnemonic=Folder name: -FileChooser.newFolderNoDirectoryErrorTitle.textAndMnemonic=Error -FileChooser.newFolderNoDirectoryError.textAndMnemonic=Error creating directory "{0}": No such file or directory -FileChooser.deleteFileButton.textAndMnemonic=De&lete File -FileChooser.renameFileButton.textAndMnemonic=&Rename File -FileChooser.cancelButton.textAndMnemonic=&Cancel -FileChooser.saveButton.textAndMnemonic=&OK -FileChooser.openButton.textAndMnemonic=&OK -FileChooser.saveDialogTitle.textAndMnemonic=Save -FileChooser.openDialogTitle.textAndMnemonic=Open -FileChooser.pathLabel.textAndMnemonic=&Selection: -FileChooser.filterLabel.textAndMnemonic=Filter: -FileChooser.foldersLabel.textAndMnemonic=Fol&ders -FileChooser.filesLabel.textAndMnemonic=&Files - -FileChooser.cancelButtonToolTip.textAndMnemonic=Abort file chooser dialog. -FileChooser.saveButtonToolTip.textAndMnemonic=Save selected file. -FileChooser.openButtonToolTip.textAndMnemonic=Open selected file. - -FileChooser.renameFileDialog.textAndMnemonic=Rename file "{0}" to -FileChooser.renameFileError.titleAndMnemonic=Error -FileChooser.renameFileError.textAndMnemonic=Error renaming file "{0}" to "{1}" - +# Refer to the note in basic.properties for a description as to what +# the mnemonics correspond to and how to calculate them. + + + +# GTK specific properties + +# GTK color chooser properties: +GTKColorChooserPanel.textAndMnemonic=>K Color Chooser +# mnemonic as a VK_ constant + +GTKColorChooserPanel.hue.textAndMnemonic=&Hue: + +GTKColorChooserPanel.red.textAndMnemonic=R&ed: + +GTKColorChooserPanel.saturation.textAndMnemonic=&Saturation: + +GTKColorChooserPanel.green.textAndMnemonic=&Green: + +GTKColorChooserPanel.value.textAndMnemonic=&Value: + +GTKColorChooserPanel.blue.textAndMnemonic=&Blue: + +GTKColorChooserPanel.color.textAndMnemonic=Color &Name: + + + +############ FILE CHOOSER STRINGS ############# + +FileChooser.acceptAllFileFilter.textAndMnemonic=All Files +FileChooser.newFolderButton.textAndMnemonic=&New Folder +FileChooser.newFolderDialog.textAndMnemonic=Folder name: +FileChooser.newFolderNoDirectoryErrorTitle.textAndMnemonic=Error +FileChooser.newFolderNoDirectoryError.textAndMnemonic=Error creating directory "{0}": No such file or directory +FileChooser.deleteFileButton.textAndMnemonic=De&lete File +FileChooser.renameFileButton.textAndMnemonic=&Rename File +FileChooser.cancelButton.textAndMnemonic=&Cancel +FileChooser.saveButton.textAndMnemonic=&OK +FileChooser.openButton.textAndMnemonic=&OK +FileChooser.saveDialogTitle.textAndMnemonic=Save +FileChooser.openDialogTitle.textAndMnemonic=Open +FileChooser.pathLabel.textAndMnemonic=&Selection: +FileChooser.filterLabel.textAndMnemonic=Filter: +FileChooser.foldersLabel.textAndMnemonic=Fol&ders +FileChooser.filesLabel.textAndMnemonic=&Files + +FileChooser.cancelButtonToolTip.textAndMnemonic=Abort file chooser dialog. +FileChooser.saveButtonToolTip.textAndMnemonic=Save selected file. +FileChooser.openButtonToolTip.textAndMnemonic=Open selected file. + +FileChooser.renameFileDialog.textAndMnemonic=Rename file "{0}" to +FileChooser.renameFileError.titleAndMnemonic=Error +FileChooser.renameFileError.textAndMnemonic=Error renaming file "{0}" to "{1}" + diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsComboBoxUI.java --- a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsComboBoxUI.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsComboBoxUI.java Fri Aug 02 09:38:09 2013 +0100 @@ -499,7 +499,8 @@ public void setItem(Object item) { super.setItem(item); - if (editor.hasFocus()) { + Object focus = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner(); + if ((focus == editor) || (focus == editor.getParent())) { editor.selectAll(); } } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/com/sun/swing/internal/plaf/synth/resources/synth.properties --- a/jdk/src/share/classes/com/sun/swing/internal/plaf/synth/resources/synth.properties Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/com/sun/swing/internal/plaf/synth/resources/synth.properties Fri Aug 02 09:38:09 2013 +0100 @@ -1,45 +1,45 @@ -# This properties file is used to create a PropertyResourceBundle -# It contains Locale specific strings used be the Synth Look and Feel. -# Currently, the following components need this for support: -# -# FileChooser -# -# When this file is read in, the strings are put into the -# defaults table. This is an implementation detail of the current -# workings of Swing. DO NOT DEPEND ON THIS. -# This may change in future versions of Swing as we improve localization -# support. -# -# Refer to the note in basic.properties for a description as to what -# the mnemonics correspond to and how to calculate them. -# -# @author Steve Wilson - - -############ FILE CHOOSER STRINGS ############# - -FileChooser.lookInLabel.textAndMnemonic=Look &In: -FileChooser.saveInLabel.textAndMnemonic=Save In: -FileChooser.fileNameLabel.textAndMnemonic=File &Name: -FileChooser.folderNameLabel.textAndMnemonic=Folder &Name: -FileChooser.filesOfTypeLabel.textAndMnemonic=Files of &Type: -FileChooser.upFolderToolTip.textAndMnemonic=Up One Level -FileChooser.upFolderAccessibleName=Up -FileChooser.homeFolderToolTip.textAndMnemonic=Home -FileChooser.homeFolderAccessibleName=Home -FileChooser.newFolderToolTip.textAndMnemonic=Create New Folder -FileChooser.newFolderAccessibleName=New Folder -FileChooser.newFolderActionLabel.textAndMnemonic=New Folder -FileChooser.listViewButtonToolTip.textAndMnemonic=List -FileChooser.listViewButtonAccessibleName=List -FileChooser.listViewActionLabel.textAndMnemonic=List -FileChooser.detailsViewButtonToolTip.textAndMnemonic=Details -FileChooser.detailsViewButtonAccessibleName=Details -FileChooser.detailsViewActionLabel.textAndMnemonic=Details -FileChooser.refreshActionLabel.textAndMnemonic=Refresh -FileChooser.viewMenuLabel.textAndMnemonic=View -FileChooser.fileNameHeader.textAndMnemonic=Name -FileChooser.fileSizeHeader.textAndMnemonic=Size -FileChooser.fileTypeHeader.textAndMnemonic=Type -FileChooser.fileDateHeader.textAndMnemonic=Modified -FileChooser.fileAttrHeader.textAndMnemonic=Attributes +# This properties file is used to create a PropertyResourceBundle +# It contains Locale specific strings used be the Synth Look and Feel. +# Currently, the following components need this for support: +# +# FileChooser +# +# When this file is read in, the strings are put into the +# defaults table. This is an implementation detail of the current +# workings of Swing. DO NOT DEPEND ON THIS. +# This may change in future versions of Swing as we improve localization +# support. +# +# Refer to the note in basic.properties for a description as to what +# the mnemonics correspond to and how to calculate them. +# +# @author Steve Wilson + + +############ FILE CHOOSER STRINGS ############# + +FileChooser.lookInLabel.textAndMnemonic=Look &In: +FileChooser.saveInLabel.textAndMnemonic=Save In: +FileChooser.fileNameLabel.textAndMnemonic=File &Name: +FileChooser.folderNameLabel.textAndMnemonic=Folder &Name: +FileChooser.filesOfTypeLabel.textAndMnemonic=Files of &Type: +FileChooser.upFolderToolTip.textAndMnemonic=Up One Level +FileChooser.upFolderAccessibleName=Up +FileChooser.homeFolderToolTip.textAndMnemonic=Home +FileChooser.homeFolderAccessibleName=Home +FileChooser.newFolderToolTip.textAndMnemonic=Create New Folder +FileChooser.newFolderAccessibleName=New Folder +FileChooser.newFolderActionLabel.textAndMnemonic=New Folder +FileChooser.listViewButtonToolTip.textAndMnemonic=List +FileChooser.listViewButtonAccessibleName=List +FileChooser.listViewActionLabel.textAndMnemonic=List +FileChooser.detailsViewButtonToolTip.textAndMnemonic=Details +FileChooser.detailsViewButtonAccessibleName=Details +FileChooser.detailsViewActionLabel.textAndMnemonic=Details +FileChooser.refreshActionLabel.textAndMnemonic=Refresh +FileChooser.viewMenuLabel.textAndMnemonic=View +FileChooser.fileNameHeader.textAndMnemonic=Name +FileChooser.fileSizeHeader.textAndMnemonic=Size +FileChooser.fileTypeHeader.textAndMnemonic=Type +FileChooser.fileDateHeader.textAndMnemonic=Modified +FileChooser.fileAttrHeader.textAndMnemonic=Attributes diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/com/sun/tools/script/shell/init.js --- a/jdk/src/share/classes/com/sun/tools/script/shell/init.js Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/com/sun/tools/script/shell/init.js Fri Aug 02 09:38:09 2013 +0100 @@ -332,7 +332,7 @@ * @param str input from which script is loaded and evaluated */ if (typeof(load) == 'undefined') { - var load = function(str) { + this.load = function(str) { var stream = inStream(str); var bstream = new BufferedInputStream(stream); var reader = new BufferedReader(new InputStreamReader(bstream)); @@ -712,7 +712,7 @@ * @param exitCode integer code returned to OS shell. * optional, defaults to 0 */ - var exit = function (code) { + this.exit = function (code) { if (code) { java.lang.System.exit(code + 0); } else { @@ -725,7 +725,7 @@ /** * synonym for exit */ - var quit = function (code) { + this.quit = function (code) { exit(code); } } @@ -881,7 +881,7 @@ * @param format string to format the rest of the print items * @param args variadic argument list */ - var printf = function (format, args/*, more args*/) { + this.printf = function (format, args/*, more args*/) { var array = java.lang.reflect.Array.newInstance(java.lang.Object, arguments.length - 1); for (var i = 0; i < array.length; i++) { @@ -921,25 +921,7 @@ } if (typeof(println) == 'undefined') { - var print = function(str, newline) { - if (typeof(str) == 'undefined') { - str = 'undefined'; - } else if (str == null) { - str = 'null'; - } - - if (!(out instanceof java.io.PrintWriter)) { - out = new java.io.PrintWriter(out); - } + // just synonym to print + this.println = print; +} - out.print(String(str)); - if (newline) { - out.print('\n'); - } - out.flush(); - } - - var println = function(str) { - print(str, true); - }; -} diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/awt/AWTException.java --- a/jdk/src/share/classes/java/awt/AWTException.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/awt/AWTException.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 1997, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,7 +26,7 @@ /** - * Signals that an Absract Window Toolkit exception has occurred. + * Signals that an Abstract Window Toolkit exception has occurred. * * @author Arthur van Hoff */ diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/io/DataInput.java --- a/jdk/src/share/classes/java/io/DataInput.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/io/DataInput.java Fri Aug 02 09:38:09 2013 +0100 @@ -48,132 +48,87 @@ * may be thrown if the input stream has been * closed. * - *

Modified UTF-8

+ *

Modified UTF-8

*

* Implementations of the DataInput and DataOutput interfaces represent * Unicode strings in a format that is a slight modification of UTF-8. * (For information regarding the standard UTF-8 format, see section * 3.9 Unicode Encoding Forms of The Unicode Standard, Version * 4.0). - * Note that in the following tables, the most significant bit appears in the + * Note that in the following table, the most significant bit appears in the * far left-hand column. - *

- * All characters in the range {@code '\u005Cu0001'} to - * {@code '\u005Cu007F'} are represented by a single byte: * *

- * * + * + * + * * - * + * * * * - * + * - *
+ * All characters in the range {@code '\u005Cu0001'} to + * {@code '\u005Cu007F'} are represented by a single byte:
Bit ValuesBit Values
Byte 1 - * - * - * - *
0
- *
bits 6-0
- *
- *
0
+ *
bits 6-0
*
- *
- * - *

- * The null character {@code '\u005Cu0000'} and characters in the - * range {@code '\u005Cu0080'} to {@code '\u005Cu07FF'} are - * represented by a pair of bytes: - * - *

- * + * + * + * * * - * + * * * * - * + * * * - * + * - *
+ * The null character {@code '\u005Cu0000'} and characters + * in the range {@code '\u005Cu0080'} to {@code '\u005Cu07FF'} are + * represented by a pair of bytes:
Bit ValuesBit Values
Byte 1 - * - * - * - *
1
- *
1
- *
0
- *
bits 10-6
- *
- *
1
+ *
1
+ *
0
+ *
bits 10-6
*
Byte 2 - * - * - * - *
1
- *
0
- *
bits 5-0
- *
- *
1
+ *
0
+ *
bits 5-0
*
- *
- * - *
- * {@code char} values in the range {@code '\u005Cu0800'} to - * {@code '\u005CuFFFF'} are represented by three bytes: - * - *
- * + * + * + * * * - * + * * * * - * + * * * - * + * * * - * + * *
+ * {@code char} values in the range {@code '\u005Cu0800'} + * to {@code '\u005CuFFFF'} are represented by three bytes:
Bit ValuesBit Values
Byte 1 - * - * - * - *
1
- *
1
- *
1
- *
0
- *
bits 15-12
- *
- *
1
+ *
1
+ *
1
+ *
0
+ *
bits 15-12
*
Byte 2 - * - * - * - *
1
- *
0
- *
bits 11-6
- *
- *
1
+ *
0
+ *
bits 11-6
*
Byte 3 - * - * - * - *
1
- *
0
- *
bits 5-0
- *
- *
1
+ *
0
+ *
bits 5-0
*
- *
- * + * *

* The differences between this format and the * standard UTF-8 format are the following: diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/io/File.java --- a/jdk/src/share/classes/java/io/File.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/io/File.java Fri Aug 02 09:38:09 2013 +0100 @@ -129,7 +129,7 @@ * created, the abstract pathname represented by a File object * will never change. * - *

Interoperability with {@code java.nio.file} package

+ *

Interoperability with {@code java.nio.file} package

* *

The {@code java.nio.file} * package defines interfaces and classes for the Java virtual machine to access diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/io/ObjectInputStream.java --- a/jdk/src/share/classes/java/io/ObjectInputStream.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/io/ObjectInputStream.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -313,6 +313,7 @@ * @throws SecurityException if a security manager exists and its * checkPermission method denies enabling * subclassing. + * @throws IOException if an I/O error occurs while creating this stream * @see SecurityManager#checkPermission * @see java.io.SerializablePermission */ diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/io/ObjectOutputStream.java --- a/jdk/src/share/classes/java/io/ObjectOutputStream.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/io/ObjectOutputStream.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -265,6 +265,7 @@ * @throws SecurityException if a security manager exists and its * checkPermission method denies enabling * subclassing. + * @throws IOException if an I/O error occurs while creating this stream * @see SecurityManager#checkPermission * @see java.io.SerializablePermission */ diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/io/ObjectStreamField.java --- a/jdk/src/share/classes/java/io/ObjectStreamField.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/io/ObjectStreamField.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -240,6 +240,8 @@ * Returns boolean value indicating whether or not the serializable field * represented by this ObjectStreamField instance is unshared. * + * @return {@code true} if this field is unshared + * * @since 1.4 */ public boolean isUnshared() { diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/io/RandomAccessFile.java --- a/jdk/src/share/classes/java/io/RandomAccessFile.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/io/RandomAccessFile.java Fri Aug 02 09:38:09 2013 +0100 @@ -128,7 +128,7 @@ * meanings are: * * - * + * * *

Value

Meaning

ValueMeaning
"r" Open for reading only. Invoking any of the write * methods of the resulting object will cause an {@link diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/lang/Class.java --- a/jdk/src/share/classes/java/lang/Class.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/lang/Class.java Fri Aug 02 09:38:09 2013 +0100 @@ -157,10 +157,10 @@ * * The string is formatted as a list of type modifiers, if any, * followed by the kind of type (empty string for primitive types - * and {@code class}, {@code enum}, {@code interface}, or {@code - * @interface}, as appropriate), followed by the type's name, - * followed by an angle-bracketed comma-separated list of the - * type's type parameters, if any. + * and {@code class}, {@code enum}, {@code interface}, or + * @{@code interface}, as appropriate), followed + * by the type's name, followed by an angle-bracketed + * comma-separated list of the type's type parameters, if any. * * A space is used to separate modifiers from one another and to * separate any modifiers from the kind of type. The modifiers diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/lang/invoke/LambdaConversionException.java --- a/jdk/src/share/classes/java/lang/invoke/LambdaConversionException.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/lang/invoke/LambdaConversionException.java Fri Aug 02 09:38:09 2013 +0100 @@ -29,6 +29,8 @@ * LambdaConversionException */ public class LambdaConversionException extends Exception { + private static final long serialVersionUID = 292L + 8L; + /** * Constructs a {@code LambdaConversionException}. */ diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/lang/ref/FinalReference.java --- a/jdk/src/share/classes/java/lang/ref/FinalReference.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/lang/ref/FinalReference.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,13 +25,12 @@ package java.lang.ref; - -/* Final references, used to implement finalization */ - +/** + * Final references, used to implement finalization + */ class FinalReference extends Reference { public FinalReference(T referent, ReferenceQueue q) { super(referent, q); } - } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/lang/ref/Finalizer.java --- a/jdk/src/share/classes/java/lang/ref/Finalizer.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/lang/ref/Finalizer.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,16 +29,16 @@ import java.security.AccessController; -final class Finalizer extends FinalReference { /* Package-private; must be in - same package as the Reference - class */ +final class Finalizer extends FinalReference { /* Package-private; must be in + same package as the Reference + class */ /* A native method that invokes an arbitrary object's finalize method is required since the finalize method is protected */ static native void invokeFinalizeMethod(Object o) throws Throwable; - private static ReferenceQueue queue = new ReferenceQueue(); + private static ReferenceQueue queue = new ReferenceQueue<>(); private static Finalizer unfinalized = null; private static final Object lock = new Object(); diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/lang/ref/Reference.java --- a/jdk/src/share/classes/java/lang/ref/Reference.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/lang/ref/Reference.java Fri Aug 02 09:38:09 2013 +0100 @@ -96,6 +96,7 @@ * Enqueued: next reference in queue (or this if last) * Inactive: this */ + @SuppressWarnings("rawtypes") Reference next; /* When active: next element in a discovered reference list maintained by GC (or this if last) @@ -119,7 +120,7 @@ * them. This list is protected by the above lock object. The * list uses the discovered field to link its elements. */ - private static Reference pending = null; + private static Reference pending = null; /* High-priority thread to enqueue pending References */ @@ -131,7 +132,7 @@ public void run() { for (;;) { - Reference r; + Reference r; synchronized (lock) { if (pending != null) { r = pending; @@ -166,7 +167,7 @@ continue; } - ReferenceQueue q = r.queue; + ReferenceQueue q = r.queue; if (q != ReferenceQueue.NULL) q.enqueue(r); } } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/lang/ref/ReferenceQueue.java --- a/jdk/src/share/classes/java/lang/ref/ReferenceQueue.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/lang/ref/ReferenceQueue.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -40,14 +40,14 @@ */ public ReferenceQueue() { } - private static class Null extends ReferenceQueue { - boolean enqueue(Reference r) { + private static class Null extends ReferenceQueue { + boolean enqueue(Reference r) { return false; } } - static ReferenceQueue NULL = new Null(); - static ReferenceQueue ENQUEUED = new Null(); + static ReferenceQueue NULL = new Null<>(); + static ReferenceQueue ENQUEUED = new Null<>(); static private class Lock { }; private Lock lock = new Lock(); @@ -58,7 +58,7 @@ synchronized (lock) { // Check that since getting the lock this reference hasn't already been // enqueued (and even then removed) - ReferenceQueue queue = r.queue; + ReferenceQueue queue = r.queue; if ((queue == NULL) || (queue == ENQUEUED)) { return false; } @@ -75,10 +75,13 @@ } } + @SuppressWarnings("unchecked") private Reference reallyPoll() { /* Must hold lock */ Reference r = head; if (r != null) { - head = (r.next == r) ? null : r.next; + head = (r.next == r) ? + null : + r.next; // Unchecked due to the next field having a raw type in Reference r.queue = NULL; r.next = r; queueLength--; diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/lang/reflect/Parameter.java --- a/jdk/src/share/classes/java/lang/reflect/Parameter.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/lang/reflect/Parameter.java Fri Aug 02 09:38:09 2013 +0100 @@ -162,7 +162,7 @@ /** * Returns the name of the parameter. If the parameter's name is - * {@linkplain isNamePresent() present}, then this method returns + * {@linkplain #isNamePresent() present}, then this method returns * the name provided by the class file. Otherwise, this method * synthesizes a name of the form argN, where N is the index of * the parameter in the descriptor of the method which declares diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/math/BigInteger.java --- a/jdk/src/share/classes/java/math/BigInteger.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/math/BigInteger.java Fri Aug 02 09:38:09 2013 +0100 @@ -33,7 +33,6 @@ import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.ObjectStreamField; -import java.util.ArrayList; import java.util.Arrays; import java.util.Random; import sun.misc.DoubleConsts; @@ -101,6 +100,7 @@ * @author Josh Bloch * @author Michael McCloskey * @author Alan Eliasen + * @author Timothy Buktu * @since JDK1.1 */ @@ -215,6 +215,14 @@ private static final int TOOM_COOK_SQUARE_THRESHOLD = 140; /** + * The threshold value for using Burnikel-Ziegler division. If the number + * of ints in the number are larger than this value, + * Burnikel-Ziegler division will be used. This value is found + * experimentally to work well. + */ + static final int BURNIKEL_ZIEGLER_THRESHOLD = 50; + + /** * The threshold value for using Schoenhage recursive base conversion. If * the number of ints in the number are larger than this value, * the Schoenhage algorithm will be used. In practice, it appears that the @@ -290,7 +298,7 @@ if (signum < -1 || signum > 1) throw(new NumberFormatException("Invalid signum value")); - if (this.mag.length==0) { + if (this.mag.length == 0) { this.signum = 0; } else { if (signum == 0) @@ -311,7 +319,7 @@ if (signum < -1 || signum > 1) throw(new NumberFormatException("Invalid signum value")); - if (this.mag.length==0) { + if (this.mag.length == 0) { this.signum = 0; } else { if (signum == 0) @@ -364,8 +372,10 @@ // Skip leading zeros and compute number of digits in magnitude while (cursor < len && - Character.digit(val.charAt(cursor), radix) == 0) + Character.digit(val.charAt(cursor), radix) == 0) { cursor++; + } + if (cursor == len) { signum = 0; mag = ZERO.mag; @@ -455,7 +465,7 @@ if (result == -1) throw new NumberFormatException(new String(source)); - for (int index = start; index 2) @@ -710,7 +720,7 @@ if (!result.testBit(0)) result = result.add(ONE); - while(true) { + while (true) { // Do cheap "pre-test" if applicable if (result.bitLength() > 6) { long r = result.remainder(SMALL_PRIME_PRODUCT).longValue(); @@ -741,7 +751,7 @@ // Looking for the next large prime int searchLen = (result.bitLength() / 20) * 64; - while(true) { + while (true) { BitSieve searchSieve = new BitSieve(result, searchLen); BigInteger candidate = searchSieve.retrieve(result, DEFAULT_PRIME_CERTAINTY, null); @@ -808,7 +818,7 @@ int d = 5; while (jacobiSymbol(d, this) != -1) { // 5, -7, 9, -11, ... - d = (d<0) ? Math.abs(d)+2 : -(d+2); + d = (d < 0) ? Math.abs(d)+2 : -(d+2); } // Step 2 @@ -881,7 +891,7 @@ BigInteger u = ONE; BigInteger u2; BigInteger v = ONE; BigInteger v2; - for (int i=k.bitLength()-2; i>=0; i--) { + for (int i=k.bitLength()-2; i >= 0; i--) { u2 = u.multiply(v).mod(n); v2 = v.square().add(d.multiply(u.square())).mod(n); @@ -937,7 +947,7 @@ if (rnd == null) { rnd = getSecureRandom(); } - for (int i=0; i0 && z.equals(ONE) || ++j==a) + while (!((j == 0 && z.equals(ONE)) || z.equals(thisMinusOne))) { + if (j > 0 && z.equals(ONE) || ++j == a) return false; z = z.modPow(TWO, this); } @@ -961,7 +971,7 @@ * arguments are correct, and it doesn't copy the magnitude array. */ BigInteger(int[] magnitude, int signum) { - this.signum = (magnitude.length==0 ? 0 : signum); + this.signum = (magnitude.length == 0 ? 0 : signum); this.mag = magnitude; } @@ -970,7 +980,7 @@ * arguments are correct. */ private BigInteger(byte[] magnitude, int signum) { - this.signum = (magnitude.length==0 ? 0 : signum); + this.signum = (magnitude.length == 0 ? 0 : signum); this.mag = stripLeadingZeroBytes(magnitude); } @@ -1009,7 +1019,7 @@ } int highWord = (int)(val >>> 32); - if (highWord==0) { + if (highWord == 0) { mag = new int[1]; mag[0] = (int)val; } else { @@ -1025,7 +1035,7 @@ * BigInteger will reference the input array if feasible). */ private static BigInteger valueOf(int val[]) { - return (val[0]>0 ? new BigInteger(val, 1) : new BigInteger(val)); + return (val[0] > 0 ? new BigInteger(val, 1) : new BigInteger(val)); } // Constants @@ -1066,8 +1076,7 @@ powerCache = new BigInteger[Character.MAX_RADIX+1][]; logCache = new double[Character.MAX_RADIX+1]; - for (int i=Character.MIN_RADIX; i<=Character.MAX_RADIX; i++) - { + for (int i=Character.MIN_RADIX; i <= Character.MAX_RADIX; i++) { powerCache[i] = new BigInteger[] { BigInteger.valueOf(i) }; logCache[i] = Math.log(i); } @@ -1161,7 +1170,7 @@ int xIndex = x.length; int[] result; int highWord = (int)(val >>> 32); - if (highWord==0) { + if (highWord == 0) { result = new int[xIndex]; sum = (x[--xIndex] & LONG_MASK) + val; result[xIndex] = (int)sum; @@ -1214,12 +1223,12 @@ int yIndex = y.length; int result[] = new int[xIndex]; long sum = 0; - if(yIndex==1) { + if (yIndex == 1) { sum = (x[--xIndex] & LONG_MASK) + (y[0] & LONG_MASK) ; result[xIndex] = (int)sum; } else { // Add common parts of both numbers - while(yIndex > 0) { + while (yIndex > 0) { sum = (x[--xIndex] & LONG_MASK) + (y[--yIndex] & LONG_MASK) + (sum >>> 32); result[xIndex] = (int)sum; @@ -1246,24 +1255,24 @@ private static int[] subtract(long val, int[] little) { int highWord = (int)(val >>> 32); - if (highWord==0) { + if (highWord == 0) { int result[] = new int[1]; result[0] = (int)(val - (little[0] & LONG_MASK)); return result; } else { int result[] = new int[2]; - if(little.length==1) { + if (little.length == 1) { long difference = ((int)val & LONG_MASK) - (little[0] & LONG_MASK); result[1] = (int)difference; // Subtract remainder of longer number while borrow propagates boolean borrow = (difference >> 32 != 0); - if(borrow) { + if (borrow) { result[0] = highWord - 1; } else { // Copy remainder of longer number result[0] = highWord; } return result; - } else { // little.length==2 + } else { // little.length == 2 long difference = ((int)val & LONG_MASK) - (little[1] & LONG_MASK); result[1] = (int)difference; difference = (highWord & LONG_MASK) - (little[0] & LONG_MASK) + (difference >> 32); @@ -1286,7 +1295,7 @@ int result[] = new int[bigIndex]; long difference = 0; - if (highWord==0) { + if (highWord == 0) { difference = (big[--bigIndex] & LONG_MASK) - val; result[bigIndex] = (int)difference; } else { @@ -1296,7 +1305,6 @@ result[bigIndex] = (int)difference; } - // Subtract remainder of longer number while borrow propagates boolean borrow = (difference >> 32 != 0); while (bigIndex > 0 && borrow) @@ -1345,7 +1353,7 @@ long difference = 0; // Subtract common parts of both numbers - while(littleIndex > 0) { + while (littleIndex > 0) { difference = (big[--bigIndex] & LONG_MASK) - (little[--littleIndex] & LONG_MASK) + (difference >> 32); @@ -1377,29 +1385,29 @@ int xlen = mag.length; int ylen = val.mag.length; - if ((xlen < KARATSUBA_THRESHOLD) || (ylen < KARATSUBA_THRESHOLD)) - { + if ((xlen < KARATSUBA_THRESHOLD) || (ylen < KARATSUBA_THRESHOLD)) { int resultSign = signum == val.signum ? 1 : -1; if (val.mag.length == 1) { return multiplyByInt(mag,val.mag[0], resultSign); } - if(mag.length == 1) { + if (mag.length == 1) { return multiplyByInt(val.mag,mag[0], resultSign); } int[] result = multiplyToLen(mag, xlen, val.mag, ylen, null); result = trustedStripLeadingZeroInts(result); return new BigInteger(result, resultSign); + } else { + if ((xlen < TOOM_COOK_THRESHOLD) && (ylen < TOOM_COOK_THRESHOLD)) { + return multiplyKaratsuba(this, val); + } else { + return multiplyToomCook3(this, val); + } } - else - if ((xlen < TOOM_COOK_THRESHOLD) && (ylen < TOOM_COOK_THRESHOLD)) - return multiplyKaratsuba(this, val); - else - return multiplyToomCook3(this, val); } private static BigInteger multiplyByInt(int[] x, int y, int sign) { - if(Integer.bitCount(y)==1) { + if (Integer.bitCount(y) == 1) { return new BigInteger(shiftLeft(x,Integer.numberOfTrailingZeros(y)), sign); } int xlen = x.length; @@ -1474,7 +1482,7 @@ z = new int[xlen+ylen]; long carry = 0; - for (int j=ystart, k=ystart+1+xstart; j>=0; j--, k--) { + for (int j=ystart, k=ystart+1+xstart; j >= 0; j--, k--) { long product = (y[j] & LONG_MASK) * (x[xstart] & LONG_MASK) + carry; z[k] = (int)product; @@ -1484,7 +1492,7 @@ for (int i = xstart-1; i >= 0; i--) { carry = 0; - for (int j=ystart, k=ystart+1+i; j>=0; j--, k--) { + for (int j=ystart, k=ystart+1+i; j >= 0; j--, k--) { long product = (y[j] & LONG_MASK) * (x[i] & LONG_MASK) + (z[k] & LONG_MASK) + carry; @@ -1511,8 +1519,7 @@ * * See: http://en.wikipedia.org/wiki/Karatsuba_algorithm */ - private static BigInteger multiplyKaratsuba(BigInteger x, BigInteger y) - { + private static BigInteger multiplyKaratsuba(BigInteger x, BigInteger y) { int xlen = x.mag.length; int ylen = y.mag.length; @@ -1535,10 +1542,11 @@ // result = p1 * 2^(32*2*half) + (p3 - p1 - p2) * 2^(32*half) + p2 BigInteger result = p1.shiftLeft(32*half).add(p3.subtract(p1).subtract(p2)).shiftLeft(32*half).add(p2); - if (x.signum != y.signum) + if (x.signum != y.signum) { return result.negate(); - else + } else { return result; + } } /** @@ -1569,8 +1577,7 @@ * LNCS #4547. Springer, Madrid, Spain, June 21-22, 2007. * */ - private static BigInteger multiplyToomCook3(BigInteger a, BigInteger b) - { + private static BigInteger multiplyToomCook3(BigInteger a, BigInteger b) { int alen = a.mag.length; int blen = b.mag.length; @@ -1605,12 +1612,12 @@ db1.add(b2).shiftLeft(1).subtract(b0)); vinf = a2.multiply(b2); - /* The algorithm requires two divisions by 2 and one by 3. - All divisions are known to be exact, that is, they do not produce - remainders, and all results are positive. The divisions by 2 are - implemented as right shifts which are relatively efficient, leaving - only an exact division by 3, which is done by a specialized - linear-time algorithm. */ + // The algorithm requires two divisions by 2 and one by 3. + // All divisions are known to be exact, that is, they do not produce + // remainders, and all results are positive. The divisions by 2 are + // implemented as right shifts which are relatively efficient, leaving + // only an exact division by 3, which is done by a specialized + // linear-time algorithm. t2 = v2.subtract(vm1).exactDivideBy3(); tm1 = v1.subtract(vm1).shiftRight(1); t1 = v1.subtract(v0); @@ -1624,10 +1631,11 @@ BigInteger result = vinf.shiftLeft(ss).add(t2).shiftLeft(ss).add(t1).shiftLeft(ss).add(tm1).shiftLeft(ss).add(v0); - if (a.signum != b.signum) + if (a.signum != b.signum) { return result.negate(); - else + } else { return result; + } } @@ -1645,38 +1653,38 @@ * numbers. */ private BigInteger getToomSlice(int lowerSize, int upperSize, int slice, - int fullsize) - { + int fullsize) { int start, end, sliceSize, len, offset; len = mag.length; offset = fullsize - len; - if (slice == 0) - { + if (slice == 0) { start = 0 - offset; end = upperSize - 1 - offset; - } - else - { + } else { start = upperSize + (slice-1)*lowerSize - offset; end = start + lowerSize - 1; } - if (start < 0) + if (start < 0) { start = 0; - if (end < 0) + } + if (end < 0) { return ZERO; + } sliceSize = (end-start) + 1; - if (sliceSize <= 0) + if (sliceSize <= 0) { return ZERO; + } // While performing Toom-Cook, all slices are positive and // the sign is adjusted when the final number is composed. - if (start==0 && sliceSize >= len) + if (start == 0 && sliceSize >= len) { return this.abs(); + } int intSlice[] = new int[sliceSize]; System.arraycopy(mag, start, intSlice, 0, sliceSize); @@ -1692,20 +1700,19 @@ * undefined. Note that this is expected to be called with positive * arguments only. */ - private BigInteger exactDivideBy3() - { + private BigInteger exactDivideBy3() { int len = mag.length; int[] result = new int[len]; long x, w, q, borrow; borrow = 0L; - for (int i=len-1; i>=0; i--) - { + for (int i=len-1; i >= 0; i--) { x = (mag[i] & LONG_MASK); w = x - borrow; - if (borrow > x) // Did we make the number go negative? + if (borrow > x) { // Did we make the number go negative? borrow = 1L; - else + } else { borrow = 0L; + } // 0xAAAAAAAB is the modular inverse of 3 (mod 2^32). Thus, // the effect of this is to divide by 3 (mod 2^32). @@ -1715,8 +1722,7 @@ // Now check the borrow. The second check can of course be // eliminated if the first fails. - if (q >= 0x55555556L) - { + if (q >= 0x55555556L) { borrow++; if (q >= 0xAAAAAAABL) borrow++; @@ -1733,8 +1739,9 @@ private BigInteger getLower(int n) { int len = mag.length; - if (len <= n) + if (len <= n) { return this; + } int lowerInts[] = new int[n]; System.arraycopy(mag, len-n, lowerInts, 0, n); @@ -1750,8 +1757,9 @@ private BigInteger getUpper(int n) { int len = mag.length; - if (len <= n) + if (len <= n) { return ZERO; + } int upperLen = len - n; int upperInts[] = new int[upperLen]; @@ -1768,20 +1776,21 @@ * @return {@code this2} */ private BigInteger square() { - if (signum == 0) + if (signum == 0) { return ZERO; + } int len = mag.length; - if (len < KARATSUBA_SQUARE_THRESHOLD) - { + if (len < KARATSUBA_SQUARE_THRESHOLD) { int[] z = squareToLen(mag, len, null); return new BigInteger(trustedStripLeadingZeroInts(z), 1); + } else { + if (len < TOOM_COOK_SQUARE_THRESHOLD) { + return squareKaratsuba(); + } else { + return squareToomCook3(); + } } - else - if (len < TOOM_COOK_SQUARE_THRESHOLD) - return squareKaratsuba(); - else - return squareToomCook3(); } /** @@ -1829,7 +1838,7 @@ // Store the squares, right shifted one bit (i.e., divided by 2) int lastProductLowWord = 0; - for (int j=0, i=0; j>> 33); @@ -1838,7 +1847,7 @@ } // Add in off-diagonal sums - for (int i=len, offset=1; i>0; i--, offset+=2) { + for (int i=len, offset=1; i > 0; i--, offset+=2) { int t = x[i-1]; t = mulAdd(z, x, offset, i-1, t); addOne(z, offset-1, i, t); @@ -1858,8 +1867,7 @@ * has better asymptotic performance than the algorithm used in * squareToLen. */ - private BigInteger squareKaratsuba() - { + private BigInteger squareKaratsuba() { int half = (mag.length+1) / 2; BigInteger xl = getLower(half); @@ -1879,8 +1887,7 @@ * that has better asymptotic performance than the algorithm used in * squareToLen or squareKaratsuba. */ - private BigInteger squareToomCook3() - { + private BigInteger squareToomCook3() { int len = mag.length; // k is the size (in ints) of the lower-order slices. @@ -1905,13 +1912,12 @@ vinf = a2.square(); v2 = da1.add(a2).shiftLeft(1).subtract(a0).square(); - /* The algorithm requires two divisions by 2 and one by 3. - All divisions are known to be exact, that is, they do not produce - remainders, and all results are positive. The divisions by 2 are - implemented as right shifts which are relatively efficient, leaving - only a division by 3. - The division by 3 is done by an optimized algorithm for this case. - */ + // The algorithm requires two divisions by 2 and one by 3. + // All divisions are known to be exact, that is, they do not produce + // remainders, and all results are positive. The divisions by 2 are + // implemented as right shifts which are relatively efficient, leaving + // only a division by 3. + // The division by 3 is done by an optimized algorithm for this case. t2 = v2.subtract(vm1).exactDivideBy3(); tm1 = v1.subtract(vm1).shiftRight(1); t1 = v1.subtract(v0); @@ -1936,11 +1942,28 @@ * @throws ArithmeticException if {@code val} is zero. */ public BigInteger divide(BigInteger val) { + if (mag.length < BURNIKEL_ZIEGLER_THRESHOLD || + val.mag.length < BURNIKEL_ZIEGLER_THRESHOLD) { + return divideKnuth(val); + } else { + return divideBurnikelZiegler(val); + } + } + + /** + * Returns a BigInteger whose value is {@code (this / val)} using an O(n^2) algorithm from Knuth. + * + * @param val value by which this BigInteger is to be divided. + * @return {@code this / val} + * @throws ArithmeticException if {@code val} is zero. + * @see MutableBigInteger#divideKnuth(MutableBigInteger, MutableBigInteger, boolean) + */ + private BigInteger divideKnuth(BigInteger val) { MutableBigInteger q = new MutableBigInteger(), a = new MutableBigInteger(this.mag), b = new MutableBigInteger(val.mag); - a.divide(b, q, false); + a.divideKnuth(b, q, false); return q.toBigInteger(this.signum * val.signum); } @@ -1956,11 +1979,21 @@ * @throws ArithmeticException if {@code val} is zero. */ public BigInteger[] divideAndRemainder(BigInteger val) { + if (mag.length < BURNIKEL_ZIEGLER_THRESHOLD || + val.mag.length < BURNIKEL_ZIEGLER_THRESHOLD) { + return divideAndRemainderKnuth(val); + } else { + return divideAndRemainderBurnikelZiegler(val); + } + } + + /** Long division */ + private BigInteger[] divideAndRemainderKnuth(BigInteger val) { BigInteger[] result = new BigInteger[2]; MutableBigInteger q = new MutableBigInteger(), a = new MutableBigInteger(this.mag), b = new MutableBigInteger(val.mag); - MutableBigInteger r = a.divide(b, q); + MutableBigInteger r = a.divideKnuth(b, q); result[0] = q.toBigInteger(this.signum == val.signum ? 1 : -1); result[1] = r.toBigInteger(this.signum); return result; @@ -1975,11 +2008,53 @@ * @throws ArithmeticException if {@code val} is zero. */ public BigInteger remainder(BigInteger val) { + if (mag.length < BURNIKEL_ZIEGLER_THRESHOLD || + val.mag.length < BURNIKEL_ZIEGLER_THRESHOLD) { + return remainderKnuth(val); + } else { + return remainderBurnikelZiegler(val); + } + } + + /** Long division */ + private BigInteger remainderKnuth(BigInteger val) { MutableBigInteger q = new MutableBigInteger(), a = new MutableBigInteger(this.mag), b = new MutableBigInteger(val.mag); - return a.divide(b, q).toBigInteger(this.signum); + return a.divideKnuth(b, q).toBigInteger(this.signum); + } + + /** + * Calculates {@code this / val} using the Burnikel-Ziegler algorithm. + * @param val the divisor + * @return {@code this / val} + */ + private BigInteger divideBurnikelZiegler(BigInteger val) { + return divideAndRemainderBurnikelZiegler(val)[0]; + } + + /** + * Calculates {@code this % val} using the Burnikel-Ziegler algorithm. + * @param val the divisor + * @return {@code this % val} + */ + private BigInteger remainderBurnikelZiegler(BigInteger val) { + return divideAndRemainderBurnikelZiegler(val)[1]; + } + + /** + * Computes {@code this / val} and {@code this % val} using the + * Burnikel-Ziegler algorithm. + * @param val the divisor + * @return an array containing the quotient and remainder + */ + private BigInteger[] divideAndRemainderBurnikelZiegler(BigInteger val) { + MutableBigInteger q = new MutableBigInteger(); + MutableBigInteger r = new MutableBigInteger(this).divideAndRemainderBurnikelZiegler(new MutableBigInteger(val), q); + BigInteger qBigInt = q.isZero() ? ZERO : q.toBigInteger(signum*val.signum); + BigInteger rBigInt = r.isZero() ? ZERO : r.toBigInteger(signum); + return new BigInteger[] {qBigInt, rBigInt}; } /** @@ -1992,10 +2067,12 @@ * cause the operation to yield a non-integer value.) */ public BigInteger pow(int exponent) { - if (exponent < 0) + if (exponent < 0) { throw new ArithmeticException("Negative exponent"); - if (signum==0) - return (exponent==0 ? ONE : this); + } + if (signum == 0) { + return (exponent == 0 ? ONE : this); + } BigInteger partToSquare = this.abs(); @@ -2008,24 +2085,25 @@ int remainingBits; // Factor the powers of two out quickly by shifting right, if needed. - if (powersOfTwo > 0) - { + if (powersOfTwo > 0) { partToSquare = partToSquare.shiftRight(powersOfTwo); remainingBits = partToSquare.bitLength(); - if (remainingBits == 1) // Nothing left but +/- 1? - if (signum<0 && (exponent&1)==1) + if (remainingBits == 1) { // Nothing left but +/- 1? + if (signum < 0 && (exponent&1) == 1) { return NEGATIVE_ONE.shiftLeft(powersOfTwo*exponent); - else + } else { return ONE.shiftLeft(powersOfTwo*exponent); - } - else - { + } + } + } else { remainingBits = partToSquare.bitLength(); - if (remainingBits == 1) // Nothing left but +/- 1? - if (signum<0 && (exponent&1)==1) + if (remainingBits == 1) { // Nothing left but +/- 1? + if (signum < 0 && (exponent&1) == 1) { return NEGATIVE_ONE; - else + } else { return ONE; + } + } } // This is a quick way to approximate the size of the result, @@ -2035,10 +2113,9 @@ // Use slightly different algorithms for small and large operands. // See if the result will safely fit into a long. (Largest 2^63-1) - if (partToSquare.mag.length==1 && scaleFactor <= 62) - { + if (partToSquare.mag.length == 1 && scaleFactor <= 62) { // Small number algorithm. Everything fits into a long. - int newSign = (signum<0 && (exponent&1)==1 ? -1 : 1); + int newSign = (signum <0 && (exponent&1) == 1 ? -1 : 1); long result = 1; long baseToPow2 = partToSquare.mag[0] & LONG_MASK; @@ -2046,27 +2123,28 @@ // Perform exponentiation using repeated squaring trick while (workingExponent != 0) { - if ((workingExponent & 1)==1) + if ((workingExponent & 1) == 1) { result = result * baseToPow2; - - if ((workingExponent >>>= 1) != 0) + } + + if ((workingExponent >>>= 1) != 0) { baseToPow2 = baseToPow2 * baseToPow2; + } } // Multiply back the powers of two (quickly, by shifting left) - if (powersOfTwo > 0) - { + if (powersOfTwo > 0) { int bitsToShift = powersOfTwo*exponent; - if (bitsToShift + scaleFactor <= 62) // Fits in long? + if (bitsToShift + scaleFactor <= 62) { // Fits in long? return valueOf((result << bitsToShift) * newSign); - else + } else { return valueOf(result*newSign).shiftLeft(bitsToShift); + } } - else + else { return valueOf(result*newSign); - } - else - { + } + } else { // Large number algorithm. This is basically identical to // the algorithm above, but calls multiply() and square() // which may use more efficient algorithms for large numbers. @@ -2075,28 +2153,32 @@ int workingExponent = exponent; // Perform exponentiation using repeated squaring trick while (workingExponent != 0) { - if ((workingExponent & 1)==1) + if ((workingExponent & 1) == 1) { answer = answer.multiply(partToSquare); - - if ((workingExponent >>>= 1) != 0) + } + + if ((workingExponent >>>= 1) != 0) { partToSquare = partToSquare.square(); + } } // Multiply back the (exponentiated) powers of two (quickly, // by shifting left) - if (powersOfTwo > 0) + if (powersOfTwo > 0) { answer = answer.shiftLeft(powersOfTwo*exponent); - - if (signum<0 && (exponent&1)==1) + } + + if (signum < 0 && (exponent&1) == 1) { return answer.negate(); - else + } else { return answer; + } } } /** * Returns a BigInteger whose value is the greatest common divisor of * {@code abs(this)} and {@code abs(val)}. Returns 0 if - * {@code this==0 && val==0}. + * {@code this == 0 && val == 0}. * * @param val value with which the GCD is to be computed. * @return {@code GCD(abs(this), abs(val))} @@ -2153,7 +2235,7 @@ // shifts a up to len right n bits assumes no leading zeros, 00; i--) { + for (int i=len-1, c=a[i]; i > 0; i--) { int b = c; c = a[i-1]; a[i] = (c << n2) | (b >>> n); @@ -2167,7 +2249,7 @@ return; int n2 = 32 - n; - for (int i=0, c=a[i], m=i+len-1; i>> n2); @@ -2378,7 +2460,7 @@ return this; // Special case for base of zero - if (signum==0) + if (signum == 0) return ZERO; int[] base = mag.clone(); @@ -2401,7 +2483,7 @@ // Allocate table for precomputed odd powers of base in Montgomery form int[][] table = new int[tblmask][]; - for (int i=0; i 0); - - while(c>0) + } while (--len > 0); + + while (c > 0) c += subN(n, mod, mlen); while (intArrayCmpToLen(n, mod, mlen) >= 0) @@ -2568,7 +2650,7 @@ * equal to, or greater than arg2 up to length len. */ private static int intArrayCmpToLen(int[] arg1, int[] arg2, int len) { - for (int i=0; i= 0) { + while (--len >= 0) { sum = (a[len] & LONG_MASK) - (b[len] & LONG_MASK) + (sum >> 32); a[len] = (int)sum; @@ -2679,7 +2761,7 @@ int excessBits = (numInts << 5) - p; mag[0] &= (1L << (32-excessBits)) - 1; - return (mag[0]==0 ? new BigInteger(1, mag) : new BigInteger(mag, 1)); + return (mag[0] == 0 ? new BigInteger(1, mag) : new BigInteger(mag, 1)); } /** @@ -2730,9 +2812,9 @@ public BigInteger shiftLeft(int n) { if (signum == 0) return ZERO; - if (n==0) + if (n == 0) return this; - if (n<0) { + if (n < 0) { if (n == Integer.MIN_VALUE) { throw new ArithmeticException("Shift distance of Integer.MIN_VALUE not supported."); } else { @@ -2784,9 +2866,9 @@ * @see #shiftLeft */ public BigInteger shiftRight(int n) { - if (n==0) + if (n == 0) return this; - if (n<0) { + if (n < 0) { if (n == Integer.MIN_VALUE) { throw new ArithmeticException("Shift distance of Integer.MIN_VALUE not supported."); } else { @@ -2825,7 +2907,7 @@ if (signum < 0) { // Find out whether any one-bits were shifted off the end. boolean onesLost = false; - for (int i=magLen-1, j=magLen-nInts; i>=j && !onesLost; i--) + for (int i=magLen-1, j=magLen-nInts; i >= j && !onesLost; i--) onesLost = (mag[i] != 0); if (!onesLost && nBits != 0) onesLost = (mag[magLen - nInts - 1] << (32 - nBits) != 0); @@ -2860,7 +2942,7 @@ */ public BigInteger and(BigInteger val) { int[] result = new int[Math.max(intLength(), val.intLength())]; - for (int i=0; i>> 5) & (1 << (n & 31))) != 0; @@ -2962,13 +3044,13 @@ * @throws ArithmeticException {@code n} is negative. */ public BigInteger setBit(int n) { - if (n<0) + if (n < 0) throw new ArithmeticException("Negative bit address"); int intNum = n >>> 5; int[] result = new int[Math.max(intLength(), intNum+2)]; - for (int i=0; i>> 5; int[] result = new int[Math.max(intLength(), ((n + 1) >>> 5) + 1)]; - for (int i=0; i>> 5; int[] result = new int[Math.max(intLength(), intNum+2)]; - for (int i=0; i 2) { + if (len > 2) { return 1; } if (val < 0) { val = -val; } int highWord = (int)(val >>> 32); - if (highWord==0) { + if (highWord == 0) { if (len < 1) return -1; if (len > 1) @@ -3283,7 +3365,7 @@ * {@code val}. If they are equal, either may be returned. */ public BigInteger min(BigInteger val) { - return (compareTo(val)<0 ? this : val); + return (compareTo(val) < 0 ? this : val); } /** @@ -3294,7 +3376,7 @@ * {@code val}. If they are equal, either may be returned. */ public BigInteger max(BigInteger val) { - return (compareTo(val)>0 ? this : val); + return (compareTo(val) > 0 ? this : val); } @@ -3308,7 +3390,7 @@ public int hashCode() { int hashCode = 0; - for (int i=0; i=0; i--) { + for (int i=numGroups-2; i >= 0; i--) { // Prepend (any) leading zeros for this digit group int numLeadingZeros = digitsPerLong[radix]-digitGroup[i].length(); - if (numLeadingZeros != 0) + if (numLeadingZeros != 0) { buf.append(zeros[numLeadingZeros]); + } buf.append(digitGroup[i]); } return buf.toString(); @@ -3399,7 +3484,7 @@ /** * Converts the specified BigInteger to a string and appends to - * sb. This implements the recursive Schoenhage algorithm + * {@code sb}. This implements the recursive Schoenhage algorithm * for base conversions. *

* See Knuth, Donald, _The Art of Computer Programming_, Vol. 2, @@ -3419,9 +3504,11 @@ // Pad with internal zeros if necessary. // Don't pad if we're at the beginning of the string. - if ((s.length() < digits) && (sb.length() > 0)) - for (int i=s.length(); i 0)) { + for (int i=s.length(); i < digits; i++) { // May be a faster way to sb.append('0'); // do this? + } + } sb.append(s); return; @@ -3450,7 +3537,7 @@ * If this value doesn't already exist in the cache, it is added. *

* This could be changed to a more complicated caching method using - * Future. + * {@code Future}. */ private static BigInteger getRadixConversionCache(int radix, int exponent) { BigInteger[] cacheLine = powerCache[radix]; // volatile read @@ -3478,7 +3565,7 @@ static { zeros[63] = "000000000000000000000000000000000000000000000000000000000000000"; - for (int i=0; i<63; i++) + for (int i=0; i < 63; i++) zeros[i] = zeros[63].substring(0, i); } @@ -3516,7 +3603,7 @@ int byteLen = bitLength()/8 + 1; byte[] byteArray = new byte[byteLen]; - for (int i=byteLen-1, bytesCopied=4, nextInt=0, intIndex=0; i>=0; i--) { + for (int i=byteLen-1, bytesCopied=4, nextInt=0, intIndex=0; i >= 0; i--) { if (bytesCopied == 4) { nextInt = getInt(intIndex++); bytesCopied = 1; @@ -3568,7 +3655,7 @@ public long longValue() { long result = 0; - for (int i=1; i>=0; i--) + for (int i=1; i >= 0; i--) result = (result << 32) + (getInt(i) & LONG_MASK); return result; } @@ -3784,7 +3871,7 @@ int keep; // Find first nonzero byte - for (keep = 0; keep < byteLength && a[keep]==0; keep++) + for (keep = 0; keep < byteLength && a[keep] == 0; keep++) ; // Allocate new array and copy relevant part of input array @@ -3810,16 +3897,16 @@ int byteLength = a.length; // Find first non-sign (0xff) byte of input - for (keep=0; keep=0; i--) { + for (int i=result.length-1; i >= 0; i--) { result[i] = (int)((result[i] & LONG_MASK) + 1); if (result[i] != 0) break; @@ -3857,23 +3944,23 @@ int keep, j; // Find first non-sign (0xffffffff) int of input - for (keep=0; keep=0; i--) { + i >= 0; i--) { if (bytesCopied == 4) { nextInt = mag[intIndex--]; bytesCopied = 1; diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/math/MutableBigInteger.java --- a/jdk/src/share/classes/java/math/MutableBigInteger.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/math/MutableBigInteger.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -38,14 +38,14 @@ * * @see BigInteger * @author Michael McCloskey + * @author Timothy Buktu * @since 1.3 */ +import static java.math.BigDecimal.INFLATED; +import static java.math.BigInteger.LONG_MASK; import java.util.Arrays; -import static java.math.BigInteger.LONG_MASK; -import static java.math.BigDecimal.INFLATED; - class MutableBigInteger { /** * Holds the magnitude of this MutableBigInteger in big endian order. @@ -75,6 +75,24 @@ */ static final MutableBigInteger ONE = new MutableBigInteger(1); + /** + * The minimum {@code intLen} for cancelling powers of two before + * dividing. + * If the number of ints is less than this threshold, + * {@code divideKnuth} does not eliminate common powers of two from + * the dividend and divisor. + */ + static final int KNUTH_POW2_THRESH_LEN = 6; + + /** + * The minimum number of trailing zero ints for cancelling powers of two + * before dividing. + * If the dividend and divisor don't share at least this many zero ints + * at the end, {@code divideKnuth} does not eliminate common powers + * of two from the dividend and divisor. + */ + static final int KNUTH_POW2_THRESH_ZEROS = 3; + // Constructors /** @@ -124,6 +142,20 @@ } /** + * Makes this number an {@code n}-int number all of whose bits are ones. + * Used by Burnikel-Ziegler division. + * @param n number of ints in the {@code value} array + * @return a number equal to {@code ((1<<(32*n)))-1} + */ + private void ones(int n) { + if (n > value.length) + value = new int[n]; + Arrays.fill(value, -1); + offset = 0; + intLen = n; + } + + /** * Internal helper method to return the magnitude array. The caller is not * supposed to modify the returned array. */ @@ -155,6 +187,14 @@ } /** + * Converts this number to a nonnegative {@code BigInteger}. + */ + BigInteger toBigInteger() { + normalize(); + return toBigInteger(isZero() ? 0 : 1); + } + + /** * Convert this MutableBigInteger to BigDecimal object with the specified sign * and scale. */ @@ -238,6 +278,32 @@ } /** + * Returns a value equal to what {@code b.leftShift(32*ints); return compare(b);} + * would return, but doesn't change the value of {@code b}. + */ + private int compareShifted(MutableBigInteger b, int ints) { + int blen = b.intLen; + int alen = intLen - ints; + if (alen < blen) + return -1; + if (alen > blen) + return 1; + + // Add Integer.MIN_VALUE to make the comparison act as unsigned integer + // comparison. + int[] bval = b.value; + for (int i = offset, j = b.offset; i < alen + offset; i++, j++) { + int b1 = value[i] + 0x80000000; + int b2 = bval[j] + 0x80000000; + if (b1 < b2) + return -1; + if (b1 > b2) + return 1; + } + return 0; + } + + /** * Compare this against half of a MutableBigInteger object (Needed for * remainder tests). * Assumes no leading unnecessary zeros, which holds for results @@ -247,7 +313,7 @@ int blen = b.intLen; int len = intLen; if (len <= 0) - return blen <=0 ? 0 : -1; + return blen <= 0 ? 0 : -1; if (len > blen) return 1; if (len < blen - 1) @@ -274,7 +340,7 @@ return v < hb ? -1 : 1; carry = (bv & 1) << 31; // carray will be either 0x80000000 or 0 } - return carry == 0? 0 : -1; + return carry == 0 ? 0 : -1; } /** @@ -285,10 +351,10 @@ if (intLen == 0) return -1; int j, b; - for (j=intLen-1; (j>0) && (value[j+offset]==0); j--) + for (j=intLen-1; (j > 0) && (value[j+offset] == 0); j--) ; b = value[j+offset]; - if (b==0) + if (b == 0) return -1; return ((intLen-1-j)<<5) + Integer.numberOfTrailingZeros(b); } @@ -329,11 +395,11 @@ int indexBound = index+intLen; do { index++; - } while(index < indexBound && value[index]==0); + } while(index < indexBound && value[index] == 0); int numZeros = index - offset; intLen -= numZeros; - offset = (intLen==0 ? 0 : offset+numZeros); + offset = (intLen == 0 ? 0 : offset+numZeros); } /** @@ -354,7 +420,7 @@ */ int[] toIntArray() { int[] result = new int[intLen]; - for(int i=0; i value.length) return false; - if (intLen ==0) + if (intLen == 0) return true; return (value[offset] != 0); } @@ -454,6 +520,17 @@ } /** + * Like {@link #rightShift(int)} but {@code n} can be greater than the length of the number. + */ + void safeRightShift(int n) { + if (n/32 >= intLen) { + reset(); + } else { + rightShift(n); + } + } + + /** * Right shift this MutableBigInteger n bits. The MutableBigInteger is left * in normal form. */ @@ -475,6 +552,15 @@ } /** + * Like {@link #leftShift(int)} but {@code n} can be zero. + */ + void safeLeftShift(int n) { + if (n > 0) { + leftShift(n); + } + } + + /** * Left shift this MutableBigInteger n bits. */ void leftShift(int n) { @@ -502,18 +588,18 @@ if (value.length < newLen) { // The array must grow int[] result = new int[newLen]; - for (int i=0; i= newLen) { // Use space on right - for(int i=0; ioffset; i--) { + for (int i=offset+intLen-1, c=val[i]; i > offset; i--) { int b = c; c = val[i-1]; val[i] = (c << n2) | (b >>> n); @@ -606,7 +692,7 @@ private final void primitiveLeftShift(int n) { int[] val = value; int n2 = 32 - n; - for (int i=offset, c=val[i], m=i+intLen-1; i>> n2); @@ -615,6 +701,35 @@ } /** + * Returns a {@code BigInteger} equal to the {@code n} + * low ints of this number. + */ + private BigInteger getLower(int n) { + if (isZero()) { + return BigInteger.ZERO; + } else if (intLen < n) { + return toBigInteger(1); + } else { + // strip zeros + int len = n; + while (len > 0 && value[offset+intLen-len] == 0) + len--; + int sign = len > 0 ? 1 : 0; + return new BigInteger(Arrays.copyOfRange(value, offset+intLen-len, offset+intLen), sign); + } + } + + /** + * Discards all ints whose index is greater than {@code n}. + */ + private void keepLower(int n) { + if (intLen >= n) { + offset += intLen - n; + intLen = n; + } + } + + /** * Adds the contents of two MutableBigInteger objects.The result * is placed within this MutableBigInteger. * The contents of the addend are not changed. @@ -630,7 +745,7 @@ long carry = 0; // Add common parts of both numbers - while(x>0 && y>0) { + while(x > 0 && y > 0) { x--; y--; sum = (value[x+offset] & LONG_MASK) + (addend.value[y+addend.offset] & LONG_MASK) + carry; @@ -639,7 +754,7 @@ } // Add remainder of the longer number - while(x>0) { + while(x > 0) { x--; if (carry == 0 && result == value && rstart == (x + offset)) return; @@ -647,7 +762,7 @@ result[rstart--] = (int)sum; carry = sum >>> 32; } - while(y>0) { + while(y > 0) { y--; sum = (addend.value[y+addend.offset] & LONG_MASK) + carry; result[rstart--] = (int)sum; @@ -673,6 +788,123 @@ offset = result.length - resultLen; } + /** + * Adds the value of {@code addend} shifted {@code n} ints to the left. + * Has the same effect as {@code addend.leftShift(32*ints); add(addend);} + * but doesn't change the value of {@code addend}. + */ + void addShifted(MutableBigInteger addend, int n) { + if (addend.isZero()) { + return; + } + + int x = intLen; + int y = addend.intLen + n; + int resultLen = (intLen > y ? intLen : y); + int[] result = (value.length < resultLen ? new int[resultLen] : value); + + int rstart = result.length-1; + long sum; + long carry = 0; + + // Add common parts of both numbers + while (x > 0 && y > 0) { + x--; y--; + int bval = y+addend.offset < addend.value.length ? addend.value[y+addend.offset] : 0; + sum = (value[x+offset] & LONG_MASK) + + (bval & LONG_MASK) + carry; + result[rstart--] = (int)sum; + carry = sum >>> 32; + } + + // Add remainder of the longer number + while (x > 0) { + x--; + if (carry == 0 && result == value && rstart == (x + offset)) { + return; + } + sum = (value[x+offset] & LONG_MASK) + carry; + result[rstart--] = (int)sum; + carry = sum >>> 32; + } + while (y > 0) { + y--; + int bval = y+addend.offset < addend.value.length ? addend.value[y+addend.offset] : 0; + sum = (bval & LONG_MASK) + carry; + result[rstart--] = (int)sum; + carry = sum >>> 32; + } + + if (carry > 0) { // Result must grow in length + resultLen++; + if (result.length < resultLen) { + int temp[] = new int[resultLen]; + // Result one word longer from carry-out; copy low-order + // bits into new result. + System.arraycopy(result, 0, temp, 1, result.length); + temp[0] = 1; + result = temp; + } else { + result[rstart--] = 1; + } + } + + value = result; + intLen = resultLen; + offset = result.length - resultLen; + } + + /** + * Like {@link #addShifted(MutableBigInteger, int)} but {@code this.intLen} must + * not be greater than {@code n}. In other words, concatenates {@code this} + * and {@code addend}. + */ + void addDisjoint(MutableBigInteger addend, int n) { + if (addend.isZero()) + return; + + int x = intLen; + int y = addend.intLen + n; + int resultLen = (intLen > y ? intLen : y); + int[] result; + if (value.length < resultLen) + result = new int[resultLen]; + else { + result = value; + Arrays.fill(value, offset+intLen, value.length, 0); + } + + int rstart = result.length-1; + + // copy from this if needed + System.arraycopy(value, offset, result, rstart+1-x, x); + y -= x; + rstart -= x; + + int len = Math.min(y, addend.value.length-addend.offset); + System.arraycopy(addend.value, addend.offset, result, rstart+1-y, len); + + // zero the gap + for (int i=rstart+1-y+len; i < rstart+1; i++) + result[i] = 0; + + value = result; + intLen = resultLen; + offset = result.length - resultLen; + } + + /** + * Adds the low {@code n} ints of {@code addend}. + */ + void addLower(MutableBigInteger addend, int n) { + MutableBigInteger a = new MutableBigInteger(addend); + if (a.offset + a.intLen >= n) { + a.offset = a.offset + a.intLen - n; + a.intLen = n; + } + a.normalize(); + add(a); + } /** * Subtracts the smaller of this and b from the larger and places the @@ -704,7 +936,7 @@ int rstart = result.length - 1; // Subtract common parts of both numbers - while (y>0) { + while (y > 0) { x--; y--; diff = (a.value[x+a.offset] & LONG_MASK) - @@ -712,7 +944,7 @@ result[rstart--] = (int)diff; } // Subtract remainder of longer number - while (x>0) { + while (x > 0) { x--; diff = (a.value[x+a.offset] & LONG_MASK) - ((int)-(diff>>32)); result[rstart--] = (int)diff; @@ -733,7 +965,7 @@ private int difference(MutableBigInteger b) { MutableBigInteger a = this; int sign = a.compare(b); - if (sign ==0) + if (sign == 0) return 0; if (sign < 0) { MutableBigInteger tmp = a; @@ -746,14 +978,14 @@ int y = b.intLen; // Subtract common parts of both numbers - while (y>0) { + while (y > 0) { x--; y--; diff = (a.value[a.offset+ x] & LONG_MASK) - (b.value[b.offset+ y] & LONG_MASK) - ((int)-(diff>>32)); a.value[a.offset+x] = (int)diff; } // Subtract remainder of longer number - while (x>0) { + while (x > 0) { x--; diff = (a.value[a.offset+ x] & LONG_MASK) - ((int)-(diff>>32)); a.value[a.offset+x] = (int)diff; @@ -822,7 +1054,7 @@ // Perform the multiplication word by word long ylong = y & LONG_MASK; - int[] zval = (z.value.length= 0; i--) { @@ -910,6 +1142,31 @@ * Calculates the quotient of this div b and places the quotient in the * provided MutableBigInteger objects and the remainder object is returned. * + */ + MutableBigInteger divide(MutableBigInteger b, MutableBigInteger quotient) { + return divide(b,quotient,true); + } + + MutableBigInteger divide(MutableBigInteger b, MutableBigInteger quotient, boolean needRemainder) { + if (intLen < BigInteger.BURNIKEL_ZIEGLER_THRESHOLD || + b.intLen < BigInteger.BURNIKEL_ZIEGLER_THRESHOLD) { + return divideKnuth(b, quotient, needRemainder); + } else { + return divideAndRemainderBurnikelZiegler(b, quotient); + } + } + + /** + * @see #divideKnuth(MutableBigInteger, MutableBigInteger, boolean) + */ + MutableBigInteger divideKnuth(MutableBigInteger b, MutableBigInteger quotient) { + return divideKnuth(b,quotient,true); + } + + /** + * Calculates the quotient of this div b and places the quotient in the + * provided MutableBigInteger objects and the remainder object is returned. + * * Uses Algorithm D in Knuth section 4.3.1. * Many optimizations to that algorithm have been adapted from the Colin * Plumb C library. @@ -917,38 +1174,34 @@ * changed. * */ - MutableBigInteger divide(MutableBigInteger b, MutableBigInteger quotient) { - return divide(b,quotient,true); - } - - MutableBigInteger divide(MutableBigInteger b, MutableBigInteger quotient, boolean needReminder) { + MutableBigInteger divideKnuth(MutableBigInteger b, MutableBigInteger quotient, boolean needRemainder) { if (b.intLen == 0) throw new ArithmeticException("BigInteger divide by zero"); // Dividend is zero if (intLen == 0) { - quotient.intLen = quotient.offset; - return needReminder ? new MutableBigInteger() : null; + quotient.intLen = quotient.offset = 0; + return needRemainder ? new MutableBigInteger() : null; } int cmp = compare(b); // Dividend less than divisor if (cmp < 0) { quotient.intLen = quotient.offset = 0; - return needReminder ? new MutableBigInteger(this) : null; + return needRemainder ? new MutableBigInteger(this) : null; } // Dividend equal to divisor if (cmp == 0) { quotient.value[0] = quotient.intLen = 1; quotient.offset = 0; - return needReminder ? new MutableBigInteger() : null; + return needRemainder ? new MutableBigInteger() : null; } quotient.clear(); // Special case one word divisor if (b.intLen == 1) { int r = divideOneWord(b.value[b.offset], quotient); - if(needReminder) { + if(needRemainder) { if (r == 0) return new MutableBigInteger(); return new MutableBigInteger(r); @@ -956,7 +1209,220 @@ return null; } } - return divideMagnitude(b, quotient, needReminder); + + // Cancel common powers of two if we're above the KNUTH_POW2_* thresholds + if (intLen >= KNUTH_POW2_THRESH_LEN) { + int trailingZeroBits = Math.min(getLowestSetBit(), b.getLowestSetBit()); + if (trailingZeroBits >= KNUTH_POW2_THRESH_ZEROS*32) { + MutableBigInteger a = new MutableBigInteger(this); + b = new MutableBigInteger(b); + a.rightShift(trailingZeroBits); + b.rightShift(trailingZeroBits); + MutableBigInteger r = a.divideKnuth(b, quotient); + r.leftShift(trailingZeroBits); + return r; + } + } + + return divideMagnitude(b, quotient, needRemainder); + } + + /** + * Computes {@code this/b} and {@code this%b} using the + * Burnikel-Ziegler algorithm. + * This method implements algorithm 3 from pg. 9 of the Burnikel-Ziegler paper. + * The parameter beta was chosen to b 232 so almost all shifts are + * multiples of 32 bits.
+ * {@code this} and {@code b} must be nonnegative. + * @param b the divisor + * @param quotient output parameter for {@code this/b} + * @return the remainder + */ + MutableBigInteger divideAndRemainderBurnikelZiegler(MutableBigInteger b, MutableBigInteger quotient) { + int r = intLen; + int s = b.intLen; + + if (r < s) { + return this; + } else { + // Unlike Knuth division, we don't check for common powers of two here because + // BZ already runs faster if both numbers contain powers of two and cancelling them has no + // additional benefit. + + // step 1: let m = min{2^k | (2^k)*BURNIKEL_ZIEGLER_THRESHOLD > s} + int m = 1 << (32-Integer.numberOfLeadingZeros(s/BigInteger.BURNIKEL_ZIEGLER_THRESHOLD)); + + int j = (s+m-1) / m; // step 2a: j = ceil(s/m) + int n = j * m; // step 2b: block length in 32-bit units + int n32 = 32 * n; // block length in bits + int sigma = Math.max(0, n32 - b.bitLength()); // step 3: sigma = max{T | (2^T)*B < beta^n} + MutableBigInteger bShifted = new MutableBigInteger(b); + bShifted.safeLeftShift(sigma); // step 4a: shift b so its length is a multiple of n + safeLeftShift(sigma); // step 4b: shift this by the same amount + + // step 5: t is the number of blocks needed to accommodate this plus one additional bit + int t = (bitLength()+n32) / n32; + if (t < 2) { + t = 2; + } + + // step 6: conceptually split this into blocks a[t-1], ..., a[0] + MutableBigInteger a1 = getBlock(t-1, t, n); // the most significant block of this + + // step 7: z[t-2] = [a[t-1], a[t-2]] + MutableBigInteger z = getBlock(t-2, t, n); // the second to most significant block + z.addDisjoint(a1, n); // z[t-2] + + // do schoolbook division on blocks, dividing 2-block numbers by 1-block numbers + MutableBigInteger qi = new MutableBigInteger(); + MutableBigInteger ri; + quotient.offset = quotient.intLen = 0; + for (int i=t-2; i > 0; i--) { + // step 8a: compute (qi,ri) such that z=b*qi+ri + ri = z.divide2n1n(bShifted, qi); + + // step 8b: z = [ri, a[i-1]] + z = getBlock(i-1, t, n); // a[i-1] + z.addDisjoint(ri, n); + quotient.addShifted(qi, i*n); // update q (part of step 9) + } + // final iteration of step 8: do the loop one more time for i=0 but leave z unchanged + ri = z.divide2n1n(bShifted, qi); + quotient.add(qi); + + ri.rightShift(sigma); // step 9: this and b were shifted, so shift back + return ri; + } + } + + /** + * This method implements algorithm 1 from pg. 4 of the Burnikel-Ziegler paper. + * It divides a 2n-digit number by a n-digit number.
+ * The parameter beta is 232 so all shifts are multiples of 32 bits. + *
+ * {@code this} must be a nonnegative number such that {@code this.bitLength() <= 2*b.bitLength()} + * @param b a positive number such that {@code b.bitLength()} is even + * @param quotient output parameter for {@code this/b} + * @return {@code this%b} + */ + private MutableBigInteger divide2n1n(MutableBigInteger b, MutableBigInteger quotient) { + int n = b.intLen; + + // step 1: base case + if (n%2 != 0 || n < BigInteger.BURNIKEL_ZIEGLER_THRESHOLD) { + return divideKnuth(b, quotient); + } + + // step 2: view this as [a1,a2,a3,a4] where each ai is n/2 ints or less + MutableBigInteger aUpper = new MutableBigInteger(this); + aUpper.safeRightShift(32*(n/2)); // aUpper = [a1,a2,a3] + keepLower(n/2); // this = a4 + + // step 3: q1=aUpper/b, r1=aUpper%b + MutableBigInteger q1 = new MutableBigInteger(); + MutableBigInteger r1 = aUpper.divide3n2n(b, q1); + + // step 4: quotient=[r1,this]/b, r2=[r1,this]%b + addDisjoint(r1, n/2); // this = [r1,this] + MutableBigInteger r2 = divide3n2n(b, quotient); + + // step 5: let quotient=[q1,quotient] and return r2 + quotient.addDisjoint(q1, n/2); + return r2; + } + + /** + * This method implements algorithm 2 from pg. 5 of the Burnikel-Ziegler paper. + * It divides a 3n-digit number by a 2n-digit number.
+ * The parameter beta is 232 so all shifts are multiples of 32 bits.
+ *
+ * {@code this} must be a nonnegative number such that {@code 2*this.bitLength() <= 3*b.bitLength()} + * @param quotient output parameter for {@code this/b} + * @return {@code this%b} + */ + private MutableBigInteger divide3n2n(MutableBigInteger b, MutableBigInteger quotient) { + int n = b.intLen / 2; // half the length of b in ints + + // step 1: view this as [a1,a2,a3] where each ai is n ints or less; let a12=[a1,a2] + MutableBigInteger a12 = new MutableBigInteger(this); + a12.safeRightShift(32*n); + + // step 2: view b as [b1,b2] where each bi is n ints or less + MutableBigInteger b1 = new MutableBigInteger(b); + b1.safeRightShift(n * 32); + BigInteger b2 = b.getLower(n); + + MutableBigInteger r; + MutableBigInteger d; + if (compareShifted(b, n) < 0) { + // step 3a: if a1=b1, let quotient=beta^n-1 and r=a12-b1*2^n+b1 + quotient.ones(n); + a12.add(b1); + b1.leftShift(32*n); + a12.subtract(b1); + r = a12; + + // step 4: d=quotient*b2=(b2 << 32*n) - b2 + d = new MutableBigInteger(b2); + d.leftShift(32 * n); + d.subtract(new MutableBigInteger(b2)); + } + + // step 5: r = r*beta^n + a3 - d (paper says a4) + // However, don't subtract d until after the while loop so r doesn't become negative + r.leftShift(32 * n); + r.addLower(this, n); + + // step 6: add b until r>=d + while (r.compare(d) < 0) { + r.add(b); + quotient.subtract(MutableBigInteger.ONE); + } + r.subtract(d); + + return r; + } + + /** + * Returns a {@code MutableBigInteger} containing {@code blockLength} ints from + * {@code this} number, starting at {@code index*blockLength}.
+ * Used by Burnikel-Ziegler division. + * @param index the block index + * @param numBlocks the total number of blocks in {@code this} number + * @param blockLength length of one block in units of 32 bits + * @return + */ + private MutableBigInteger getBlock(int index, int numBlocks, int blockLength) { + int blockStart = index * blockLength; + if (blockStart >= intLen) { + return new MutableBigInteger(); + } + + int blockEnd; + if (index == numBlocks-1) { + blockEnd = intLen; + } else { + blockEnd = (index+1) * blockLength; + } + if (blockEnd > intLen) { + return new MutableBigInteger(); + } + + int[] newVal = Arrays.copyOfRange(value, offset+intLen-blockEnd, offset+intLen-blockStart); + return new MutableBigInteger(newVal); + } + + /** @see BigInteger#bitLength() */ + int bitLength() { + if (intLen == 0) + return 0; + return intLen*32 - Integer.numberOfLeadingZeros(value[offset]); } /** @@ -1006,7 +1472,7 @@ */ private MutableBigInteger divideMagnitude(MutableBigInteger div, MutableBigInteger quotient, - boolean needReminder ) { + boolean needRemainder ) { // assert div.intLen > 1 // D1 normalize the divisor int shift = Integer.numberOfLeadingZeros(div.value[div.offset]); @@ -1017,7 +1483,7 @@ if (shift > 0) { divisor = new int[dlen]; copyAndShift(div.value,div.offset,dlen,divisor,0,shift); - if(Integer.numberOfLeadingZeros(value[offset])>=shift) { + if (Integer.numberOfLeadingZeros(value[offset]) >= shift) { int[] remarr = new int[intLen + 1]; rem = new MutableBigInteger(remarr); rem.intLen = intLen; @@ -1070,7 +1536,7 @@ int dl = divisor[1]; // D2 Initialize j - for(int j=0; j nh2) { // D6 Add back - if(needReminder) + if(needRemainder) divadd(divisor, rem.value, limit - 1 + 1 + rem.offset); qhat--; } @@ -1194,14 +1660,14 @@ } - if(needReminder) { + if (needRemainder) { // D8 Unnormalize if (shift > 0) rem.rightShift(shift); rem.normalize(); } quotient.normalize(); - return needReminder ? rem : null; + return needRemainder ? rem : null; } /** @@ -1367,7 +1833,7 @@ * This method divides a long quantity by an int to estimate * qhat for two multi precision numbers. It is used when * the signed value of n is less than zero. - * Returns long value where high 32 bits contain reminder value and + * Returns long value where high 32 bits contain remainder value and * low 32 bits contain quotient value. */ static long divWord(long n, int d) { @@ -1436,7 +1902,7 @@ } // step B2 - boolean uOdd = (k==s1); + boolean uOdd = (k == s1); MutableBigInteger t = uOdd ? v: u; int tsign = uOdd ? -1 : 1; @@ -1478,9 +1944,9 @@ * Calculate GCD of a and b interpreted as unsigned integers. */ static int binaryGcd(int a, int b) { - if (b==0) + if (b == 0) return a; - if (a==0) + if (a == 0) return b; // Right shift a & b till their last bits equal to 1. @@ -1582,7 +2048,7 @@ return result; } - /* + /** * Returns the multiplicative inverse of val mod 2^32. Assumes val is odd. */ static int inverseMod32(int val) { @@ -1595,7 +2061,7 @@ return t; } - /* + /** * Calculate the multiplicative inverse of 2^k mod mod, where mod is odd. */ static MutableBigInteger modInverseBP2(MutableBigInteger mod, int k) { @@ -1631,7 +2097,7 @@ } // The Almost Inverse Algorithm - while(!f.isOne()) { + while (!f.isOne()) { // If gcd(f, g) != 1, number is not invertible modulo mod if (f.isZero()) throw new ArithmeticException("BigInteger not invertible."); @@ -1665,7 +2131,7 @@ return fixup(c, p, k); } - /* + /** * The Fixup Algorithm * Calculates X such that X = C * 2^(-k) (mod P) * Assumes C

> 5; i> 5; i < numWords; i++) { // V = R * c (mod 2^j) int v = r * c.value[c.offset + c.intLen-1]; // c = c + (v * p) diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/Authenticator.java --- a/jdk/src/share/classes/java/net/Authenticator.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/Authenticator.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -103,17 +103,17 @@ * Sets the authenticator that will be used by the networking code * when a proxy or an HTTP server asks for authentication. *

- * First, if there is a security manager, its checkPermission + * First, if there is a security manager, its {@code checkPermission} * method is called with a - * NetPermission("setDefaultAuthenticator") permission. + * {@code NetPermission("setDefaultAuthenticator")} permission. * This may result in a java.lang.SecurityException. * - * @param a The authenticator to be set. If a is null then + * @param a The authenticator to be set. If a is {@code null} then * any previously set authenticator is removed. * * @throws SecurityException * if a security manager exists and its - * checkPermission method doesn't allow + * {@code checkPermission} method doesn't allow * setting the default authenticator. * * @see SecurityManager#checkPermission @@ -134,9 +134,9 @@ * Ask the authenticator that has been registered with the system * for a password. *

- * First, if there is a security manager, its checkPermission + * First, if there is a security manager, its {@code checkPermission} * method is called with a - * NetPermission("requestPasswordAuthentication") permission. + * {@code NetPermission("requestPasswordAuthentication")} permission. * This may result in a java.lang.SecurityException. * * @param addr The InetAddress of the site requesting authorization, @@ -151,7 +151,7 @@ * * @throws SecurityException * if a security manager exists and its - * checkPermission method doesn't allow + * {@code checkPermission} method doesn't allow * the password authentication request. * * @see SecurityManager#checkPermission @@ -193,9 +193,9 @@ * because the hostname can be provided in cases where the InetAddress * is not available. *

- * First, if there is a security manager, its checkPermission + * First, if there is a security manager, its {@code checkPermission} * method is called with a - * NetPermission("requestPasswordAuthentication") permission. + * {@code NetPermission("requestPasswordAuthentication")} permission. * This may result in a java.lang.SecurityException. * * @param host The hostname of the site requesting authentication. @@ -211,7 +211,7 @@ * * @throws SecurityException * if a security manager exists and its - * checkPermission method doesn't allow + * {@code checkPermission} method doesn't allow * the password authentication request. * * @see SecurityManager#checkPermission @@ -254,9 +254,9 @@ * Ask the authenticator that has been registered with the system * for a password. *

- * First, if there is a security manager, its checkPermission + * First, if there is a security manager, its {@code checkPermission} * method is called with a - * NetPermission("requestPasswordAuthentication") permission. + * {@code NetPermission("requestPasswordAuthentication")} permission. * This may result in a java.lang.SecurityException. * * @param host The hostname of the site requesting authentication. @@ -275,7 +275,7 @@ * * @throws SecurityException * if a security manager exists and its - * checkPermission method doesn't allow + * {@code checkPermission} method doesn't allow * the password authentication request. * * @see SecurityManager#checkPermission @@ -320,8 +320,8 @@ } /** - * Gets the hostname of the - * site or proxy requesting authentication, or null + * Gets the {@code hostname} of the + * site or proxy requesting authentication, or {@code null} * if not available. * * @return the hostname of the connection requiring authentication, or null @@ -333,8 +333,8 @@ } /** - * Gets the InetAddress of the - * site requesting authorization, or null + * Gets the {@code InetAddress} of the + * site requesting authorization, or {@code null} * if not available. * * @return the InetAddress of the site requesting authorization, or null @@ -346,7 +346,7 @@ /** * Gets the port number for the requested connection. - * @return an int indicating the + * @return an {@code int} indicating the * port for the requested connection. */ protected final int getRequestingPort() { diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/ContentHandler.java --- a/jdk/src/share/classes/java/net/ContentHandler.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/ContentHandler.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,21 +28,21 @@ import java.io.IOException; /** - * The abstract class ContentHandler is the superclass - * of all classes that read an Object from a - * URLConnection. + * The abstract class {@code ContentHandler} is the superclass + * of all classes that read an {@code Object} from a + * {@code URLConnection}. *

* An application does not generally call the - * getContent method in this class directly. Instead, an - * application calls the getContent method in class - * URL or in URLConnection. + * {@code getContent} method in this class directly. Instead, an + * application calls the {@code getContent} method in class + * {@code URL} or in {@code URLConnection}. * The application's content handler factory (an instance of a class that - * implements the interface ContentHandlerFactory set - * up by a call to setContentHandler) is - * called with a String giving the MIME type of the + * implements the interface {@code ContentHandlerFactory} set + * up by a call to {@code setContentHandler}) is + * called with a {@code String} giving the MIME type of the * object being received on the socket. The factory returns an - * instance of a subclass of ContentHandler, and its - * getContent method is called to create the object. + * instance of a subclass of {@code ContentHandler}, and its + * {@code getContent} method is called to create the object. *

* If no content handler could be found, URLConnection will * look for a content handler in a user-defineable set of places. @@ -75,7 +75,7 @@ * creates an object from it. * * @param urlc a URL connection. - * @return the object read by the ContentHandler. + * @return the object read by the {@code ContentHandler}. * @exception IOException if an I/O error occurs while reading the object. */ abstract public Object getContent(URLConnection urlc) throws IOException; @@ -90,7 +90,7 @@ * * @param urlc a URL connection. * @param classes an array of types requested - * @return the object read by the ContentHandler that is + * @return the object read by the {@code ContentHandler} that is * the first match of the suggested types. * null if none of the requested are supported. * @exception IOException if an I/O error occurs while reading the object. diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/ContentHandlerFactory.java --- a/jdk/src/share/classes/java/net/ContentHandlerFactory.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/ContentHandlerFactory.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 1997, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,10 +28,10 @@ /** * This interface defines a factory for content handlers. An * implementation of this interface should map a MIME type into an - * instance of ContentHandler. + * instance of {@code ContentHandler}. *

- * This interface is used by the URLStreamHandler class - * to create a ContentHandler for a MIME type. + * This interface is used by the {@code URLStreamHandler} class + * to create a {@code ContentHandler} for a MIME type. * * @author James Gosling * @see java.net.ContentHandler @@ -40,13 +40,13 @@ */ public interface ContentHandlerFactory { /** - * Creates a new ContentHandler to read an object from - * a URLStreamHandler. + * Creates a new {@code ContentHandler} to read an object from + * a {@code URLStreamHandler}. * * @param mimetype the MIME type for which a content handler is desired. - * @return a new ContentHandler to read an object from a - * URLStreamHandler. + * @return a new {@code ContentHandler} to read an object from a + * {@code URLStreamHandler}. * @see java.net.ContentHandler * @see java.net.URLStreamHandler */ diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/CookieHandler.java --- a/jdk/src/share/classes/java/net/CookieHandler.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/CookieHandler.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -66,7 +66,7 @@ * there is no system-wide cookie handler currently set. * @throws SecurityException * If a security manager has been installed and it denies - * {@link NetPermission}("getCookieHandler") + * {@link NetPermission}{@code ("getCookieHandler")} * @see #setDefault(CookieHandler) */ public synchronized static CookieHandler getDefault() { @@ -83,10 +83,10 @@ * Note: non-standard http protocol handlers may ignore this setting. * * @param cHandler The HTTP cookie handler, or - * null to unset. + * {@code null} to unset. * @throws SecurityException * If a security manager has been installed and it denies - * {@link NetPermission}("setCookieHandler") + * {@link NetPermission}{@code ("setCookieHandler")} * @see #getDefault() */ public synchronized static void setDefault(CookieHandler cHandler) { @@ -114,7 +114,7 @@ * called after all request headers related to choosing cookies * are added, and before the request is sent.

* - * @param uri a URI representing the intended use for the + * @param uri a {@code URI} representing the intended use for the * cookies * @param requestHeaders - a Map from request header * field names to lists of field values representing @@ -136,7 +136,7 @@ * fields that are named Set-Cookie2, present in the response * headers into a cookie cache. * - * @param uri a URI where the cookies come from + * @param uri a {@code URI} where the cookies come from * @param responseHeaders an immutable map from field names to * lists of field values representing the response * header fields returned diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/CookieManager.java --- a/jdk/src/share/classes/java/net/CookieManager.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/CookieManager.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -131,7 +131,7 @@ * *

This constructor will create new cookie manager with default * cookie store and accept policy. The effect is same as - * CookieManager(null, null). + * {@code CookieManager(null, null)}. */ public CookieManager() { this(null, null); @@ -141,12 +141,12 @@ /** * Create a new cookie manager with specified cookie store and cookie policy. * - * @param store a CookieStore to be used by cookie manager. - * if null, cookie manager will use a default one, + * @param store a {@code CookieStore} to be used by cookie manager. + * if {@code null}, cookie manager will use a default one, * which is an in-memory CookieStore implmentation. - * @param cookiePolicy a CookiePolicy instance + * @param cookiePolicy a {@code CookiePolicy} instance * to be used by cookie manager as policy callback. - * if null, ACCEPT_ORIGINAL_SERVER will + * if {@code null}, ACCEPT_ORIGINAL_SERVER will * be used. */ public CookieManager(CookieStore store, @@ -170,11 +170,11 @@ /** * To set the cookie policy of this cookie manager. * - *

A instance of CookieManager will have + *

A instance of {@code CookieManager} will have * cookie policy ACCEPT_ORIGINAL_SERVER by default. Users always * can call this method to set another cookie policy. * - * @param cookiePolicy the cookie policy. Can be null, which + * @param cookiePolicy the cookie policy. Can be {@code null}, which * has no effects on current cookie policy. */ public void setCookiePolicy(CookiePolicy cookiePolicy) { diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/CookiePolicy.java --- a/jdk/src/share/classes/java/net/CookiePolicy.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/CookiePolicy.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -71,8 +71,8 @@ * * @param uri the URI to consult accept policy with * @param cookie the HttpCookie object in question - * @return true if this cookie should be accepted; - * otherwise, false + * @return {@code true} if this cookie should be accepted; + * otherwise, {@code false} */ public boolean shouldAccept(URI uri, HttpCookie cookie); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/CookieStore.java --- a/jdk/src/share/classes/java/net/CookieStore.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/CookieStore.java Fri Aug 02 09:38:09 2013 +0100 @@ -32,8 +32,8 @@ * A CookieStore object represents a storage for cookie. Can store and retrieve * cookies. * - *

{@link CookieManager} will call CookieStore.add to save cookies - * for every incoming HTTP response, and call CookieStore.get to + *

{@link CookieManager} will call {@code CookieStore.add} to save cookies + * for every incoming HTTP response, and call {@code CookieStore.get} to * retrieve cookie for every outgoing HTTP request. A CookieStore * is responsible for removing HttpCookie instances which have expired. * @@ -55,11 +55,11 @@ * then it is replaced with the new one. * * @param uri the uri this cookie associated with. - * if null, this cookie will not be associated + * if {@code null}, this cookie will not be associated * with an URI * @param cookie the cookie to store * - * @throws NullPointerException if cookie is null + * @throws NullPointerException if {@code cookie} is {@code null} * * @see #get * @@ -77,7 +77,7 @@ * * @param uri the uri associated with the cookies to be returned * - * @throws NullPointerException if uri is null + * @throws NullPointerException if {@code uri} is {@code null} * * @see #add * @@ -108,14 +108,14 @@ * Remove a cookie from store. * * @param uri the uri this cookie associated with. - * if null, the cookie to be removed is not associated - * with an URI when added; if not null, the cookie + * if {@code null}, the cookie to be removed is not associated + * with an URI when added; if not {@code null}, the cookie * to be removed is associated with the given URI when added. * @param cookie the cookie to remove * - * @return true if this store contained the specified cookie + * @return {@code true} if this store contained the specified cookie * - * @throws NullPointerException if cookie is null + * @throws NullPointerException if {@code cookie} is {@code null} */ public boolean remove(URI uri, HttpCookie cookie); @@ -123,7 +123,7 @@ /** * Remove all cookies in this cookie store. * - * @return true if this store changed as a result of the call + * @return {@code true} if this store changed as a result of the call */ public boolean removeAll(); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/DatagramPacket.java --- a/jdk/src/share/classes/java/net/DatagramPacket.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/DatagramPacket.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -68,11 +68,11 @@ int port; /** - * Constructs a DatagramPacket for receiving packets of - * length length, specifying an offset into the buffer. + * Constructs a {@code DatagramPacket} for receiving packets of + * length {@code length}, specifying an offset into the buffer. *

- * The length argument must be less than or equal to - * buf.length. + * The {@code length} argument must be less than or equal to + * {@code buf.length}. * * @param buf buffer for holding the incoming datagram. * @param offset the offset for the buffer @@ -87,11 +87,11 @@ } /** - * Constructs a DatagramPacket for receiving packets of - * length length. + * Constructs a {@code DatagramPacket} for receiving packets of + * length {@code length}. *

- * The length argument must be less than or equal to - * buf.length. + * The {@code length} argument must be less than or equal to + * {@code buf.length}. * * @param buf buffer for holding the incoming datagram. * @param length the number of bytes to read. @@ -102,10 +102,10 @@ /** * Constructs a datagram packet for sending packets of length - * length with offset ioffsetto the + * {@code length} with offset {@code ioffset}to the * specified port number on the specified host. The - * length argument must be less than or equal to - * buf.length. + * {@code length} argument must be less than or equal to + * {@code buf.length}. * * @param buf the packet data. * @param offset the packet data offset. @@ -125,10 +125,10 @@ /** * Constructs a datagram packet for sending packets of length - * length with offset ioffsetto the + * {@code length} with offset {@code ioffset}to the * specified port number on the specified host. The - * length argument must be less than or equal to - * buf.length. + * {@code length} argument must be less than or equal to + * {@code buf.length}. * * @param buf the packet data. * @param offset the packet data offset. @@ -147,9 +147,9 @@ /** * Constructs a datagram packet for sending packets of length - * length to the specified port number on the specified - * host. The length argument must be less than or equal - * to buf.length. + * {@code length} to the specified port number on the specified + * host. The {@code length} argument must be less than or equal + * to {@code buf.length}. * * @param buf the packet data. * @param length the packet length. @@ -164,9 +164,9 @@ /** * Constructs a datagram packet for sending packets of length - * length to the specified port number on the specified - * host. The length argument must be less than or equal - * to buf.length. + * {@code length} to the specified port number on the specified + * host. The {@code length} argument must be less than or equal + * to {@code buf.length}. * * @param buf the packet data. * @param length the packet length. @@ -207,8 +207,8 @@ /** * Returns the data buffer. The data received or the data to be sent - * starts from the offset in the buffer, - * and runs for length long. + * starts from the {@code offset} in the buffer, + * and runs for {@code length} long. * * @return the buffer used to receive or send data * @see #setData(byte[], int, int) @@ -277,7 +277,7 @@ /** * Sets the IP address of the machine to which this datagram * is being sent. - * @param iaddr the InetAddress + * @param iaddr the {@code InetAddress} * @since JDK1.1 * @see #getAddress() */ @@ -303,7 +303,7 @@ * Sets the SocketAddress (usually IP address + port number) of the remote * host to which this datagram is being sent. * - * @param address the SocketAddress + * @param address the {@code SocketAddress} * @throws IllegalArgumentException if address is null or is a * SocketAddress subclass not supported by this socket * @@ -324,7 +324,7 @@ * Gets the SocketAddress (usually IP address + port number) of the remote * host that this packet is being sent to or is coming from. * - * @return the SocketAddress + * @return the {@code SocketAddress} * @since 1.4 * @see #setSocketAddress */ @@ -335,7 +335,7 @@ /** * Set the data buffer for this packet. With the offset of * this DatagramPacket set to 0, and the length set to - * the length of buf. + * the length of {@code buf}. * * @param buf the buffer to set for this packet. * diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/DatagramSocket.java --- a/jdk/src/share/classes/java/net/DatagramSocket.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/DatagramSocket.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -47,14 +47,14 @@ * a DatagramSocket is bound to a more specific address. *

* Example: - * + * {@code * DatagramSocket s = new DatagramSocket(null); * s.bind(new InetSocketAddress(8888)); - * + * } * Which is equivalent to: - * + * {@code * DatagramSocket s = new DatagramSocket(8888); - * + * } * Both cases will create a DatagramSocket able to receive broadcasts on * UDP port 8888. * @@ -161,14 +161,14 @@ * an IP address chosen by the kernel. * *

If there is a security manager, - * its checkListen method is first called + * its {@code checkListen} method is first called * with 0 as its argument to ensure the operation is allowed. * This could result in a SecurityException. * * @exception SocketException if the socket could not be opened, * or the socket could not bind to the specified local port. * @exception SecurityException if a security manager exists and its - * checkListen method doesn't allow the operation. + * {@code checkListen} method doesn't allow the operation. * * @see SecurityManager#checkListen */ @@ -195,21 +195,21 @@ * Creates a datagram socket, bound to the specified local * socket address. *

- * If, if the address is null, creates an unbound socket. + * If, if the address is {@code null}, creates an unbound socket. *

*

If there is a security manager, - * its checkListen method is first called + * its {@code checkListen} method is first called * with the port from the socket address * as its argument to ensure the operation is allowed. * This could result in a SecurityException. * - * @param bindaddr local socket address to bind, or null + * @param bindaddr local socket address to bind, or {@code null} * for an unbound socket. * * @exception SocketException if the socket could not be opened, * or the socket could not bind to the specified local port. * @exception SecurityException if a security manager exists and its - * checkListen method doesn't allow the operation. + * {@code checkListen} method doesn't allow the operation. * * @see SecurityManager#checkListen * @since 1.4 @@ -234,8 +234,8 @@ * an IP address chosen by the kernel. * *

If there is a security manager, - * its checkListen method is first called - * with the port argument + * its {@code checkListen} method is first called + * with the {@code port} argument * as its argument to ensure the operation is allowed. * This could result in a SecurityException. * @@ -243,7 +243,7 @@ * @exception SocketException if the socket could not be opened, * or the socket could not bind to the specified local port. * @exception SecurityException if a security manager exists and its - * checkListen method doesn't allow the operation. + * {@code checkListen} method doesn't allow the operation. * * @see SecurityManager#checkListen */ @@ -259,8 +259,8 @@ * an IP address chosen by the kernel. * *

If there is a security manager, - * its checkListen method is first called - * with the port argument + * its {@code checkListen} method is first called + * with the {@code port} argument * as its argument to ensure the operation is allowed. * This could result in a SecurityException. * @@ -270,7 +270,7 @@ * @exception SocketException if the socket could not be opened, * or the socket could not bind to the specified local port. * @exception SecurityException if a security manager exists and its - * checkListen method doesn't allow the operation. + * {@code checkListen} method doesn't allow the operation. * * @see SecurityManager#checkListen * @since JDK1.1 @@ -319,10 +319,10 @@ } /** - * Get the DatagramSocketImpl attached to this socket, + * Get the {@code DatagramSocketImpl} attached to this socket, * creating it if necessary. * - * @return the DatagramSocketImpl attached to that + * @return the {@code DatagramSocketImpl} attached to that * DatagramSocket * @throws SocketException if creation fails. * @since 1.4 @@ -336,14 +336,14 @@ /** * Binds this DatagramSocket to a specific address and port. *

- * If the address is null, then the system will pick up + * If the address is {@code null}, then the system will pick up * an ephemeral port and a valid local address to bind the socket. *

* @param addr The address and port to bind to. * @throws SocketException if any error happens during the bind, or if the * socket is already bound. * @throws SecurityException if a security manager exists and its - * checkListen method doesn't allow the operation. + * {@code checkListen} method doesn't allow the operation. * @throws IllegalArgumentException if addr is a SocketAddress subclass * not supported by this socket. * @since 1.4 @@ -496,7 +496,7 @@ * Returns the binding state of the socket. *

* If the socket was bound prior to being {@link #close closed}, - * then this method will continue to return true + * then this method will continue to return {@code true} * after the socket is closed. * * @return true if the socket successfully bound to an address @@ -510,7 +510,7 @@ * Returns the connection state of the socket. *

* If the socket was connected prior to being {@link #close closed}, - * then this method will continue to return true + * then this method will continue to return {@code true} * after the socket is closed. * * @return true if the socket successfully connected to a server @@ -522,7 +522,7 @@ /** * Returns the address to which this socket is connected. Returns - * null if the socket is not connected. + * {@code null} if the socket is not connected. *

* If the socket was connected prior to being {@link #close closed}, * then this method will continue to return the connected address @@ -536,7 +536,7 @@ /** * Returns the port number to which this socket is connected. - * Returns -1 if the socket is not connected. + * Returns {@code -1} if the socket is not connected. *

* If the socket was connected prior to being {@link #close closed}, * then this method will continue to return the connected port number @@ -550,14 +550,14 @@ /** * Returns the address of the endpoint this socket is connected to, or - * null if it is unconnected. + * {@code null} if it is unconnected. *

* If the socket was connected prior to being {@link #close closed}, * then this method will continue to return the connected address * after the socket is closed. * - * @return a SocketAddress representing the remote - * endpoint of this socket, or null if it is + * @return a {@code SocketAddress} representing the remote + * endpoint of this socket, or {@code null} if it is * not connected yet. * @see #getInetAddress() * @see #getPort() @@ -573,8 +573,8 @@ /** * Returns the address of the endpoint this socket is bound to. * - * @return a SocketAddress representing the local endpoint of this - * socket, or null if it is closed or not bound yet. + * @return a {@code SocketAddress} representing the local endpoint of this + * socket, or {@code null} if it is closed or not bound yet. * @see #getLocalAddress() * @see #getLocalPort() * @see #bind(SocketAddress) @@ -591,28 +591,28 @@ /** * Sends a datagram packet from this socket. The - * DatagramPacket includes information indicating the + * {@code DatagramPacket} includes information indicating the * data to be sent, its length, the IP address of the remote host, * and the port number on the remote host. * *

If there is a security manager, and the socket is not currently * connected to a remote address, this method first performs some - * security checks. First, if p.getAddress().isMulticastAddress() + * security checks. First, if {@code p.getAddress().isMulticastAddress()} * is true, this method calls the - * security manager's checkMulticast method - * with p.getAddress() as its argument. + * security manager's {@code checkMulticast} method + * with {@code p.getAddress()} as its argument. * If the evaluation of that expression is false, * this method instead calls the security manager's - * checkConnect method with arguments - * p.getAddress().getHostAddress() and - * p.getPort(). Each call to a security manager method + * {@code checkConnect} method with arguments + * {@code p.getAddress().getHostAddress()} and + * {@code p.getPort()}. Each call to a security manager method * could result in a SecurityException if the operation is not allowed. * - * @param p the DatagramPacket to be sent. + * @param p the {@code DatagramPacket} to be sent. * * @exception IOException if an I/O error occurs. * @exception SecurityException if a security manager exists and its - * checkMulticast or checkConnect + * {@code checkMulticast} or {@code checkConnect} * method doesn't allow the send. * @exception PortUnreachableException may be thrown if the socket is connected * to a currently unreachable destination. Note, there is no @@ -674,20 +674,20 @@ /** * Receives a datagram packet from this socket. When this method - * returns, the DatagramPacket's buffer is filled with + * returns, the {@code DatagramPacket}'s buffer is filled with * the data received. The datagram packet also contains the sender's * IP address, and the port number on the sender's machine. *

* This method blocks until a datagram is received. The - * length field of the datagram packet object contains + * {@code length} field of the datagram packet object contains * the length of the received message. If the message is longer than * the packet's length, the message is truncated. *

* If there is a security manager, a packet cannot be received if the - * security manager's checkAccept method + * security manager's {@code checkAccept} method * does not allow it. * - * @param p the DatagramPacket into which to place + * @param p the {@code DatagramPacket} into which to place * the incoming data. * @exception IOException if an I/O error occurs. * @exception SocketTimeoutException if setSoTimeout was previously called @@ -786,17 +786,17 @@ * Gets the local address to which the socket is bound. * *

If there is a security manager, its - * checkConnect method is first called - * with the host address and -1 + * {@code checkConnect} method is first called + * with the host address and {@code -1} * as its arguments to see if the operation is allowed. * * @see SecurityManager#checkConnect * @return the local address to which the socket is bound, - * null if the socket is closed, or - * an InetAddress representing + * {@code null} if the socket is closed, or + * an {@code InetAddress} representing * {@link InetAddress#isAnyLocalAddress wildcard} * address if either the socket is not bound, or - * the security manager checkConnect + * the security manager {@code checkConnect} * method does not allow the operation * @since 1.1 */ @@ -824,8 +824,8 @@ * is bound. * * @return the port number on the local host to which this socket is bound, - -1 if the socket is closed, or - 0 if it is not bound yet. + {@code -1} if the socket is closed, or + {@code 0} if it is not bound yet. */ public int getLocalPort() { if (isClosed()) @@ -883,7 +883,7 @@ /** * Sets the SO_SNDBUF option to the specified value for this - * DatagramSocket. The SO_SNDBUF option is used by the + * {@code DatagramSocket}. The SO_SNDBUF option is used by the * network implementation as a hint to size the underlying * network I/O buffers. The SO_SNDBUF setting may also be used * by the network implementation to determine the maximum size @@ -897,7 +897,7 @@ * is high. *

* Note: If {@link #send(DatagramPacket)} is used to send a - * DatagramPacket that is larger than the setting + * {@code DatagramPacket} that is larger than the setting * of SO_SNDBUF then it is implementation specific if the * packet is sent or discarded. * @@ -921,10 +921,10 @@ } /** - * Get value of the SO_SNDBUF option for this DatagramSocket, that is the - * buffer size used by the platform for output on this DatagramSocket. + * Get value of the SO_SNDBUF option for this {@code DatagramSocket}, that is the + * buffer size used by the platform for output on this {@code DatagramSocket}. * - * @return the value of the SO_SNDBUF option for this DatagramSocket + * @return the value of the SO_SNDBUF option for this {@code DatagramSocket} * @exception SocketException if there is an error in * the underlying protocol, such as an UDP error. * @see #setSendBufferSize @@ -942,7 +942,7 @@ /** * Sets the SO_RCVBUF option to the specified value for this - * DatagramSocket. The SO_RCVBUF option is used by the + * {@code DatagramSocket}. The SO_RCVBUF option is used by the * the network implementation as a hint to size the underlying * network I/O buffers. The SO_RCVBUF setting may also be used * by the network implementation to determine the maximum size @@ -979,10 +979,10 @@ } /** - * Get value of the SO_RCVBUF option for this DatagramSocket, that is the - * buffer size used by the platform for input on this DatagramSocket. + * Get value of the SO_RCVBUF option for this {@code DatagramSocket}, that is the + * buffer size used by the platform for input on this {@code DatagramSocket}. * - * @return the value of the SO_RCVBUF option for this DatagramSocket + * @return the value of the SO_RCVBUF option for this {@code DatagramSocket} * @exception SocketException if there is an error in the underlying protocol, such as an UDP error. * @see #setReceiveBufferSize(int) */ @@ -1005,26 +1005,26 @@ * socket to the same socket address. This is typically for the * purpose of receiving multicast packets * (See {@link java.net.MulticastSocket}). The - * SO_REUSEADDR socket option allows multiple + * {@code SO_REUSEADDR} socket option allows multiple * sockets to be bound to the same socket address if the - * SO_REUSEADDR socket option is enabled prior + * {@code SO_REUSEADDR} socket option is enabled prior * to binding the socket using {@link #bind(SocketAddress)}. *

* Note: This functionality is not supported by all existing platforms, * so it is implementation specific whether this option will be ignored * or not. However, if it is not supported then - * {@link #getReuseAddress()} will always return false. + * {@link #getReuseAddress()} will always return {@code false}. *

- * When a DatagramSocket is created the initial setting - * of SO_REUSEADDR is disabled. + * When a {@code DatagramSocket} is created the initial setting + * of {@code SO_REUSEADDR} is disabled. *

- * The behaviour when SO_REUSEADDR is enabled or + * The behaviour when {@code SO_REUSEADDR} is enabled or * disabled after a socket is bound (See {@link #isBound()}) * is not defined. * * @param on whether to enable or disable the * @exception SocketException if an error occurs enabling or - * disabling the SO_RESUEADDR socket option, + * disabling the {@code SO_RESUEADDR} socket option, * or the socket is closed. * @since 1.4 * @see #getReuseAddress() @@ -1045,7 +1045,7 @@ /** * Tests if SO_REUSEADDR is enabled. * - * @return a boolean indicating whether or not SO_REUSEADDR is enabled. + * @return a {@code boolean} indicating whether or not SO_REUSEADDR is enabled. * @exception SocketException if there is an error * in the underlying protocol, such as an UDP error. * @since 1.4 @@ -1083,7 +1083,7 @@ /** * Tests if SO_BROADCAST is enabled. - * @return a boolean indicating whether or not SO_BROADCAST is enabled. + * @return a {@code boolean} indicating whether or not SO_BROADCAST is enabled. * @exception SocketException if there is an error * in the underlying protocol, such as an UDP error. * @since 1.4 @@ -1105,7 +1105,7 @@ * 255} or an IllegalArgumentException will be thrown. *

Notes: *

For Internet Protocol v4 the value consists of an - * integer, the least significant 8 bits of which + * {@code integer}, the least significant 8 bits of which * represent the value of the TOS octet in IP packets sent by * the socket. * RFC 1349 defines the TOS values as follows: @@ -1123,10 +1123,10 @@ * SocketException indicating that the operation is not * permitted. *

- * for Internet Protocol v6 tc is the value that + * for Internet Protocol v6 {@code tc} is the value that * would be placed into the sin6_flowinfo field of the IP header. * - * @param tc an int value for the bitset. + * @param tc an {@code int} value for the bitset. * @throws SocketException if there is an error setting the * traffic class or type-of-service * @since 1.4 @@ -1205,7 +1205,7 @@ * DatagramChannel.open} method. * * @return the datagram channel associated with this datagram socket, - * or null if this socket was not created for a channel + * or {@code null} if this socket was not created for a channel * * @since 1.4 * @spec JSR-51 @@ -1224,14 +1224,14 @@ * application. The factory can be specified only once. *

* When an application creates a new datagram socket, the socket - * implementation factory's createDatagramSocketImpl method is + * implementation factory's {@code createDatagramSocketImpl} method is * called to create the actual datagram socket implementation. *

- * Passing null to the method is a no-op unless the factory + * Passing {@code null} to the method is a no-op unless the factory * was already set. * *

If there is a security manager, this method first calls - * the security manager's checkSetFactory method + * the security manager's {@code checkSetFactory} method * to ensure the operation is allowed. * This could result in a SecurityException. * @@ -1240,7 +1240,7 @@ * datagram socket factory. * @exception SocketException if the factory is already defined. * @exception SecurityException if a security manager exists and its - * checkSetFactory method doesn't allow the + * {@code checkSetFactory} method doesn't allow the operation. * @see java.net.DatagramSocketImplFactory#createDatagramSocketImpl() diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/DatagramSocketImpl.java --- a/jdk/src/share/classes/java/net/DatagramSocketImpl.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/DatagramSocketImpl.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -101,7 +101,7 @@ protected void disconnect() {} /** - * Peek at the packet to see who it is from. Updates the specified InetAddress + * Peek at the packet to see who it is from. Updates the specified {@code InetAddress} * to the address which the packet came from. * @param i an InetAddress object * @return the port number which the packet came from. @@ -114,7 +114,7 @@ /** * Peek at the packet to see who it is from. The data is copied into the specified - * DatagramPacket. The data is returned, + * {@code DatagramPacket}. The data is returned, * but not consumed, so that a subsequent peekData/receive operation * will see the same data. * @param p the Packet Received. @@ -163,7 +163,7 @@ /** * Set the TTL (time-to-live) option. - * @param ttl an int specifying the time-to-live value + * @param ttl an {@code int} specifying the time-to-live value * @exception IOException if an I/O exception occurs * while setting the time-to-live option. * @see #getTimeToLive() @@ -174,7 +174,7 @@ * Retrieve the TTL (time-to-live) option. * @exception IOException if an I/O exception occurs * while retrieving the time-to-live option - * @return an int representing the time-to-live value + * @return an {@code int} representing the time-to-live value * @see #setTimeToLive(int) */ protected abstract int getTimeToLive() throws IOException; @@ -227,7 +227,7 @@ /** * Gets the local port. - * @return an int representing the local port value + * @return an {@code int} representing the local port value */ protected int getLocalPort() { return localPort; @@ -235,7 +235,7 @@ /** * Gets the datagram socket file descriptor. - * @return a FileDescriptor object representing the datagram socket + * @return a {@code FileDescriptor} object representing the datagram socket * file descriptor */ protected FileDescriptor getFileDescriptor() { diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/DatagramSocketImplFactory.java --- a/jdk/src/share/classes/java/net/DatagramSocketImplFactory.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/DatagramSocketImplFactory.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2002, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,7 +27,7 @@ /** * This interface defines a factory for datagram socket implementations. It - * is used by the classes DatagramSocket to create actual socket + * is used by the classes {@code DatagramSocket} to create actual socket * implementations. * * @author Yingxian Wang @@ -37,9 +37,9 @@ public interface DatagramSocketImplFactory { /** - * Creates a new DatagramSocketImpl instance. + * Creates a new {@code DatagramSocketImpl} instance. * - * @return a new instance of DatagramSocketImpl. + * @return a new instance of {@code DatagramSocketImpl}. * @see java.net.DatagramSocketImpl */ DatagramSocketImpl createDatagramSocketImpl(); diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/FileNameMap.java --- a/jdk/src/share/classes/java/net/FileNameMap.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/FileNameMap.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 1999, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -37,7 +37,7 @@ /** * Gets the MIME type for the specified file name. * @param fileName the specified file name - * @return a String indicating the MIME + * @return a {@code String} indicating the MIME * type for the specified file name. */ public String getContentTypeFor(String fileName); diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/HttpCookie.java --- a/jdk/src/share/classes/java/net/HttpCookie.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/HttpCookie.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -470,7 +470,7 @@ * protocol. * * @return {@code false} if the cookie can be sent over any standard - * protocol; otherwise, true + * protocol; otherwise, {@code true} * * @see #setSecure */ diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/HttpRetryException.java --- a/jdk/src/share/classes/java/net/HttpRetryException.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/HttpRetryException.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -43,7 +43,7 @@ private String location; /** - * Constructs a new HttpRetryException from the + * Constructs a new {@code HttpRetryException} from the * specified response code and exception detail message * * @param detail the detail message. @@ -55,7 +55,7 @@ } /** - * Constructs a new HttpRetryException with detail message + * Constructs a new {@code HttpRetryException} with detail message * responseCode and the contents of the Location response header field. * * @param detail the detail message. diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/HttpURLConnection.java --- a/jdk/src/share/classes/java/net/HttpURLConnection.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/HttpURLConnection.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -76,14 +76,14 @@ /** * The chunk-length when using chunked encoding streaming mode for output. - * A value of -1 means chunked encoding is disabled for output. + * A value of {@code -1} means chunked encoding is disabled for output. * @since 1.5 */ protected int chunkLength = -1; /** * The fixed content-length when using fixed-length streaming mode. - * A value of -1 means fixed-length streaming mode is disabled + * A value of {@code -1} means fixed-length streaming mode is disabled * for output. * *

NOTE: {@link #fixedContentLengthLong} is recommended instead @@ -103,15 +103,15 @@ protected long fixedContentLengthLong = -1; /** - * Returns the key for the nth header field. - * Some implementations may treat the 0th + * Returns the key for the {@code n}th header field. + * Some implementations may treat the {@code 0}th * header field as special, i.e. as the status line returned by the HTTP * server. In this case, {@link #getHeaderField(int) getHeaderField(0)} returns the status - * line, but getHeaderFieldKey(0) returns null. + * line, but {@code getHeaderFieldKey(0)} returns null. * * @param n an index, where {@code n >=0}. - * @return the key for the nth header field, - * or null if the key does not exist. + * @return the key for the {@code n}th header field, + * or {@code null} if the key does not exist. */ public String getHeaderFieldKey (int n) { return null; @@ -251,8 +251,8 @@ } /** - * Returns the value for the nth header field. - * Some implementations may treat the 0th + * Returns the value for the {@code n}th header field. + * Some implementations may treat the {@code 0}th * header field as special, i.e. as the status line returned by the HTTP * server. *

@@ -261,8 +261,8 @@ * the headers in the message. * * @param n an index, where {@code n>=0}. - * @return the value of the nth header field, - * or null if the value does not exist. + * @return the value of the {@code n}th header field, + * or {@code null} if the value does not exist. * @see java.net.HttpURLConnection#getHeaderFieldKey(int) */ public String getHeaderField(int n) { @@ -270,7 +270,7 @@ } /** - * An int representing the three digit HTTP Status-Code. + * An {@code int} representing the three digit HTTP Status-Code. *

    *
  • 1xx: Informational *
  • 2xx: Success @@ -292,12 +292,12 @@ private static boolean followRedirects = true; /** - * If true, the protocol will automatically follow redirects. - * If false, the protocol will not automatically follow + * If {@code true}, the protocol will automatically follow redirects. + * If {@code false}, the protocol will not automatically follow * redirects. *

    - * This field is set by the setInstanceFollowRedirects - * method. Its value is returned by the getInstanceFollowRedirects + * This field is set by the {@code setInstanceFollowRedirects} + * method. Its value is returned by the {@code getInstanceFollowRedirects} * method. *

    * Its default value is based on the value of the static followRedirects @@ -328,14 +328,14 @@ * cannot change this variable. *

    * If there is a security manager, this method first calls - * the security manager's checkSetFactory method + * the security manager's {@code checkSetFactory} method * to ensure the operation is allowed. * This could result in a SecurityException. * - * @param set a boolean indicating whether or not + * @param set a {@code boolean} indicating whether or not * to follow HTTP redirects. * @exception SecurityException if a security manager exists and its - * checkSetFactory method doesn't + * {@code checkSetFactory} method doesn't * allow the operation. * @see SecurityManager#checkSetFactory * @see #getFollowRedirects() @@ -350,12 +350,12 @@ } /** - * Returns a boolean indicating + * Returns a {@code boolean} indicating * whether or not HTTP redirects (3xx) should * be automatically followed. * - * @return true if HTTP redirects should - * be automatically followed, false if not. + * @return {@code true} if HTTP redirects should + * be automatically followed, {@code false} if not. * @see #setFollowRedirects(boolean) */ public static boolean getFollowRedirects() { @@ -364,13 +364,13 @@ /** * Sets whether HTTP redirects (requests with response code 3xx) should - * be automatically followed by this HttpURLConnection + * be automatically followed by this {@code HttpURLConnection} * instance. *

    * The default value comes from followRedirects, which defaults to * true. * - * @param followRedirects a boolean indicating + * @param followRedirects a {@code boolean} indicating * whether or not to follow HTTP redirects. * * @see java.net.HttpURLConnection#instanceFollowRedirects @@ -382,11 +382,11 @@ } /** - * Returns the value of this HttpURLConnection's - * instanceFollowRedirects field. + * Returns the value of this {@code HttpURLConnection}'s + * {@code instanceFollowRedirects} field. * - * @return the value of this HttpURLConnection's - * instanceFollowRedirects field. + * @return the value of this {@code HttpURLConnection}'s + * {@code instanceFollowRedirects} field. * @see java.net.HttpURLConnection#instanceFollowRedirects * @see #setInstanceFollowRedirects(boolean) * @since 1.3 @@ -540,7 +540,7 @@ * Returns null if none could be discerned from the responses * (the result was not valid HTTP). * @throws IOException if an error occurred connecting to the server. - * @return the HTTP response message, or null + * @return the HTTP response message, or {@code null} */ public String getResponseMessage() throws IOException { getResponseCode(); @@ -583,7 +583,7 @@ * @exception IOException if an error occurs while computing * the permission. * - * @return a SocketPermission object representing the + * @return a {@code SocketPermission} object representing the * permission necessary to connect to the destination * host and port. */ diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/IDN.java --- a/jdk/src/share/classes/java/net/IDN.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/IDN.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -104,7 +104,7 @@ * @param input the string to be processed * @param flag process flag; can be 0 or any logical OR of possible flags * - * @return the translated String + * @return the translated {@code String} * * @throws IllegalArgumentException if the input string doesn't conform to RFC 3490 specification */ @@ -130,13 +130,13 @@ * *

    This convenience method works as if by invoking the * two-argument counterpart as follows: - *

    + *
    * {@link #toASCII(String, int) toASCII}(input, 0); - *
    + *
    * * @param input the string to be processed * - * @return the translated String + * @return the translated {@code String} * * @throws IllegalArgumentException if the input string doesn't conform to RFC 3490 specification */ @@ -161,7 +161,7 @@ * @param input the string to be processed * @param flag process flag; can be 0 or any logical OR of possible flags * - * @return the translated String + * @return the translated {@code String} */ public static String toUnicode(String input, int flag) { int p = 0, q = 0; @@ -184,13 +184,13 @@ * *

    This convenience method works as if by invoking the * two-argument counterpart as follows: - *

    + *
    * {@link #toUnicode(String, int) toUnicode}(input, 0); - *
    + *
    * * @param input the string to be processed * - * @return the translated String + * @return the translated {@code String} */ public static String toUnicode(String input) { return toUnicode(input, 0); diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/Inet4Address.java --- a/jdk/src/share/classes/java/net/Inet4Address.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/Inet4Address.java Fri Aug 02 09:38:09 2013 +0100 @@ -42,10 +42,10 @@ * takes one of the following forms: * *
    - * - * - * - * + * + * + * + * *
    d.d.d.d
    d.d.d
    d.d
    d
    {@code d.d.d.d}
    {@code d.d.d}
    {@code d.d}
    {@code d}
    * *

    When four parts are specified, each is interpreted as a byte of @@ -153,7 +153,7 @@ * Utility routine to check if the InetAddress is an * IP multicast address. IP multicast address is a Class D * address i.e first four bits of the address are 1110. - * @return a boolean indicating if the InetAddress is + * @return a {@code boolean} indicating if the InetAddress is * an IP multicast address * @since JDK1.1 */ @@ -163,7 +163,7 @@ /** * Utility routine to check if the InetAddress in a wildcard address. - * @return a boolean indicating if the Inetaddress is + * @return a {@code boolean} indicating if the Inetaddress is * a wildcard address. * @since 1.4 */ @@ -174,7 +174,7 @@ /** * Utility routine to check if the InetAddress is a loopback address. * - * @return a boolean indicating if the InetAddress is + * @return a {@code boolean} indicating if the InetAddress is * a loopback address; or false otherwise. * @since 1.4 */ @@ -187,7 +187,7 @@ /** * Utility routine to check if the InetAddress is an link local address. * - * @return a boolean indicating if the InetAddress is + * @return a {@code boolean} indicating if the InetAddress is * a link local address; or false if address is not a link local unicast address. * @since 1.4 */ @@ -204,7 +204,7 @@ /** * Utility routine to check if the InetAddress is a site local address. * - * @return a boolean indicating if the InetAddress is + * @return a {@code boolean} indicating if the InetAddress is * a site local address; or false if address is not a site local unicast address. * @since 1.4 */ @@ -224,7 +224,7 @@ /** * Utility routine to check if the multicast address has global scope. * - * @return a boolean indicating if the address has + * @return a {@code boolean} indicating if the address has * is a multicast address of global scope, false if it is not * of global scope or it is not a multicast address * @since 1.4 @@ -240,7 +240,7 @@ /** * Utility routine to check if the multicast address has node scope. * - * @return a boolean indicating if the address has + * @return a {@code boolean} indicating if the address has * is a multicast address of node-local scope, false if it is not * of node-local scope or it is not a multicast address * @since 1.4 @@ -253,7 +253,7 @@ /** * Utility routine to check if the multicast address has link scope. * - * @return a boolean indicating if the address has + * @return a {@code boolean} indicating if the address has * is a multicast address of link-local scope, false if it is not * of link-local scope or it is not a multicast address * @since 1.4 @@ -269,7 +269,7 @@ /** * Utility routine to check if the multicast address has site scope. * - * @return a boolean indicating if the address has + * @return a {@code boolean} indicating if the address has * is a multicast address of site-local scope, false if it is not * of site-local scope or it is not a multicast address * @since 1.4 @@ -284,7 +284,7 @@ /** * Utility routine to check if the multicast address has organization scope. * - * @return a boolean indicating if the address has + * @return a {@code boolean} indicating if the address has * is a multicast address of organization-local scope, * false if it is not of organization-local scope * or it is not a multicast address @@ -299,9 +299,9 @@ } /** - * Returns the raw IP address of this InetAddress + * Returns the raw IP address of this {@code InetAddress} * object. The result is in network byte order: the highest order - * byte of the address is in getAddress()[0]. + * byte of the address is in {@code getAddress()[0]}. * * @return the raw IP address of this object. */ @@ -337,18 +337,18 @@ /** * Compares this object against the specified object. - * The result is true if and only if the argument is - * not null and it represents the same IP address as + * The result is {@code true} if and only if the argument is + * not {@code null} and it represents the same IP address as * this object. *

    - * Two instances of InetAddress represent the same IP + * Two instances of {@code InetAddress} represent the same IP * address if the length of the byte arrays returned by - * getAddress is the same for both, and each of the + * {@code getAddress} is the same for both, and each of the * array components is the same for the byte arrays. * * @param obj the object to compare against. - * @return true if the objects are the same; - * false otherwise. + * @return {@code true} if the objects are the same; + * {@code false} otherwise. * @see java.net.InetAddress#getAddress() */ public boolean equals(Object obj) { diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/Inet6Address.java --- a/jdk/src/share/classes/java/net/Inet6Address.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/Inet6Address.java Fri Aug 02 09:38:09 2013 +0100 @@ -47,7 +47,7 @@ * address. This is the full form. For example, * *

    - * + * *
    1080:0:0:0:8:800:200C:417A
    {@code 1080:0:0:0:8:800:200C:417A}
    * *

    Note that it is not necessary to write the leading zeros in @@ -64,7 +64,7 @@ * zeros in an address. For example, * *

    - * + * *
    1080::8:800:200C:417A
    {@code 1080::8:800:200C:417A}
    * *
  • An alternative form that is sometimes more convenient @@ -75,8 +75,8 @@ * standard IPv4 representation address, for example, * *

    - * - * + * + * *
    ::FFFF:129.144.52.38
    ::129.144.52.38
    {@code ::FFFF:129.144.52.38}
    {@code ::129.144.52.38}
    * *

    where "::FFFF:d.d.d.d" and "::d.d.d.d" are, respectively, the @@ -85,23 +85,23 @@ * in the "d.d.d.d" form. The following forms are invalid: * *

    - * - * - * - * + * + * + * + * *
    ::FFFF:d.d.d
    ::FFFF:d.d
    ::d.d.d
    ::d.d
    {@code ::FFFF:d.d.d}
    {@code ::FFFF:d.d}
    {@code ::d.d.d}
    {@code ::d.d}
    * *

    The following form: * *

    - * + * *
    ::FFFF:d
    {@code ::FFFF:d}
    * *

    is valid, however it is an unconventional representation of * the IPv4-compatible IPv6 address, * *

    - * + * *
    ::255.255.0.d
    {@code ::255.255.0.d}
    * *

    while "::d" corresponds to the general IPv6 address @@ -258,7 +258,7 @@ * Create an Inet6Address in the exact manner of {@link * InetAddress#getByAddress(String,byte[])} except that the IPv6 scope_id is * set to the value corresponding to the given interface for the address - * type specified in addr. The call will fail with an + * type specified in {@code addr}. The call will fail with an * UnknownHostException if the given interface does not have a numeric * scope_id assigned for the given address type (eg. link-local or site-local). * See here for a description of IPv6 diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/InetAddress.java --- a/jdk/src/share/classes/java/net/InetAddress.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/InetAddress.java Fri Aug 02 09:38:09 2013 +0100 @@ -296,7 +296,7 @@ /** * Utility routine to check if the InetAddress is an * IP multicast address. - * @return a boolean indicating if the InetAddress is + * @return a {@code boolean} indicating if the InetAddress is * an IP multicast address * @since JDK1.1 */ @@ -306,7 +306,7 @@ /** * Utility routine to check if the InetAddress in a wildcard address. - * @return a boolean indicating if the Inetaddress is + * @return a {@code boolean} indicating if the Inetaddress is * a wildcard address. * @since 1.4 */ @@ -317,7 +317,7 @@ /** * Utility routine to check if the InetAddress is a loopback address. * - * @return a boolean indicating if the InetAddress is + * @return a {@code boolean} indicating if the InetAddress is * a loopback address; or false otherwise. * @since 1.4 */ @@ -328,7 +328,7 @@ /** * Utility routine to check if the InetAddress is an link local address. * - * @return a boolean indicating if the InetAddress is + * @return a {@code boolean} indicating if the InetAddress is * a link local address; or false if address is not a link local unicast address. * @since 1.4 */ @@ -339,7 +339,7 @@ /** * Utility routine to check if the InetAddress is a site local address. * - * @return a boolean indicating if the InetAddress is + * @return a {@code boolean} indicating if the InetAddress is * a site local address; or false if address is not a site local unicast address. * @since 1.4 */ @@ -350,7 +350,7 @@ /** * Utility routine to check if the multicast address has global scope. * - * @return a boolean indicating if the address has + * @return a {@code boolean} indicating if the address has * is a multicast address of global scope, false if it is not * of global scope or it is not a multicast address * @since 1.4 @@ -362,7 +362,7 @@ /** * Utility routine to check if the multicast address has node scope. * - * @return a boolean indicating if the address has + * @return a {@code boolean} indicating if the address has * is a multicast address of node-local scope, false if it is not * of node-local scope or it is not a multicast address * @since 1.4 @@ -374,7 +374,7 @@ /** * Utility routine to check if the multicast address has link scope. * - * @return a boolean indicating if the address has + * @return a {@code boolean} indicating if the address has * is a multicast address of link-local scope, false if it is not * of link-local scope or it is not a multicast address * @since 1.4 @@ -386,7 +386,7 @@ /** * Utility routine to check if the multicast address has site scope. * - * @return a boolean indicating if the address has + * @return a {@code boolean} indicating if the address has * is a multicast address of site-local scope, false if it is not * of site-local scope or it is not a multicast address * @since 1.4 @@ -398,7 +398,7 @@ /** * Utility routine to check if the multicast address has organization scope. * - * @return a boolean indicating if the address has + * @return a {@code boolean} indicating if the address has * is a multicast address of organization-local scope, * false if it is not of organization-local scope * or it is not a multicast address @@ -424,9 +424,9 @@ * in an IllegalArgumentException being thrown. * * @param timeout the time, in milliseconds, before the call aborts - * @return a boolean indicating if the address is reachable. + * @return a {@code boolean} indicating if the address is reachable. * @throws IOException if a network error occurs - * @throws IllegalArgumentException if timeout is negative. + * @throws IllegalArgumentException if {@code timeout} is negative. * @since 1.5 */ public boolean isReachable(int timeout) throws IOException { @@ -442,10 +442,10 @@ * privilege can be obtained, otherwise it will try to establish * a TCP connection on port 7 (Echo) of the destination host. *

    - * The network interface and ttl parameters + * The {@code network interface} and {@code ttl} parameters * let the caller specify which network interface the test will go through * and the maximum number of hops the packets should go through. - * A negative value for the ttl will result in an + * A negative value for the {@code ttl} will result in an * IllegalArgumentException being thrown. *

    * The timeout value, in milliseconds, indicates the maximum amount of time @@ -458,9 +458,9 @@ * @param ttl the maximum numbers of hops to try or 0 for the * default * @param timeout the time, in milliseconds, before the call aborts - * @throws IllegalArgumentException if either timeout - * or ttl are negative. - * @return a booleanindicating if the address is reachable. + * @throws IllegalArgumentException if either {@code timeout} + * or {@code ttl} are negative. + * @return a {@code boolean}indicating if the address is reachable. * @throws IOException if a network error occurs * @since 1.5 */ @@ -486,8 +486,8 @@ * {@link #getCanonicalHostName() getCanonicalHostName}. * *

    If there is a security manager, its - * checkConnect method is first called - * with the hostname and -1 + * {@code checkConnect} method is first called + * with the hostname and {@code -1} * as its arguments to see if the operation is allowed. * If the operation is not allowed, it will return * the textual representation of the IP address. @@ -511,8 +511,8 @@ * here without a security check. * *

    If there is a security manager, this method first - * calls its checkConnect method - * with the hostname and -1 + * calls its {@code checkConnect} method + * with the hostname and {@code -1} * as its arguments to see if the calling code is allowed to know * the hostname for this IP address, i.e., to connect to the host. * If the operation is not allowed, it will return @@ -539,8 +539,8 @@ * the FQDN depending on the underlying system configuration. * *

    If there is a security manager, this method first - * calls its checkConnect method - * with the hostname and -1 + * calls its {@code checkConnect} method + * with the hostname and {@code -1} * as its arguments to see if the calling code is allowed to know * the hostname for this IP address, i.e., to connect to the host. * If the operation is not allowed, it will return @@ -566,8 +566,8 @@ * Returns the hostname for this address. * *

    If there is a security manager, this method first - * calls its checkConnect method - * with the hostname and -1 + * calls its {@code checkConnect} method + * with the hostname and {@code -1} * as its arguments to see if the calling code is allowed to know * the hostname for this IP address, i.e., to connect to the host. * If the operation is not allowed, it will return @@ -633,9 +633,9 @@ } /** - * Returns the raw IP address of this InetAddress + * Returns the raw IP address of this {@code InetAddress} * object. The result is in network byte order: the highest order - * byte of the address is in getAddress()[0]. + * byte of the address is in {@code getAddress()[0]}. * * @return the raw IP address of this object. */ @@ -664,18 +664,18 @@ /** * Compares this object against the specified object. - * The result is true if and only if the argument is - * not null and it represents the same IP address as + * The result is {@code true} if and only if the argument is + * not {@code null} and it represents the same IP address as * this object. *

    - * Two instances of InetAddress represent the same IP + * Two instances of {@code InetAddress} represent the same IP * address if the length of the byte arrays returned by - * getAddress is the same for both, and each of the + * {@code getAddress} is the same for both, and each of the * array components is the same for the byte arrays. * * @param obj the object to compare against. - * @return true if the objects are the same; - * false otherwise. + * @return {@code true} if the objects are the same; + * {@code false} otherwise. * @see java.net.InetAddress#getAddress() */ public boolean equals(Object obj) { @@ -683,7 +683,7 @@ } /** - * Converts this IP address to a String. The + * Converts this IP address to a {@code String}. The * string returned is of the form: hostname / literal IP * address. * @@ -974,7 +974,7 @@ * No name service is checked for the validity of the address. * *

    The host name can either be a machine name, such as - * "java.sun.com", or a textual representation of its IP + * "{@code java.sun.com}", or a textual representation of its IP * address. *

    No validity checking is done on the host name either. * @@ -1019,26 +1019,26 @@ * Determines the IP address of a host, given the host's name. * *

    The host name can either be a machine name, such as - * "java.sun.com", or a textual representation of its + * "{@code java.sun.com}", or a textual representation of its * IP address. If a literal IP address is supplied, only the * validity of the address format is checked. * - *

    For host specified in literal IPv6 address, + *

    For {@code host} specified in literal IPv6 address, * either the form defined in RFC 2732 or the literal IPv6 address * format defined in RFC 2373 is accepted. IPv6 scoped addresses are also * supported. See here for a description of IPv6 * scoped addresses. * - *

    If the host is null then an InetAddress + *

    If the host is {@code null} then an {@code InetAddress} * representing an address of the loopback interface is returned. * See RFC 3330 * section 2 and RFC 2373 * section 2.5.3.

    * - * @param host the specified host, or null. + * @param host the specified host, or {@code null}. * @return an IP address for the given host name. * @exception UnknownHostException if no IP address for the - * host could be found, or if a scope_id was specified + * {@code host} could be found, or if a scope_id was specified * for a global IPv6 address. * @exception SecurityException if a security manager exists * and its checkConnect method doesn't allow the operation @@ -1059,37 +1059,37 @@ * based on the configured name service on the system. * *

    The host name can either be a machine name, such as - * "java.sun.com", or a textual representation of its IP + * "{@code java.sun.com}", or a textual representation of its IP * address. If a literal IP address is supplied, only the * validity of the address format is checked. * - *

    For host specified in literal IPv6 address, + *

    For {@code host} specified in literal IPv6 address, * either the form defined in RFC 2732 or the literal IPv6 address * format defined in RFC 2373 is accepted. A literal IPv6 address may * also be qualified by appending a scoped zone identifier or scope_id. * The syntax and usage of scope_ids is described * here. - *

    If the host is null then an InetAddress + *

    If the host is {@code null} then an {@code InetAddress} * representing an address of the loopback interface is returned. * See RFC 3330 * section 2 and RFC 2373 * section 2.5.3.

    * - *

    If there is a security manager and host is not - * null and host.length() is not equal to zero, the + *

    If there is a security manager and {@code host} is not + * null and {@code host.length() } is not equal to zero, the * security manager's - * checkConnect method is called - * with the hostname and -1 + * {@code checkConnect} method is called + * with the hostname and {@code -1} * as its arguments to see if the operation is allowed. * - * @param host the name of the host, or null. + * @param host the name of the host, or {@code null}. * @return an array of all the IP addresses for a given host name. * * @exception UnknownHostException if no IP address for the - * host could be found, or if a scope_id was specified + * {@code host} could be found, or if a scope_id was specified * for a global IPv6 address. * @exception SecurityException if a security manager exists and its - * checkConnect method doesn't allow the operation. + * {@code checkConnect} method doesn't allow the operation. * * @see SecurityManager#checkConnect */ @@ -1389,9 +1389,9 @@ } /** - * Returns an InetAddress object given the raw IP address . + * Returns an {@code InetAddress} object given the raw IP address . * The argument is in network byte order: the highest order - * byte of the address is in getAddress()[0]. + * byte of the address is in {@code getAddress()[0]}. * *

    This method doesn't block, i.e. no reverse name service lookup * is performed. @@ -1417,14 +1417,14 @@ /** * Returns the address of the local host. This is achieved by retrieving * the name of the host from the system, then resolving that name into - * an InetAddress. + * an {@code InetAddress}. * *

    Note: The resolved address may be cached for a short period of time. *

    * *

    If there is a security manager, its - * checkConnect method is called - * with the local host name and -1 + * {@code checkConnect} method is called + * with the local host name and {@code -1} * as its arguments to see if the operation is allowed. * If the operation is not allowed, an InetAddress representing * the loopback address is returned. diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/InetSocketAddress.java --- a/jdk/src/share/classes/java/net/InetSocketAddress.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/InetSocketAddress.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -43,7 +43,7 @@ * as returned values. *

    * The wildcard is a special local IP address. It usually means "any" - * and can only be used for bind operations. + * and can only be used for {@code bind} operations. * * @see java.net.Socket * @see java.net.ServerSocket @@ -155,8 +155,8 @@ * and the port number a specified value. *

    * A valid port value is between 0 and 65535. - * A port number of zero will let the system pick up an - * ephemeral port in a bind operation. + * A port number of {@code zero} will let the system pick up an + * ephemeral port in a {@code bind} operation. *

    * @param port The port number * @throws IllegalArgumentException if the port parameter is outside the specified @@ -171,10 +171,10 @@ * Creates a socket address from an IP address and a port number. *

    * A valid port value is between 0 and 65535. - * A port number of zero will let the system pick up an - * ephemeral port in a bind operation. + * A port number of {@code zero} will let the system pick up an + * ephemeral port in a {@code bind} operation. *

    - * A null address will assign the wildcard address. + * A {@code null} address will assign the wildcard address. *

    * @param addr The IP address * @param port The port number @@ -195,13 +195,13 @@ * An attempt will be made to resolve the hostname into an InetAddress. * If that attempt fails, the address will be flagged as unresolved. *

    - * If there is a security manager, its checkConnect method + * If there is a security manager, its {@code checkConnect} method * is called with the host name as its argument to check the permissiom * to resolve it. This could result in a SecurityException. *

    * A valid port value is between 0 and 65535. - * A port number of zero will let the system pick up an - * ephemeral port in a bind operation. + * A port number of {@code zero} will let the system pick up an + * ephemeral port in a {@code bind} operation. *

    * @param hostname the Host name * @param port The port number @@ -237,8 +237,8 @@ * The address will be flagged as unresolved. *

    * A valid port value is between 0 and 65535. - * A port number of zero will let the system pick up an - * ephemeral port in a bind operation. + * A port number of {@code zero} will let the system pick up an + * ephemeral port in a {@code bind} operation. *

    * @param host the Host name * @param port The port number @@ -246,7 +246,7 @@ * the range of valid port values, or if the hostname * parameter is null. * @see #isUnresolved() - * @return a InetSocketAddress representing the unresolved + * @return a {@code InetSocketAddress} representing the unresolved * socket address * @since 1.5 */ @@ -326,16 +326,16 @@ /** * - * Gets the InetAddress. + * Gets the {@code InetAddress}. * - * @return the InetAdress or null if it is unresolved. + * @return the InetAdress or {@code null} if it is unresolved. */ public final InetAddress getAddress() { return holder.getAddress(); } /** - * Gets the hostname. + * Gets the {@code hostname}. * Note: This method may trigger a name service reverse lookup if the * address was created with a literal IP address. * @@ -360,8 +360,8 @@ /** * Checks whether the address has been resolved or not. * - * @return true if the hostname couldn't be resolved into - * an InetAddress. + * @return {@code true} if the hostname couldn't be resolved into + * an {@code InetAddress}. */ public final boolean isUnresolved() { return holder.isUnresolved(); @@ -382,11 +382,11 @@ /** * Compares this object against the specified object. - * The result is true if and only if the argument is - * not null and it represents the same address as + * The result is {@code true} if and only if the argument is + * not {@code null} and it represents the same address as * this object. *

    - * Two instances of InetSocketAddress represent the same + * Two instances of {@code InetSocketAddress} represent the same * address if both the InetAddresses (or hostnames if it is unresolved) and port * numbers are equal. * If both addresses are unresolved, then the hostname and the port number @@ -396,8 +396,8 @@ * considered equal. * * @param obj the object to compare against. - * @return true if the objects are the same; - * false otherwise. + * @return {@code true} if the objects are the same; + * {@code false} otherwise. * @see java.net.InetAddress#equals(java.lang.Object) */ @Override diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/InterfaceAddress.java --- a/jdk/src/share/classes/java/net/InterfaceAddress.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/InterfaceAddress.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -47,23 +47,23 @@ } /** - * Returns an InetAddress for this address. + * Returns an {@code InetAddress} for this address. * - * @return the InetAddress for this address. + * @return the {@code InetAddress} for this address. */ public InetAddress getAddress() { return address; } /** - * Returns an InetAddress for the brodcast address + * Returns an {@code InetAddress} for the brodcast address * for this InterfaceAddress. *

    * Only IPv4 networks have broadcast address therefore, in the case - * of an IPv6 network, null will be returned. + * of an IPv6 network, {@code null} will be returned. * - * @return the InetAddress representing the broadcast - * address or null if there is no broadcast address. + * @return the {@code InetAddress} representing the broadcast + * address or {@code null} if there is no broadcast address. */ public InetAddress getBroadcast() { return broadcast; @@ -76,7 +76,7 @@ * or 24 (255.255.255.0).

    * Typical IPv6 values would be 128 (::1/128) or 10 (fe80::203:baff:fe27:1243/10) * - * @return a short representing the prefix length for the + * @return a {@code short} representing the prefix length for the * subnet of that address. */ public short getNetworkPrefixLength() { @@ -85,17 +85,17 @@ /** * Compares this object against the specified object. - * The result is true if and only if the argument is - * not null and it represents the same interface address as + * The result is {@code true} if and only if the argument is + * not {@code null} and it represents the same interface address as * this object. *

    - * Two instances of InterfaceAddress represent the same + * Two instances of {@code InterfaceAddress} represent the same * address if the InetAddress, the prefix length and the broadcast are * the same for both. * * @param obj the object to compare against. - * @return true if the objects are the same; - * false otherwise. + * @return {@code true} if the objects are the same; + * {@code false} otherwise. * @see java.net.InterfaceAddress#hashCode() */ public boolean equals(Object obj) { @@ -122,7 +122,7 @@ } /** - * Converts this Interface address to a String. The + * Converts this Interface address to a {@code String}. The * string returned is of the form: InetAddress / prefix length [ broadcast address ]. * * @return a string representation of this Interface address. diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/JarURLConnection.java --- a/jdk/src/share/classes/java/net/JarURLConnection.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/JarURLConnection.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -45,18 +45,14 @@ * *

    for example: * - *

    - * jar:http://www.foo.com/bar/baz.jar!/COM/foo/Quux.class
    - *
    + *

    {@code jar:http://www.foo.com/bar/baz.jar!/COM/foo/Quux.class} * *

    Jar URLs should be used to refer to a JAR file or entries in * a JAR file. The example above is a JAR URL which refers to a JAR * entry. If the entry name is omitted, the URL refers to the whole * JAR file: * - * - * jar:http://www.foo.com/bar/baz.jar!/ - * + * {@code jar:http://www.foo.com/bar/baz.jar!/} * *

    Users should cast the generic URLConnection to a * JarURLConnection when they know that the URL they created is a JAR @@ -76,19 +72,19 @@ *

    * *
    A Jar entry - *
    jar:http://www.foo.com/bar/baz.jar!/COM/foo/Quux.class + *
    {@code jar:http://www.foo.com/bar/baz.jar!/COM/foo/Quux.class} * *
    A Jar file - *
    jar:http://www.foo.com/bar/baz.jar!/ + *
    {@code jar:http://www.foo.com/bar/baz.jar!/} * *
    A Jar directory - *
    jar:http://www.foo.com/bar/baz.jar!/COM/foo/ + *
    {@code jar:http://www.foo.com/bar/baz.jar!/COM/foo/} * *
    * - *

    !/ is refered to as the separator. + *

    {@code !/} is refered to as the separator. * - *

    When constructing a JAR url via new URL(context, spec), + *

    When constructing a JAR url via {@code new URL(context, spec)}, * the following rules apply: * *

      @@ -294,7 +290,7 @@ * can only be called once * the connection has been completely verified by reading * from the input stream until the end of the stream has been - * reached. Otherwise, this method will return null + * reached. Otherwise, this method will return {@code null} * * @return the Certificate object for this connection if the URL * for it points to a JAR file entry, null otherwise. diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/MalformedURLException.java --- a/jdk/src/share/classes/java/net/MalformedURLException.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/MalformedURLException.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -39,13 +39,13 @@ private static final long serialVersionUID = -182787522200415866L; /** - * Constructs a MalformedURLException with no detail message. + * Constructs a {@code MalformedURLException} with no detail message. */ public MalformedURLException() { } /** - * Constructs a MalformedURLException with the + * Constructs a {@code MalformedURLException} with the * specified detail message. * * @param msg the detail message. diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/MulticastSocket.java --- a/jdk/src/share/classes/java/net/MulticastSocket.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/MulticastSocket.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -92,7 +92,7 @@ * Create a multicast socket. * *

      If there is a security manager, - * its checkListen method is first called + * its {@code checkListen} method is first called * with 0 as its argument to ensure the operation is allowed. * This could result in a SecurityException. *

      @@ -103,7 +103,7 @@ * @exception IOException if an I/O exception occurs * while creating the MulticastSocket * @exception SecurityException if a security manager exists and its - * checkListen method doesn't allow the operation. + * {@code checkListen} method doesn't allow the operation. * @see SecurityManager#checkListen * @see java.net.DatagramSocket#setReuseAddress(boolean) */ @@ -115,8 +115,8 @@ * Create a multicast socket and bind it to a specific port. * *

      If there is a security manager, - * its checkListen method is first called - * with the port argument + * its {@code checkListen} method is first called + * with the {@code port} argument * as its argument to ensure the operation is allowed. * This could result in a SecurityException. *

      @@ -128,7 +128,7 @@ * @exception IOException if an I/O exception occurs * while creating the MulticastSocket * @exception SecurityException if a security manager exists and its - * checkListen method doesn't allow the operation. + * {@code checkListen} method doesn't allow the operation. * @see SecurityManager#checkListen * @see java.net.DatagramSocket#setReuseAddress(boolean) */ @@ -139,10 +139,10 @@ /** * Create a MulticastSocket bound to the specified socket address. *

      - * Or, if the address is null, create an unbound socket. + * Or, if the address is {@code null}, create an unbound socket. *

      *

      If there is a security manager, - * its checkListen method is first called + * its {@code checkListen} method is first called * with the SocketAddress port as its argument to ensure the operation is allowed. * This could result in a SecurityException. *

      @@ -150,12 +150,12 @@ * {@link DatagramSocket#setReuseAddress(boolean)} method is * called to enable the SO_REUSEADDR socket option. * - * @param bindaddr Socket address to bind to, or null for + * @param bindaddr Socket address to bind to, or {@code null} for * an unbound socket. * @exception IOException if an I/O exception occurs * while creating the MulticastSocket * @exception SecurityException if a security manager exists and its - * checkListen method doesn't allow the operation. + * {@code checkListen} method doesn't allow the operation. * @see SecurityManager#checkListen * @see java.net.DatagramSocket#setReuseAddress(boolean) * @@ -197,7 +197,7 @@ /** * Set the default time-to-live for multicast packets sent out - * on this MulticastSocket in order to control the + * on this {@code MulticastSocket} in order to control the * scope of the multicasts. * *

      The ttl is an unsigned 8-bit quantity, and so must be @@ -279,11 +279,11 @@ /** * Joins a multicast group. Its behavior may be affected by - * setInterface or setNetworkInterface. + * {@code setInterface} or {@code setNetworkInterface}. * *

      If there is a security manager, this method first - * calls its checkMulticast method - * with the mcastaddr argument + * calls its {@code checkMulticast} method + * with the {@code mcastaddr} argument * as its argument. * * @param mcastaddr is the multicast address to join @@ -291,7 +291,7 @@ * @exception IOException if there is an error joining * or when the address is not a multicast address. * @exception SecurityException if a security manager exists and its - * checkMulticast method doesn't allow the join. + * {@code checkMulticast} method doesn't allow the join. * * @see SecurityManager#checkMulticast(InetAddress) */ @@ -325,18 +325,18 @@ /** * Leave a multicast group. Its behavior may be affected by - * setInterface or setNetworkInterface. + * {@code setInterface} or {@code setNetworkInterface}. * *

      If there is a security manager, this method first - * calls its checkMulticast method - * with the mcastaddr argument + * calls its {@code checkMulticast} method + * with the {@code mcastaddr} argument * as its argument. * * @param mcastaddr is the multicast address to leave * @exception IOException if there is an error leaving * or when the address is not a multicast address. * @exception SecurityException if a security manager exists and its - * checkMulticast method doesn't allow the operation. + * {@code checkMulticast} method doesn't allow the operation. * * @see SecurityManager#checkMulticast(InetAddress) */ @@ -362,8 +362,8 @@ * Joins the specified multicast group at the specified interface. * *

      If there is a security manager, this method first - * calls its checkMulticast method - * with the mcastaddr argument + * calls its {@code checkMulticast} method + * with the {@code mcastaddr} argument * as its argument. * * @param mcastaddr is the multicast address to join @@ -375,7 +375,7 @@ * @exception IOException if there is an error joining * or when the address is not a multicast address. * @exception SecurityException if a security manager exists and its - * checkMulticast method doesn't allow the join. + * {@code checkMulticast} method doesn't allow the join. * @throws IllegalArgumentException if mcastaddr is null or is a * SocketAddress subclass not supported by this socket * @@ -410,8 +410,8 @@ * Leave a multicast group on a specified local interface. * *

      If there is a security manager, this method first - * calls its checkMulticast method - * with the mcastaddr argument + * calls its {@code checkMulticast} method + * with the {@code mcastaddr} argument * as its argument. * * @param mcastaddr is the multicast address to leave @@ -422,7 +422,7 @@ * @exception IOException if there is an error leaving * or when the address is not a multicast address. * @exception SecurityException if a security manager exists and its - * checkMulticast method doesn't allow the operation. + * {@code checkMulticast} method doesn't allow the operation. * @throws IllegalArgumentException if mcastaddr is null or is a * SocketAddress subclass not supported by this socket * @@ -478,7 +478,7 @@ * Retrieve the address of the network interface used for * multicast packets. * - * @return An InetAddress representing + * @return An {@code InetAddress} representing * the address of the network interface used for * multicast packets. * @@ -562,7 +562,7 @@ * * @exception SocketException if there is an error in * the underlying protocol, such as a TCP error. - * @return the multicast NetworkInterface currently set + * @return the multicast {@code NetworkInterface} currently set * @see #setNetworkInterface(NetworkInterface) * @since 1.4 */ @@ -587,7 +587,7 @@ *

      Because this option is a hint, applications that want to * verify what loopback mode is set to should call * {@link #getLoopbackMode()} - * @param disable true to disable the LoopbackMode + * @param disable {@code true} to disable the LoopbackMode * @throws SocketException if an error occurs while setting the value * @since 1.4 * @see #getLoopbackMode @@ -615,18 +615,18 @@ * otherwise it is preferable to set a TTL once on the socket, and * use that default TTL for all packets. This method does not * alter the default TTL for the socket. Its behavior may be - * affected by setInterface. + * affected by {@code setInterface}. * *

      If there is a security manager, this method first performs some - * security checks. First, if p.getAddress().isMulticastAddress() + * security checks. First, if {@code p.getAddress().isMulticastAddress()} * is true, this method calls the - * security manager's checkMulticast method - * with p.getAddress() and ttl as its arguments. + * security manager's {@code checkMulticast} method + * with {@code p.getAddress()} and {@code ttl} as its arguments. * If the evaluation of that expression is false, * this method instead calls the security manager's - * checkConnect method with arguments - * p.getAddress().getHostAddress() and - * p.getPort(). Each call to a security manager method + * {@code checkConnect} method with arguments + * {@code p.getAddress().getHostAddress()} and + * {@code p.getPort()}. Each call to a security manager method * could result in a SecurityException if the operation is not allowed. * * @param p is the packet to be sent. The packet should contain @@ -639,7 +639,7 @@ * @exception IOException is raised if an error occurs i.e * error while setting ttl. * @exception SecurityException if a security manager exists and its - * checkMulticast or checkConnect + * {@code checkMulticast} or {@code checkConnect} * method doesn't allow the send. * * @deprecated Use the following code or its equivalent instead: diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/NetPermission.java --- a/jdk/src/share/classes/java/net/NetPermission.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/NetPermission.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -177,8 +177,8 @@ * * @param name the name of the NetPermission. * - * @throws NullPointerException if name is null. - * @throws IllegalArgumentException if name is empty. + * @throws NullPointerException if {@code name} is {@code null}. + * @throws IllegalArgumentException if {@code name} is empty. */ public NetPermission(String name) @@ -194,8 +194,8 @@ * @param name the name of the NetPermission. * @param actions should be null. * - * @throws NullPointerException if name is null. - * @throws IllegalArgumentException if name is empty. + * @throws NullPointerException if {@code name} is {@code null}. + * @throws IllegalArgumentException if {@code name} is empty. */ public NetPermission(String name, String actions) diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/NetworkInterface.java --- a/jdk/src/share/classes/java/net/NetworkInterface.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/NetworkInterface.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -98,9 +98,9 @@ * Convenience method to return an Enumeration with all or a * subset of the InetAddresses bound to this network interface. *

      - * If there is a security manager, its checkConnect + * If there is a security manager, its {@code checkConnect} * method is called for each InetAddress. Only InetAddresses where - * the checkConnect doesn't throw a SecurityException + * the {@code checkConnect} doesn't throw a SecurityException * will be returned in the Enumeration. However, if the caller has the * {@link NetPermission}("getNetworkInformation") permission, then all * InetAddresses are returned. @@ -154,15 +154,15 @@ } /** - * Get a List of all or a subset of the InterfaceAddresses + * Get a List of all or a subset of the {@code InterfaceAddresses} * of this network interface. *

      - * If there is a security manager, its checkConnect + * If there is a security manager, its {@code checkConnect} * method is called with the InetAddress for each InterfaceAddress. - * Only InterfaceAddresses where the checkConnect doesn't throw + * Only InterfaceAddresses where the {@code checkConnect} doesn't throw * a SecurityException will be returned in the List. * - * @return a List object with all or a subset of the + * @return a {@code List} object with all or a subset of the * InterfaceAddresss of this network interface * @since 1.6 */ @@ -216,10 +216,10 @@ /** * Returns the parent NetworkInterface of this interface if this is - * a subinterface, or null if it is a physical + * a subinterface, or {@code null} if it is a physical * (non virtual) interface or has no parent. * - * @return The NetworkInterface this interface is attached to. + * @return The {@code NetworkInterface} this interface is attached to. * @since 1.6 */ public NetworkInterface getParent() { @@ -260,15 +260,15 @@ * @param name * The name of the network interface. * - * @return A NetworkInterface with the specified name, - * or null if there is no network interface + * @return A {@code NetworkInterface} with the specified name, + * or {@code null} if there is no network interface * with the specified name. * * @throws SocketException * If an I/O error occurs. * * @throws NullPointerException - * If the specified name is null. + * If the specified name is {@code null}. */ public static NetworkInterface getByName(String name) throws SocketException { if (name == null) @@ -303,17 +303,17 @@ * returned. * * @param addr - * The InetAddress to search with. + * The {@code InetAddress} to search with. * - * @return A NetworkInterface - * or null if there is no network interface + * @return A {@code NetworkInterface} + * or {@code null} if there is no network interface * with the specified IP address. * * @throws SocketException * If an I/O error occurs. * * @throws NullPointerException - * If the specified address is null. + * If the specified address is {@code null}. */ public static NetworkInterface getByInetAddress(InetAddress addr) throws SocketException { if (addr == null) { @@ -378,7 +378,7 @@ /** * Returns whether a network interface is up and running. * - * @return true if the interface is up and running. + * @return {@code true} if the interface is up and running. * @exception SocketException if an I/O error occurs. * @since 1.6 */ @@ -390,7 +390,7 @@ /** * Returns whether a network interface is a loopback interface. * - * @return true if the interface is a loopback interface. + * @return {@code true} if the interface is a loopback interface. * @exception SocketException if an I/O error occurs. * @since 1.6 */ @@ -404,7 +404,7 @@ * A typical point to point interface would be a PPP connection through * a modem. * - * @return true if the interface is a point to point + * @return {@code true} if the interface is a point to point * interface. * @exception SocketException if an I/O error occurs. * @since 1.6 @@ -417,7 +417,7 @@ /** * Returns whether a network interface supports multicasting or not. * - * @return true if the interface supports Multicasting. + * @return {@code true} if the interface supports Multicasting. * @exception SocketException if an I/O error occurs. * @since 1.6 */ @@ -432,7 +432,7 @@ * If a security manager is set, then the caller must have * the permission {@link NetPermission}("getNetworkInformation"). * - * @return a byte array containing the address, or null if + * @return a byte array containing the address, or {@code null} if * the address doesn't exist, is not accessible or a security * manager is set and the caller does not have the permission * NetPermission("getNetworkInformation") @@ -481,7 +481,7 @@ * can be several virtual interfaces attached to a single physical * interface. * - * @return true if this interface is a virtual interface. + * @return {@code true} if this interface is a virtual interface. * @since 1.6 */ public boolean isVirtual() { @@ -497,16 +497,16 @@ /** * Compares this object against the specified object. - * The result is true if and only if the argument is - * not null and it represents the same NetworkInterface + * The result is {@code true} if and only if the argument is + * not {@code null} and it represents the same NetworkInterface * as this object. *

      - * Two instances of NetworkInterface represent the same + * Two instances of {@code NetworkInterface} represent the same * NetworkInterface if both name and addrs are the same for both. * * @param obj the object to compare against. - * @return true if the objects are the same; - * false otherwise. + * @return {@code true} if the objects are the same; + * {@code false} otherwise. * @see java.net.InetAddress#getAddress() */ public boolean equals(Object obj) { diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/PasswordAuthentication.java --- a/jdk/src/share/classes/java/net/PasswordAuthentication.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/PasswordAuthentication.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2001, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -43,11 +43,11 @@ private char[] password; /** - * Creates a new PasswordAuthentication object from the given + * Creates a new {@code PasswordAuthentication} object from the given * user name and password. * *

      Note that the given user password is cloned before it is stored in - * the new PasswordAuthentication object. + * the new {@code PasswordAuthentication} object. * * @param userName the user name * @param password the user's password diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/PortUnreachableException.java --- a/jdk/src/share/classes/java/net/PortUnreachableException.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/PortUnreachableException.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -36,7 +36,7 @@ private static final long serialVersionUID = 8462541992376507323L; /** - * Constructs a new PortUnreachableException with a + * Constructs a new {@code PortUnreachableException} with a * detail message. * @param msg the detail message */ @@ -45,7 +45,7 @@ } /** - * Construct a new PortUnreachableException with no + * Construct a new {@code PortUnreachableException} with no * detailed message. */ public PortUnreachableException() {} diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/ProtocolException.java --- a/jdk/src/share/classes/java/net/ProtocolException.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/ProtocolException.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -39,7 +39,7 @@ private static final long serialVersionUID = -6098449442062388080L; /** - * Constructs a new ProtocolException with the + * Constructs a new {@code ProtocolException} with the * specified detail message. * * @param host the detail message. @@ -49,7 +49,7 @@ } /** - * Constructs a new ProtocolException with no detail message. + * Constructs a new {@code ProtocolException} with no detail message. */ public ProtocolException() { } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/Proxy.java --- a/jdk/src/share/classes/java/net/Proxy.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/Proxy.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,7 +28,7 @@ /** * This class represents a proxy setting, typically a type (http, socks) and * a socket address. - * A Proxy is an immutable object. + * A {@code Proxy} is an immutable object. * * @see java.net.ProxySelector * @author Yingxian Wang @@ -61,17 +61,17 @@ private SocketAddress sa; /** - * A proxy setting that represents a DIRECT connection, + * A proxy setting that represents a {@code DIRECT} connection, * basically telling the protocol handler not to use any proxying. * Used, for instance, to create sockets bypassing any other global * proxy settings (like SOCKS): *

      - * Socket s = new Socket(Proxy.NO_PROXY);
      + * {@code Socket s = new Socket(Proxy.NO_PROXY);}
      *

      */ public final static Proxy NO_PROXY = new Proxy(); - // Creates the proxy that represents a DIRECT connection. + // Creates the proxy that represents a {@code DIRECT} connection. private Proxy() { type = Type.DIRECT; sa = null; @@ -82,11 +82,11 @@ * Certain combinations are illegal. For instance, for types Http, and * Socks, a SocketAddress must be provided. *

      - * Use the Proxy.NO_PROXY constant + * Use the {@code Proxy.NO_PROXY} constant * for representing a direct connection. * - * @param type the Type of the proxy - * @param sa the SocketAddress for that proxy + * @param type the {@code Type} of the proxy + * @param sa the {@code SocketAddress} for that proxy * @throws IllegalArgumentException when the type and the address are * incompatible */ @@ -108,9 +108,9 @@ /** * Returns the socket address of the proxy, or - * null if its a direct connection. + * {@code null} if its a direct connection. * - * @return a SocketAddress representing the socket end + * @return a {@code SocketAddress} representing the socket end * point of the proxy */ public SocketAddress address() { @@ -121,7 +121,7 @@ * Constructs a string representation of this Proxy. * This String is constructed by calling toString() on its type * and concatenating " @ " and the toString() result from its address - * if its type is not DIRECT. + * if its type is not {@code DIRECT}. * * @return a string representation of this object. */ @@ -133,16 +133,16 @@ /** * Compares this object against the specified object. - * The result is true if and only if the argument is - * not null and it represents the same proxy as + * The result is {@code true} if and only if the argument is + * not {@code null} and it represents the same proxy as * this object. *

      - * Two instances of Proxy represent the same + * Two instances of {@code Proxy} represent the same * address if both the SocketAddresses and type are equal. * * @param obj the object to compare against. - * @return true if the objects are the same; - * false otherwise. + * @return {@code true} if the objects are the same; + * {@code false} otherwise. * @see java.net.InetSocketAddress#equals(java.lang.Object) */ public final boolean equals(Object obj) { diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/ProxySelector.java --- a/jdk/src/share/classes/java/net/ProxySelector.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/ProxySelector.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -83,9 +83,9 @@ * * @throws SecurityException * If a security manager has been installed and it denies - * {@link NetPermission}("getProxySelector") + * {@link NetPermission}{@code ("getProxySelector")} * @see #setDefault(ProxySelector) - * @return the system-wide ProxySelector + * @return the system-wide {@code ProxySelector} * @since 1.5 */ public static ProxySelector getDefault() { @@ -102,11 +102,11 @@ * Note: non-standard protocol handlers may ignore this setting. * * @param ps The HTTP proxy selector, or - * null to unset the proxy selector. + * {@code null} to unset the proxy selector. * * @throws SecurityException * If a security manager has been installed and it denies - * {@link NetPermission}("setProxySelector") + * {@link NetPermission}{@code ("setProxySelector")} * * @see #getDefault() * @since 1.5 @@ -127,7 +127,7 @@ *

        *
      • http URI for http connections
      • *
      • https URI for https connections - *
      • socket://host:port
        + *
      • {@code socket://host:port}
        * for tcp client sockets connections
      • *
      * diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/ResponseCache.java --- a/jdk/src/share/classes/java/net/ResponseCache.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/ResponseCache.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -74,10 +74,10 @@ * * @throws SecurityException * If a security manager has been installed and it denies - * {@link NetPermission}("getResponseCache") + * {@link NetPermission}{@code ("getResponseCache")} * * @see #setDefault(ResponseCache) - * @return the system-wide ResponseCache + * @return the system-wide {@code ResponseCache} * @since 1.5 */ public synchronized static ResponseCache getDefault() { @@ -94,11 +94,11 @@ * Note: non-standard procotol handlers may ignore this setting. * * @param responseCache The response cache, or - * null to unset the cache. + * {@code null} to unset the cache. * * @throws SecurityException * If a security manager has been installed and it denies - * {@link NetPermission}("setResponseCache") + * {@link NetPermission}{@code ("setResponseCache")} * * @see #getDefault() * @since 1.5 @@ -118,14 +118,14 @@ * to get the network resource. If a cached response is returned, * that resource is used instead. * - * @param uri a URI used to reference the requested + * @param uri a {@code URI} used to reference the requested * network resource - * @param rqstMethod a String representing the request + * @param rqstMethod a {@code String} representing the request * method * @param rqstHeaders - a Map from request header * field names to lists of field values representing * the current request headers - * @return a CacheResponse instance if available + * @return a {@code CacheResponse} instance if available * from cache, or null otherwise * @throws IOException if an I/O error occurs * @throws IllegalArgumentException if any one of the arguments is null @@ -148,11 +148,11 @@ * use to write the resource into the cache. If the resource is * not to be cached, then put must return null. * - * @param uri a URI used to reference the requested + * @param uri a {@code URI} used to reference the requested * network resource * @param conn - a URLConnection instance that is used to fetch * the response to be cached - * @return a CacheRequest for recording the + * @return a {@code CacheRequest} for recording the * response to be cached. Null return indicates that * the caller does not intend to cache the response. * @throws IOException if an I/O error occurs diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/ServerSocket.java --- a/jdk/src/share/classes/java/net/ServerSocket.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/ServerSocket.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -37,7 +37,7 @@ * based on that request, and then possibly returns a result to the requester. *

      * The actual work of the server socket is performed by an instance - * of the SocketImpl class. An application can + * of the {@code SocketImpl} class. An application can * change the socket factory that creates the socket * implementation to configure itself to create sockets * appropriate to the local firewall. @@ -89,31 +89,31 @@ /** * Creates a server socket, bound to the specified port. A port number - * of 0 means that the port number is automatically + * of {@code 0} means that the port number is automatically * allocated, typically from an ephemeral port range. This port * number can then be retrieved by calling {@link #getLocalPort getLocalPort}. *

      * The maximum queue length for incoming connection indications (a - * request to connect) is set to 50. If a connection + * request to connect) is set to {@code 50}. If a connection * indication arrives when the queue is full, the connection is refused. *

      * If the application has specified a server socket factory, that - * factory's createSocketImpl method is called to create + * factory's {@code createSocketImpl} method is called to create * the actual socket implementation. Otherwise a "plain" socket is created. *

      * If there is a security manager, - * its checkListen method is called - * with the port argument + * its {@code checkListen} method is called + * with the {@code port} argument * as its argument to ensure the operation is allowed. * This could result in a SecurityException. * * - * @param port the port number, or 0 to use a port + * @param port the port number, or {@code 0} to use a port * number that is automatically allocated. * * @exception IOException if an I/O error occurs when opening the socket. * @exception SecurityException - * if a security manager exists and its checkListen + * if a security manager exists and its {@code checkListen} * method doesn't allow the operation. * @exception IllegalArgumentException if the port parameter is outside * the specified range of valid port values, which is between @@ -131,42 +131,42 @@ /** * Creates a server socket and binds it to the specified local port * number, with the specified backlog. - * A port number of 0 means that the port number is + * A port number of {@code 0} means that the port number is * automatically allocated, typically from an ephemeral port range. * This port number can then be retrieved by calling * {@link #getLocalPort getLocalPort}. *

      * The maximum queue length for incoming connection indications (a - * request to connect) is set to the backlog parameter. If + * request to connect) is set to the {@code backlog} parameter. If * a connection indication arrives when the queue is full, the * connection is refused. *

      * If the application has specified a server socket factory, that - * factory's createSocketImpl method is called to create + * factory's {@code createSocketImpl} method is called to create * the actual socket implementation. Otherwise a "plain" socket is created. *

      * If there is a security manager, - * its checkListen method is called - * with the port argument + * its {@code checkListen} method is called + * with the {@code port} argument * as its argument to ensure the operation is allowed. * This could result in a SecurityException. * - * The backlog argument is the requested maximum number of + * The {@code backlog} argument is the requested maximum number of * pending connections on the socket. Its exact semantics are implementation * specific. In particular, an implementation may impose a maximum length * or may choose to ignore the parameter altogther. The value provided - * should be greater than 0. If it is less than or equal to - * 0, then an implementation specific default will be used. + * should be greater than {@code 0}. If it is less than or equal to + * {@code 0}, then an implementation specific default will be used. *

      * - * @param port the port number, or 0 to use a port + * @param port the port number, or {@code 0} to use a port * number that is automatically allocated. * @param backlog requested maximum length of the queue of incoming * connections. * * @exception IOException if an I/O error occurs when opening the socket. * @exception SecurityException - * if a security manager exists and its checkListen + * if a security manager exists and its {@code checkListen} * method doesn't allow the operation. * @exception IllegalArgumentException if the port parameter is outside * the specified range of valid port values, which is between @@ -189,32 +189,32 @@ * If bindAddr is null, it will default accepting * connections on any/all local addresses. * The port must be between 0 and 65535, inclusive. - * A port number of 0 means that the port number is + * A port number of {@code 0} means that the port number is * automatically allocated, typically from an ephemeral port range. * This port number can then be retrieved by calling * {@link #getLocalPort getLocalPort}. * *

      If there is a security manager, this method - * calls its checkListen method - * with the port argument + * calls its {@code checkListen} method + * with the {@code port} argument * as its argument to ensure the operation is allowed. * This could result in a SecurityException. * - * The backlog argument is the requested maximum number of + * The {@code backlog} argument is the requested maximum number of * pending connections on the socket. Its exact semantics are implementation * specific. In particular, an implementation may impose a maximum length * or may choose to ignore the parameter altogther. The value provided - * should be greater than 0. If it is less than or equal to - * 0, then an implementation specific default will be used. + * should be greater than {@code 0}. If it is less than or equal to + * {@code 0}, then an implementation specific default will be used. *

      - * @param port the port number, or 0 to use a port + * @param port the port number, or {@code 0} to use a port * number that is automatically allocated. * @param backlog requested maximum length of the queue of incoming * connections. * @param bindAddr the local InetAddress the server will bind to * * @throws SecurityException if a security manager exists and - * its checkListen method doesn't allow the operation. + * its {@code checkListen} method doesn't allow the operation. * * @throws IOException if an I/O error occurs when opening the socket. * @exception IllegalArgumentException if the port parameter is outside @@ -245,10 +245,10 @@ } /** - * Get the SocketImpl attached to this socket, creating + * Get the {@code SocketImpl} attached to this socket, creating * it if necessary. * - * @return the SocketImpl attached to that ServerSocket. + * @return the {@code SocketImpl} attached to that ServerSocket. * @throws SocketException if creation fails. * @since 1.4 */ @@ -310,17 +310,17 @@ /** * - * Binds the ServerSocket to a specific address + * Binds the {@code ServerSocket} to a specific address * (IP address and port number). *

      - * If the address is null, then the system will pick up + * If the address is {@code null}, then the system will pick up * an ephemeral port and a valid local address to bind the socket. *

      * @param endpoint The IP address and port number to bind to. * @throws IOException if the bind operation fails, or if the socket * is already bound. - * @throws SecurityException if a SecurityManager is present and - * its checkListen method doesn't allow the operation. + * @throws SecurityException if a {@code SecurityManager} is present and + * its {@code checkListen} method doesn't allow the operation. * @throws IllegalArgumentException if endpoint is a * SocketAddress subclass not supported by this socket * @since 1.4 @@ -331,25 +331,25 @@ /** * - * Binds the ServerSocket to a specific address + * Binds the {@code ServerSocket} to a specific address * (IP address and port number). *

      - * If the address is null, then the system will pick up + * If the address is {@code null}, then the system will pick up * an ephemeral port and a valid local address to bind the socket. *

      - * The backlog argument is the requested maximum number of + * The {@code backlog} argument is the requested maximum number of * pending connections on the socket. Its exact semantics are implementation * specific. In particular, an implementation may impose a maximum length * or may choose to ignore the parameter altogther. The value provided - * should be greater than 0. If it is less than or equal to - * 0, then an implementation specific default will be used. + * should be greater than {@code 0}. If it is less than or equal to + * {@code 0}, then an implementation specific default will be used. * @param endpoint The IP address and port number to bind to. * @param backlog requested maximum length of the queue of * incoming connections. * @throws IOException if the bind operation fails, or if the socket * is already bound. - * @throws SecurityException if a SecurityManager is present and - * its checkListen method doesn't allow the operation. + * @throws SecurityException if a {@code SecurityManager} is present and + * its {@code checkListen} method doesn't allow the operation. * @throws IllegalArgumentException if endpoint is a * SocketAddress subclass not supported by this socket * @since 1.4 @@ -480,18 +480,18 @@ * Listens for a connection to be made to this socket and accepts * it. The method blocks until a connection is made. * - *

      A new Socket s is created and, if there + *

      A new Socket {@code s} is created and, if there * is a security manager, - * the security manager's checkAccept method is called - * with s.getInetAddress().getHostAddress() and - * s.getPort() + * the security manager's {@code checkAccept} method is called + * with {@code s.getInetAddress().getHostAddress()} and + * {@code s.getPort()} * as its arguments to ensure the operation is allowed. * This could result in a SecurityException. * * @exception IOException if an I/O error occurs when waiting for a * connection. * @exception SecurityException if a security manager exists and its - * checkAccept method doesn't allow the operation. + * {@code checkAccept} method doesn't allow the operation. * @exception SocketTimeoutException if a timeout was previously set with setSoTimeout and * the timeout has been reached. * @exception java.nio.channels.IllegalBlockingModeException @@ -597,7 +597,7 @@ * method. * * @return the server-socket channel associated with this socket, - * or null if this socket was not created + * or {@code null} if this socket was not created * for a channel * * @since 1.4 @@ -678,18 +678,18 @@ *

      * When a TCP connection is closed the connection may remain * in a timeout state for a period of time after the connection - * is closed (typically known as the TIME_WAIT state - * or 2MSL wait state). + * is closed (typically known as the {@code TIME_WAIT} state + * or {@code 2MSL} wait state). * For applications using a well known socket address or port * it may not be possible to bind a socket to the required - * SocketAddress if there is a connection in the + * {@code SocketAddress} if there is a connection in the * timeout state involving the socket address or port. *

      * Enabling {@link SocketOptions#SO_REUSEADDR SO_REUSEADDR} prior to * binding the socket using {@link #bind(SocketAddress)} allows the socket * to be bound even though a previous connection is in a timeout state. *

      - * When a ServerSocket is created the initial setting + * When a {@code ServerSocket} is created the initial setting * of {@link SocketOptions#SO_REUSEADDR SO_REUSEADDR} is not defined. * Applications can use {@link #getReuseAddress()} to determine the initial * setting of {@link SocketOptions#SO_REUSEADDR SO_REUSEADDR}. @@ -717,7 +717,7 @@ /** * Tests if {@link SocketOptions#SO_REUSEADDR SO_REUSEADDR} is enabled. * - * @return a boolean indicating whether or not + * @return a {@code boolean} indicating whether or not * {@link SocketOptions#SO_REUSEADDR SO_REUSEADDR} is enabled. * @exception SocketException if there is an error * in the underlying protocol, such as a TCP error. @@ -732,7 +732,7 @@ /** * Returns the implementation address and implementation port of - * this socket as a String. + * this socket as a {@code String}. *

      * If there is a security manager set, its {@code checkConnect} method is * called with the local address and {@code -1} as its arguments to see @@ -773,14 +773,14 @@ * application. The factory can be specified only once. *

      * When an application creates a new server socket, the socket - * implementation factory's createSocketImpl method is + * implementation factory's {@code createSocketImpl} method is * called to create the actual socket implementation. *

      - * Passing null to the method is a no-op unless the factory + * Passing {@code null} to the method is a no-op unless the factory * was already set. *

      * If there is a security manager, this method first calls - * the security manager's checkSetFactory method + * the security manager's {@code checkSetFactory} method * to ensure the operation is allowed. * This could result in a SecurityException. * @@ -789,7 +789,7 @@ * socket factory. * @exception SocketException if the factory has already been defined. * @exception SecurityException if a security manager exists and its - * checkSetFactory method doesn't allow the operation. + * {@code checkSetFactory} method doesn't allow the operation. * @see java.net.SocketImplFactory#createSocketImpl() * @see SecurityManager#checkSetFactory */ @@ -807,7 +807,7 @@ /** * Sets a default proposed value for the * {@link SocketOptions#SO_RCVBUF SO_RCVBUF} option for sockets - * accepted from this ServerSocket. The value actually set + * accepted from this {@code ServerSocket}. The value actually set * in the accepted socket must be determined by calling * {@link Socket#getReceiveBufferSize()} after the socket * is returned by {@link #accept()}. @@ -851,13 +851,13 @@ /** * Gets the value of the {@link SocketOptions#SO_RCVBUF SO_RCVBUF} option - * for this ServerSocket, that is the proposed buffer size that - * will be used for Sockets accepted from this ServerSocket. + * for this {@code ServerSocket}, that is the proposed buffer size that + * will be used for Sockets accepted from this {@code ServerSocket}. * *

      Note, the value actually set in the accepted socket is determined by * calling {@link Socket#getReceiveBufferSize()}. * @return the value of the {@link SocketOptions#SO_RCVBUF SO_RCVBUF} - * option for this Socket. + * option for this {@code Socket}. * @exception SocketException if there is an error * in the underlying protocol, such as a TCP error. * @see #setReceiveBufferSize(int) @@ -891,24 +891,24 @@ * compared, with larger values indicating stronger preferences. If the * application prefers short connection time over both low latency and high * bandwidth, for example, then it could invoke this method with the values - * (1, 0, 0). If the application prefers high bandwidth above low + * {@code (1, 0, 0)}. If the application prefers high bandwidth above low * latency, and low latency above short connection time, then it could - * invoke this method with the values (0, 1, 2). + * invoke this method with the values {@code (0, 1, 2)}. * *

      Invoking this method after this socket has been bound * will have no effect. This implies that in order to use this capability * requires the socket to be created with the no-argument constructor. * * @param connectionTime - * An int expressing the relative importance of a short + * An {@code int} expressing the relative importance of a short * connection time * * @param latency - * An int expressing the relative importance of low + * An {@code int} expressing the relative importance of low * latency * * @param bandwidth - * An int expressing the relative importance of high + * An {@code int} expressing the relative importance of high * bandwidth * * @since 1.5 diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/Socket.java --- a/jdk/src/share/classes/java/net/Socket.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/Socket.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -39,7 +39,7 @@ * between two machines. *

      * The actual work of the socket is performed by an instance of the - * SocketImpl class. An application, by changing + * {@code SocketImpl} class. An application, by changing * the socket factory that creates the socket implementation, * can configure itself to create sockets appropriate to the local * firewall. @@ -88,14 +88,14 @@ * Creates an unconnected socket, specifying the type of proxy, if any, * that should be used regardless of any other settings. *

      - * If there is a security manager, its checkConnect method + * If there is a security manager, its {@code checkConnect} method * is called with the proxy host address and port number * as its arguments. This could result in a SecurityException. *

      * Examples: - *

      • Socket s = new Socket(Proxy.NO_PROXY); will create + *
        • {@code Socket s = new Socket(Proxy.NO_PROXY);} will create * a plain socket ignoring any other proxy configuration.
        • - *
        • Socket s = new Socket(new Proxy(Proxy.Type.SOCKS, new InetSocketAddress("socks.mydom.com", 1080))); + *
        • {@code Socket s = new Socket(new Proxy(Proxy.Type.SOCKS, new InetSocketAddress("socks.mydom.com", 1080)));} * will create a socket connecting through the specified SOCKS proxy * server.
        • *
        @@ -103,7 +103,7 @@ * @param proxy a {@link java.net.Proxy Proxy} object specifying what kind * of proxying should be used. * @throws IllegalArgumentException if the proxy is of an invalid type - * or null. + * or {@code null}. * @throws SecurityException if a security manager is present and * permission to connect to the proxy is * denied. @@ -173,21 +173,22 @@ * Creates a stream socket and connects it to the specified port * number on the named host. *

        - * If the specified host is null it is the equivalent of - * specifying the address as {@link java.net.InetAddress#getByName InetAddress.getByName}(null). + * If the specified host is {@code null} it is the equivalent of + * specifying the address as + * {@link java.net.InetAddress#getByName InetAddress.getByName}{@code (null)}. * In other words, it is equivalent to specifying an address of the * loopback interface.

        *

        * If the application has specified a server socket factory, that - * factory's createSocketImpl method is called to create + * factory's {@code createSocketImpl} method is called to create * the actual socket implementation. Otherwise a "plain" socket is created. *

        * If there is a security manager, its - * checkConnect method is called - * with the host address and port + * {@code checkConnect} method is called + * with the host address and {@code port} * as its arguments. This could result in a SecurityException. * - * @param host the host name, or null for the loopback address. + * @param host the host name, or {@code null} for the loopback address. * @param port the port number. * * @exception UnknownHostException if the IP address of @@ -195,7 +196,7 @@ * * @exception IOException if an I/O error occurs when creating the socket. * @exception SecurityException if a security manager exists and its - * checkConnect method doesn't allow the operation. + * {@code checkConnect} method doesn't allow the operation. * @exception IllegalArgumentException if the port parameter is outside * the specified range of valid port values, which is between * 0 and 65535, inclusive. @@ -217,23 +218,23 @@ * number at the specified IP address. *

        * If the application has specified a socket factory, that factory's - * createSocketImpl method is called to create the + * {@code createSocketImpl} method is called to create the * actual socket implementation. Otherwise a "plain" socket is created. *

        * If there is a security manager, its - * checkConnect method is called - * with the host address and port + * {@code checkConnect} method is called + * with the host address and {@code port} * as its arguments. This could result in a SecurityException. * * @param address the IP address. * @param port the port number. * @exception IOException if an I/O error occurs when creating the socket. * @exception SecurityException if a security manager exists and its - * checkConnect method doesn't allow the operation. + * {@code checkConnect} method doesn't allow the operation. * @exception IllegalArgumentException if the port parameter is outside * the specified range of valid port values, which is between * 0 and 65535, inclusive. - * @exception NullPointerException if address is null. + * @exception NullPointerException if {@code address} is null. * @see java.net.Socket#setSocketImplFactory(java.net.SocketImplFactory) * @see java.net.SocketImpl * @see java.net.SocketImplFactory#createSocketImpl() @@ -249,28 +250,29 @@ * the specified remote port. The Socket will also bind() to the local * address and port supplied. *

        - * If the specified host is null it is the equivalent of - * specifying the address as {@link java.net.InetAddress#getByName InetAddress.getByName}(null). + * If the specified host is {@code null} it is the equivalent of + * specifying the address as + * {@link java.net.InetAddress#getByName InetAddress.getByName}{@code (null)}. * In other words, it is equivalent to specifying an address of the * loopback interface.

        *

        - * A local port number of zero will let the system pick up a - * free port in the bind operation.

        + * A local port number of {@code zero} will let the system pick up a + * free port in the {@code bind} operation.

        *

        * If there is a security manager, its - * checkConnect method is called - * with the host address and port + * {@code checkConnect} method is called + * with the host address and {@code port} * as its arguments. This could result in a SecurityException. * - * @param host the name of the remote host, or null for the loopback address. + * @param host the name of the remote host, or {@code null} for the loopback address. * @param port the remote port * @param localAddr the local address the socket is bound to, or - * null for the anyLocal address. + * {@code null} for the {@code anyLocal} address. * @param localPort the local port the socket is bound to, or - * zero for a system selected free port. + * {@code zero} for a system selected free port. * @exception IOException if an I/O error occurs when creating the socket. * @exception SecurityException if a security manager exists and its - * checkConnect method doesn't allow the operation. + * {@code checkConnect} method doesn't allow the operation. * @exception IllegalArgumentException if the port parameter or localPort * parameter is outside the specified range of valid port values, * which is between 0 and 65535, inclusive. @@ -289,30 +291,31 @@ * the specified remote port. The Socket will also bind() to the local * address and port supplied. *

        - * If the specified local address is null it is the equivalent of - * specifying the address as the AnyLocal address (see {@link java.net.InetAddress#isAnyLocalAddress InetAddress.isAnyLocalAddress}()). + * If the specified local address is {@code null} it is the equivalent of + * specifying the address as the AnyLocal address + * (see {@link java.net.InetAddress#isAnyLocalAddress InetAddress.isAnyLocalAddress}{@code ()}). *

        - * A local port number of zero will let the system pick up a - * free port in the bind operation.

        + * A local port number of {@code zero} will let the system pick up a + * free port in the {@code bind} operation.

        *

        * If there is a security manager, its - * checkConnect method is called - * with the host address and port + * {@code checkConnect} method is called + * with the host address and {@code port} * as its arguments. This could result in a SecurityException. * * @param address the remote address * @param port the remote port * @param localAddr the local address the socket is bound to, or - * null for the anyLocal address. + * {@code null} for the {@code anyLocal} address. * @param localPort the local port the socket is bound to or - * zero for a system selected free port. + * {@code zero} for a system selected free port. * @exception IOException if an I/O error occurs when creating the socket. * @exception SecurityException if a security manager exists and its - * checkConnect method doesn't allow the operation. + * {@code checkConnect} method doesn't allow the operation. * @exception IllegalArgumentException if the port parameter or localPort * parameter is outside the specified range of valid port values, * which is between 0 and 65535, inclusive. - * @exception NullPointerException if address is null. + * @exception NullPointerException if {@code address} is null. * @see SecurityManager#checkConnect * @since JDK1.1 */ @@ -326,33 +329,34 @@ * Creates a stream socket and connects it to the specified port * number on the named host. *

        - * If the specified host is null it is the equivalent of - * specifying the address as {@link java.net.InetAddress#getByName InetAddress.getByName}(null). + * If the specified host is {@code null} it is the equivalent of + * specifying the address as + * {@link java.net.InetAddress#getByName InetAddress.getByName}{@code (null)}. * In other words, it is equivalent to specifying an address of the * loopback interface.

        *

        - * If the stream argument is true, this creates a - * stream socket. If the stream argument is false, it + * If the stream argument is {@code true}, this creates a + * stream socket. If the stream argument is {@code false}, it * creates a datagram socket. *

        * If the application has specified a server socket factory, that - * factory's createSocketImpl method is called to create + * factory's {@code createSocketImpl} method is called to create * the actual socket implementation. Otherwise a "plain" socket is created. *

        * If there is a security manager, its - * checkConnect method is called - * with the host address and port + * {@code checkConnect} method is called + * with the host address and {@code port} * as its arguments. This could result in a SecurityException. *

        * If a UDP socket is used, TCP/IP related socket options will not apply. * - * @param host the host name, or null for the loopback address. + * @param host the host name, or {@code null} for the loopback address. * @param port the port number. - * @param stream a boolean indicating whether this is + * @param stream a {@code boolean} indicating whether this is * a stream socket or a datagram socket. * @exception IOException if an I/O error occurs when creating the socket. * @exception SecurityException if a security manager exists and its - * checkConnect method doesn't allow the operation. + * {@code checkConnect} method doesn't allow the operation. * @exception IllegalArgumentException if the port parameter is outside * the specified range of valid port values, which is between * 0 and 65535, inclusive. @@ -373,32 +377,32 @@ * Creates a socket and connects it to the specified port number at * the specified IP address. *

        - * If the stream argument is true, this creates a - * stream socket. If the stream argument is false, it + * If the stream argument is {@code true}, this creates a + * stream socket. If the stream argument is {@code false}, it * creates a datagram socket. *

        * If the application has specified a server socket factory, that - * factory's createSocketImpl method is called to create + * factory's {@code createSocketImpl} method is called to create * the actual socket implementation. Otherwise a "plain" socket is created. * *

        If there is a security manager, its - * checkConnect method is called - * with host.getHostAddress() and port + * {@code checkConnect} method is called + * with {@code host.getHostAddress()} and {@code port} * as its arguments. This could result in a SecurityException. *

        * If UDP socket is used, TCP/IP related socket options will not apply. * * @param host the IP address. * @param port the port number. - * @param stream if true, create a stream socket; + * @param stream if {@code true}, create a stream socket; * otherwise, create a datagram socket. * @exception IOException if an I/O error occurs when creating the socket. * @exception SecurityException if a security manager exists and its - * checkConnect method doesn't allow the operation. + * {@code checkConnect} method doesn't allow the operation. * @exception IllegalArgumentException if the port parameter is outside * the specified range of valid port values, which is between * 0 and 65535, inclusive. - * @exception NullPointerException if host is null. + * @exception NullPointerException if {@code host} is null. * @see java.net.Socket#setSocketImplFactory(java.net.SocketImplFactory) * @see java.net.SocketImpl * @see java.net.SocketImplFactory#createSocketImpl() @@ -437,8 +441,8 @@ /** * Creates the socket implementation. * - * @param stream a boolean value : true for a TCP socket, - * false for UDP. + * @param stream a {@code boolean} value : {@code true} for a TCP socket, + * {@code false} for UDP. * @throws IOException if creation fails * @since 1.4 */ @@ -500,10 +504,10 @@ /** - * Get the SocketImpl attached to this socket, creating + * Get the {@code SocketImpl} attached to this socket, creating * it if necessary. * - * @return the SocketImpl attached to that ServerSocket. + * @return the {@code SocketImpl} attached to that ServerSocket. * @throws SocketException if creation fails * @since 1.4 */ @@ -516,7 +520,7 @@ /** * Connects this socket to the server. * - * @param endpoint the SocketAddress + * @param endpoint the {@code SocketAddress} * @throws IOException if an error occurs during the connection * @throws java.nio.channels.IllegalBlockingModeException * if this socket has an associated channel, @@ -535,7 +539,7 @@ * A timeout of zero is interpreted as an infinite timeout. The connection * will then block until established or an error occurs. * - * @param endpoint the SocketAddress + * @param endpoint the {@code SocketAddress} * @param timeout the timeout value to be used in milliseconds. * @throws IOException if an error occurs during the connection * @throws SocketTimeoutException if timeout expires before connecting @@ -597,10 +601,10 @@ /** * Binds the socket to a local address. *

        - * If the address is null, then the system will pick up + * If the address is {@code null}, then the system will pick up * an ephemeral port and a valid local address to bind the socket. * - * @param bindpoint the SocketAddress to bind to + * @param bindpoint the {@code SocketAddress} to bind to * @throws IOException if the bind operation fails, or if the socket * is already bound. * @throws IllegalArgumentException if bindpoint is a @@ -668,7 +672,7 @@ * after the socket is closed. * * @return the remote IP address to which this socket is connected, - * or null if the socket is not connected. + * or {@code null} if the socket is not connected. */ public InetAddress getInetAddress() { if (!isConnected()) @@ -760,15 +764,15 @@ /** * Returns the address of the endpoint this socket is connected to, or - * null if it is unconnected. + * {@code null} if it is unconnected. *

        * If the socket was connected prior to being {@link #close closed}, * then this method will continue to return the connected address * after the socket is closed. * - * @return a SocketAddress representing the remote endpoint of this - * socket, or null if it is not connected yet. + * @return a {@code SocketAddress} representing the remote endpoint of this + * socket, or {@code null} if it is not connected yet. * @see #getInetAddress() * @see #getPort() * @see #connect(SocketAddress, int) @@ -785,10 +789,10 @@ * Returns the address of the endpoint this socket is bound to. *

        * If a socket bound to an endpoint represented by an - * InetSocketAddress is {@link #close closed}, - * then this method will continue to return an InetSocketAddress + * {@code InetSocketAddress } is {@link #close closed}, + * then this method will continue to return an {@code InetSocketAddress} * after the socket is closed. In that case the returned - * InetSocketAddress's address is the + * {@code InetSocketAddress}'s address is the * {@link InetAddress#isAnyLocalAddress wildcard} address * and its port is the local port that it was bound to. *

        @@ -828,7 +832,7 @@ * methods. * * @return the socket channel associated with this socket, - * or null if this socket was not created + * or {@code null} if this socket was not created * for a channel * * @since 1.4 @@ -843,7 +847,7 @@ * *

        If this socket has an associated channel then the resulting input * stream delegates all of its operations to the channel. If the channel - * is in non-blocking mode then the input stream's read operations + * is in non-blocking mode then the input stream's {@code read} operations * will throw an {@link java.nio.channels.IllegalBlockingModeException}. * *

        Under abnormal conditions the underlying connection may be @@ -867,7 +871,7 @@ *

      • If there are no bytes buffered on the socket, and the * socket has not been closed using {@link #close close}, then * {@link java.io.InputStream#available available} will - * return 0. + * return {@code 0}. * *

      * @@ -910,7 +914,7 @@ * *

      If this socket has an associated channel then the resulting output * stream delegates all of its operations to the channel. If the channel - * is in non-blocking mode then the output stream's write + * is in non-blocking mode then the output stream's {@code write} * operations will throw an {@link * java.nio.channels.IllegalBlockingModeException}. * @@ -949,8 +953,8 @@ * Enable/disable {@link SocketOptions#TCP_NODELAY TCP_NODELAY} * (disable/enable Nagle's algorithm). * - * @param on true to enable TCP_NODELAY, - * false to disable. + * @param on {@code true} to enable TCP_NODELAY, + * {@code false} to disable. * * @exception SocketException if there is an error * in the underlying protocol, such as a TCP error. @@ -968,7 +972,7 @@ /** * Tests if {@link SocketOptions#TCP_NODELAY TCP_NODELAY} is enabled. * - * @return a boolean indicating whether or not + * @return a {@code boolean} indicating whether or not * {@link SocketOptions#TCP_NODELAY TCP_NODELAY} is enabled. * @exception SocketException if there is an error * in the underlying protocol, such as a TCP error. @@ -1066,9 +1070,9 @@ * and there is no capability to distinguish between normal data and urgent * data unless provided by a higher level protocol. * - * @param on true to enable + * @param on {@code true} to enable * {@link SocketOptions#SO_OOBINLINE SO_OOBINLINE}, - * false to disable. + * {@code false} to disable. * * @exception SocketException if there is an error * in the underlying protocol, such as a TCP error. @@ -1086,7 +1090,7 @@ /** * Tests if {@link SocketOptions#SO_OOBINLINE SO_OOBINLINE} is enabled. * - * @return a boolean indicating whether or not + * @return a {@code boolean} indicating whether or not * {@link SocketOptions#SO_OOBINLINE SO_OOBINLINE}is enabled. * * @exception SocketException if there is an error @@ -1151,7 +1155,7 @@ /** * Sets the {@link SocketOptions#SO_SNDBUF SO_SNDBUF} option to the - * specified value for this Socket. + * specified value for this {@code Socket}. * The {@link SocketOptions#SO_SNDBUF SO_SNDBUF} option is used by the * platform's networking code as a hint for the size to set the underlying * network I/O buffers. @@ -1184,10 +1188,10 @@ /** * Get value of the {@link SocketOptions#SO_SNDBUF SO_SNDBUF} option - * for this Socket, that is the buffer size used by the platform - * for output on this Socket. + * for this {@code Socket}, that is the buffer size used by the platform + * for output on this {@code Socket}. * @return the value of the {@link SocketOptions#SO_SNDBUF SO_SNDBUF} - * option for this Socket. + * option for this {@code Socket}. * * @exception SocketException if there is an error * in the underlying protocol, such as a TCP error. @@ -1208,7 +1212,7 @@ /** * Sets the {@link SocketOptions#SO_RCVBUF SO_RCVBUF} option to the - * specified value for this Socket. The + * specified value for this {@code Socket}. The * {@link SocketOptions#SO_RCVBUF SO_RCVBUF} option is * used by the platform's networking code as a hint for the size to set * the underlying network I/O buffers. @@ -1258,11 +1262,11 @@ /** * Gets the value of the {@link SocketOptions#SO_RCVBUF SO_RCVBUF} option - * for this Socket, that is the buffer size used by the platform - * for input on this Socket. + * for this {@code Socket}, that is the buffer size used by the platform + * for input on this {@code Socket}. * * @return the value of the {@link SocketOptions#SO_RCVBUF SO_RCVBUF} - * option for this Socket. + * option for this {@code Socket}. * @exception SocketException if there is an error * in the underlying protocol, such as a TCP error. * @see #setReceiveBufferSize(int) @@ -1298,7 +1302,7 @@ /** * Tests if {@link SocketOptions#SO_KEEPALIVE SO_KEEPALIVE} is enabled. * - * @return a boolean indicating whether or not + * @return a {@code boolean} indicating whether or not * {@link SocketOptions#SO_KEEPALIVE SO_KEEPALIVE} is enabled. * @exception SocketException if there is an error * in the underlying protocol, such as a TCP error. @@ -1321,7 +1325,7 @@ * 255} or an IllegalArgumentException will be thrown. *

      Notes: *

      For Internet Protocol v4 the value consists of an - * integer, the least significant 8 bits of which + * {@code integer}, the least significant 8 bits of which * represent the value of the TOS octet in IP packets sent by * the socket. * RFC 1349 defines the TOS values as follows: @@ -1347,10 +1351,10 @@ * in the underlying platform. Applications should not assume that * they can change the TOS field after the connection. *

      - * For Internet Protocol v6 tc is the value that + * For Internet Protocol v6 {@code tc} is the value that * would be placed into the sin6_flowinfo field of the IP header. * - * @param tc an int value for the bitset. + * @param tc an {@code int} value for the bitset. * @throws SocketException if there is an error setting the * traffic class or type-of-service * @since 1.4 @@ -1392,11 +1396,11 @@ *

      * When a TCP connection is closed the connection may remain * in a timeout state for a period of time after the connection - * is closed (typically known as the TIME_WAIT state - * or 2MSL wait state). + * is closed (typically known as the {@code TIME_WAIT} state + * or {@code 2MSL} wait state). * For applications using a well known socket address or port * it may not be possible to bind a socket to the required - * SocketAddress if there is a connection in the + * {@code SocketAddress} if there is a connection in the * timeout state involving the socket address or port. *

      * Enabling {@link SocketOptions#SO_REUSEADDR SO_REUSEADDR} @@ -1404,7 +1408,7 @@ * the socket to be bound even though a previous connection is in a timeout * state. *

      - * When a Socket is created the initial setting + * When a {@code Socket} is created the initial setting * of {@link SocketOptions#SO_REUSEADDR SO_REUSEADDR} is disabled. *

      * The behaviour when {@link SocketOptions#SO_REUSEADDR SO_REUSEADDR} is @@ -1430,7 +1434,7 @@ /** * Tests if {@link SocketOptions#SO_REUSEADDR SO_REUSEADDR} is enabled. * - * @return a boolean indicating whether or not + * @return a {@code boolean} indicating whether or not * {@link SocketOptions#SO_REUSEADDR SO_REUSEADDR} is enabled. * @exception SocketException if there is an error * in the underlying protocol, such as a TCP error. @@ -1536,7 +1540,7 @@ } /** - * Converts this socket to a String. + * Converts this socket to a {@code String}. * * @return a string representation of this socket. */ @@ -1555,7 +1559,7 @@ * Returns the connection state of the socket. *

      * Note: Closing a socket doesn't clear its connection state, which means - * this method will return true for a closed socket + * this method will return {@code true} for a closed socket * (see {@link #isClosed()}) if it was successfuly connected prior * to being closed. * @@ -1571,7 +1575,7 @@ * Returns the binding state of the socket. *

      * Note: Closing a socket doesn't clear its binding state, which means - * this method will return true for a closed socket + * this method will return {@code true} for a closed socket * (see {@link #isClosed()}) if it was successfuly bound prior * to being closed. * @@ -1629,13 +1633,13 @@ * application. The factory can be specified only once. *

      * When an application creates a new client socket, the socket - * implementation factory's createSocketImpl method is + * implementation factory's {@code createSocketImpl} method is * called to create the actual socket implementation. *

      - * Passing null to the method is a no-op unless the factory + * Passing {@code null} to the method is a no-op unless the factory * was already set. *

      If there is a security manager, this method first calls - * the security manager's checkSetFactory method + * the security manager's {@code checkSetFactory} method * to ensure the operation is allowed. * This could result in a SecurityException. * @@ -1644,7 +1648,7 @@ * socket factory. * @exception SocketException if the factory is already defined. * @exception SecurityException if a security manager exists and its - * checkSetFactory method doesn't allow the operation. + * {@code checkSetFactory} method doesn't allow the operation. * @see java.net.SocketImplFactory#createSocketImpl() * @see SecurityManager#checkSetFactory */ @@ -1678,23 +1682,23 @@ * values represent a lower priority than positive values. If the * application prefers short connection time over both low latency and high * bandwidth, for example, then it could invoke this method with the values - * (1, 0, 0). If the application prefers high bandwidth above low + * {@code (1, 0, 0)}. If the application prefers high bandwidth above low * latency, and low latency above short connection time, then it could - * invoke this method with the values (0, 1, 2). + * invoke this method with the values {@code (0, 1, 2)}. * *

      Invoking this method after this socket has been connected * will have no effect. * * @param connectionTime - * An int expressing the relative importance of a short + * An {@code int} expressing the relative importance of a short * connection time * * @param latency - * An int expressing the relative importance of low + * An {@code int} expressing the relative importance of low * latency * * @param bandwidth - * An int expressing the relative importance of high + * An {@code int} expressing the relative importance of high * bandwidth * * @since 1.5 diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/SocketException.java --- a/jdk/src/share/classes/java/net/SocketException.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/SocketException.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -38,7 +38,7 @@ private static final long serialVersionUID = -5935874303556886934L; /** - * Constructs a new SocketException with the + * Constructs a new {@code SocketException} with the * specified detail message. * * @param msg the detail message. @@ -48,7 +48,7 @@ } /** - * Constructs a new SocketException with no detail message. + * Constructs a new {@code SocketException} with no detail message. */ public SocketException() { } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/SocketImpl.java --- a/jdk/src/share/classes/java/net/SocketImpl.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/SocketImpl.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,7 +31,7 @@ import java.io.FileDescriptor; /** - * The abstract class SocketImpl is a common superclass + * The abstract class {@code SocketImpl} is a common superclass * of all classes that actually implement sockets. It is used to * create both client and server sockets. *

      @@ -71,7 +71,7 @@ /** * Creates either a stream or a datagram socket. * - * @param stream if true, create a stream socket; + * @param stream if {@code true}, create a stream socket; * otherwise, create a datagram socket. * @exception IOException if an I/O error occurs while creating the * socket. @@ -122,7 +122,7 @@ /** * Sets the maximum queue length for incoming connection indications - * (a request to connect) to the count argument. If a + * (a request to connect) to the {@code count} argument. If a * connection indication arrives when the queue is full, the * connection is refused. * @@ -217,9 +217,9 @@ } /** - * Returns the value of this socket's fd field. + * Returns the value of this socket's {@code fd} field. * - * @return the value of this socket's fd field. + * @return the value of this socket's {@code fd} field. * @see java.net.SocketImpl#fd */ protected FileDescriptor getFileDescriptor() { @@ -227,9 +227,9 @@ } /** - * Returns the value of this socket's address field. + * Returns the value of this socket's {@code address} field. * - * @return the value of this socket's address field. + * @return the value of this socket's {@code address} field. * @see java.net.SocketImpl#address */ protected InetAddress getInetAddress() { @@ -237,9 +237,9 @@ } /** - * Returns the value of this socket's port field. + * Returns the value of this socket's {@code port} field. * - * @return the value of this socket's port field. + * @return the value of this socket's {@code port} field. * @see java.net.SocketImpl#port */ protected int getPort() { @@ -270,9 +270,9 @@ protected abstract void sendUrgentData (int data) throws IOException; /** - * Returns the value of this socket's localport field. + * Returns the value of this socket's {@code localport} field. * - * @return the value of this socket's localport field. + * @return the value of this socket's {@code localport} field. * @see java.net.SocketImpl#localport */ protected int getLocalPort() { @@ -296,7 +296,7 @@ } /** - * Returns the address and port of this socket as a String. + * Returns the address and port of this socket as a {@code String}. * * @return a string representation of this socket. */ @@ -328,23 +328,23 @@ * values represent a lower priority than positive values. If the * application prefers short connection time over both low latency and high * bandwidth, for example, then it could invoke this method with the values - * (1, 0, 0). If the application prefers high bandwidth above low + * {@code (1, 0, 0)}. If the application prefers high bandwidth above low * latency, and low latency above short connection time, then it could - * invoke this method with the values (0, 1, 2). + * invoke this method with the values {@code (0, 1, 2)}. * * By default, this method does nothing, unless it is overridden in a * a sub-class. * * @param connectionTime - * An int expressing the relative importance of a short + * An {@code int} expressing the relative importance of a short * connection time * * @param latency - * An int expressing the relative importance of low + * An {@code int} expressing the relative importance of low * latency * * @param bandwidth - * An int expressing the relative importance of high + * An {@code int} expressing the relative importance of high * bandwidth * * @since 1.5 diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/SocketImplFactory.java --- a/jdk/src/share/classes/java/net/SocketImplFactory.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/SocketImplFactory.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 1999, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,8 +27,8 @@ /** * This interface defines a factory for socket implementations. It - * is used by the classes Socket and - * ServerSocket to create actual socket + * is used by the classes {@code Socket} and + * {@code ServerSocket} to create actual socket * implementations. * * @author Arthur van Hoff @@ -39,9 +39,9 @@ public interface SocketImplFactory { /** - * Creates a new SocketImpl instance. + * Creates a new {@code SocketImpl} instance. * - * @return a new instance of SocketImpl. + * @return a new instance of {@code SocketImpl}. * @see java.net.SocketImpl */ SocketImpl createSocketImpl(); diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/SocketInputStream.java --- a/jdk/src/share/classes/java/net/SocketInputStream.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/SocketInputStream.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -67,8 +67,8 @@ * Returns the unique {@link java.nio.channels.FileChannel FileChannel} * object associated with this file input stream.

      * - * The getChannel method of SocketInputStream - * returns null since it is a socket based stream.

      + * The {@code getChannel} method of {@code SocketInputStream} + * returns {@code null} since it is a socket based stream.

      * * @return the file channel associated with this file input stream * diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/SocketOptions.java --- a/jdk/src/share/classes/java/net/SocketOptions.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/SocketOptions.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -115,7 +115,7 @@ * } * * - * @param optID an int identifying the option to fetch + * @param optID an {@code int} identifying the option to fetch * @return the value of the option * @throws SocketException if the socket is closed * @throws SocketException if optID is unknown along the diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/SocketOutputStream.java --- a/jdk/src/share/classes/java/net/SocketOutputStream.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/SocketOutputStream.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -64,8 +64,8 @@ * Returns the unique {@link java.nio.channels.FileChannel FileChannel} * object associated with this file output stream.

      * - * The getChannel method of SocketOutputStream - * returns null since it is a socket based stream.

      + * The {@code getChannel} method of {@code SocketOutputStream} + * returns {@code null} since it is a socket based stream.

      * * @return the file channel associated with this file output stream * diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/SocketPermission.java --- a/jdk/src/share/classes/java/net/SocketPermission.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/SocketPermission.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -110,7 +110,7 @@ * * * is granted to some code, it allows that code to connect to port 7777 on - * puffin.eng.sun.com, and to accept connections on that port. + * {@code puffin.eng.sun.com}, and to accept connections on that port. * *

      Similarly, if the following permission: * @@ -788,7 +788,7 @@ * port range is ignored when p only contains the action, 'resolve'.

      *

    * - * Then implies checks each of the following, in order, + * Then {@code implies} checks each of the following, in order, * and for each returns true if the stated condition is true:

    *

      *
    • If this object was initialized with a single IP address and one of p's @@ -802,7 +802,7 @@ *
    • If this canonical name equals p's canonical name.

      *

    * - * If none of the above are true, implies returns false. + * If none of the above are true, {@code implies} returns false. * @param p the permission to check against. * * @return true if the specified permission is implied by this object, @@ -1131,7 +1131,7 @@ *

    * SocketPermission objects must be stored in a manner that allows them * to be inserted into the collection in any order, but that also enables the - * PermissionCollection implies + * PermissionCollection {@code implies} * method to be implemented in an efficient (and consistent) manner. * * @return a new PermissionCollection object suitable for storing SocketPermissions. diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/SocksSocketImpl.java --- a/jdk/src/share/classes/java/net/SocksSocketImpl.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/SocksSocketImpl.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -315,7 +315,7 @@ * grants the connections, then the connect is successful and all * further traffic will go to the "real" endpoint. * - * @param endpoint the SocketAddress to connect to. + * @param endpoint the {@code SocketAddress} to connect to. * @param timeout the timeout value in milliseconds * @throws IOException if the connection can't be established. * @throws SecurityException if there is a security manager and it @@ -1032,9 +1032,9 @@ /** - * Returns the value of this socket's address field. + * Returns the value of this socket's {@code address} field. * - * @return the value of this socket's address field. + * @return the value of this socket's {@code address} field. * @see java.net.SocketImpl#address */ @Override @@ -1046,9 +1046,9 @@ } /** - * Returns the value of this socket's port field. + * Returns the value of this socket's {@code port} field. * - * @return the value of this socket's port field. + * @return the value of this socket's {@code port} field. * @see java.net.SocketImpl#port */ @Override diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/URI.java --- a/jdk/src/share/classes/java/net/URI.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/URI.java Fri Aug 02 09:38:09 2013 +0100 @@ -67,24 +67,24 @@ * form has the syntax * *

    - * [scheme:]scheme-specific-part[#fragment] + * [scheme{@code :}]scheme-specific-part[{@code #}fragment] *
    * * where square brackets [...] delineate optional components and the characters - * : and # stand for themselves. + * {@code :} and {@code #} stand for themselves. * *

    An absolute URI specifies a scheme; a URI that is not absolute is * said to be relative. URIs are also classified according to whether * they are opaque or hierarchical. * *

    An opaque URI is an absolute URI whose scheme-specific part does - * not begin with a slash character ('/'). Opaque URIs are not + * not begin with a slash character ({@code '/'}). Opaque URIs are not * subject to further parsing. Some examples of opaque URIs are: * *

    - * - * - * + * + * + * *
    mailto:java-net@java.sun.com
    news:comp.lang.java
    urn:isbn:096139210x
    {@code mailto:java-net@java.sun.com}
    {@code news:comp.lang.java}
    {@code urn:isbn:096139210x}
    * *

    A hierarchical URI is either an absolute URI whose @@ -93,20 +93,20 @@ * URIs are: * *

    - * http://java.sun.com/j2se/1.3/
    - * docs/guide/collections/designfaq.html#28
    - * ../../../demo/jfc/SwingSet2/src/SwingSet2.java
    - * file:///~/calendar + * {@code http://java.sun.com/j2se/1.3/}
    + * {@code docs/guide/collections/designfaq.html#28}
    + * {@code ../../../demo/jfc/SwingSet2/src/SwingSet2.java}
    + * {@code file:///~/calendar} *
    * *

    A hierarchical URI is subject to further parsing according to the syntax * *

    - * [scheme:][//authority][path][?query][#fragment] + * [scheme{@code :}][{@code //}authority][path][{@code ?}query][{@code #}fragment] *
    * - * where the characters :, /, - * ?, and # stand for themselves. The + * where the characters {@code :}, {@code /}, + * {@code ?}, and {@code #} stand for themselves. The * scheme-specific part of a hierarchical URI consists of the characters * between the scheme and fragment components. * @@ -115,16 +115,16 @@ * parses according to the familiar syntax * *
    - * [user-info@]host[:port] + * [user-info{@code @}]host[{@code :}port] *
    * - * where the characters @ and : stand for + * where the characters {@code @} and {@code :} stand for * themselves. Nearly all URI schemes currently in use are server-based. An * authority component that does not parse in this way is considered to be * registry-based. * *

    The path component of a hierarchical URI is itself said to be absolute - * if it begins with a slash character ('/'); otherwise it is + * if it begins with a slash character ({@code '/'}); otherwise it is * relative. The path of a hierarchical URI that is either absolute or * specifies an authority is always absolute. * @@ -132,21 +132,21 @@ * *

    * - * - * - * - * - * - * - * - * - * + * + * + * + * + * + * + * + * + * *
    ComponentType
    schemeString
    scheme-specific-part    String
    authorityString
    user-infoString
    hostString
    portint
    pathString
    queryString
    fragmentString
    scheme{@code String}
    scheme-specific-part    {@code String}
    authority{@code String}
    user-info{@code String}
    host{@code String}
    port{@code int}
    path{@code String}
    query{@code String}
    fragment{@code String}
    * * In a given instance any particular component is either undefined or * defined with a distinct value. Undefined string components are - * represented by null, while undefined integer components are - * represented by -1. A string component may be defined to have the + * represented by {@code null}, while undefined integer components are + * represented by {@code -1}. A string component may be defined to have the * empty string as its value; this is not equivalent to that component being * undefined. * @@ -165,10 +165,10 @@ * The key operations supported by this class are those of * normalization, resolution, and relativization. * - *

    Normalization is the process of removing unnecessary "." - * and ".." segments from the path component of a hierarchical URI. - * Each "." segment is simply removed. A ".." segment is - * removed only if it is preceded by a non-".." segment. + *

    Normalization is the process of removing unnecessary {@code "."} + * and {@code ".."} segments from the path component of a hierarchical URI. + * Each {@code "."} segment is simply removed. A {@code ".."} segment is + * removed only if it is preceded by a non-{@code ".."} segment. * Normalization has no effect upon opaque URIs. * *

    Resolution is the process of resolving one URI against another, @@ -179,45 +179,47 @@ * normalized. The result, for example, of resolving * *

    - * docs/guide/collections/designfaq.html#28          (1) + * {@code docs/guide/collections/designfaq.html#28} + *              + *     (1) *
    * - * against the base URI http://java.sun.com/j2se/1.3/ is the result + * against the base URI {@code http://java.sun.com/j2se/1.3/} is the result * URI * *
    - * http://java.sun.com/j2se/1.3/docs/guide/collections/designfaq.html#28 + * {@code http://java.sun.com/j2se/1.3/docs/guide/collections/designfaq.html#28} *
    * * Resolving the relative URI * *
    - * ../../../demo/jfc/SwingSet2/src/SwingSet2.java    (2) + * {@code ../../../demo/jfc/SwingSet2/src/SwingSet2.java}    (2) *
    * * against this result yields, in turn, * *
    - * http://java.sun.com/j2se/1.3/demo/jfc/SwingSet2/src/SwingSet2.java + * {@code http://java.sun.com/j2se/1.3/demo/jfc/SwingSet2/src/SwingSet2.java} *
    * * Resolution of both absolute and relative URIs, and of both absolute and * relative paths in the case of hierarchical URIs, is supported. Resolving - * the URI file:///~calendar against any other URI simply yields the + * the URI {@code file:///~calendar} against any other URI simply yields the * original URI, since it is absolute. Resolving the relative URI (2) above * against the relative base URI (1) yields the normalized, but still relative, * URI * *
    - * demo/jfc/SwingSet2/src/SwingSet2.java + * {@code demo/jfc/SwingSet2/src/SwingSet2.java} *
    * *

    Relativization, finally, is the inverse of resolution: For any * two normalized URIs u and v, * *

    - * u.relativize(u.resolve(v)).equals(v)  and
    - * u.resolve(u.relativize(v)).equals(v)  .
    + * u{@code .relativize(}u{@code .resolve(}v{@code )).equals(}v{@code )}  and
    + * u{@code .resolve(}u{@code .relativize(}v{@code )).equals(}v{@code )}  .
    *
    * * This operation is often useful when constructing a document containing URIs @@ -225,16 +227,16 @@ * possible. For example, relativizing the URI * *
    - * http://java.sun.com/j2se/1.3/docs/guide/index.html + * {@code http://java.sun.com/j2se/1.3/docs/guide/index.html} *
    * * against the base URI * *
    - * http://java.sun.com/j2se/1.3 + * {@code http://java.sun.com/j2se/1.3} *
    * - * yields the relative URI docs/guide/index.html. + * yields the relative URI {@code docs/guide/index.html}. * * *

    Character categories

    @@ -247,26 +249,26 @@ *
    * * + * {@code 'A'} through {@code 'Z'} + * and {@code 'a'} through {@code 'z'} * * + * {@code '0'} through {@code '9'} * * * * + * {@code "_-!.~'()*"} * - * + * * * + * {@code "?/[]@"} * * + * character ({@code '%'}) followed by two hexadecimal digits + * ({@code '0'}-{@code '9'}, {@code 'A'}-{@code 'F'}, and + * {@code 'a'}-{@code 'f'}) * *
    alphaThe US-ASCII alphabetic characters, - * 'A' through 'Z' - * and 'a' through 'z'
    digitThe US-ASCII decimal digit characters, - * '0' through '9'
    alphanumAll alpha and digit characters
    unreserved    All alphanum characters together with those in the string - * "_-!.~'()*"
    punctThe characters in the string ",;:$&+="
    The characters in the string {@code ",;:$&+="}
    reservedAll punct characters together with those in the string - * "?/[]@"
    escapedEscaped octets, that is, triplets consisting of the percent - * character ('%') followed by two hexadecimal digits - * ('0'-'9', 'A'-'F', and - * 'a'-'f')
    otherThe Unicode characters that are not in the US-ASCII character set, * are not control characters (according to the {@link @@ -306,14 +308,14 @@ * *
  • A character is encoded by replacing it * with the sequence of escaped octets that represent that character in the - * UTF-8 character set. The Euro currency symbol ('\u20AC'), - * for example, is encoded as "%E2%82%AC". (Deviation from + * UTF-8 character set. The Euro currency symbol ({@code '\u005Cu20AC'}), + * for example, is encoded as {@code "%E2%82%AC"}. (Deviation from * RFC 2396, which does not specify any particular character * set.)

  • * *
  • An illegal character is quoted simply by * encoding it. The space character, for example, is quoted by replacing it - * with "%20". UTF-8 contains US-ASCII, hence for US-ASCII + * with {@code "%20"}. UTF-8 contains US-ASCII, hence for US-ASCII * characters this transformation has exactly the effect required by * RFC 2396.

  • * @@ -325,7 +327,7 @@ * decoding any encoded non-US-ASCII characters. If a decoding error occurs * when decoding the escaped octets then the erroneous octets are replaced by - * '\uFFFD', the Unicode replacement character.

    + * {@code '\u005CuFFFD'}, the Unicode replacement character.

    * * * @@ -343,7 +345,7 @@ * #URI(java.lang.String,java.lang.String,java.lang.String,int,java.lang.String,java.lang.String,java.lang.String) * multi-argument constructors} quote illegal characters as * required by the components in which they appear. The percent character - * ('%') is always quoted by these constructors. Any other + * ({@code '%'}) is always quoted by these constructors. Any other * characters are preserved.

    * *
  • The {@link #getRawUserInfo() getRawUserInfo}, {@link #getRawPath() @@ -379,42 +381,33 @@ * For any URI u, it is always the case that * *

    - * new URI(u.toString()).equals(u) . + * {@code new URI(}u{@code .toString()).equals(}u{@code )} . *
    * * For any URI u that does not contain redundant syntax such as two - * slashes before an empty authority (as in file:///tmp/ ) or a + * slashes before an empty authority (as in {@code file:///tmp/} ) or a * colon following a host name but no port (as in - * http://java.sun.com: ), and that does not encode characters + * {@code http://java.sun.com:} ), and that does not encode characters * except those that must be quoted, the following identities also hold: - * - *
    - * new URI(u.getScheme(),
    - *         
    u.getSchemeSpecificPart(),
    - *         
    u.getFragment())
    - * .equals(
    u) - *
    - * + *

    + *     new URI(u.getScheme(),
    + *             u.getSchemeSpecificPart(),
    + *             u.getFragment())
    + *     .equals(u)
    * in all cases, - * - *
    - * new URI(u.getScheme(),
    - *         
    u.getUserInfo(), u.getAuthority(),
    - *         
    u.getPath(), u.getQuery(),
    - *         
    u.getFragment())
    - * .equals(
    u) - *
    - * + *

    + *     new URI(u.getScheme(),
    + *             u.getUserInfo(), u.getAuthority(),
    + *             u.getPath(), u.getQuery(),
    + *             u.getFragment())
    + *     .equals(u)
    * if u is hierarchical, and - * - *
    - * new URI(u.getScheme(),
    - *         
    u.getUserInfo(), u.getHost(), u.getPort(),
    - *         
    u.getPath(), u.getQuery(),
    - *         
    u.getFragment())
    - * .equals(
    u) - *
    - * + *

    + *     new URI(u.getScheme(),
    + *             u.getUserInfo(), u.getHost(), u.getPort(),
    + *             u.getPath(), u.getQuery(),
    + *             u.getFragment())
    + *     .equals(u)
    * if u is hierarchical and has either no authority or a server-based * authority. * @@ -425,8 +418,8 @@ * resource locator. Hence every URL is a URI, abstractly speaking, but * not every URI is a URL. This is because there is another subcategory of * URIs, uniform resource names (URNs), which name resources but do not - * specify how to locate them. The mailto, news, and - * isbn URIs shown above are examples of URNs. + * specify how to locate them. The {@code mailto}, {@code news}, and + * {@code isbn} URIs shown above are examples of URNs. * *

    The conceptual distinction between URIs and URLs is reflected in the * differences between this class and the {@link URL} class. @@ -530,12 +523,12 @@ * href="http://www.ietf.org/rfc/rfc2396.txt">RFC 2396, * Appendix A, except for the following deviations:

    * - *
      + *
        * *
      • An empty authority component is permitted as long as it is * followed by a non-empty path, a query component, or a fragment * component. This allows the parsing of URIs such as - * "file:///foo/bar", which seems to be the intent of + * {@code "file:///foo/bar"}, which seems to be the intent of * RFC 2396 although the grammar does not permit it. If the * authority component is empty then the user-information, host, and port * components are undefined.

      • @@ -543,7 +536,7 @@ *
      • Empty relative paths are permitted; this seems to be the * intent of RFC 2396 although the grammar does not permit it. The * primary consequence of this deviation is that a standalone fragment - * such as "#foo" parses as a relative URI with an empty path + * such as {@code "#foo"} parses as a relative URI with an empty path * and the given fragment, and can be usefully resolved against a base URI. * @@ -560,12 +553,12 @@ * href="http://www.ietf.org/rfc/rfc2396.txt">RFC 2396 * section 3.2.2 although the grammar does not permit it. The * consequence of this deviation is that the authority component of a - * hierarchical URI such as s://123, will parse as a server-based + * hierarchical URI such as {@code s://123}, will parse as a server-based * authority.

      • * *
      • IPv6 addresses are permitted for the host component. An IPv6 - * address must be enclosed in square brackets ('[' and - * ']') as specified by RFC 2732. The * IPv6 address itself must parse according to RFC 2373. IPv6 @@ -585,7 +578,7 @@ * @param str The string to be parsed into a URI * * @throws NullPointerException - * If str is null + * If {@code str} is {@code null} * * @throws URISyntaxException * If the given string violates RFC 2396, as augmented @@ -599,10 +592,10 @@ * Constructs a hierarchical URI from the given components. * *

        If a scheme is given then the path, if also given, must either be - * empty or begin with a slash character ('/'). Otherwise a - * component of the new URI may be left undefined by passing null - * for the corresponding parameter or, in the case of the port - * parameter, by passing -1. + * empty or begin with a slash character ({@code '/'}). Otherwise a + * component of the new URI may be left undefined by passing {@code null} + * for the corresponding parameter or, in the case of the {@code port} + * parameter, by passing {@code -1}. * *

        This constructor first builds a URI string from the given components * according to the rules specified in

        Initially, the result string is empty.

      • * *
      • If a scheme is given then it is appended to the result, - * followed by a colon character (':').

      • + * followed by a colon character ({@code ':'}).

        * *
      • If user information, a host, or a port are given then the - * string "//" is appended.

      • + * string {@code "//"} is appended.

        * *
      • If user information is given then it is appended, followed by - * a commercial-at character ('@'). Any character not in the + * a commercial-at character ({@code '@'}). Any character not in the * unreserved, punct, escaped, or other * categories is quoted.

      • * *
      • If a host is given then it is appended. If the host is a * literal IPv6 address but is not enclosed in square brackets - * ('[' and ']') then the square brackets are added. + * ({@code '['} and {@code ']'}) then the square brackets are added. *

      • * *
      • If a port number is given then a colon character - * (':') is appended, followed by the port number in decimal. + * ({@code ':'}) is appended, followed by the port number in decimal. *

      • * *
      • If a path is given then it is appended. Any character not in * the unreserved, punct, escaped, or other - * categories, and not equal to the slash character ('/') or the - * commercial-at character ('@'), is quoted.

      • + * categories, and not equal to the slash character ({@code '/'}) or the + * commercial-at character ({@code '@'}), is quoted.

        * *
      • If a query is given then a question-mark character - * ('?') is appended, followed by the query. Any character that + * ({@code '?'}) is appended, followed by the query. Any character that * is not a legal URI character is quoted. *

      • * *
      • Finally, if a fragment is given then a hash character - * ('#') is appended, followed by the fragment. Any character + * ({@code '#'}) is appended, followed by the fragment. Any character * that is not a legal URI character is quoted.

      • * * @@ -684,8 +677,8 @@ * Constructs a hierarchical URI from the given components. * *

        If a scheme is given then the path, if also given, must either be - * empty or begin with a slash character ('/'). Otherwise a - * component of the new URI may be left undefined by passing null + * empty or begin with a slash character ({@code '/'}). Otherwise a + * component of the new URI may be left undefined by passing {@code null} * for the corresponding parameter. * *

        This constructor first builds a URI string from the given components @@ -698,28 +691,28 @@ *

      • Initially, the result string is empty.

      • * *
      • If a scheme is given then it is appended to the result, - * followed by a colon character (':').

      • + * followed by a colon character ({@code ':'}).

        * - *
      • If an authority is given then the string "//" is + *

      • If an authority is given then the string {@code "//"} is * appended, followed by the authority. If the authority contains a * literal IPv6 address then the address must be enclosed in square - * brackets ('[' and ']'). Any character not in the + * brackets ({@code '['} and {@code ']'}). Any character not in the * unreserved, punct, escaped, or other * categories, and not equal to the commercial-at character - * ('@'), is quoted.

      • + * ({@code '@'}), is quoted.

        * *
      • If a path is given then it is appended. Any character not in * the unreserved, punct, escaped, or other - * categories, and not equal to the slash character ('/') or the - * commercial-at character ('@'), is quoted.

      • + * categories, and not equal to the slash character ({@code '/'}) or the + * commercial-at character ({@code '@'}), is quoted.

        * *
      • If a query is given then a question-mark character - * ('?') is appended, followed by the query. Any character that + * ({@code '?'}) is appended, followed by the query. Any character that * is not a legal URI character is quoted. *

      • * *
      • Finally, if a fragment is given then a hash character - * ('#') is appended, followed by the fragment. Any character + * ({@code '#'}) is appended, followed by the fragment. Any character * that is not a legal URI character is quoted.

      • * * @@ -756,15 +749,15 @@ /** * Constructs a hierarchical URI from the given components. * - *

        A component may be left undefined by passing null. + *

        A component may be left undefined by passing {@code null}. * *

        This convenience constructor works as if by invoking the * seven-argument constructor as follows: * - *

        - * new {@link #URI(String, String, String, int, String, String, String) - * URI}(scheme, null, host, -1, path, null, fragment); - *
        + *
        + * {@code new} {@link #URI(String, String, String, int, String, String, String) + * URI}{@code (scheme, null, host, -1, path, null, fragment);} + *
        * * @param scheme Scheme name * @param host Host name @@ -784,7 +777,7 @@ /** * Constructs a URI from the given components. * - *

        A component may be left undefined by passing null. + *

        A component may be left undefined by passing {@code null}. * *

        This constructor first builds a URI in string form using the given * components as follows:

        @@ -794,14 +787,14 @@ *
      • Initially, the result string is empty.

      • * *
      • If a scheme is given then it is appended to the result, - * followed by a colon character (':').

      • + * followed by a colon character ({@code ':'}).

        * *
      • If a scheme-specific part is given then it is appended. Any * character that is not a legal URI character * is quoted.

      • * *
      • Finally, if a fragment is given then a hash character - * ('#') is appended to the string, followed by the fragment. + * ({@code '#'}) is appended to the string, followed by the fragment. * Any character that is not a legal URI character is quoted.

      • * * @@ -847,7 +840,7 @@ * @return The new URI * * @throws NullPointerException - * If str is null + * If {@code str} is {@code null} * * @throws IllegalArgumentException * If the given string violates RFC 2396 @@ -882,7 +875,7 @@ * cannot always distinguish a malformed server-based authority from a * legitimate registry-based authority. It must therefore treat some * instances of the former as instances of the latter. The authority - * component in the URI string "//foo:bar", for example, is not a + * component in the URI string {@code "//foo:bar"}, for example, is not a * legal server-based authority but it is legal as a registry-based * authority. * @@ -892,7 +885,7 @@ * treated as an error. In these cases a statement such as * *
        - * URI u = new URI(str).parseServerAuthority(); + * {@code URI }u{@code = new URI(str).parseServerAuthority();} *
        * *

        can be used to ensure that u always refers to a URI that, if @@ -936,26 +929,26 @@ * *

          * - *
        1. All "." segments are removed.

        2. + *
        3. All {@code "."} segments are removed.

        4. * - *
        5. If a ".." segment is preceded by a non-".." + *

        6. If a {@code ".."} segment is preceded by a non-{@code ".."} * segment then both of these segments are removed. This step is * repeated until it is no longer applicable.

        7. * *
        8. If the path is relative, and if its first segment contains a - * colon character (':'), then a "." segment is + * colon character ({@code ':'}), then a {@code "."} segment is * prepended. This prevents a relative URI with a path such as - * "a:b/c/d" from later being re-parsed as an opaque URI with a - * scheme of "a" and a scheme-specific part of "b/c/d". + * {@code "a:b/c/d"} from later being re-parsed as an opaque URI with a + * scheme of {@code "a"} and a scheme-specific part of {@code "b/c/d"}. * (Deviation from RFC 2396)

        9. * *
        * - *

        A normalized path will begin with one or more ".." segments - * if there were insufficient non-".." segments preceding them to - * allow their removal. A normalized path will begin with a "." + *

        A normalized path will begin with one or more {@code ".."} segments + * if there were insufficient non-{@code ".."} segments preceding them to + * allow their removal. A normalized path will begin with a {@code "."} * segment if one was inserted by step 3 above. Otherwise, a normalized - * path will not contain any "." or ".." segments.

        + * path will not contain any {@code "."} or {@code ".."} segments.

        * * @return A URI equivalent to this URI, * but whose path is in normal form @@ -975,7 +968,7 @@ * query components are undefined, then a URI with the given fragment but * with all other components equal to those of this URI is returned. This * allows a URI representing a standalone fragment reference, such as - * "#foo", to be usefully resolved against a base URI. + * {@code "#foo"}, to be usefully resolved against a base URI. * *

        Otherwise this method constructs a new hierarchical URI in a manner * consistent with

        Otherwise the new URI's authority component is copied from * this URI, and its path is computed as follows:

        * - *
          + *
            * *
          1. If the given URI's path is absolute then the new URI's path * is taken from the given URI.

          2. @@ -1016,7 +1009,7 @@ * @return The resulting URI * * @throws NullPointerException - * If uri is null + * If {@code uri} is {@code null} */ public URI resolve(URI uri) { return resolve(this, uri); @@ -1027,14 +1020,14 @@ * against this URI. * *

            This convenience method works as if invoking it were equivalent to - * evaluating the expression {@link #resolve(java.net.URI) - * resolve}(URI.{@link #create(String) create}(str)).

            + * evaluating the expression {@link #resolve(java.net.URI) + * resolve}{@code (URI.}{@link #create(String) create}{@code (str))}.

            * * @param str The string to be parsed into a URI * @return The resulting URI * * @throws NullPointerException - * If str is null + * If {@code str} is {@code null} * * @throws IllegalArgumentException * If the given string violates RFC 2396 @@ -1067,7 +1060,7 @@ * @return The resulting URI * * @throws NullPointerException - * If uri is null + * If {@code uri} is {@code null} */ public URI relativize(URI uri) { return relativize(this, uri); @@ -1077,7 +1070,7 @@ * Constructs a URL from this URI. * *

            This convenience method works as if invoking it were equivalent to - * evaluating the expression new URL(this.toString()) after + * evaluating the expression {@code new URL(this.toString())} after * first checking that this URI is absolute.

            * * @return A URL constructed from this URI @@ -1102,14 +1095,14 @@ * Returns the scheme component of this URI. * *

            The scheme component of a URI, if defined, only contains characters - * in the alphanum category and in the string "-.+". A + * in the alphanum category and in the string {@code "-.+"}. A * scheme always starts with an alpha character.

            * * The scheme component of a URI cannot contain escaped octets, hence this * method does not perform any decoding. * * @return The scheme component of this URI, - * or null if the scheme is undefined + * or {@code null} if the scheme is undefined */ public String getScheme() { return scheme; @@ -1120,7 +1113,7 @@ * *

            A URI is absolute if, and only if, it has a scheme component.

            * - * @return true if, and only if, this URI is absolute + * @return {@code true} if, and only if, this URI is absolute */ public boolean isAbsolute() { return scheme != null; @@ -1134,7 +1127,7 @@ * An opaque URI has a scheme, a scheme-specific part, and possibly * a fragment; all other components are undefined.

            * - * @return true if, and only if, this URI is opaque + * @return {@code true} if, and only if, this URI is opaque */ public boolean isOpaque() { return path == null; @@ -1148,7 +1141,7 @@ * characters.

            * * @return The raw scheme-specific part of this URI - * (never null) + * (never {@code null}) */ public String getRawSchemeSpecificPart() { defineSchemeSpecificPart(); @@ -1164,7 +1157,7 @@ * href="#decode">decoded
            .

            * * @return The decoded scheme-specific part of this URI - * (never null) + * (never {@code null}) */ public String getSchemeSpecificPart() { if (decodedSchemeSpecificPart == null) @@ -1176,14 +1169,14 @@ * Returns the raw authority component of this URI. * *

            The authority component of a URI, if defined, only contains the - * commercial-at character ('@') and characters in the + * commercial-at character ({@code '@'}) and characters in the * unreserved, punct, escaped, and other * categories. If the authority is server-based then it is further * constrained to have valid user-information, host, and port * components.

            * * @return The raw authority component of this URI, - * or null if the authority is undefined + * or {@code null} if the authority is undefined */ public String getRawAuthority() { return authority; @@ -1197,7 +1190,7 @@ * sequences of escaped octets are decoded.

            * * @return The decoded authority component of this URI, - * or null if the authority is undefined + * or {@code null} if the authority is undefined */ public String getAuthority() { if (decodedAuthority == null) @@ -1213,7 +1206,7 @@ * other categories.

            * * @return The raw user-information component of this URI, - * or null if the user information is undefined + * or {@code null} if the user information is undefined */ public String getRawUserInfo() { return userInfo; @@ -1227,7 +1220,7 @@ * sequences of escaped octets are decoded.

            * * @return The decoded user-information component of this URI, - * or null if the user information is undefined + * or {@code null} if the user information is undefined */ public String getUserInfo() { if ((decodedUserInfo == null) && (userInfo != null)) @@ -1241,24 +1234,24 @@ *

            The host component of a URI, if defined, will have one of the * following forms:

            * - *
              + *
                * *
              • A domain name consisting of one or more labels - * separated by period characters ('.'), optionally followed by + * separated by period characters ({@code '.'}), optionally followed by * a period character. Each label consists of alphanum characters - * as well as hyphen characters ('-'), though hyphens never + * as well as hyphen characters ({@code '-'}), though hyphens never * occur as the first or last characters in a label. The rightmost * label of a domain name consisting of two or more labels, begins * with an alpha character.

              • * *
              • A dotted-quad IPv4 address of the form - * digit+.digit+.digit+.digit+, + * digit{@code +.}digit{@code +.}digit{@code +.}digit{@code +}, * where no digit sequence is longer than three characters and no * sequence has a value larger than 255.

              • * - *
              • An IPv6 address enclosed in square brackets ('[' and - * ']') and consisting of hexadecimal digits, colon characters - * (':'), and possibly an embedded IPv4 address. The full + *

              • An IPv6 address enclosed in square brackets ({@code '['} and + * {@code ']'}) and consisting of hexadecimal digits, colon characters + * ({@code ':'}), and possibly an embedded IPv4 address. The full * syntax of IPv6 addresses is specified in RFC 2373: IPv6 * Addressing Architecture.

              • @@ -1269,7 +1262,7 @@ * method does not perform any decoding. * * @return The host component of this URI, - * or null if the host is undefined + * or {@code null} if the host is undefined */ public String getHost() { return host; @@ -1282,7 +1275,7 @@ * integer.

                * * @return The port component of this URI, - * or -1 if the port is undefined + * or {@code -1} if the port is undefined */ public int getPort() { return port; @@ -1292,12 +1285,12 @@ * Returns the raw path component of this URI. * *

                The path component of a URI, if defined, only contains the slash - * character ('/'), the commercial-at character ('@'), + * character ({@code '/'}), the commercial-at character ({@code '@'}), * and characters in the unreserved, punct, escaped, * and other categories.

                * * @return The path component of this URI, - * or null if the path is undefined + * or {@code null} if the path is undefined */ public String getRawPath() { return path; @@ -1311,7 +1304,7 @@ * escaped octets are decoded.

                * * @return The decoded path component of this URI, - * or null if the path is undefined + * or {@code null} if the path is undefined */ public String getPath() { if ((decodedPath == null) && (path != null)) @@ -1326,7 +1319,7 @@ * characters.

                * * @return The raw query component of this URI, - * or null if the query is undefined + * or {@code null} if the query is undefined */ public String getRawQuery() { return query; @@ -1340,7 +1333,7 @@ * escaped octets are decoded.

                * * @return The decoded query component of this URI, - * or null if the query is undefined + * or {@code null} if the query is undefined */ public String getQuery() { if ((decodedQuery == null) && (query != null)) @@ -1355,7 +1348,7 @@ * characters.

                * * @return The raw fragment component of this URI, - * or null if the fragment is undefined + * or {@code null} if the fragment is undefined */ public String getRawFragment() { return fragment; @@ -1369,7 +1362,7 @@ * sequences of escaped octets are decoded.

                * * @return The decoded fragment component of this URI, - * or null if the fragment is undefined + * or {@code null} if the fragment is undefined */ public String getFragment() { if ((decodedFragment == null) && (fragment != null)) @@ -1384,7 +1377,7 @@ * Tests this URI for equality with another object. * *

                If the given object is not a URI then this method immediately - * returns false. + * returns {@code false}. * *

                For two URIs to be considered equal requires that either both are * opaque or both are hierarchical. Their schemes must either both be @@ -1414,7 +1407,7 @@ * * @param ob The object to which this object is to be compared * - * @return true if, and only if, the given object is a URI that + * @return {@code true} if, and only if, the given object is a URI that * is identical to this URI */ public boolean equals(Object ob) { @@ -1495,7 +1488,7 @@ * *

                The ordering of URIs is defined as follows:

                * - *
                  + *
                    * *
                  • Two URIs with different schemes are ordered according the * ordering of their schemes, without regard to case.

                  • @@ -1513,7 +1506,7 @@ *
                  • Two hierarchical URIs with identical schemes are ordered * according to the ordering of their authority components:

                    * - *
                      + *
                        * *
                      • If both authority components are server-based then the URIs * are ordered according to their user-information components; if these @@ -1635,7 +1628,7 @@ /** * Saves the content of this URI to the given serial stream. * - *

                        The only serializable field of a URI instance is its string + *

                        The only serializable field of a URI instance is its {@code string} * field. That field is given a value, if it does not have one already, * and then the {@link java.io.ObjectOutputStream#defaultWriteObject()} * method of the given object-output stream is invoked.

                        @@ -1654,7 +1647,7 @@ * Reconstitutes a URI from the given serial stream. * *

                        The {@link java.io.ObjectInputStream#defaultReadObject()} method is - * invoked to read the value of the string field. The result is + * invoked to read the value of the {@code string} field. The result is * then parsed in the usual way. * * @param is The object-input stream from which this object diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/URISyntaxException.java --- a/jdk/src/share/classes/java/net/URISyntaxException.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/URISyntaxException.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -50,13 +50,13 @@ * @param input The input string * @param reason A string explaining why the input could not be parsed * @param index The index at which the parse error occurred, - * or -1 if the index is not known + * or {@code -1} if the index is not known * * @throws NullPointerException - * If either the input or reason strings are null + * If either the input or reason strings are {@code null} * * @throws IllegalArgumentException - * If the error index is less than -1 + * If the error index is less than {@code -1} */ public URISyntaxException(String input, String reason, int index) { super(reason); @@ -70,13 +70,13 @@ /** * Constructs an instance from the given input string and reason. The - * resulting object will have an error index of -1. + * resulting object will have an error index of {@code -1}. * * @param input The input string * @param reason A string explaining why the input could not be parsed * * @throws NullPointerException - * If either the input or reason strings are null + * If either the input or reason strings are {@code null} */ public URISyntaxException(String input, String reason) { this(input, reason, -1); @@ -102,7 +102,7 @@ /** * Returns an index into the input string of the position at which the - * parse error occurred, or -1 if this position is not known. + * parse error occurred, or {@code -1} if this position is not known. * * @return The error index */ @@ -113,8 +113,8 @@ /** * Returns a string describing the parse error. The resulting string * consists of the reason string followed by a colon character - * (':'), a space, and the input string. If the error index is - * defined then the string " at index " followed by the index, in + * ({@code ':'}), a space, and the input string. If the error index is + * defined then the string {@code " at index "} followed by the index, in * decimal, is inserted after the reason string and before the colon * character. * diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/URL.java --- a/jdk/src/share/classes/java/net/URL.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/URL.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -32,7 +32,7 @@ import sun.security.util.SecurityConstants; /** - * Class URL represents a Uniform Resource + * Class {@code URL} represents a Uniform Resource * Locator, a pointer to a "resource" on the World * Wide Web. A resource can be something as simple as a file or a * directory, or it can be a reference to a more complicated object, @@ -49,10 +49,10 @@ * *

                        * The URL above indicates that the protocol to use is - * http (HyperText Transfer Protocol) and that the + * {@code http} (HyperText Transfer Protocol) and that the * information resides on a host machine named - * www.example.com. The information on that host - * machine is named /docs/resource1.html. The exact + * {@code www.example.com}. The information on that host + * machine is named {@code /docs/resource1.html}. The exact * meaning of this name on the host machine is both protocol * dependent and host dependent. The information normally resides in * a file, but it could be generated on the fly. This component of @@ -62,13 +62,13 @@ * port number to which the TCP connection is made on the remote host * machine. If the port is not specified, the default port for * the protocol is used instead. For example, the default port for - * http is 80. An alternative port could be + * {@code http} is {@code 80}. An alternative port could be * specified as: *

                          *     http://www.example.com:1080/docs/resource1.html
                          * 
                        *

                        - * The syntax of URL is defined by RFC 2396: Uniform * Resource Identifiers (URI): Generic Syntax, amended by RFC 2732: Format for @@ -86,7 +86,7 @@ * This fragment is not technically part of the URL. Rather, it * indicates that after the specified resource is retrieved, the * application is specifically interested in that part of the - * document that has the tag chapter1 attached to it. The + * document that has the tag {@code chapter1} attached to it. The * meaning of a tag is resource specific. *

                        * An application can also specify a "relative URL", @@ -170,8 +170,8 @@ private int port = -1; /** - * The specified file name on that host. file is - * defined as path[?query] + * The specified file name on that host. {@code file} is + * defined as {@code path[?query]} * @serial */ private String file; @@ -220,42 +220,42 @@ private int hashCode = -1; /** - * Creates a URL object from the specified - * protocol, host, port - * number, and file.

                        + * Creates a {@code URL} object from the specified + * {@code protocol}, {@code host}, {@code port} + * number, and {@code file}.

                        * - * host can be expressed as a host name or a literal + * {@code host} can be expressed as a host name or a literal * IP address. If IPv6 literal address is used, it should be - * enclosed in square brackets ('[' and ']'), as + * enclosed in square brackets ({@code '['} and {@code ']'}), as * specified by RFC 2732; * However, the literal IPv6 address format defined in RFC 2373: IP * Version 6 Addressing Architecture is also accepted.

                        * - * Specifying a port number of -1 + * Specifying a {@code port} number of {@code -1} * indicates that the URL should use the default port for the * protocol.

                        * * If this is the first URL object being created with the specified * protocol, a stream protocol handler object, an instance of - * class URLStreamHandler, is created for that protocol: + * class {@code URLStreamHandler}, is created for that protocol: *

                          *
                        1. If the application has previously set up an instance of - * URLStreamHandlerFactory as the stream handler factory, - * then the createURLStreamHandler method of that instance + * {@code URLStreamHandlerFactory} as the stream handler factory, + * then the {@code createURLStreamHandler} method of that instance * is called with the protocol string as an argument to create the * stream protocol handler. - *
                        2. If no URLStreamHandlerFactory has yet been set up, - * or if the factory's createURLStreamHandler method - * returns null, then the constructor finds the + *
                        3. If no {@code URLStreamHandlerFactory} has yet been set up, + * or if the factory's {@code createURLStreamHandler} method + * returns {@code null}, then the constructor finds the * value of the system property: *
                                *         java.protocol.handler.pkgs
                                *     
                          - * If the value of that system property is not null, + * If the value of that system property is not {@code null}, * it is interpreted as a list of packages separated by a vertical - * slash character '|'. The constructor tries to load + * slash character '{@code |}'. The constructor tries to load * the class named: *
                                *         <package>.<protocol>.Handler
                          @@ -263,7 +263,7 @@
                                *     where <package> is replaced by the name of the package
                                *     and <protocol> is replaced by the name of the protocol.
                                *     If this class does not exist, or if the class exists but it is not
                          -     *     a subclass of URLStreamHandler, then the next package
                          +     *     a subclass of {@code URLStreamHandler}, then the next package
                                *     in the list is tried.
                                * 
                        4. If the previous step fails to find a protocol handler, then the * constructor tries to load from a system default package. @@ -271,8 +271,8 @@ * <system default package>.<protocol>.Handler *
                        5. * If this class does not exist, or if the class exists but it is not a - * subclass of URLStreamHandler, then a - * MalformedURLException is thrown. + * subclass of {@code URLStreamHandler}, then a + * {@code MalformedURLException} is thrown. *
                        * *

                        Protocol handlers for the following protocols are guaranteed @@ -304,13 +304,13 @@ } /** - * Creates a URL from the specified protocol - * name, host name, and file name. The + * Creates a URL from the specified {@code protocol} + * name, {@code host} name, and {@code file} name. The * default port for the specified protocol is used. *

                        * This method is equivalent to calling the four-argument - * constructor with the arguments being protocol, - * host, -1, and file. + * constructor with the arguments being {@code protocol}, + * {@code host}, {@code -1}, and {@code file}. * * No validation of the inputs is performed by this constructor. * @@ -327,21 +327,21 @@ } /** - * Creates a URL object from the specified - * protocol, host, port - * number, file, and handler. Specifying - * a port number of -1 indicates that + * Creates a {@code URL} object from the specified + * {@code protocol}, {@code host}, {@code port} + * number, {@code file}, and {@code handler}. Specifying + * a {@code port} number of {@code -1} indicates that * the URL should use the default port for the protocol. Specifying - * a handler of null indicates that the URL + * a {@code handler} of {@code null} indicates that the URL * should use a default stream handler for the protocol, as outlined * for: * java.net.URL#URL(java.lang.String, java.lang.String, int, * java.lang.String) * *

                        If the handler is not null and there is a security manager, - * the security manager's checkPermission + * the security manager's {@code checkPermission} * method is called with a - * NetPermission("specifyStreamHandler") permission. + * {@code NetPermission("specifyStreamHandler")} permission. * This may result in a SecurityException. * * No validation of the inputs is performed by this constructor. @@ -354,7 +354,7 @@ * @exception MalformedURLException if an unknown protocol is specified. * @exception SecurityException * if a security manager exists and its - * checkPermission method doesn't allow + * {@code checkPermission} method doesn't allow * specifying a stream handler explicitly. * @see java.lang.System#getProperty(java.lang.String) * @see java.net.URL#setURLStreamHandlerFactory( @@ -417,15 +417,15 @@ } /** - * Creates a URL object from the String + * Creates a {@code URL} object from the {@code String} * representation. *

                        * This constructor is equivalent to a call to the two-argument - * constructor with a null first argument. + * constructor with a {@code null} first argument. * - * @param spec the String to parse as a URL. + * @param spec the {@code String} to parse as a URL. * @exception MalformedURLException if no protocol is specified, or an - * unknown protocol is found, or spec is null. + * unknown protocol is found, or {@code spec} is {@code null}. * @see java.net.URL#URL(java.net.URL, java.lang.String) */ public URL(String spec) throws MalformedURLException { @@ -470,9 +470,9 @@ * For a more detailed description of URL parsing, refer to RFC2396. * * @param context the context in which to parse the specification. - * @param spec the String to parse as a URL. + * @param spec the {@code String} to parse as a URL. * @exception MalformedURLException if no protocol is specified, or an - * unknown protocol is found, or spec is null. + * unknown protocol is found, or {@code spec} is {@code null}. * @see java.net.URL#URL(java.lang.String, java.lang.String, * int, java.lang.String) * @see java.net.URLStreamHandler @@ -489,13 +489,13 @@ * occurs as with the two argument constructor. * * @param context the context in which to parse the specification. - * @param spec the String to parse as a URL. + * @param spec the {@code String} to parse as a URL. * @param handler the stream handler for the URL. * @exception MalformedURLException if no protocol is specified, or an - * unknown protocol is found, or spec is null. + * unknown protocol is found, or {@code spec} is {@code null}. * @exception SecurityException * if a security manager exists and its - * checkPermission method doesn't allow + * {@code checkPermission} method doesn't allow * specifying a stream handler. * @see java.net.URL#URL(java.lang.String, java.lang.String, * int, java.lang.String) @@ -719,9 +719,9 @@ } /** - * Gets the query part of this URL. + * Gets the query part of this {@code URL}. * - * @return the query part of this URL, + * @return the query part of this {@code URL}, * or null if one does not exist * @since 1.3 */ @@ -730,9 +730,9 @@ } /** - * Gets the path part of this URL. + * Gets the path part of this {@code URL}. * - * @return the path part of this URL, or an + * @return the path part of this {@code URL}, or an * empty string if one does not exist * @since 1.3 */ @@ -741,9 +741,9 @@ } /** - * Gets the userInfo part of this URL. + * Gets the userInfo part of this {@code URL}. * - * @return the userInfo part of this URL, or + * @return the userInfo part of this {@code URL}, or * null if one does not exist * @since 1.3 */ @@ -752,9 +752,9 @@ } /** - * Gets the authority part of this URL. + * Gets the authority part of this {@code URL}. * - * @return the authority part of this URL + * @return the authority part of this {@code URL} * @since 1.3 */ public String getAuthority() { @@ -762,7 +762,7 @@ } /** - * Gets the port number of this URL. + * Gets the port number of this {@code URL}. * * @return the port number, or -1 if the port is not set */ @@ -772,7 +772,7 @@ /** * Gets the default port number of the protocol associated - * with this URL. If the URL scheme or the URLStreamHandler + * with this {@code URL}. If the URL scheme or the URLStreamHandler * for the URL do not define a default port number, * then -1 is returned. * @@ -784,35 +784,35 @@ } /** - * Gets the protocol name of this URL. + * Gets the protocol name of this {@code URL}. * - * @return the protocol of this URL. + * @return the protocol of this {@code URL}. */ public String getProtocol() { return protocol; } /** - * Gets the host name of this URL, if applicable. + * Gets the host name of this {@code URL}, if applicable. * The format of the host conforms to RFC 2732, i.e. for a * literal IPv6 address, this method will return the IPv6 address - * enclosed in square brackets ('[' and ']'). + * enclosed in square brackets ({@code '['} and {@code ']'}). * - * @return the host name of this URL. + * @return the host name of this {@code URL}. */ public String getHost() { return host; } /** - * Gets the file name of this URL. + * Gets the file name of this {@code URL}. * The returned file portion will be * the same as getPath(), plus the concatenation of * the value of getQuery(), if any. If there is * no query portion, this method and getPath() will * return identical results. * - * @return the file name of this URL, + * @return the file name of this {@code URL}, * or an empty string if one does not exist */ public String getFile() { @@ -821,10 +821,10 @@ /** * Gets the anchor (also known as the "reference") of this - * URL. + * {@code URL}. * * @return the anchor (also known as the "reference") of this - * URL, or null if one does not exist + * {@code URL}, or null if one does not exist */ public String getRef() { return ref; @@ -834,7 +834,7 @@ * Compares this URL for equality with another object.

                        * * If the given object is not a URL then this method immediately returns - * false.

                        + * {@code false}.

                        * * Two URL objects are equal if they have the same protocol, reference * equivalent hosts, have the same port number on the host, and the same @@ -848,12 +848,12 @@ * Since hosts comparison requires name resolution, this operation is a * blocking operation.

                        * - * Note: The defined behavior for equals is known to + * Note: The defined behavior for {@code equals} is known to * be inconsistent with virtual hosting in HTTP. * * @param obj the URL to compare against. - * @return true if the objects are the same; - * false otherwise. + * @return {@code true} if the objects are the same; + * {@code false} otherwise. */ public boolean equals(Object obj) { if (!(obj instanceof URL)) @@ -869,7 +869,7 @@ * The hash code is based upon all the URL components relevant for URL * comparison. As such, this operation is a blocking operation.

                        * - * @return a hash code for this URL. + * @return a hash code for this {@code URL}. */ public synchronized int hashCode() { if (hashCode != -1) @@ -882,21 +882,21 @@ /** * Compares two URLs, excluding the fragment component.

                        * - * Returns true if this URL and the - * other argument are equal without taking the + * Returns {@code true} if this {@code URL} and the + * {@code other} argument are equal without taking the * fragment component into consideration. * - * @param other the URL to compare against. - * @return true if they reference the same remote object; - * false otherwise. + * @param other the {@code URL} to compare against. + * @return {@code true} if they reference the same remote object; + * {@code false} otherwise. */ public boolean sameFile(URL other) { return handler.sameFile(this, other); } /** - * Constructs a string representation of this URL. The - * string is created by calling the toExternalForm + * Constructs a string representation of this {@code URL}. The + * string is created by calling the {@code toExternalForm} * method of the stream protocol handler for this object. * * @return a string representation of this object. @@ -909,8 +909,8 @@ } /** - * Constructs a string representation of this URL. The - * string is created by calling the toExternalForm + * Constructs a string representation of this {@code URL}. The + * string is created by calling the {@code toExternalForm} * method of the stream protocol handler for this object. * * @return a string representation of this object. @@ -924,7 +924,7 @@ /** * Returns a {@link java.net.URI} equivalent to this URL. - * This method functions in the same way as new URI (this.toString()). + * This method functions in the same way as {@code new URI (this.toString())}. *

                        Note, any URL instance that complies with RFC 2396 can be converted * to a URI. However, some URLs that are not strictly in compliance * can not be converted to a URI. @@ -984,7 +984,7 @@ * @param proxy the Proxy through which this connection * will be made. If direct connection is desired, * Proxy.NO_PROXY should be specified. - * @return a URLConnection to the URL. + * @return a {@code URLConnection} to the URL. * @exception IOException if an I/O exception occurs. * @exception SecurityException if a security manager is present * and the caller doesn't have permission to connect @@ -1022,8 +1022,8 @@ } /** - * Opens a connection to this URL and returns an - * InputStream for reading from that connection. This + * Opens a connection to this {@code URL} and returns an + * {@code InputStream} for reading from that connection. This * method is a shorthand for: *

                              *     openConnection().getInputStream()
                        @@ -1077,22 +1077,22 @@
                             static URLStreamHandlerFactory factory;
                         
                             /**
                        -     * Sets an application's URLStreamHandlerFactory.
                        +     * Sets an application's {@code URLStreamHandlerFactory}.
                              * This method can be called at most once in a given Java Virtual
                              * Machine.
                              *
                        -     *

                        The URLStreamHandlerFactory instance is used to + *

                        The {@code URLStreamHandlerFactory} instance is used to *construct a stream protocol handler from a protocol name. * *

                        If there is a security manager, this method first calls - * the security manager's checkSetFactory method + * the security manager's {@code checkSetFactory} method * to ensure the operation is allowed. * This could result in a SecurityException. * * @param fac the desired factory. * @exception Error if the application has already set a factory. * @exception SecurityException if a security manager exists and its - * checkSetFactory method doesn't allow + * {@code checkSetFactory} method doesn't allow * the operation. * @see java.net.URL#URL(java.lang.String, java.lang.String, * int, java.lang.String) diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/URLClassLoader.java --- a/jdk/src/share/classes/java/net/URLClassLoader.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/URLClassLoader.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -117,7 +117,7 @@ /** * Constructs a new URLClassLoader for the specified URLs using the - * default delegation parent ClassLoader. The URLs will + * default delegation parent {@code ClassLoader}. The URLs will * be searched in the order specified for classes and resources after * first searching in the parent class loader. Any URL that ends with * a '/' is assumed to refer to a directory. Otherwise, the URL is @@ -125,13 +125,13 @@ * as needed. * *

                        If there is a security manager, this method first - * calls the security manager's checkCreateClassLoader method + * calls the security manager's {@code checkCreateClassLoader} method * to ensure creation of a class loader is allowed. * * @param urls the URLs from which to load classes and resources * * @exception SecurityException if a security manager exists and its - * checkCreateClassLoader method doesn't allow + * {@code checkCreateClassLoader} method doesn't allow * creation of a class loader. * @see SecurityManager#checkCreateClassLoader */ @@ -165,7 +165,7 @@ * obtain protocol handlers when creating new jar URLs. * *

                        If there is a security manager, this method first - * calls the security manager's checkCreateClassLoader method + * calls the security manager's {@code checkCreateClassLoader} method * to ensure creation of a class loader is allowed. * * @param urls the URLs from which to load classes and resources @@ -173,7 +173,7 @@ * @param factory the URLStreamHandlerFactory to use when creating URLs * * @exception SecurityException if a security manager exists and its - * checkCreateClassLoader method doesn't allow + * {@code checkCreateClassLoader} method doesn't allow * creation of a class loader. * @see SecurityManager#checkCreateClassLoader */ @@ -217,7 +217,7 @@ * @param name * The resource name * - * @return An input stream for reading the resource, or null + * @return An input stream for reading the resource, or {@code null} * if the resource could not be found * * @since 1.7 @@ -273,7 +273,7 @@ * as suppressed exceptions of the first one caught, which is then re-thrown. * * @throws SecurityException if a security manager is set, and it denies - * {@link RuntimePermission}("closeClassLoader") + * {@link RuntimePermission}{@code ("closeClassLoader")} * * @since 1.7 */ @@ -316,7 +316,7 @@ * Appends the specified URL to the list of URLs to search for * classes and resources. *

                        - * If the URL specified is null or is already in the + * If the URL specified is {@code null} or is already in the * list of URLs, or if this loader is closed, then invoking this * method has no effect. * @@ -537,7 +537,7 @@ * Finds the resource with the specified name on the URL search path. * * @param name the name of the resource - * @return a URL for the resource, or null + * @return a {@code URL} for the resource, or {@code null} * if the resource could not be found, or if the loader is closed. */ public URL findResource(final String name) { @@ -560,7 +560,7 @@ * * @param name the resource name * @exception IOException if an I/O exception occurs - * @return an Enumeration of URLs + * @return an {@code Enumeration} of {@code URL}s * If the loader is closed, the Enumeration will be empty. */ public Enumeration findResources(final String name) @@ -699,9 +699,9 @@ /** * Creates a new instance of URLClassLoader for the specified * URLs and parent class loader. If a security manager is - * installed, the loadClass method of the URLClassLoader + * installed, the {@code loadClass} method of the URLClassLoader * returned by this method will invoke the - * SecurityManager.checkPackageAccess method before + * {@code SecurityManager.checkPackageAccess} method before * loading the class. * * @param urls the URLs to search for classes and resources @@ -725,9 +725,9 @@ /** * Creates a new instance of URLClassLoader for the specified * URLs and default parent class loader. If a security manager is - * installed, the loadClass method of the URLClassLoader + * installed, the {@code loadClass} method of the URLClassLoader * returned by this method will invoke the - * SecurityManager.checkPackageAccess before + * {@code SecurityManager.checkPackageAccess} before * loading the class. * * @param urls the URLs to search for classes and resources diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/URLConnection.java --- a/jdk/src/share/classes/java/net/URLConnection.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/URLConnection.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -40,15 +40,15 @@ import sun.net.www.MessageHeader; /** - * The abstract class URLConnection is the superclass + * The abstract class {@code URLConnection} is the superclass * of all classes that represent a communications link between the * application and a URL. Instances of this class can be used both to * read from and to write to the resource referenced by the URL. In * general, creating a connection to a URL is a multistep process: *

                        *

                        - * - * + * + * * *
                        openConnection()connect()
                        {@code openConnection()}{@code connect()}
                        Manipulate parameters that affect the connection to the remote * resource.Interact with the resource; query header fields and @@ -59,78 +59,78 @@ * *
                          *
                        1. The connection object is created by invoking the - * openConnection method on a URL. + * {@code openConnection} method on a URL. *
                        2. The setup parameters and general request properties are manipulated. *
                        3. The actual connection to the remote object is made, using the - * connect method. + * {@code connect} method. *
                        4. The remote object becomes available. The header fields and the contents * of the remote object can be accessed. *
                        *

                        * The setup parameters are modified using the following methods: *

                          - *
                        • setAllowUserInteraction - *
                        • setDoInput - *
                        • setDoOutput - *
                        • setIfModifiedSince - *
                        • setUseCaches + *
                        • {@code setAllowUserInteraction} + *
                        • {@code setDoInput} + *
                        • {@code setDoOutput} + *
                        • {@code setIfModifiedSince} + *
                        • {@code setUseCaches} *
                        *

                        * and the general request properties are modified using the method: *

                          - *
                        • setRequestProperty + *
                        • {@code setRequestProperty} *
                        *

                        - * Default values for the AllowUserInteraction and - * UseCaches parameters can be set using the methods - * setDefaultAllowUserInteraction and - * setDefaultUseCaches. + * Default values for the {@code AllowUserInteraction} and + * {@code UseCaches} parameters can be set using the methods + * {@code setDefaultAllowUserInteraction} and + * {@code setDefaultUseCaches}. *

                        - * Each of the above set methods has a corresponding - * get method to retrieve the value of the parameter or + * Each of the above {@code set} methods has a corresponding + * {@code get} method to retrieve the value of the parameter or * general request property. The specific parameters and general * request properties that are applicable are protocol specific. *

                        * The following methods are used to access the header fields and * the contents after the connection is made to the remote object: *

                          - *
                        • getContent - *
                        • getHeaderField - *
                        • getInputStream - *
                        • getOutputStream + *
                        • {@code getContent} + *
                        • {@code getHeaderField} + *
                        • {@code getInputStream} + *
                        • {@code getOutputStream} *
                        *

                        * Certain header fields are accessed frequently. The methods: *

                          - *
                        • getContentEncoding - *
                        • getContentLength - *
                        • getContentType - *
                        • getDate - *
                        • getExpiration - *
                        • getLastModifed + *
                        • {@code getContentEncoding} + *
                        • {@code getContentLength} + *
                        • {@code getContentType} + *
                        • {@code getDate} + *
                        • {@code getExpiration} + *
                        • {@code getLastModifed} *
                        *

                        * provide convenient access to these fields. The - * getContentType method is used by the - * getContent method to determine the type of the remote + * {@code getContentType} method is used by the + * {@code getContent} method to determine the type of the remote * object; subclasses may find it convenient to override the - * getContentType method. + * {@code getContentType} method. *

                        * In the common case, all of the pre-connection parameters and * general request properties can be ignored: the pre-connection * parameters and request properties default to sensible values. For * most clients of this interface, there are only two interesting - * methods: getInputStream and getContent, - * which are mirrored in the URL class by convenience methods. + * methods: {@code getInputStream} and {@code getContent}, + * which are mirrored in the {@code URL} class by convenience methods. *

                        * More information on the request properties and header fields of - * an http connection can be found at: + * an {@code http} connection can be found at: *

                          * http://www.ietf.org/rfc/rfc2616.txt
                          * 
                        * - * Invoking the close() methods on the InputStream or OutputStream of an - * URLConnection after a request may free network resources associated with this + * Invoking the {@code close()} methods on the {@code InputStream} or {@code OutputStream} of an + * {@code URLConnection} after a request may free network resources associated with this * instance, unless particular protocol specifications specify different behaviours * for it. * @@ -164,10 +164,10 @@ * which this connection is opened. *

                        * The value of this field can be accessed by the - * getURL method. + * {@code getURL} method. *

                        * The default value of this variable is the value of the URL - * argument in the URLConnection constructor. + * argument in the {@code URLConnection} constructor. * * @see java.net.URLConnection#getURL() * @see java.net.URLConnection#url @@ -175,14 +175,14 @@ protected URL url; /** - * This variable is set by the setDoInput method. Its - * value is returned by the getDoInput method. + * This variable is set by the {@code setDoInput} method. Its + * value is returned by the {@code getDoInput} method. *

                        * A URL connection can be used for input and/or output. Setting the - * doInput flag to true indicates that + * {@code doInput} flag to {@code true} indicates that * the application intends to read data from the URL connection. *

                        - * The default value of this field is true. + * The default value of this field is {@code true}. * * @see java.net.URLConnection#getDoInput() * @see java.net.URLConnection#setDoInput(boolean) @@ -190,14 +190,14 @@ protected boolean doInput = true; /** - * This variable is set by the setDoOutput method. Its - * value is returned by the getDoOutput method. + * This variable is set by the {@code setDoOutput} method. Its + * value is returned by the {@code getDoOutput} method. *

                        * A URL connection can be used for input and/or output. Setting the - * doOutput flag to true indicates + * {@code doOutput} flag to {@code true} indicates * that the application intends to write data to the URL connection. *

                        - * The default value of this field is false. + * The default value of this field is {@code false}. * * @see java.net.URLConnection#getDoOutput() * @see java.net.URLConnection#setDoOutput(boolean) @@ -207,17 +207,17 @@ private static boolean defaultAllowUserInteraction = false; /** - * If true, this URL is being examined in + * If {@code true}, this {@code URL} is being examined in * a context in which it makes sense to allow user interactions such - * as popping up an authentication dialog. If false, + * as popping up an authentication dialog. If {@code false}, * then no user interaction is allowed. *

                        * The value of this field can be set by the - * setAllowUserInteraction method. + * {@code setAllowUserInteraction} method. * Its value is returned by the - * getAllowUserInteraction method. + * {@code getAllowUserInteraction} method. * Its default value is the value of the argument in the last invocation - * of the setDefaultAllowUserInteraction method. + * of the {@code setDefaultAllowUserInteraction} method. * * @see java.net.URLConnection#getAllowUserInteraction() * @see java.net.URLConnection#setAllowUserInteraction(boolean) @@ -228,15 +228,15 @@ private static boolean defaultUseCaches = true; /** - * If true, the protocol is allowed to use caching - * whenever it can. If false, the protocol must always + * If {@code true}, the protocol is allowed to use caching + * whenever it can. If {@code false}, the protocol must always * try to get a fresh copy of the object. *

                        - * This field is set by the setUseCaches method. Its - * value is returned by the getUseCaches method. + * This field is set by the {@code setUseCaches} method. Its + * value is returned by the {@code getUseCaches} method. *

                        * Its default value is the value given in the last invocation of the - * setDefaultUseCaches method. + * {@code setDefaultUseCaches} method. * * @see java.net.URLConnection#setUseCaches(boolean) * @see java.net.URLConnection#getUseCaches() @@ -252,11 +252,11 @@ * January 1, 1970, GMT. The object is fetched only if it has been * modified more recently than that time. *

                        - * This variable is set by the setIfModifiedSince + * This variable is set by the {@code setIfModifiedSince} * method. Its value is returned by the - * getIfModifiedSince method. + * {@code getIfModifiedSince} method. *

                        - * The default value of this field is 0, indicating + * The default value of this field is {@code 0}, indicating * that the fetching must always occur. * * @see java.net.URLConnection#getIfModifiedSince() @@ -265,8 +265,8 @@ protected long ifModifiedSince = 0; /** - * If false, this connection object has not created a - * communications link to the specified URL. If true, + * If {@code false}, this connection object has not created a + * communications link to the specified URL. If {@code true}, * the communications link has been established. */ protected boolean connected = false; @@ -320,13 +320,13 @@ * Sets the FileNameMap. *

                        * If there is a security manager, this method first calls - * the security manager's checkSetFactory method + * the security manager's {@code checkSetFactory} method * to ensure the operation is allowed. * This could result in a SecurityException. * * @param map the FileNameMap to be set * @exception SecurityException if a security manager exists and its - * checkSetFactory method doesn't allow the operation. + * {@code checkSetFactory} method doesn't allow the operation. * @see SecurityManager#checkSetFactory * @see #getFileNameMap() * @since 1.2 @@ -341,9 +341,9 @@ * Opens a communications link to the resource referenced by this * URL, if such a connection has not already been established. *

                        - * If the connect method is called when the connection - * has already been opened (indicated by the connected - * field having the value true), the call is ignored. + * If the {@code connect} method is called when the connection + * has already been opened (indicated by the {@code connected} + * field having the value {@code true}), the call is ignored. *

                        * URLConnection objects go through two phases: first they are * created, then they are connected. After being created, and @@ -375,7 +375,7 @@ * the specified timeout. To see the connect timeout set, please * call getConnectTimeout(). * - * @param timeout an int that specifies the connect + * @param timeout an {@code int} that specifies the connect * timeout value in milliseconds * @throws IllegalArgumentException if the timeout parameter is negative * @@ -396,7 +396,7 @@ * 0 return implies that the option is disabled * (i.e., timeout of infinity). * - * @return an int that indicates the connect timeout + * @return an {@code int} that indicates the connect timeout * value in milliseconds * @see #setConnectTimeout(int) * @see #connect() @@ -418,7 +418,7 @@ * specified timeout. To see the read timeout set, please call * getReadTimeout(). * - * @param timeout an int that specifies the timeout + * @param timeout an {@code int} that specifies the timeout * value to be used in milliseconds * @throws IllegalArgumentException if the timeout parameter is negative * @@ -437,7 +437,7 @@ * Returns setting for read timeout. 0 return implies that the * option is disabled (i.e., timeout of infinity). * - * @return an int that indicates the read timeout + * @return an {@code int} that indicates the read timeout * value in milliseconds * * @see #setReadTimeout(int) @@ -459,10 +459,10 @@ } /** - * Returns the value of this URLConnection's URL + * Returns the value of this {@code URLConnection}'s {@code URL} * field. * - * @return the value of this URLConnection's URL + * @return the value of this {@code URLConnection}'s {@code URL} * field. * @see java.net.URLConnection#url */ @@ -471,7 +471,7 @@ } /** - * Returns the value of the content-length header field. + * Returns the value of the {@code content-length} header field. *

                        * Note: {@link #getContentLengthLong() getContentLengthLong()} * should be preferred over this method, since it returns a {@code long} @@ -489,11 +489,11 @@ } /** - * Returns the value of the content-length header field as a + * Returns the value of the {@code content-length} header field as a * long. * * @return the content length of the resource that this connection's URL - * references, or -1 if the content length is + * references, or {@code -1} if the content length is * not known. * @since 7.0 */ @@ -502,10 +502,10 @@ } /** - * Returns the value of the content-type header field. + * Returns the value of the {@code content-type} header field. * * @return the content type of the resource that the URL references, - * or null if not known. + * or {@code null} if not known. * @see java.net.URLConnection#getHeaderField(java.lang.String) */ public String getContentType() { @@ -513,10 +513,10 @@ } /** - * Returns the value of the content-encoding header field. + * Returns the value of the {@code content-encoding} header field. * * @return the content encoding of the resource that the URL references, - * or null if not known. + * or {@code null} if not known. * @see java.net.URLConnection#getHeaderField(java.lang.String) */ public String getContentEncoding() { @@ -524,7 +524,7 @@ } /** - * Returns the value of the expires header field. + * Returns the value of the {@code expires} header field. * * @return the expiration date of the resource that this URL references, * or 0 if not known. The value is the number of milliseconds since @@ -536,10 +536,10 @@ } /** - * Returns the value of the date header field. + * Returns the value of the {@code date} header field. * * @return the sending date of the resource that the URL references, - * or 0 if not known. The value returned is the + * or {@code 0} if not known. The value returned is the * number of milliseconds since January 1, 1970 GMT. * @see java.net.URLConnection#getHeaderField(java.lang.String) */ @@ -548,11 +548,11 @@ } /** - * Returns the value of the last-modified header field. + * Returns the value of the {@code last-modified} header field. * The result is the number of milliseconds since January 1, 1970 GMT. * * @return the date the resource referenced by this - * URLConnection was last modified, or 0 if not known. + * {@code URLConnection} was last modified, or 0 if not known. * @see java.net.URLConnection#getHeaderField(java.lang.String) */ public long getLastModified() { @@ -567,7 +567,7 @@ * * * @param name the name of a header field. - * @return the value of the named header field, or null + * @return the value of the named header field, or {@code null} * if there is no such field in the header. */ public String getHeaderField(String name) { @@ -591,15 +591,15 @@ /** * Returns the value of the named field parsed as a number. *

                        - * This form of getHeaderField exists because some - * connection types (e.g., http-ng) have pre-parsed + * This form of {@code getHeaderField} exists because some + * connection types (e.g., {@code http-ng}) have pre-parsed * headers. Classes for that connection type can override this method * and short-circuit the parsing. * * @param name the name of the header field. * @param Default the default value. * @return the value of the named field, parsed as an integer. The - * Default value is returned if the field is + * {@code Default} value is returned if the field is * missing or malformed. */ public int getHeaderFieldInt(String name, int Default) { @@ -613,15 +613,15 @@ /** * Returns the value of the named field parsed as a number. *

                        - * This form of getHeaderField exists because some - * connection types (e.g., http-ng) have pre-parsed + * This form of {@code getHeaderField} exists because some + * connection types (e.g., {@code http-ng}) have pre-parsed * headers. Classes for that connection type can override this method * and short-circuit the parsing. * * @param name the name of the header field. * @param Default the default value. * @return the value of the named field, parsed as a long. The - * Default value is returned if the field is + * {@code Default} value is returned if the field is * missing or malformed. * @since 7.0 */ @@ -638,15 +638,15 @@ * The result is the number of milliseconds since January 1, 1970 GMT * represented by the named field. *

                        - * This form of getHeaderField exists because some - * connection types (e.g., http-ng) have pre-parsed + * This form of {@code getHeaderField} exists because some + * connection types (e.g., {@code http-ng}) have pre-parsed * headers. Classes for that connection type can override this method * and short-circuit the parsing. * * @param name the name of the header field. * @param Default a default value. * @return the value of the field, parsed as a date. The value of the - * Default argument is returned if the field is + * {@code Default} argument is returned if the field is * missing or malformed. */ @SuppressWarnings("deprecation") @@ -659,12 +659,12 @@ } /** - * Returns the key for the nth header field. - * It returns null if there are fewer than n+1 fields. + * Returns the key for the {@code n}th header field. + * It returns {@code null} if there are fewer than {@code n+1} fields. * * @param n an index, where {@code n>=0} - * @return the key for the nth header field, - * or null if there are fewer than n+1 + * @return the key for the {@code n}th header field, + * or {@code null} if there are fewer than {@code n+1} * fields. */ public String getHeaderFieldKey(int n) { @@ -672,17 +672,17 @@ } /** - * Returns the value for the nth header field. - * It returns null if there are fewer than - * n+1fields. + * Returns the value for the {@code n}th header field. + * It returns {@code null} if there are fewer than + * {@code n+1}fields. *

                        * This method can be used in conjunction with the * {@link #getHeaderFieldKey(int) getHeaderFieldKey} method to iterate through all * the headers in the message. * * @param n an index, where {@code n>=0} - * @return the value of the nth header field - * or null if there are fewer than n+1 fields + * @return the value of the {@code n}th header field + * or {@code null} if there are fewer than {@code n+1} fields * @see java.net.URLConnection#getHeaderFieldKey(int) */ public String getHeaderField(int n) { @@ -693,35 +693,35 @@ * Retrieves the contents of this URL connection. *

                        * This method first determines the content type of the object by - * calling the getContentType method. If this is + * calling the {@code getContentType} method. If this is * the first time that the application has seen that specific content * type, a content handler for that content type is created: *

                          *
                        1. If the application has set up a content handler factory instance - * using the setContentHandlerFactory method, the - * createContentHandler method of that instance is called + * using the {@code setContentHandlerFactory} method, the + * {@code createContentHandler} method of that instance is called * with the content type as an argument; the result is a content * handler for that content type. *
                        2. If no content handler factory has yet been set up, or if the - * factory's createContentHandler method returns - * null, then the application loads the class named: + * factory's {@code createContentHandler} method returns + * {@code null}, then the application loads the class named: *
                                *         sun.net.www.content.<contentType>
                                *     
                          * where <contentType> is formed by taking the * content-type string, replacing all slash characters with a - * period ('.'), and all other non-alphanumeric characters - * with the underscore character '_'. The alphanumeric + * {@code period} ('.'), and all other non-alphanumeric characters + * with the underscore character '{@code _}'. The alphanumeric * characters are specifically the 26 uppercase ASCII letters - * 'A' through 'Z', the 26 lowercase ASCII - * letters 'a' through 'z', and the 10 ASCII - * digits '0' through '9'. If the specified + * '{@code A}' through '{@code Z}', the 26 lowercase ASCII + * letters '{@code a}' through '{@code z}', and the 10 ASCII + * digits '{@code 0}' through '{@code 9}'. If the specified * class does not exist, or is not a subclass of - * ContentHandler, then an - * UnknownServiceException is thrown. + * {@code ContentHandler}, then an + * {@code UnknownServiceException} is thrown. *
                        * - * @return the object fetched. The instanceof operator + * @return the object fetched. The {@code instanceof} operator * should be used to determine the specific kind of object * returned. * @exception IOException if an I/O error occurs while @@ -743,12 +743,12 @@ /** * Retrieves the contents of this URL connection. * - * @param classes the Class array + * @param classes the {@code Class} array * indicating the requested types * @return the object fetched that is the first match of the type * specified in the classes array. null if none of * the requested types are supported. - * The instanceof operator should be used to + * The {@code instanceof} operator should be used to * determine the specific kind of object returned. * @exception IOException if an I/O error occurs while * getting the content. @@ -773,12 +773,12 @@ * necessary to make the connection represented by this * object. This method returns null if no permission is * required to make the connection. By default, this method - * returns java.security.AllPermission. Subclasses + * returns {@code java.security.AllPermission}. Subclasses * should override this method and return the permission * that best represents the permission required to make a - * a connection to the URL. For example, a URLConnection - * representing a file: URL would return a - * java.io.FilePermission object. + * a connection to the URL. For example, a {@code URLConnection} + * representing a {@code file:} URL would return a + * {@code java.io.FilePermission} object. * *

                        The permission returned may dependent upon the state of the * connection. For example, the permission before connecting may be @@ -844,17 +844,17 @@ } /** - * Returns a String representation of this URL connection. + * Returns a {@code String} representation of this URL connection. * - * @return a string representation of this URLConnection. + * @return a string representation of this {@code URLConnection}. */ public String toString() { return this.getClass().getName() + ":" + url; } /** - * Sets the value of the doInput field for this - * URLConnection to the specified value. + * Sets the value of the {@code doInput} field for this + * {@code URLConnection} to the specified value. *

                        * A URL connection can be used for input and/or output. Set the DoInput * flag to true if you intend to use the URL connection for input, @@ -872,11 +872,11 @@ } /** - * Returns the value of this URLConnection's - * doInput flag. + * Returns the value of this {@code URLConnection}'s + * {@code doInput} flag. * - * @return the value of this URLConnection's - * doInput flag. + * @return the value of this {@code URLConnection}'s + * {@code doInput} flag. * @see #setDoInput(boolean) */ public boolean getDoInput() { @@ -884,8 +884,8 @@ } /** - * Sets the value of the doOutput field for this - * URLConnection to the specified value. + * Sets the value of the {@code doOutput} field for this + * {@code URLConnection} to the specified value. *

                        * A URL connection can be used for input and/or output. Set the DoOutput * flag to true if you intend to use the URL connection for output, @@ -902,11 +902,11 @@ } /** - * Returns the value of this URLConnection's - * doOutput flag. + * Returns the value of this {@code URLConnection}'s + * {@code doOutput} flag. * - * @return the value of this URLConnection's - * doOutput flag. + * @return the value of this {@code URLConnection}'s + * {@code doOutput} flag. * @see #setDoOutput(boolean) */ public boolean getDoOutput() { @@ -914,8 +914,8 @@ } /** - * Set the value of the allowUserInteraction field of - * this URLConnection. + * Set the value of the {@code allowUserInteraction} field of + * this {@code URLConnection}. * * @param allowuserinteraction the new value. * @throws IllegalStateException if already connected @@ -928,10 +928,10 @@ } /** - * Returns the value of the allowUserInteraction field for + * Returns the value of the {@code allowUserInteraction} field for * this object. * - * @return the value of the allowUserInteraction field for + * @return the value of the {@code allowUserInteraction} field for * this object. * @see #setAllowUserInteraction(boolean) */ @@ -941,8 +941,8 @@ /** * Sets the default value of the - * allowUserInteraction field for all future - * URLConnection objects to the specified value. + * {@code allowUserInteraction} field for all future + * {@code URLConnection} objects to the specified value. * * @param defaultallowuserinteraction the new value. * @see #getDefaultAllowUserInteraction() @@ -952,14 +952,14 @@ } /** - * Returns the default value of the allowUserInteraction + * Returns the default value of the {@code allowUserInteraction} * field. *

                        * Ths default is "sticky", being a part of the static state of all * URLConnections. This flag applies to the next, and all following * URLConnections that are created. * - * @return the default value of the allowUserInteraction + * @return the default value of the {@code allowUserInteraction} * field. * @see #setDefaultAllowUserInteraction(boolean) */ @@ -968,8 +968,8 @@ } /** - * Sets the value of the useCaches field of this - * URLConnection to the specified value. + * Sets the value of the {@code useCaches} field of this + * {@code URLConnection} to the specified value. *

                        * Some protocols do caching of documents. Occasionally, it is important * to be able to "tunnel through" and ignore the caches (e.g., the @@ -979,7 +979,7 @@ * The default value comes from DefaultUseCaches, which defaults to * true. * - * @param usecaches a boolean indicating whether + * @param usecaches a {@code boolean} indicating whether * or not to allow caching * @throws IllegalStateException if already connected * @see #getUseCaches() @@ -991,11 +991,11 @@ } /** - * Returns the value of this URLConnection's - * useCaches field. + * Returns the value of this {@code URLConnection}'s + * {@code useCaches} field. * - * @return the value of this URLConnection's - * useCaches field. + * @return the value of this {@code URLConnection}'s + * {@code useCaches} field. * @see #setUseCaches(boolean) */ public boolean getUseCaches() { @@ -1003,8 +1003,8 @@ } /** - * Sets the value of the ifModifiedSince field of - * this URLConnection to the specified value. + * Sets the value of the {@code ifModifiedSince} field of + * this {@code URLConnection} to the specified value. * * @param ifmodifiedsince the new value. * @throws IllegalStateException if already connected @@ -1017,9 +1017,9 @@ } /** - * Returns the value of this object's ifModifiedSince field. + * Returns the value of this object's {@code ifModifiedSince} field. * - * @return the value of this object's ifModifiedSince field. + * @return the value of this object's {@code ifModifiedSince} field. * @see #setIfModifiedSince(long) */ public long getIfModifiedSince() { @@ -1027,15 +1027,15 @@ } /** - * Returns the default value of a URLConnection's - * useCaches flag. + * Returns the default value of a {@code URLConnection}'s + * {@code useCaches} flag. *

                        * Ths default is "sticky", being a part of the static state of all * URLConnections. This flag applies to the next, and all following * URLConnections that are created. * - * @return the default value of a URLConnection's - * useCaches flag. + * @return the default value of a {@code URLConnection}'s + * {@code useCaches} flag. * @see #setDefaultUseCaches(boolean) */ public boolean getDefaultUseCaches() { @@ -1043,7 +1043,7 @@ } /** - * Sets the default value of the useCaches field to the + * Sets the default value of the {@code useCaches} field to the * specified value. * * @param defaultusecaches the new value. @@ -1063,7 +1063,7 @@ * properties to be appended into a single property. * * @param key the keyword by which the request is known - * (e.g., "Accept"). + * (e.g., "{@code Accept}"). * @param value the value associated with it. * @throws IllegalStateException if already connected * @throws NullPointerException if key is null @@ -1087,7 +1087,7 @@ * existing values associated with the same key. * * @param key the keyword by which the request is known - * (e.g., "Accept"). + * (e.g., "{@code Accept}"). * @param value the value associated with it. * @throws IllegalStateException if already connected * @throws NullPointerException if key is null @@ -1151,11 +1151,11 @@ /** * Sets the default value of a general request property. When a - * URLConnection is created, it is initialized with + * {@code URLConnection} is created, it is initialized with * these properties. * * @param key the keyword by which the request is known - * (e.g., "Accept"). + * (e.g., "{@code Accept}"). * @param value the value associated with the key. * * @see java.net.URLConnection#setRequestProperty(java.lang.String,java.lang.String) @@ -1197,21 +1197,21 @@ static ContentHandlerFactory factory; /** - * Sets the ContentHandlerFactory of an + * Sets the {@code ContentHandlerFactory} of an * application. It can be called at most once by an application. *

                        - * The ContentHandlerFactory instance is used to + * The {@code ContentHandlerFactory} instance is used to * construct a content handler from a content type *

                        * If there is a security manager, this method first calls - * the security manager's checkSetFactory method + * the security manager's {@code checkSetFactory} method * to ensure the operation is allowed. * This could result in a SecurityException. * * @param fac the desired factory. * @exception Error if the factory has already been defined. * @exception SecurityException if a security manager exists and its - * checkSetFactory method doesn't allow the operation. + * {@code checkSetFactory} method doesn't allow the operation. * @see java.net.ContentHandlerFactory * @see java.net.URLConnection#getContent() * @see SecurityManager#checkSetFactory @@ -1374,7 +1374,7 @@ * Tries to determine the content type of an object, based * on the specified "file" component of a URL. * This is a convenience method that can be used by - * subclasses that override the getContentType method. + * subclasses that override the {@code getContentType} method. * * @param fname a filename. * @return a guess as to what the content type of the object is, @@ -1389,16 +1389,16 @@ * Tries to determine the type of an input stream based on the * characters at the beginning of the input stream. This method can * be used by subclasses that override the - * getContentType method. + * {@code getContentType} method. *

                        * Ideally, this routine would not be needed. But many - * http servers return the incorrect content type; in + * {@code http} servers return the incorrect content type; in * addition, there are many nonstandard extensions. Direct inspection * of the bytes to determine the content type is often more accurate - * than believing the content type claimed by the http server. + * than believing the content type claimed by the {@code http} server. * * @param is an input stream that supports marks. - * @return a guess at the content type, or null if none + * @return a guess at the content type, or {@code null} if none * can be determined. * @exception IOException if an I/O error occurs while reading the * input stream. diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/URLDecoder.java --- a/jdk/src/share/classes/java/net/URLDecoder.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/URLDecoder.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,27 +34,27 @@ *

                        * The conversion process is the reverse of that used by the URLEncoder class. It is assumed * that all characters in the encoded string are one of the following: - * "a" through "z", - * "A" through "Z", - * "0" through "9", and - * "-", "_", - * ".", and "*". The - * character "%" is allowed but is interpreted + * "{@code a}" through "{@code z}", + * "{@code A}" through "{@code Z}", + * "{@code 0}" through "{@code 9}", and + * "{@code -}", "{@code _}", + * "{@code .}", and "{@code *}". The + * character "{@code %}" is allowed but is interpreted * as the start of a special escaped sequence. *

                        * The following rules are applied in the conversion: *

                        *

                          - *
                        • The alphanumeric characters "a" through - * "z", "A" through - * "Z" and "0" - * through "9" remain the same. - *
                        • The special characters ".", - * "-", "*", and - * "_" remain the same. - *
                        • The plus sign "+" is converted into a - * space character " " . - *
                        • A sequence of the form "%xy" will be + *
                        • The alphanumeric characters "{@code a}" through + * "{@code z}", "{@code A}" through + * "{@code Z}" and "{@code 0}" + * through "{@code 9}" remain the same. + *
                        • The special characters "{@code .}", + * "{@code -}", "{@code *}", and + * "{@code _}" remain the same. + *
                        • The plus sign "{@code +}" is converted into a + * space character "   " . + *
                        • A sequence of the form "{@code %xy}" will be * treated as representing a byte where xy is the two-digit * hexadecimal representation of the 8 bits. Then, all substrings * that contain one or more of these byte sequences consecutively @@ -66,7 +66,7 @@ *

                          * There are two possible ways in which this decoder could deal with * illegal strings. It could either leave illegal characters alone or - * it could throw an {@link java.lang.IllegalArgumentException}. + * it could throw an {@link java.lang.IllegalArgumentException}. * Which approach the decoder takes is left to the * implementation. * @@ -81,15 +81,15 @@ static String dfltEncName = URLEncoder.dfltEncName; /** - * Decodes a x-www-form-urlencoded string. + * Decodes a {@code x-www-form-urlencoded} string. * The platform's default encoding is used to determine what characters * are represented by any consecutive sequences of the form - * "%xy". - * @param s the String to decode + * "{@code %xy}". + * @param s the {@code String} to decode * @deprecated The resulting string may vary depending on the platform's * default encoding. Instead, use the decode(String,String) method * to specify the encoding. - * @return the newly decoded String + * @return the newly decoded {@code String} */ @Deprecated public static String decode(String s) { @@ -106,11 +106,11 @@ } /** - * Decodes a application/x-www-form-urlencoded string using a specific + * Decodes a {@code application/x-www-form-urlencoded} string using a specific * encoding scheme. * The supplied encoding is used to determine * what characters are represented by any consecutive sequences of the - * form "%xy". + * form "{@code %xy}". *

                          * Note: The @@ -118,11 +118,11 @@ * UTF-8 should be used. Not doing so may introduce * incompatibilites. * - * @param s the String to decode + * @param s the {@code String} to decode * @param enc The name of a supported * character * encoding. - * @return the newly decoded String + * @return the newly decoded {@code String} * @exception UnsupportedEncodingException * If character encoding needs to be consulted, but * named character encoding is not supported diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/URLEncoder.java --- a/jdk/src/share/classes/java/net/URLEncoder.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/URLEncoder.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -51,19 +51,19 @@ * *

                          *

                            - *
                          • The alphanumeric characters "a" through - * "z", "A" through - * "Z" and "0" - * through "9" remain the same. - *
                          • The special characters ".", - * "-", "*", and - * "_" remain the same. - *
                          • The space character " " is - * converted into a plus sign "+". + *
                          • The alphanumeric characters "{@code a}" through + * "{@code z}", "{@code A}" through + * "{@code Z}" and "{@code 0}" + * through "{@code 9}" remain the same. + *
                          • The special characters "{@code .}", + * "{@code -}", "{@code *}", and + * "{@code _}" remain the same. + *
                          • The space character "   " is + * converted into a plus sign "{@code +}". *
                          • All other characters are unsafe and are first converted into * one or more bytes using some encoding scheme. Then each byte is * represented by the 3-character string - * "%xy", where xy is the + * "{@code %xy}", where xy is the * two-digit hexadecimal representation of the byte. * The recommended encoding scheme to use is UTF-8. However, * for compatibility reasons, if an encoding is not specified, @@ -152,15 +152,15 @@ private URLEncoder() { } /** - * Translates a string into x-www-form-urlencoded + * Translates a string into {@code x-www-form-urlencoded} * format. This method uses the platform's default encoding * as the encoding scheme to obtain the bytes for unsafe characters. * - * @param s String to be translated. + * @param s {@code String} to be translated. * @deprecated The resulting string may vary depending on the platform's * default encoding. Instead, use the encode(String,String) * method to specify the encoding. - * @return the translated String. + * @return the translated {@code String}. */ @Deprecated public static String encode(String s) { @@ -177,7 +177,7 @@ } /** - * Translates a string into application/x-www-form-urlencoded + * Translates a string into {@code application/x-www-form-urlencoded} * format using a specific encoding scheme. This method uses the * supplied encoding scheme to obtain the bytes for unsafe * characters. @@ -188,11 +188,11 @@ * UTF-8 should be used. Not doing so may introduce * incompatibilites. * - * @param s String to be translated. + * @param s {@code String} to be translated. * @param enc The name of a supported * character * encoding. - * @return the translated String. + * @return the translated {@code String}. * @exception UnsupportedEncodingException * If the named encoding is not supported * @see URLDecoder#decode(java.lang.String, java.lang.String) diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/URLStreamHandler.java --- a/jdk/src/share/classes/java/net/URLStreamHandler.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/URLStreamHandler.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,15 +34,15 @@ import sun.net.www.ParseUtil; /** - * The abstract class URLStreamHandler is the common + * The abstract class {@code URLStreamHandler} is the common * superclass for all stream protocol handlers. A stream protocol * handler knows how to make a connection for a particular protocol - * type, such as http or https. + * type, such as {@code http} or {@code https}. *

                            - * In most cases, an instance of a URLStreamHandler + * In most cases, an instance of a {@code URLStreamHandler} * subclass is not created directly by an application. Rather, the * first time a protocol name is encountered when constructing a - * URL, the appropriate stream protocol handler is + * {@code URL}, the appropriate stream protocol handler is * automatically loaded. * * @author James Gosling @@ -52,7 +52,7 @@ public abstract class URLStreamHandler { /** * Opens a connection to the object referenced by the - * URL argument. + * {@code URL} argument. * This method should be overridden by a subclass. * *

                            If for the handler's protocol (such as HTTP or JAR), there @@ -64,7 +64,7 @@ * JarURLConnection will be returned. * * @param u the URL that this connects to. - * @return a URLConnection object for the URL. + * @return a {@code URLConnection} object for the {@code URL}. * @exception IOException if an I/O error occurs while opening the * connection. */ @@ -83,7 +83,7 @@ * @param p the proxy through which the connection will be made. * If direct connection is desired, Proxy.NO_PROXY * should be specified. - * @return a URLConnection object for the URL. + * @return a {@code URLConnection} object for the {@code URL}. * @exception IOException if an I/O error occurs while opening the * connection. * @exception IllegalArgumentException if either u or p is null, @@ -97,28 +97,28 @@ } /** - * Parses the string representation of a URL into a - * URL object. + * Parses the string representation of a {@code URL} into a + * {@code URL} object. *

                            * If there is any inherited context, then it has already been - * copied into the URL argument. + * copied into the {@code URL} argument. *

                            - * The parseURL method of URLStreamHandler + * The {@code parseURL} method of {@code URLStreamHandler} * parses the string representation as if it were an - * http specification. Most URL protocol families have a + * {@code http} specification. Most URL protocol families have a * similar parsing. A stream protocol handler for a protocol that has * a different syntax must override this routine. * - * @param u the URL to receive the result of parsing + * @param u the {@code URL} to receive the result of parsing * the spec. - * @param spec the String representing the URL that + * @param spec the {@code String} representing the URL that * must be parsed. * @param start the character index at which to begin parsing. This is - * just past the ':' (if there is one) that + * just past the '{@code :}' (if there is one) that * specifies the determination of the protocol name. * @param limit the character position to stop parsing at. This is the * end of the string or the position of the - * "#" character, if present. All information + * "{@code #}" character, if present. All information * after the sharp sign indicates an anchor. */ protected void parseURL(URL u, String spec, int start, int limit) { @@ -307,7 +307,7 @@ /** * Returns the default port for a URL parsed by this handler. This method * is meant to be overidden by handlers with default port numbers. - * @return the default port for a URL parsed by this handler. + * @return the default port for a {@code URL} parsed by this handler. * @since 1.3 */ protected int getDefaultPort() { @@ -321,7 +321,7 @@ * guaranteed by the fact that it is only called by java.net.URL class. * @param u1 a URL object * @param u2 a URL object - * @return true if the two urls are + * @return {@code true} if the two urls are * considered equal, ie. they refer to the same * fragment in the same file. * @since 1.3 @@ -338,7 +338,7 @@ * other protocols that have different requirements for hashCode * calculation. * @param u a URL object - * @return an int suitable for hash table indexing + * @return an {@code int} suitable for hash table indexing * @since 1.3 */ protected int hashCode(URL u) { @@ -420,7 +420,7 @@ * will result in a null return. * * @param u a URL object - * @return an InetAddress representing the host + * @return an {@code InetAddress} representing the host * IP address. * @since 1.3 */ @@ -447,8 +447,8 @@ * Compares the host components of two URLs. * @param u1 the URL of the first host to compare * @param u2 the URL of the second host to compare - * @return true if and only if they - * are equal, false otherwise. + * @return {@code true} if and only if they + * are equal, {@code false} otherwise. * @since 1.3 */ protected boolean hostsEqual(URL u1, URL u2) { @@ -465,11 +465,11 @@ } /** - * Converts a URL of a specific protocol to a - * String. + * Converts a {@code URL} of a specific protocol to a + * {@code String}. * * @param u the URL. - * @return a string representation of the URL argument. + * @return a string representation of the {@code URL} argument. */ protected String toExternalForm(URL u) { @@ -508,7 +508,7 @@ } /** - * Sets the fields of the URL argument to the indicated values. + * Sets the fields of the {@code URL} argument to the indicated values. * Only classes derived from URLStreamHandler are able * to use this method to set the values of the URL fields. * @@ -538,7 +538,7 @@ } /** - * Sets the fields of the URL argument to the indicated values. + * Sets the fields of the {@code URL} argument to the indicated values. * Only classes derived from URLStreamHandler are able * to use this method to set the values of the URL fields. * diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/URLStreamHandlerFactory.java --- a/jdk/src/share/classes/java/net/URLStreamHandlerFactory.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/URLStreamHandlerFactory.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 1999, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,11 +26,11 @@ package java.net; /** - * This interface defines a factory for URL stream + * This interface defines a factory for {@code URL} stream * protocol handlers. *

                            - * It is used by the URL class to create a - * URLStreamHandler for a specific protocol. + * It is used by the {@code URL} class to create a + * {@code URLStreamHandler} for a specific protocol. * * @author Arthur van Hoff * @see java.net.URL @@ -39,12 +39,12 @@ */ public interface URLStreamHandlerFactory { /** - * Creates a new URLStreamHandler instance with the specified + * Creates a new {@code URLStreamHandler} instance with the specified * protocol. * - * @param protocol the protocol ("ftp", - * "http", "nntp", etc.). - * @return a URLStreamHandler for the specific protocol. + * @param protocol the protocol ("{@code ftp}", + * "{@code http}", "{@code nntp}", etc.). + * @return a {@code URLStreamHandler} for the specific protocol. * @see java.net.URLStreamHandler */ URLStreamHandler createURLStreamHandler(String protocol); diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/UnknownHostException.java --- a/jdk/src/share/classes/java/net/UnknownHostException.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/UnknownHostException.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -38,7 +38,7 @@ private static final long serialVersionUID = -4639126076052875403L; /** - * Constructs a new UnknownHostException with the + * Constructs a new {@code UnknownHostException} with the * specified detail message. * * @param host the detail message. @@ -48,7 +48,7 @@ } /** - * Constructs a new UnknownHostException with no detail + * Constructs a new {@code UnknownHostException} with no detail * message. */ public UnknownHostException() { diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/UnknownServiceException.java --- a/jdk/src/share/classes/java/net/UnknownServiceException.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/net/UnknownServiceException.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -40,14 +40,14 @@ private static final long serialVersionUID = -4169033248853639508L; /** - * Constructs a new UnknownServiceException with no + * Constructs a new {@code UnknownServiceException} with no * detail message. */ public UnknownServiceException() { } /** - * Constructs a new UnknownServiceException with the + * Constructs a new {@code UnknownServiceException} with the * specified detail message. * * @param msg the detail message. diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/package-info.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/java/net/package-info.java Fri Aug 02 09:38:09 2013 +0100 @@ -0,0 +1,161 @@ +/* + * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * Provides the classes for implementing networking applications. + * + *

                            The java.net package can be roughly divided in two sections:

                            + *
                              + *
                            • A Low Level API, which deals with the + * following abstractions:

                              + *
                                + *
                              • Addresses, which are networking identifiers, + * like IP addresses.

                              • + *
                              • Sockets, which are basic bidirectional data communication + * mechanisms.

                              • + *
                              • Interfaces, which describe network interfaces.

                              • + *
                            • + *
                            • A High Level API, which deals with the following + * abstractions:

                              + *
                                + *
                              • URIs, which represent + * Universal Resource Identifiers.

                              • + *
                              • URLs, which represent + * Universal Resource Locators.

                              • + *
                              • Connections, which represents connections to the resource + * pointed to by URLs.

                              • + *
                            • + *
                            + *

                            Addresses

                            + *

                            Addresses are used throughout the java.net APIs as either host + * identifiers, or socket endpoint identifiers.

                            + *

                            The {@link java.net.InetAddress} class is the abstraction representing an + * IP (Internet Protocol) address. It has two subclasses: + *

                              + *
                            • {@link java.net.Inet4Address} for IPv4 addresses.
                            • + *
                            • {@link java.net.Inet6Address} for IPv6 addresses.
                            • + *
                            + *

                            But, in most cases, there is no need to deal directly with the subclasses, + * as the InetAddress abstraction should cover most of the needed + * functionality.

                            + *

                            About IPv6

                            + *

                            Not all systems have support for the IPv6 protocol, and while the Java + * networking stack will attempt to detect it and use it transparently when + * available, it is also possible to disable its use with a system property. + * In the case where IPv6 is not available, or explicitly disabled, + * Inet6Address are not valid arguments for most networking operations any + * more. While methods like {@link java.net.InetAddress#getByName} are + * guaranteed not to return an Inet6Address when looking up host names, it + * is possible, by passing literals, to create such an object. In which + * case, most methods, when called with an Inet6Address will throw an + * Exception.

                            + *

                            Sockets

                            + *

                            Sockets are means to establish a communication link between machines over + * the network. The java.net package provides 4 kinds of Sockets:

                            + *
                              + *
                            • {@link java.net.Socket} is a TCP client API, and will typically + * be used to {@linkplain java.net.Socket#connect(SocketAddress) + * connect} to a remote host.
                            • + *
                            • {@link java.net.ServerSocket} is a TCP server API, and will + * typically {@linkplain java.net.ServerSocket#accept accept} + * connections from client sockets.
                            • + *
                            • {@link java.net.DatagramSocket} is a UDP endpoint API and is used + * to {@linkplain java.net.DatagramSocket#send send} and + * {@linkplain java.net.DatagramSocket#receive receive} + * {@linkplain java.net.DatagramPacket datagram packets}.
                            • + *
                            • {@link java.net.MulticastSocket} is a subclass of + * {@code DatagramSocket} used when dealing with multicast + * groups.
                            • + *
                            + *

                            Sending and receiving with TCP sockets is done through InputStreams and + * OutputStreams which can be obtained via the + * {@link java.net.Socket#getInputStream} and + * {@link java.net.Socket#getOutputStream} methods.

                            + *

                            Interfaces

                            + *

                            The {@link java.net.NetworkInterface} class provides APIs to browse and + * query all the networking interfaces (e.g. ethernet connection or PPP + * endpoint) of the local machine. It is through that class that you can + * check if any of the local interfaces is configured to support IPv6.

                            + *

                            Note, all conforming implementations must support at least one + * {@code NetworkInterface} object, which must either be connected to a + * network, or be a "loopback" interface that can only communicate with + * entities on the same machine.

                            + * + *

                            High level API

                            + *

                            A number of classes in the java.net package do provide for a much higher + * level of abstraction and allow for easy access to resources on the + * network. The classes are: + *

                              + *
                            • {@link java.net.URI} is the class representing a + * Universal Resource Identifier, as specified in RFC 2396. + * As the name indicates, this is just an Identifier and doesn't + * provide directly the means to access the resource.
                            • + *
                            • {@link java.net.URL} is the class representing a + * Universal Resource Locator, which is both an older concept for + * URIs and a means to access the resources.
                            • + *
                            • {@link java.net.URLConnection} is created from a URL and is the + * communication link used to access the resource pointed by the + * URL. This abstract class will delegate most of the work to the + * underlying protocol handlers like http or https.
                            • + *
                            • {@link java.net.HttpURLConnection} is a subclass of URLConnection + * and provides some additional functionalities specific to the + * HTTP protocol.
                            • + *
                            + *

                            The recommended usage is to use {@link java.net.URI} to identify + * resources, then convert it into a {@link java.net.URL} when it is time to + * access the resource. From that URL, you can either get the + * {@link java.net.URLConnection} for fine control, or get directly the + * InputStream.

                            + *

                            Here is an example:

                            + *

                            + * URI uri = new URI("http://java.sun.com/");
                            + * URL url = uri.toURL();
                            + * InputStream in = url.openStream();
                            + * 
                            + *

                            Protocol Handlers

                            + * As mentioned, URL and URLConnection rely on protocol handlers which must be + * present, otherwise an Exception is thrown. This is the major difference with + * URIs which only identify resources, and therefore don't need to have access + * to the protocol handler. So, while it is possible to create an URI with any + * kind of protocol scheme (e.g. {@code myproto://myhost.mydomain/resource/}), + * a similar URL will try to instantiate the handler for the specified protocol; + * if it doesn't exist an exception will be thrown. + *

                            By default the protocol handlers are loaded dynamically from the default + * location. It is, however, possible to add to the search path by setting + * the {@code java.protocol.handler.pkgs} system property. For instance if + * it is set to {@code myapp.protocols}, then the URL code will try, in the + * case of http, first to load {@code myapp.protocols.http.Handler}, then, + * if this fails, {@code http.Handler} from the default location.

                            + *

                            Note that the Handler class has to be a subclass of the abstract + * class {@link java.net.URLStreamHandler}.

                            + *

                            Additional Specification

                            + * + * + * @since JDK1.0 + */ +package java.net; diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/net/package.html --- a/jdk/src/share/classes/java/net/package.html Thu Jul 25 17:32:23 2013 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,112 +0,0 @@ - - - - - - -Provides the classes for implementing networking applications. - -

                            The java.net package can be roughly divided in two sections:

                            -
                              -
                            • A Low Level API, which deals with the following abstractions:

                              -
                                -
                              • Addresses, which are networking identifiers, like IP addresses.

                              • -
                              • Sockets, which are basic bidirectional data communication mechanisms.

                              • -
                              • Interfaces, which describe network interfaces.

                              • -
                            • -
                            • A High Level API, which deals with the following abstractions:

                              -
                                -
                              • URIs, which represent Universal Resource Identifiers.

                              • -
                              • URLs, which represent Universal Resource Locators.

                              • -
                              • Connections, which represents connections to the resource pointed to by URLs.

                              • -
                            • -
                            -

                            Addresses

                            -

                            Addresses are used throughout the java.net APIs as either host identifiers, or socket endpoint identifiers.

                            -

                            The {@link java.net.InetAddress} class is the abstraction representing an IP (Internet Protocol) address. It has two subclasses: -

                              -
                            • {@link java.net.Inet4Address} for IPv4 addresses.
                            • -
                            • {@link java.net.Inet6Address} for IPv6 addresses.
                            • -
                            -

                            But, in most cases, there is no need to deal directly with the subclasses, as the InetAddress abstraction should cover most of the needed functionality.

                            -

                            About IPv6

                            -

                            Not all systems have support for the IPv6 protocol, and while the Java networking stack will attempt to detect it and use it transparently when available, it is also possible to disable its use with a system property. In the case where IPv6 is not available, or explicitly disabled, Inet6Address are not valid arguments for most networking operations any more. While methods like {@link java.net.InetAddress#getByName} are guaranteed not to return an Inet6Address when looking up host names, it is possible, by passing literals, to create such an object. In which case, most methods, when called with an Inet6Address will throw an Exception.

                            -

                            Sockets

                            -

                            Sockets are means to establish a communication link between machines over the network. The java.net package provides 4 kinds of Sockets:

                            -
                              -
                            • {@link java.net.Socket} is a TCP client API, and will typically be used to {@linkplain java.net.Socket#connect(SocketAddress) connect} to a remote host.
                            • -
                            • {@link java.net.ServerSocket} is a TCP server API, and will typically {@linkplain java.net.ServerSocket#accept accept} connections from client sockets.
                            • -
                            • {@link java.net.DatagramSocket} is a UDP endpoint API and is used to {@linkplain java.net.DatagramSocket#send send} and {@linkplain java.net.DatagramSocket#receive receive} {@linkplain java.net.DatagramPacket datagram packets}.
                            • -
                            • {@link java.net.MulticastSocket} is a subclass of {@code DatagramSocket} used when dealing with multicast groups.
                            • -
                            -

                            Sending and receiving with TCP sockets is done through InputStreams and OutputStreams which can be obtained via the {@link java.net.Socket#getInputStream} and {@link java.net.Socket#getOutputStream} methods.

                            -

                            Interfaces

                            -

                            The {@link java.net.NetworkInterface} class provides APIs to browse and query all the networking interfaces (e.g. ethernet connection or PPP endpoint) of the local machine. It is through that class that you can check if any of the local interfaces is configured to support IPv6.

                            -

                            Note, all conforming implementations must support at least one {@code NetworkInterface} object, which must either be connected to a network, or be a "loopback" interface that can only communicate with entities on the same machine.

                            - -

                            High level API

                            -

                            A number of classes in the java.net package do provide for a much higher level of abstraction and allow for easy access to resources on the network. The classes are: -

                              -
                            • {@link java.net.URI} is the class representing a Universal Resource Identifier, as specified in RFC 2396. As the name indicates, this is just an Identifier and doesn't provide directly the means to access the resource.
                            • -
                            • {@link java.net.URL} is the class representing a Universal Resource Locator, which is both an older concept for URIs and a means to access the resources.
                            • -
                            • {@link java.net.URLConnection} is created from a URL and is the communication link used to access the resource pointed by the URL. This abstract class will delegate most of the work to the underlying protocol handlers like http or https.
                            • -
                            • {@link java.net.HttpURLConnection} is a subclass of URLConnection and provides some additional functionalities specific to the HTTP protocol.
                            • -
                            -

                            The recommended usage is to use {@link java.net.URI} to identify resources, then convert it into a {@link java.net.URL} when it is time to access the resource. From that URL, you can either get the {@link java.net.URLConnection} for fine control, or get directly the InputStream.

                            -

                            Here is an example:

                            -

                            -URI uri = new URI("http://java.sun.com/");
                            -URL url = uri.toURL();
                            -InputStream in = url.openStream(); -

                            -

                            Protocol Handlers

                            -As mentioned, URL and URLConnection rely on protocol handlers which must be present, otherwise an Exception is thrown. This is the major difference with URIs which only identify resources, and therefore don't need to have access to the protocol handler. So, while it is possible to create an URI with any kind of protocol scheme (e.g. myproto://myhost.mydomain/resource/), a similar URL will try to instantiate the handler for the specified protocol; if it doesn't exist an exception will be thrown.

                            -

                            By default the protocol handlers are loaded dynamically from the default location. It is, however, possible to add to the search path by setting the java.protocol.handler.pkgs system property. For instance if it is set to myapp.protocols, then the URL code will try, in the case of http, first to load myapp.protocols.http.Handler, then, if this fails, http.Handler from the default location.

                            -

                            Note that the Handler class has to be a subclass of the abstract class {@link java.net.URLStreamHandler}.

                            -

                            Additional Specification

                            - - - -@since JDK1.0 - - diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/nio/channels/package-info.java --- a/jdk/src/share/classes/java/nio/channels/package-info.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/nio/channels/package-info.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,7 +31,7 @@ * * *
                            - * + * * * * @@ -110,7 +110,7 @@ * write them to a given writable byte channel. * *

                            Channels

                            Description

                            ChannelsDescription
                            {@link java.nio.channels.Channel}A nexus for I/O operations
                              {@link java.nio.channels.ReadableByteChannel}
                            - * + * * * * @@ -138,7 +138,7 @@ * * *

                            File channels

                            Description

                            File channelsDescription
                            {@link java.nio.channels.FileChannel}Reads, writes, maps, and manipulates files
                            {@link java.nio.channels.FileLock}
                            - * + * * * * @@ -225,7 +225,7 @@ * * *

                            Multiplexed, non-blocking I/O

                            Description

                            Multiplexed, non-blocking I/O

                            Description

                            {@link java.nio.channels.SelectableChannel}A channel that can be multiplexed
                              {@link java.nio.channels.DatagramChannel}
                            - * + * * * * diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/nio/charset/Charset-X-Coder.java.template --- a/jdk/src/share/classes/java/nio/charset/Charset-X-Coder.java.template Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/nio/charset/Charset-X-Coder.java.template Fri Aug 02 09:38:09 2013 +0100 @@ -41,7 +41,7 @@ * An engine that can transform a sequence of $itypesPhrase$ into a sequence of * $otypesPhrase$. * - * + * * *

                            The input $itype$ sequence is provided in a $itype$ buffer or a series * of such buffers. The output $otype$ sequence is written to a $otype$ buffer @@ -76,22 +76,22 @@ * examine this object and fill the input buffer, flush the output buffer, or * attempt to recover from $a$ $coding$ error, as appropriate, and try again. * - * + * * *

                            There are two general types of $coding$ errors. If the input $itype$ * sequence is $notLegal$ then the input is considered malformed. If * the input $itype$ sequence is legal but cannot be mapped to a valid * $outSequence$ then an unmappable character has been encountered. * - * + * * *

                            How $a$ $coding$ error is handled depends upon the action requested for * that type of error, which is described by an instance of the {@link - * CodingErrorAction} class. The possible error actions are to {@link - * CodingErrorAction#IGNORE ignore} the erroneous input, {@link - * CodingErrorAction#REPORT report} the error to the invoker via - * the returned {@link CoderResult} object, or {@link CodingErrorAction#REPLACE - * replace} the erroneous input with the current value of the + * CodingErrorAction} class. The possible error actions are to {@linkplain + * CodingErrorAction#IGNORE ignore} the erroneous input, {@linkplain + * CodingErrorAction#REPORT report} the error to the invoker via + * the returned {@link CoderResult} object, or {@linkplain CodingErrorAction#REPLACE + * replace} the erroneous input with the current value of the * replacement $replTypeName$. The replacement * #if[encoder] @@ -106,7 +106,7 @@ * replaceWith} method. * *

                            The default action for malformed-input and unmappable-character errors - * is to {@link CodingErrorAction#REPORT report} them. The + * is to {@linkplain CodingErrorAction#REPORT report} them. The * malformed-input error action may be changed via the {@link * #onMalformedInput(CodingErrorAction) onMalformedInput} method; the * unmappable-character action may be changed via the {@link @@ -177,7 +177,7 @@ * @param replacement * The initial replacement; must not be null, must have * non-zero length, must not be longer than max$ItypesPerOtype$, - * and must be {@link #isLegalReplacement legal} + * and must be {@linkplain #isLegalReplacement legal} * * @throws IllegalArgumentException * If the preconditions on the parameters do not hold @@ -276,7 +276,7 @@ * The new replacement; must not be null, must have * non-zero length, must not be longer than the value returned by * the {@link #max$ItypesPerOtype$() max$ItypesPerOtype$} method, and - * must be {@link #isLegalReplacement legal} + * must be {@link #isLegalReplacement legal} #end[encoder] * * @return This $coder$ @@ -495,24 +495,24 @@ * typically done by draining any $code$d $otype$s from the output * buffer.

                            * - *
                          • A {@link CoderResult#malformedForLength - * malformed-input} result indicates that a malformed-input + *

                          • A {@linkplain CoderResult#malformedForLength + * malformed-input} result indicates that a malformed-input * error has been detected. The malformed $itype$s begin at the input * buffer's (possibly incremented) position; the number of malformed * $itype$s may be determined by invoking the result object's {@link * CoderResult#length() length} method. This case applies only if the - * {@link #onMalformedInput malformed action} of this $coder$ + * {@linkplain #onMalformedInput malformed action} of this $coder$ * is {@link CodingErrorAction#REPORT}; otherwise the malformed input * will be ignored or replaced, as requested.

                          • * - *
                          • An {@link CoderResult#unmappableForLength - * unmappable-character} result indicates that an + *

                          • An {@linkplain CoderResult#unmappableForLength + * unmappable-character} result indicates that an * unmappable-character error has been detected. The $itype$s that * $code$ the unmappable character begin at the input buffer's (possibly * incremented) position; the number of such $itype$s may be determined * by invoking the result object's {@link CoderResult#length() length} - * method. This case applies only if the {@link #onUnmappableCharacter - * unmappable action} of this $coder$ is {@link + * method. This case applies only if the {@linkplain #onUnmappableCharacter + * unmappable action} of this $coder$ is {@link * CodingErrorAction#REPORT}; otherwise the unmappable character will be * ignored or replaced, as requested.

                          • * diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/nio/charset/Charset.java --- a/jdk/src/share/classes/java/nio/charset/Charset.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/nio/charset/Charset.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -65,7 +65,7 @@ * concurrent threads. * * - * + * *

                            Charset names

                            * *

                            Charsets are named by strings composed of the following characters: @@ -111,21 +111,17 @@ * The aliases of a charset are returned by the {@link #aliases() aliases} * method. * - * - * - *

                            Some charsets have an historical name that is defined for - * compatibility with previous versions of the Java platform. A charset's + *

                            Some charsets have an historical name that is defined for + * compatibility with previous versions of the Java platform. A charset's * historical name is either its canonical name or one of its aliases. The * historical name is returned by the getEncoding() methods of the * {@link java.io.InputStreamReader#getEncoding InputStreamReader} and {@link * java.io.OutputStreamWriter#getEncoding OutputStreamWriter} classes. * - * - * - *

                            If a charset listed in the If a charset listed in the IANA Charset * Registry is supported by an implementation of the Java platform then - * its canonical name must be the name listed in the registry. Many charsets + * its canonical name must be the name listed in the registry. Many charsets * are given more than one name in the registry, in which case the registry * identifies one of the names as MIME-preferred. If a charset has more * than one registry name then its canonical name must be the MIME-preferred @@ -142,15 +138,15 @@ * *

                            Standard charsets

                            * - * + * * - *

                            Every implementation of the Java platform is required to support the - * following standard charsets. Consult the release documentation for your + *

                            Every implementation of the Java platform is required to support the + * following standard charsets. Consult the release documentation for your * implementation to see if any other charsets are supported. The behavior * of such optional charsets may differ between implementations. * *

                            Asynchronous I/O

                            Description

                            Asynchronous I/ODescription
                            {@link java.nio.channels.AsynchronousFileChannel}An asynchronous channel for reading, writing, and manipulating a file
                            {@link java.nio.channels.AsynchronousSocketChannel}
                            - * + * * * diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/nio/charset/MalformedInputException.java --- a/jdk/src/share/classes/java/nio/charset/MalformedInputException.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/nio/charset/MalformedInputException.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -42,14 +42,27 @@ private int inputLength; + /** + * Constructs an {@code MalformedInputException} with the given + * length. + * @param inputLength the length of the input + */ public MalformedInputException(int inputLength) { this.inputLength = inputLength; } + /** + * Returns the length of the input. + * @return the length of the input + */ public int getInputLength() { return inputLength; } + /** + * Returns the message. + * @return the message + */ public String getMessage() { return "Input length = " + inputLength; } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/nio/charset/UnmappableCharacterException.java --- a/jdk/src/share/classes/java/nio/charset/UnmappableCharacterException.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/nio/charset/UnmappableCharacterException.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -42,14 +42,27 @@ private int inputLength; + /** + * Constructs an {@code UnmappableCharacterException} with the + * given length. + * @param inputLength the length of the input + */ public UnmappableCharacterException(int inputLength) { this.inputLength = inputLength; } + /** + * Returns the length of the input. + * @return the length of the input + */ public int getInputLength() { return inputLength; } + /** + * Returns the message. + * @return the message + */ public String getMessage() { return "Input length = " + inputLength; } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/nio/file/attribute/package-info.java --- a/jdk/src/share/classes/java/nio/file/attribute/package-info.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/nio/file/attribute/package-info.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,7 +27,7 @@ * Interfaces and classes providing access to file and file system attributes. * *

                            Charset

                            Description

                            CharsetDescription
                            US-ASCIISeven-bit ASCII, a.k.a. ISO646-US, * a.k.a. the Basic Latin block of the Unicode character set
                            - * + * * * * @@ -38,7 +38,7 @@ * * * - * + * * * * @@ -86,14 +86,14 @@ * *
                              * - *

                            • The {@link java.nio.file.attribute.UserPrincipal} and + *
                            • The {@link java.nio.file.attribute.UserPrincipal} and * {@link java.nio.file.attribute.GroupPrincipal} interfaces represent an * identity or group identity.
                            • * - *

                            • The {@link java.nio.file.attribute.UserPrincipalLookupService} + *
                            • The {@link java.nio.file.attribute.UserPrincipalLookupService} * interface defines methods to lookup user or group principals.
                            • * - *

                            • The {@link java.nio.file.attribute.FileAttribute} interface + *
                            • The {@link java.nio.file.attribute.FileAttribute} interface * represents the value of an attribute for cases where the attribute value is * required to be set atomically when creating an object in the file system.
                            • * diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/nio/file/package-info.java --- a/jdk/src/share/classes/java/nio/file/package-info.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/nio/file/package-info.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,8 +33,8 @@ * package is used by service provider implementors wishing to extend the * platform default provider, or to construct other provider implementations.

                              * - *

                              Symbolic Links

                              - * Many operating systems and file systems support for symbolic links. + *

                              Symbolic Links

                              + *

                              Many operating systems and file systems support for symbolic links. * A symbolic link is a special file that serves as a reference to another file. * For the most part, symbolic links are transparent to applications and * operations on symbolic links are automatically redirected to the target @@ -45,8 +45,8 @@ * that are semantically close but support for these other types of links is * not included in this package.

                              * - *

                              Interoperability

                              - * The {@link java.io.File} class defines the {@link java.io.File#toPath + *

                              Interoperability

                              + *

                              The {@link java.io.File} class defines the {@link java.io.File#toPath * toPath} method to construct a {@link java.nio.file.Path} by converting * the abstract path represented by the {@code java.io.File} object. The resulting * {@code Path} can be used to operate on the same file as the {@code File} @@ -55,7 +55,7 @@ * and {@code java.io.File} objects.

                              * *

                              Visibility

                              - * The view of the files and file system provided by classes in this package are + *

                              The view of the files and file system provided by classes in this package are * guaranteed to be consistent with other views provided by other instances in the * same Java virtual machine. The view may or may not, however, be consistent with * the view of the file system as seen by other concurrently running programs due @@ -65,8 +65,8 @@ * or on some other machine. The exact nature of any such inconsistencies are * system-dependent and are therefore unspecified.

                              * - *

                              Synchronized I/O File Integrity

                              - * The {@link java.nio.file.StandardOpenOption#SYNC SYNC} and {@link + *

                              Synchronized I/O File Integrity

                              + *

                              The {@link java.nio.file.StandardOpenOption#SYNC SYNC} and {@link * java.nio.file.StandardOpenOption#DSYNC DSYNC} options are used when opening a file * to require that updates to the file are written synchronously to the underlying * storage device. In the case of the default provider, and the file resides on @@ -83,7 +83,7 @@ * specific.

                              * *

                              General Exceptions

                              - * Unless otherwise noted, passing a {@code null} argument to a constructor + *

                              Unless otherwise noted, passing a {@code null} argument to a constructor * or method of any class or interface in this package will cause a {@link * java.lang.NullPointerException NullPointerException} to be thrown. Additionally, * invoking a method with a collection containing a {@code null} element will diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/security/cert/PKIXRevocationChecker.java --- a/jdk/src/share/classes/java/security/cert/PKIXRevocationChecker.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/security/cert/PKIXRevocationChecker.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -50,21 +50,26 @@ * status of certificates with OCSP and CRLs. By default, OCSP is the * preferred mechanism for checking revocation status, with CRLs as the * fallback mechanism. However, this preference can be switched to CRLs with - * the {@link Option#PREFER_CRLS PREFER_CRLS} option. + * the {@link Option#PREFER_CRLS PREFER_CRLS} option. In addition, the fallback + * mechanism can be disabled with the {@link Option#NO_FALLBACK NO_FALLBACK} + * option. * *

                              A {@code PKIXRevocationChecker} is obtained by calling the * {@link CertPathValidator#getRevocationChecker getRevocationChecker} method * of a PKIX {@code CertPathValidator}. Additional parameters and options - * specific to revocation can be set (by calling {@link #setOCSPResponder} - * method for instance). The {@code PKIXRevocationChecker} is added to - * a {@code PKIXParameters} object using the - * {@link PKIXParameters#addCertPathChecker addCertPathChecker} + * specific to revocation can be set (by calling the + * {@link #setOcspResponder setOcspResponder} method for instance). The + * {@code PKIXRevocationChecker} is added to a {@code PKIXParameters} object + * using the {@link PKIXParameters#addCertPathChecker addCertPathChecker} * or {@link PKIXParameters#setCertPathCheckers setCertPathCheckers} method, * and then the {@code PKIXParameters} is passed along with the {@code CertPath} * to be validated to the {@link CertPathValidator#validate validate} method * of a PKIX {@code CertPathValidator}. When supplying a revocation checker in * this manner, it will be used to check revocation irrespective of the setting * of the {@link PKIXParameters#isRevocationEnabled RevocationEnabled} flag. + * Similarly, a {@code PKIXRevocationChecker} may be added to a + * {@code PKIXBuilderParameters} object for use with a PKIX + * {@code CertPathBuilder}. * *

                              Note that when a {@code PKIXRevocationChecker} is added to * {@code PKIXParameters}, it clones the {@code PKIXRevocationChecker}; @@ -83,6 +88,13 @@ * need not synchronize. * * @since 1.8 + * + * @see RFC 2560: X.509 + * Internet Public Key Infrastructure Online Certificate Status Protocol - + * OCSP,
                              RFC 5280: Internet X.509 + * Public Key Infrastructure Certificate and Certificate Revocation List (CRL) + * Profile */ public abstract class PKIXRevocationChecker extends PKIXCertPathChecker { private URI ocspResponder; @@ -101,7 +113,7 @@ * * @param uri the responder URI */ - public void setOCSPResponder(URI uri) { + public void setOcspResponder(URI uri) { this.ocspResponder = uri; } @@ -114,7 +126,7 @@ * * @return the responder URI, or {@code null} if not set */ - public URI getOCSPResponder() { + public URI getOcspResponder() { return ocspResponder; } @@ -126,7 +138,7 @@ * * @param cert the responder's certificate */ - public void setOCSPResponderCert(X509Certificate cert) { + public void setOcspResponderCert(X509Certificate cert) { this.ocspResponderCert = cert; } @@ -140,7 +152,7 @@ * * @return the responder's certificate, or {@code null} if not set */ - public X509Certificate getOCSPResponderCert() { + public X509Certificate getOcspResponderCert() { return ocspResponderCert; } @@ -151,7 +163,7 @@ * @param extensions a list of extensions. The list is copied to protect * against subsequent modification. */ - public void setOCSPExtensions(List extensions) + public void setOcspExtensions(List extensions) { this.ocspExtensions = (extensions == null) ? Collections.emptyList() @@ -161,10 +173,10 @@ /** * Gets the optional OCSP request extensions. * - * @return an unmodifiable list of extensions. Returns an empty list if no + * @return an unmodifiable list of extensions. The list is empty if no * extensions have been specified. */ - public List getOCSPExtensions() { + public List getOcspExtensions() { return Collections.unmodifiableList(ocspExtensions); } @@ -177,7 +189,7 @@ * DER-encoded OCSP response for that certificate. A deep copy of * the map is performed to protect against subsequent modification. */ - public void setOCSPResponses(Map responses) + public void setOcspResponses(Map responses) { if (responses == null) { this.ocspResponses = Collections.emptyMap(); @@ -200,7 +212,7 @@ * the map is returned to protect against subsequent modification. * Returns an empty map if no responses have been specified. */ - public Map getOCSPResponses() { + public Map getOcspResponses() { Map copy = new HashMap<>(ocspResponses.size()); for (Map.Entry e : ocspResponses.entrySet()) { copy.put(e.getKey(), e.getValue().clone()); @@ -223,15 +235,31 @@ /** * Gets the revocation options. * - * @return an unmodifiable set of revocation options, or an empty set if - * none are specified + * @return an unmodifiable set of revocation options. The set is empty if + * no options have been specified. */ public Set

                              + * An implementation of {@code PKIXRevocationChecker} is responsible for + * adding the ignored exceptions to the list. + * + * @return an unmodifiable list containing the ignored exceptions. The list + * is empty if no exceptions have been ignored. + */ + public abstract List getSoftFailExceptions(); + @Override - public Object clone() { + public PKIXRevocationChecker clone() { PKIXRevocationChecker copy = (PKIXRevocationChecker)super.clone(); copy.ocspExtensions = new ArrayList<>(ocspExtensions); copy.ocspResponses = new HashMap<>(ocspResponses); @@ -262,9 +290,26 @@ */ PREFER_CRLS, /** - * Ignore network failures. The default behavior is to consider it a - * failure if the revocation status of a certificate cannot be obtained - * due to a network error. This option applies to both OCSP and CRLs. + * Disable the fallback mechanism. + */ + NO_FALLBACK, + /** + * Allow revocation check to succeed if the revocation status cannot be + * determined for one of the following reasons: + *

                                + *
                              • The CRL or OCSP response cannot be obtained because of a + * network error. + *
                              • The OCSP responder returns one of the following errors + * specified in section 2.3 of RFC 2560: internalError, tryLater, + * or unauthorized. + *

                              + * Note that these conditions apply to both OCSP and CRLs, and unless + * the {@code NO_FALLBACK} option is set, the revocation check is + * allowed to succeed only if both mechanisms fail under one of the + * conditions as stated above. + * Exceptions that cause the network errors are ignored but can be + * later retrieved by calling the + * {@link #getSoftFailExceptions getSoftFailExceptions} method. */ SOFT_FAIL } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/text/Annotation.java --- a/jdk/src/share/classes/java/text/Annotation.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/text/Annotation.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2002, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -59,7 +59,8 @@ /** * Constructs an annotation record with the given value, which * may be null. - * @param value The value of the attribute + * + * @param value the value of the attribute */ public Annotation(Object value) { this.value = value; @@ -67,6 +68,8 @@ /** * Returns the value of the attribute, which may be null. + * + * @return the value of the attribute */ public Object getValue() { return value; @@ -74,6 +77,8 @@ /** * Returns the String representation of this Annotation. + * + * @return the {@code String} representation of this {@code Annotation} */ public String toString() { return getClass().getName() + "[value=" + value + "]"; diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/text/AttributedCharacterIterator.java --- a/jdk/src/share/classes/java/text/AttributedCharacterIterator.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/text/AttributedCharacterIterator.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -101,6 +101,8 @@ /** * Constructs an {@code Attribute} with the given name. + * + * @param name the name of {@code Attribute} */ protected Attribute(String name) { this.name = name; @@ -111,7 +113,7 @@ /** * Compares two objects for equality. This version only returns true - * for x.equals(y) if x and y refer + * for {@code x.equals(y)} if {@code x} and {@code y} refer * to the same object, and guarantees this for all subclasses. */ public final boolean equals(Object obj) { @@ -137,6 +139,8 @@ /** * Returns the name of the attribute. + * + * @return the name of {@code Attribute} */ protected String getName() { return name; @@ -144,6 +148,10 @@ /** * Resolves instances being deserialized to the predefined constants. + * + * @return the resolved {@code Attribute} object + * @throws InvalidObjectException if the object to resolve is not + * an instance of {@code Attribute} */ protected Object readResolve() throws InvalidObjectException { if (this.getClass() != Attribute.class) { @@ -171,6 +179,7 @@ * it is often necessary to store the reading (pronunciation) along with the * written form. *

                              Values are instances of {@link Annotation} holding instances of {@link String}. + * * @see Annotation * @see java.lang.String */ @@ -196,18 +205,26 @@ *

                              Any contiguous text segments having the same attributes (the * same set of attribute/value pairs) are treated as separate runs * if the attributes have been given to those text segments separately. + * + * @return the index of the first character of the run */ public int getRunStart(); /** * Returns the index of the first character of the run * with respect to the given {@code attribute} containing the current character. + * + * @param attribute the desired attribute. + * @return the index of the first character of the run */ public int getRunStart(Attribute attribute); /** * Returns the index of the first character of the run * with respect to the given {@code attributes} containing the current character. + * + * @param attributes a set of the desired attributes. + * @return the index of the first character of the run */ public int getRunStart(Set attributes); @@ -218,30 +235,43 @@ *

                              Any contiguous text segments having the same attributes (the * same set of attribute/value pairs) are treated as separate runs * if the attributes have been given to those text segments separately. + * + * @return the index of the first character following the run */ public int getRunLimit(); /** * Returns the index of the first character following the run * with respect to the given {@code attribute} containing the current character. + * + * @param attribute the desired attribute + * @return the index of the first character following the run */ public int getRunLimit(Attribute attribute); /** * Returns the index of the first character following the run * with respect to the given {@code attributes} containing the current character. + * + * @param attributes a set of the desired attributes + * @return the index of the first character following the run */ public int getRunLimit(Set attributes); /** * Returns a map with the attributes defined on the current * character. + * + * @return a map with the attributes defined on the current character */ public Map getAttributes(); /** * Returns the value of the named {@code attribute} for the current character. * Returns {@code null} if the {@code attribute} is not defined. + * + * @param attribute the desired attribute + * @return the value of the named {@code attribute} or {@code null} */ public Object getAttribute(Attribute attribute); @@ -249,6 +279,8 @@ * Returns the keys of all attributes defined on the * iterator's text range. The set is empty if no * attributes are defined. + * + * @return the keys of all attributes */ public Set getAllAttributeKeys(); }; diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/text/Bidi.java --- a/jdk/src/share/classes/java/text/Bidi.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/text/Bidi.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -176,8 +176,10 @@ * Create a Bidi object representing the bidi information on a line of text within * the paragraph represented by the current Bidi. This call is not required if the * entire paragraph fits on one line. + * * @param lineStart the offset from the start of the paragraph to the start of the line. * @param lineLimit the offset from the start of the paragraph to the limit of the line. + * @return a {@code Bidi} object */ public Bidi createLineBidi(int lineStart, int lineLimit) { AttributedString astr = new AttributedString(""); @@ -189,6 +191,7 @@ /** * Return true if the line is not left-to-right or right-to-left. This means it either has mixed runs of left-to-right * and right-to-left text, or the base direction differs from the direction of the only run of text. + * * @return true if the line is not left-to-right or right-to-left. */ public boolean isMixed() { @@ -197,6 +200,7 @@ /** * Return true if the line is all left-to-right text and the base direction is left-to-right. + * * @return true if the line is all left-to-right text and the base direction is left-to-right */ public boolean isLeftToRight() { @@ -236,8 +240,10 @@ } /** - * Return the resolved level of the character at offset. If offset is <0 or >= - * the length of the line, return the base direction level. + * Return the resolved level of the character at offset. If offset is + * {@literal <} 0 or ≥ the length of the line, return the base direction + * level. + * * @param offset the index of the character for which to return the level * @return the resolved level of the character at offset */ diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/text/BreakIterator.java --- a/jdk/src/share/classes/java/text/BreakIterator.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/text/BreakIterator.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -191,7 +191,7 @@ * * Find the next word: *

                              - *
                              + * 
                              {@code
                                * public static int nextWordStartAfter(int pos, String text) {
                                *     BreakIterator wb = BreakIterator.getWordInstance();
                                *     wb.setText(text);
                              @@ -207,7 +207,7 @@
                                *     }
                                *     return BreakIterator.DONE;
                                * }
                              - * 
                              + * }
                              * (The iterator returned by BreakIterator.getWordInstance() is unique in that * the break positions it returns don't represent both the start and end of the * thing being iterated over. That is, a sentence-break iterator returns breaks diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/text/ChoiceFormat.java --- a/jdk/src/share/classes/java/text/ChoiceFormat.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/text/ChoiceFormat.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -50,7 +50,7 @@ * specifies a half-open interval up to the next item: *
                              *
                              - * X matches j if and only if limit[j] <= X < limit[j+1]
                              + * X matches j if and only if limit[j] ≤ X < limit[j+1]
                                * 
                              *
                              * If there is no match, then either the first or last index is used, depending @@ -85,21 +85,21 @@ *

                              * Here is a simple example that shows formatting and parsing: *

                              - *
                              + * 
                              {@code
                                * double[] limits = {1,2,3,4,5,6,7};
                                * String[] dayOfWeekNames = {"Sun","Mon","Tue","Wed","Thur","Fri","Sat"};
                                * ChoiceFormat form = new ChoiceFormat(limits, dayOfWeekNames);
                                * ParsePosition status = new ParsePosition(0);
                              - * for (double i = 0.0; i <= 8.0; ++i) {
                              + * for (double i = 0.0; i <= 8.0; ++i) {
                                *     status.setIndex(0);
                              - *     System.out.println(i + " -> " + form.format(i) + " -> "
                              + *     System.out.println(i + " -> " + form.format(i) + " -> "
                                *                              + form.parse(form.format(i),status));
                                * }
                              - * 
                              + * }
                              *
                              * Here is a more complex example, with a pattern format: *
                              - *
                              + * 
                              {@code
                                * double[] filelimits = {0,1,2};
                                * String[] filepart = {"are no files","is one file","are {2} files"};
                                * ChoiceFormat fileform = new ChoiceFormat(filelimits, filepart);
                              @@ -107,20 +107,20 @@
                                * MessageFormat pattform = new MessageFormat("There {0} on {1}");
                                * pattform.setFormats(testFormats);
                                * Object[] testArgs = {null, "ADisk", null};
                              - * for (int i = 0; i < 4; ++i) {
                              + * for (int i = 0; i < 4; ++i) {
                                *     testArgs[0] = new Integer(i);
                                *     testArgs[2] = testArgs[0];
                                *     System.out.println(pattform.format(testArgs));
                                * }
                              - * 
                              + * }
                              *
                              *

                              * Specifying a pattern for ChoiceFormat objects is fairly straightforward. * For example: *

                              - *
                              + * 
                              {@code
                                * ChoiceFormat fmt = new ChoiceFormat(
                              - *      "-1#is negative| 0#is zero or fraction | 1#is one |1.0<is 1+ |2#is two |2<is more than 2.");
                              + *      "-1#is negative| 0#is zero or fraction | 1#is one |1.0
                              + * }
                              *
                              * And the output result would be like the following: *
                              - *
                              - *   Format with -INF : is negative
                              - *   Format with -1.0 : is negative
                              - *   Format with 0 : is zero or fraction
                              - *   Format with 0.9 : is zero or fraction
                              - *   Format with 1.0 : is one
                              - *   Format with 1.5 : is 1+
                              - *   Format with 2 : is two
                              - *   Format with 2.1 : is more than 2.
                              - *   Format with NaN : is negative
                              - *   Format with +INF : is more than 2.
                              - * 
                              + *
                              {@code
                              + * Format with -INF : is negative
                              + * Format with -1.0 : is negative
                              + * Format with 0 : is zero or fraction
                              + * Format with 0.9 : is zero or fraction
                              + * Format with 1.0 : is one
                              + * Format with 1.5 : is 1+
                              + * Format with 2 : is two
                              + * Format with 2.1 : is more than 2.
                              + * Format with NaN : is negative
                              + * Format with +INF : is more than 2.
                              + * }
                              *
                              * - *

                              Synchronization

                              + *

                              Synchronization

                              * *

                              * Choice formats are not synchronized. @@ -255,6 +255,8 @@ /** * Gets the pattern. + * + * @return the pattern string */ public String toPattern() { StringBuffer result = new StringBuffer(); @@ -305,6 +307,8 @@ /** * Constructs with limits and corresponding formats based on the pattern. + * + * @param newPattern the new pattern string * @see #applyPattern */ public ChoiceFormat(String newPattern) { @@ -313,6 +317,9 @@ /** * Constructs with the limits and the corresponding formats. + * + * @param limits limits in ascending order + * @param formats corresponding format strings * @see #setChoices */ public ChoiceFormat(double[] limits, String[] formats) { @@ -322,9 +329,9 @@ /** * Set the choices to be used in formatting. * @param limits contains the top value that you want - * parsed with that format,and should be in ascending sorted order. When + * parsed with that format, and should be in ascending sorted order. When * formatting X, the choice will be the i, where - * limit[i] <= X < limit[i+1]. + * limit[i] ≤ X {@literal <} limit[i+1]. * If the limit array is not in ascending order, the results of formatting * will be incorrect. * @param formats are the formats you want to use for each limit. @@ -434,9 +441,12 @@ } /** - * Finds the least double greater than d. - * If NaN, returns same value. + * Finds the least double greater than {@code d}. + * If {@code NaN}, returns same value. *

                              Used to make half-open intervals. + * + * @param d the reference value + * @return the least double value greather than {@code d} * @see #previousDouble */ public static final double nextDouble (double d) { @@ -444,8 +454,11 @@ } /** - * Finds the greatest double less than d. - * If NaN, returns same value. + * Finds the greatest double less than {@code d}. + * If {@code NaN}, returns same value. + * + * @param d the reference value + * @return the greatest double value less than {@code d} * @see #nextDouble */ public static final double previousDouble (double d) { @@ -553,15 +566,21 @@ static final long POSITIVEINFINITY = 0x7FF0000000000000L; /** - * Finds the least double greater than d (if positive == true), - * or the greatest double less than d (if positive == false). - * If NaN, returns same value. + * Finds the least double greater than {@code d} (if {@code positive} is + * {@code true}), or the greatest double less than {@code d} (if + * {@code positive} is {@code false}). + * If {@code NaN}, returns same value. * * Does not affect floating-point flags, * provided these member functions do not: * Double.longBitsToDouble(long) * Double.doubleToLongBits(double) * Double.isNaN(double) + * + * @param d the reference value + * @param positive {@code true} if the least double is desired; + * {@code false} otherwise + * @return the least or greater double value */ public static double nextDouble (double d, boolean positive) { diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/text/CollationElementIterator.java --- a/jdk/src/share/classes/java/text/CollationElementIterator.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/text/CollationElementIterator.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -54,14 +54,14 @@ * For example, consider the following in Spanish: *

                              *
                              - * "ca" -> the first key is key('c') and second key is key('a').
                              - * "cha" -> the first key is key('ch') and second key is key('a').
                              + * "ca" → the first key is key('c') and second key is key('a').
                              + * "cha" → the first key is key('ch') and second key is key('a').
                                * 
                              *
                              * And in German, *
                              *
                              - * "\u00e4b"-> the first key is key('a'), the second key is key('e'), and
                              + * "\u00e4b" → the first key is key('a'), the second key is key('e'), and
                                * the third key is key('b').
                                * 
                              *
                              @@ -177,6 +177,8 @@ * means that when you change direction while iterating (i.e., call next() and * then call previous(), or call previous() and then call next()), you'll get * back the same element twice.

                              + * + * @return the next collation element */ public int next() { @@ -272,6 +274,8 @@ * updates the pointer. This means that when you change direction while * iterating (i.e., call next() and then call previous(), or call previous() * and then call next()), you'll get back the same element twice.

                              + * + * @return the previous collation element * @since 1.2 */ public int previous() diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/text/CollationKey.java --- a/jdk/src/share/classes/java/text/CollationKey.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/text/CollationKey.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -68,28 +68,28 @@ * The following example shows how CollationKeys might be used * to sort a list of Strings. *
                              - *
                              + * 
                              {@code
                                * // Create an array of CollationKeys for the Strings to be sorted.
                                * Collator myCollator = Collator.getInstance();
                                * CollationKey[] keys = new CollationKey[3];
                                * keys[0] = myCollator.getCollationKey("Tom");
                                * keys[1] = myCollator.getCollationKey("Dick");
                                * keys[2] = myCollator.getCollationKey("Harry");
                              - * sort( keys );
                              - * 
                              + * sort(keys); + * * //... - *
                              + * * // Inside body of sort routine, compare keys this way - * if( keys[i].compareTo( keys[j] ) > 0 ) + * if (keys[i].compareTo(keys[j]) > 0) * // swap keys[i] and keys[j] - *
                              + * * //... - *
                              + * * // Finally, when we've returned from sort. - * System.out.println( keys[0].getSourceString() ); - * System.out.println( keys[1].getSourceString() ); - * System.out.println( keys[2].getSourceString() ); - *
                              + * System.out.println(keys[0].getSourceString()); + * System.out.println(keys[1].getSourceString()); + * System.out.println(keys[2].getSourceString()); + * }
                              *
                              * * @see Collator @@ -112,6 +112,8 @@ /** * Returns the String that this CollationKey represents. + * + * @return the source string of this CollationKey */ public String getSourceString() { return source; @@ -123,6 +125,8 @@ * could be legitimately compared, then one could compare the byte arrays * for each of those keys to obtain the same result. Byte arrays are * organized most significant byte first. + * + * @return a byte array representation of the CollationKey */ abstract public byte[] toByteArray(); @@ -130,8 +134,8 @@ /** * CollationKey constructor. * - * @param source - the source string. - * @exception NullPointerException if source is null. + * @param source the source string + * @exception NullPointerException if {@code source} is null * @since 1.6 */ protected CollationKey(String source) { diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/text/DateFormat.java --- a/jdk/src/share/classes/java/text/DateFormat.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/text/DateFormat.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -57,7 +57,7 @@ * {@code DateFormat} is an abstract class for date/time formatting subclasses which * formats and parses dates or time in a language-independent manner. * The date/time formatting subclass, such as {@link SimpleDateFormat}, allows for - * formatting (i.e., date -> text), parsing (text -> date), and + * formatting (i.e., date → text), parsing (text → date), and * normalization. The date is represented as a Date object or * as the milliseconds since January 1, 1970, 00:00:00 GMT. * @@ -73,28 +73,36 @@ * *

                              To format a date for the current Locale, use one of the * static factory methods: - *

                              - *  myString = DateFormat.getDateInstance().format(myDate);
                              - * 
                              + *
                              + *
                              {@code
                              + * myString = DateFormat.getDateInstance().format(myDate);
                              + * }
                              + *
                              *

                              If you are formatting multiple dates, it is * more efficient to get the format and use it multiple times so that * the system doesn't have to fetch the information about the local * language and country conventions multiple times. - *

                              - *  DateFormat df = DateFormat.getDateInstance();
                              - *  for (int i = 0; i < myDate.length; ++i) {
                              - *    output.println(df.format(myDate[i]) + "; ");
                              - *  }
                              - * 
                              + *
                              + *
                              {@code
                              + * DateFormat df = DateFormat.getDateInstance();
                              + * for (int i = 0; i < myDate.length; ++i) {
                              + *     output.println(df.format(myDate[i]) + "; ");
                              + * }
                              + * }
                              + *
                              *

                              To format a date for a different Locale, specify it in the * call to {@link #getDateInstance(int, Locale) getDateInstance()}. - *

                              - *  DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, Locale.FRANCE);
                              - * 
                              + *
                              + *
                              {@code
                              + * DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, Locale.FRANCE);
                              + * }
                              + *
                              *

                              You can use a DateFormat to parse also. - *

                              - *  myDate = df.parse(myString);
                              - * 
                              + *
                              + *
                              {@code
                              + * myDate = df.parse(myString);
                              + * }
                              + *
                              *

                              Use {@code getDateInstance} to get the normal date format for that country. * There are other static factory methods available. * Use {@code getTimeInstance} to get the time format for that country. @@ -125,7 +133,7 @@ * on the screen. *

                            * - *

                            Synchronization

                            + *

                            Synchronization

                            * *

                            * Date formats are not synchronized. @@ -581,6 +589,8 @@ /** * Get a default date/time formatter that uses the SHORT style for both the * date and the time. + * + * @return a date/time formatter */ public final static DateFormat getInstance() { return getDateTimeInstance(SHORT, SHORT); @@ -653,9 +663,9 @@ /** * Sets the time zone for the calendar of this {@code DateFormat} object. * This method is equivalent to the following call. - *

                            -     *  getCalendar().setTimeZone(zone)
                            -     * 
                            + *
                            {@code
                            +     * getCalendar().setTimeZone(zone)
                            +     * }
                            * *

                            The {@code TimeZone} set by this method is overwritten by a * {@link #setCalendar(java.util.Calendar) setCalendar} call. @@ -673,9 +683,9 @@ /** * Gets the time zone. * This method is equivalent to the following call. - *

                            -     *  getCalendar().getTimeZone()
                            -     * 
                            + *
                            {@code
                            +     * getCalendar().getTimeZone()
                            +     * }
                            * * @return the time zone associated with the calendar of DateFormat. */ @@ -691,9 +701,9 @@ * inputs must match this object's format. * *

                            This method is equivalent to the following call. - *

                            -     *  getCalendar().setLenient(lenient)
                            -     * 
                            + *
                            {@code
                            +     * getCalendar().setLenient(lenient)
                            +     * }
                            * *

                            This leniency value is overwritten by a call to {@link * #setCalendar(java.util.Calendar) setCalendar()}. @@ -709,9 +719,9 @@ /** * Tell whether date/time parsing is to be lenient. * This method is equivalent to the following call. - *

                            -     *  getCalendar().isLenient()
                            -     * 
                            + *
                            {@code
                            +     * getCalendar().isLenient()
                            +     * }
                            * * @return {@code true} if the {@link #calendar} is lenient; * {@code false} otherwise. diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/text/DateFormatSymbols.java --- a/jdk/src/share/classes/java/text/DateFormatSymbols.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/text/DateFormatSymbols.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -135,6 +135,7 @@ * implementations. For full locale coverage, use the * {@link #getInstance(Locale) getInstance} method. * + * @param locale the desired locale * @see #getInstance(Locale) * @exception java.util.MissingResourceException * if the resources for the specified locale cannot be diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/text/DecimalFormat.java --- a/jdk/src/share/classes/java/text/DecimalFormat.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/text/DecimalFormat.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -87,7 +87,7 @@ * the NumberFormat factory methods, the pattern and symbols are * read from localized ResourceBundles. * - *

                            Patterns

                            + *

                            Patterns

                            * * DecimalFormat patterns have the following syntax: *
                            @@ -174,7 +174,7 @@
                              * 
                            *

                            Attribute views

                            Description

                            Attribute viewsDescription
                            {@link java.nio.file.attribute.AttributeView}Can read or update non-opaque values associated with objects in a file system
                              {@link java.nio.file.attribute.FileAttributeView}Can read or update POSIX defined file attributes
                                  {@link java.nio.file.attribute.DosFileAttributeView}  Can read or update FAT file attributes
                                {@link java.nio.file.attribute.FileOwnerAttributeView}  
                                {@link java.nio.file.attribute.FileOwnerAttributeView}  Can read or update the owner of a file
                                 {@link java.nio.file.attribute.AclFileAttributeView}  Can read or update Access Control Lists
                            - * + * * + * * + * * + * * + * * + * * * @@ -811,6 +811,8 @@ * @param result where text is appended. * @param pos On input: an alignment field, if desired. * On output: the offsets of the alignment field. + * @return the string buffer passed in as {@code result}, with formatted + * text appended * @exception IllegalArgumentException if an argument in the * arguments array is not of the type * expected by the format element(s) that use it. @@ -828,6 +830,9 @@ * (new {@link #MessageFormat(String) MessageFormat}(pattern)).{@link #format(java.lang.Object[], java.lang.StringBuffer, java.text.FieldPosition) format}(arguments, new StringBuffer(), null).toString() * * + * @param pattern the pattern string + * @param arguments object(s) to format + * @return the formatted string * @exception IllegalArgumentException if the pattern is invalid, * or if an argument in the arguments array * is not of the type expected by the format element(s) @@ -940,6 +945,10 @@ * is comparing against the pattern "AAD {0} BBB", the error index is * 0. When an error occurs, the call to this method will return null. * If the source is null, return an empty array. + * + * @param source the string to parse + * @param pos the parse position + * @return an array of parsed objects */ public Object[] parse(String source, ParsePosition pos) { if (source == null) { diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/text/Normalizer.java --- a/jdk/src/share/classes/java/text/Normalizer.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/text/Normalizer.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -55,14 +55,12 @@ * *

                              *      U+00C1    LATIN CAPITAL LETTER A WITH ACUTE
                            - *

                            * * or as two separate characters (the "decomposed" form): * *

                              *      U+0041    LATIN CAPITAL LETTER A
                              *      U+0301    COMBINING ACUTE ACCENT
                            - *

                            * * To a user of your program, however, both of these sequences should be * treated as the same "user-level" character "A with acute accent". When you @@ -78,13 +76,11 @@ * U+0066 LATIN SMALL LETTER F * U+0066 LATIN SMALL LETTER F * U+0069 LATIN SMALL LETTER I - *

                            * * or as the single character * *

                              *      U+FB03    LATIN SMALL LIGATURE FFI
                            - *

                            * * The ffi ligature is not a distinct semantic character, and strictly speaking * it shouldn't be in Unicode at all, but it was included for compatibility diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/text/NumberFormat.java --- a/jdk/src/share/classes/java/text/NumberFormat.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/text/NumberFormat.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -73,34 +73,34 @@ * To format a number for the current Locale, use one of the factory * class methods: *
                            - *
                            - *  myString = NumberFormat.getInstance().format(myNumber);
                            - * 
                            + *
                            {@code
                            + * myString = NumberFormat.getInstance().format(myNumber);
                            + * }
                            *
                            * If you are formatting multiple numbers, it is * more efficient to get the format and use it multiple times so that * the system doesn't have to fetch the information about the local * language and country conventions multiple times. *
                            - *
                            + * 
                            {@code
                              * NumberFormat nf = NumberFormat.getInstance();
                              * for (int i = 0; i < myNumber.length; ++i) {
                              *     output.println(nf.format(myNumber[i]) + "; ");
                              * }
                            - * 
                            + * }
                            *
                            * To format a number for a different Locale, specify it in the * call to getInstance. *
                            - *
                            + * 
                            {@code
                              * NumberFormat nf = NumberFormat.getInstance(Locale.FRENCH);
                            - * 
                            + * }
                            *
                            * You can also use a NumberFormat to parse numbers: *
                            - *
                            + * 
                            {@code
                              * myNumber = nf.parse(myString);
                            - * 
                            + * }
                            *
                            * Use getInstance or getNumberInstance to get the * normal number format. Use getIntegerInstance to get an @@ -125,8 +125,8 @@ * the detailed description for each these control methods, *

                            * setParseIntegerOnly : only affects parsing, e.g. - * if true, "3456.78" -> 3456 (and leaves the parse position just after index 6) - * if false, "3456.78" -> 3456.78 (and leaves the parse position just after index 8) + * if true, "3456.78" → 3456 (and leaves the parse position just after index 6) + * if false, "3456.78" → 3456.78 (and leaves the parse position just after index 8) * This is independent of formatting. If you want to not show a decimal point * where there might be no digits after the decimal point, use * setDecimalSeparatorAlwaysShown. @@ -134,8 +134,8 @@ * setDecimalSeparatorAlwaysShown : only affects formatting, and only where * there might be no digits after the decimal point, such as with a pattern * like "#,##0.##", e.g., - * if true, 3456.00 -> "3,456." - * if false, 3456.00 -> "3456" + * if true, 3456.00 → "3,456." + * if false, 3456.00 → "3456" * This is independent of parsing. If you want parsing to stop at the decimal * point, use setParseIntegerOnly. * @@ -166,7 +166,7 @@ * numbers: "(12)" for -12. * * - *

                            Synchronization

                            + *

                            Synchronization

                            * *

                            * Number formats are generally not synchronized. @@ -280,6 +280,9 @@ /** * Specialization of format. + * + * @param number the double number to format + * @return the formatted String * @exception ArithmeticException if rounding is needed with rounding * mode being set to RoundingMode.UNNECESSARY * @see java.text.Format#format @@ -302,6 +305,9 @@ /** * Specialization of format. + * + * @param number the long number to format + * @return the formatted String * @exception ArithmeticException if rounding is needed with rounding * mode being set to RoundingMode.UNNECESSARY * @see java.text.Format#format @@ -313,6 +319,12 @@ /** * Specialization of format. + * + * @param number the double number to format + * @param toAppendTo the StringBuffer to which the formatted text is to be + * appended + * @param pos the field position + * @return the formatted StringBuffer * @exception ArithmeticException if rounding is needed with rounding * mode being set to RoundingMode.UNNECESSARY * @see java.text.Format#format @@ -323,6 +335,12 @@ /** * Specialization of format. + * + * @param number the long number to format + * @param toAppendTo the StringBuffer to which the formatted text is to be + * appended + * @param pos the field position + * @return the formatted StringBuffer * @exception ArithmeticException if rounding is needed with rounding * mode being set to RoundingMode.UNNECESSARY * @see java.text.Format#format @@ -339,6 +357,10 @@ * after the 1). * Does not throw an exception; if no object can be parsed, index is * unchanged! + * + * @param source the String to parse + * @param parsePosition the parse position + * @return the parsed value * @see java.text.NumberFormat#isParseIntegerOnly * @see java.text.Format#parseObject */ @@ -373,6 +395,9 @@ * would stop at the "." character. Of course, the exact format accepted * by the parse operation is locale dependant and determined by sub-classes * of NumberFormat. + * + * @return {@code true} if numbers should be parsed as integers only; + * {@code false} otherwise */ public boolean isParseIntegerOnly() { return parseIntegerOnly; @@ -380,6 +405,9 @@ /** * Sets whether or not numbers should be parsed as integers only. + * + * @param value {@code true} if numbers should be parsed as integers only; + * {@code false} otherwise * @see #isParseIntegerOnly */ public void setParseIntegerOnly(boolean value) { @@ -393,6 +421,9 @@ * {@link java.util.Locale.Category#FORMAT FORMAT} locale. * This is the same as calling * {@link #getNumberInstance() getNumberInstance()}. + * + * @return the {@code NumberFormat} instance for general-purpose number + * formatting */ public final static NumberFormat getInstance() { return getInstance(Locale.getDefault(Locale.Category.FORMAT), NUMBERSTYLE); @@ -402,6 +433,10 @@ * Returns a general-purpose number format for the specified locale. * This is the same as calling * {@link #getNumberInstance(java.util.Locale) getNumberInstance(inLocale)}. + * + * @param inLocale the desired locale + * @return the {@code NumberFormat} instance for general-purpose number + * formatting */ public static NumberFormat getInstance(Locale inLocale) { return getInstance(inLocale, NUMBERSTYLE); @@ -413,6 +448,9 @@ *

                            This is equivalent to calling * {@link #getNumberInstance(Locale) * getNumberInstance(Locale.getDefault(Locale.Category.FORMAT))}. + * + * @return the {@code NumberFormat} instance for general-purpose number + * formatting * @see java.util.Locale#getDefault(java.util.Locale.Category) * @see java.util.Locale.Category#FORMAT */ @@ -422,6 +460,10 @@ /** * Returns a general-purpose number format for the specified locale. + * + * @param inLocale the desired locale + * @return the {@code NumberFormat} instance for general-purpose number + * formatting */ public static NumberFormat getNumberInstance(Locale inLocale) { return getInstance(inLocale, NUMBERSTYLE); @@ -457,6 +499,7 @@ * and to parse only the integer part of an input string (see {@link * #isParseIntegerOnly isParseIntegerOnly}). * + * @param inLocale the desired locale * @see #getRoundingMode() * @return a number format for integer values * @since 1.4 @@ -472,6 +515,7 @@ * {@link #getCurrencyInstance(Locale) * getCurrencyInstance(Locale.getDefault(Locale.Category.FORMAT))}. * + * @return the {@code NumberFormat} instance for currency formatting * @see java.util.Locale#getDefault(java.util.Locale.Category) * @see java.util.Locale.Category#FORMAT */ @@ -481,6 +525,9 @@ /** * Returns a currency format for the specified locale. + * + * @param inLocale the desired locale + * @return the {@code NumberFormat} instance for currency formatting */ public static NumberFormat getCurrencyInstance(Locale inLocale) { return getInstance(inLocale, CURRENCYSTYLE); @@ -493,6 +540,7 @@ * {@link #getPercentInstance(Locale) * getPercentInstance(Locale.getDefault(Locale.Category.FORMAT))}. * + * @return the {@code NumberFormat} instance for percentage formatting * @see java.util.Locale#getDefault(java.util.Locale.Category) * @see java.util.Locale.Category#FORMAT */ @@ -502,6 +550,9 @@ /** * Returns a percentage format for the specified locale. + * + * @param inLocale the desired locale + * @return the {@code NumberFormat} instance for percentage formatting */ public static NumberFormat getPercentInstance(Locale inLocale) { return getInstance(inLocale, PERCENTSTYLE); @@ -516,6 +567,8 @@ /** * Returns a scientific format for the specified locale. + * + * @param inLocale the desired locale */ /*public*/ static NumberFormat getScientificInstance(Locale inLocale) { return getInstance(inLocale, SCIENTIFICSTYLE); @@ -586,6 +639,9 @@ * English locale, with grouping on, the number 1234567 might be formatted * as "1,234,567". The grouping separator as well as the size of each group * is locale dependant and is determined by sub-classes of NumberFormat. + * + * @return {@code true} if grouping is used; + * {@code false} otherwise * @see #setGroupingUsed */ public boolean isGroupingUsed() { @@ -594,6 +650,9 @@ /** * Set whether or not grouping will be used in this format. + * + * @param newValue {@code true} if grouping is used; + * {@code false} otherwise * @see #isGroupingUsed */ public void setGroupingUsed(boolean newValue) { @@ -603,6 +662,8 @@ /** * Returns the maximum number of digits allowed in the integer portion of a * number. + * + * @return the maximum number of digits * @see #setMaximumIntegerDigits */ public int getMaximumIntegerDigits() { @@ -611,10 +672,11 @@ /** * Sets the maximum number of digits allowed in the integer portion of a - * number. maximumIntegerDigits must be >= minimumIntegerDigits. If the + * number. maximumIntegerDigits must be ≥ minimumIntegerDigits. If the * new value for maximumIntegerDigits is less than the current value * of minimumIntegerDigits, then minimumIntegerDigits will also be set to * the new value. + * * @param newValue the maximum number of integer digits to be shown; if * less than zero, then zero is used. The concrete subclass may enforce an * upper limit to this value appropriate to the numeric type being formatted. @@ -630,6 +692,8 @@ /** * Returns the minimum number of digits allowed in the integer portion of a * number. + * + * @return the minimum number of digits * @see #setMinimumIntegerDigits */ public int getMinimumIntegerDigits() { @@ -638,10 +702,11 @@ /** * Sets the minimum number of digits allowed in the integer portion of a - * number. minimumIntegerDigits must be <= maximumIntegerDigits. If the + * number. minimumIntegerDigits must be ≤ maximumIntegerDigits. If the * new value for minimumIntegerDigits exceeds the current value * of maximumIntegerDigits, then maximumIntegerDigits will also be set to * the new value + * * @param newValue the minimum number of integer digits to be shown; if * less than zero, then zero is used. The concrete subclass may enforce an * upper limit to this value appropriate to the numeric type being formatted. @@ -657,6 +722,8 @@ /** * Returns the maximum number of digits allowed in the fraction portion of a * number. + * + * @return the maximum number of digits. * @see #setMaximumFractionDigits */ public int getMaximumFractionDigits() { @@ -665,10 +732,11 @@ /** * Sets the maximum number of digits allowed in the fraction portion of a - * number. maximumFractionDigits must be >= minimumFractionDigits. If the + * number. maximumFractionDigits must be ≥ minimumFractionDigits. If the * new value for maximumFractionDigits is less than the current value * of minimumFractionDigits, then minimumFractionDigits will also be set to * the new value. + * * @param newValue the maximum number of fraction digits to be shown; if * less than zero, then zero is used. The concrete subclass may enforce an * upper limit to this value appropriate to the numeric type being formatted. @@ -684,6 +752,8 @@ /** * Returns the minimum number of digits allowed in the fraction portion of a * number. + * + * @return the minimum number of digits * @see #setMinimumFractionDigits */ public int getMinimumFractionDigits() { @@ -692,10 +762,11 @@ /** * Sets the minimum number of digits allowed in the fraction portion of a - * number. minimumFractionDigits must be <= maximumFractionDigits. If the + * number. minimumFractionDigits must be ≤ maximumFractionDigits. If the * new value for minimumFractionDigits exceeds the current value * of maximumFractionDigits, then maximumIntegerDigits will also be set to * the new value + * * @param newValue the minimum number of fraction digits to be shown; if * less than zero, then zero is used. The concrete subclass may enforce an * upper limit to this value appropriate to the numeric type being formatted. diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/text/ParseException.java --- a/jdk/src/share/classes/java/text/ParseException.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/text/ParseException.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -55,6 +55,7 @@ * Constructs a ParseException with the specified detail message and * offset. * A detail message is a String that describes this particular exception. + * * @param s the detail message * @param errorOffset the position where the error is found while parsing. */ @@ -65,6 +66,8 @@ /** * Returns the position where the error was found. + * + * @return the position where the error was found */ public int getErrorOffset () { return errorOffset; diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/text/ParsePosition.java --- a/jdk/src/share/classes/java/text/ParsePosition.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/text/ParsePosition.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2002, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -69,6 +69,8 @@ * Retrieve the current parse position. On input to a parse method, this * is the index of the character at which parsing will begin; on output, it * is the index of the character following the last character parsed. + * + * @return the current parse position */ public int getIndex() { return index; @@ -76,6 +78,8 @@ /** * Set the current parse position. + * + * @param index the current parse position */ public void setIndex(int index) { this.index = index; @@ -83,6 +87,8 @@ /** * Create a new ParsePosition with the given initial index. + * + * @param index initial index */ public ParsePosition(int index) { this.index = index; @@ -91,6 +97,8 @@ * Set the index at which a parse error occurred. Formatters * should set this before returning an error code from their * parseObject method. The default value is -1 if this is not set. + * + * @param ei the index at which an error occurred * @since 1.2 */ public void setErrorIndex(int ei) @@ -101,12 +109,15 @@ /** * Retrieve the index at which an error occurred, or -1 if the * error index has not been set. + * + * @return the index at which an error occurred * @since 1.2 */ public int getErrorIndex() { return errorIndex; } + /** * Overrides equals */ diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/text/RuleBasedCollator.java --- a/jdk/src/share/classes/java/text/RuleBasedCollator.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/text/RuleBasedCollator.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -68,17 +68,17 @@ * <reset> <text-argument> * * The definitions of the rule elements is as follows: - *

                              + *
                                *
                              • Text-Argument: A text-argument is any sequence of * characters, excluding special characters (that is, common * whitespace characters [0009-000D, 0020] and rule syntax characters * [0021-002F, 003A-0040, 005B-0060, 007B-007E]). If those * characters are desired, you can put them in single quotes - * (e.g. ampersand => '&'). Note that unquoted white space characters + * (e.g. ampersand => '&'). Note that unquoted white space characters * are ignored; e.g. b c is treated as bc. *
                              • Modifier: There are currently two modifiers that * turn on special collation rules. - *
                                  + *
                                    *
                                  • '@' : Turns on backwards sorting of accents (secondary * differences), as in French. *
                                  • '!' : Turns on Thai/Lao vowel-consonant swapping. If this @@ -91,7 +91,7 @@ *
                                  *

                                  '@' : Indicates that accents are sorted backwards, as in French. *

                                • Relation: The relations are the following: - *
                                    + *
                                      *
                                    • '<' : Greater, as a letter difference (primary) *
                                    • ';' : Greater, as an accent difference (secondary) *
                                    • ',' : Greater, as a case difference (tertiary) @@ -100,7 +100,7 @@ *
                                    • Reset: There is a single reset * which is used primarily for contractions and expansions, but which * can also be used to add a modification at the end of a set of rules. - *

                                      '&' : Indicates that the next rule follows the position to where + *

                                      '&' : Indicates that the next rule follows the position to where * the reset text-argument would be sorted. *

                                    * @@ -166,7 +166,7 @@ *

                                    Errors *

                                    * The following are errors: - *

                                      + *
                                        *
                                      • A text-argument contains unquoted punctuation symbols * (e.g. "a < b-c < d"). *
                                      • A relation or reset character not followed by a text-argument @@ -206,8 +206,8 @@ * String Norwegian = "< a, A < b, B < c, C < d, D < e, E < f, F < g, G < h, H < i, I" + * "< j, J < k, K < l, L < m, M < n, N < o, O < p, P < q, Q < r, R" + * "< s, S < t, T < u, U < v, V < w, W < x, X < y, Y < z, Z" + - * "< \u00E6, \u00C6" + // Latin letter ae & AE - * "< \u00F8, \u00D8" + // Latin letter o & O with stroke + * "< \u00E6, \u00C6" + // Latin letter ae & AE + * "< \u00F8, \u00D8" + // Latin letter o & O with stroke * "< \u00E5 = a\u030A," + // Latin letter a with ring above * " \u00C5 = A\u030A;" + // Latin letter A with ring above * " aa, AA"; @@ -232,9 +232,9 @@ * + ";\u030B;\u030C;\u030D;\u030E" // main accents * + ";\u030F;\u0310;\u0311;\u0312" // main accents * + "< a , A ; ae, AE ; \u00e6 , \u00c6" - * + "< b , B < c, C < e, E & C < d, D"; + * + "< b , B < c, C < e, E & C < d, D"; * // change the order of accent characters - * String addOn = "& \u0300 ; \u0308 ; \u0302"; + * String addOn = "& \u0300 ; \u0308 ; \u0302"; * RuleBasedCollator myCollator = new RuleBasedCollator(oldRules + addOn); * * @@ -274,7 +274,7 @@ * @param rules the collation rules to build the collation table from. * @exception ParseException A format exception * will be thrown if the build process of the rules fails. For - * example, build rule "a < ? < d" will cause the constructor to + * example, build rule "a < ? < d" will cause the constructor to * throw the ParseException because the '?' is not quoted. */ public RuleBasedCollator(String rules) throws ParseException { @@ -320,7 +320,10 @@ } /** - * Return a CollationElementIterator for the given String. + * Returns a CollationElementIterator for the given String. + * + * @param source the string to be collated + * @return a {@code CollationElementIterator} object * @see java.text.CollationElementIterator */ public CollationElementIterator getCollationElementIterator(String source) { @@ -328,7 +331,10 @@ } /** - * Return a CollationElementIterator for the given String. + * Returns a CollationElementIterator for the given CharacterIterator. + * + * @param source the character iterator to be collated + * @return a {@code CollationElementIterator} object * @see java.text.CollationElementIterator * @since 1.2 */ diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/text/SimpleDateFormat.java --- a/jdk/src/share/classes/java/text/SimpleDateFormat.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/text/SimpleDateFormat.java Fri Aug 02 09:38:09 2013 +0100 @@ -59,7 +59,7 @@ /** * SimpleDateFormat is a concrete class for formatting and * parsing dates in a locale-sensitive manner. It allows for formatting - * (date -> text), parsing (text -> date), and normalization. + * (date → text), parsing (text → date), and normalization. * *

                                        * SimpleDateFormat allows you to start by choosing @@ -73,7 +73,7 @@ * For more information on using these methods, see * {@link DateFormat}. * - *

                                        Date and Time Patterns

                                        + *

                                        Date and Time Patterns

                                        *

                                        * Date and time formats are specified by date and time pattern * strings. @@ -93,7 +93,7 @@ * 'z' are reserved): *

                                        *
                            Symbol * Location * Localized? @@ -184,7 +184,7 @@ * Number * Yes * Digit - *
                            # * Number * Yes @@ -194,7 +194,7 @@ * Number * Yes * Decimal separator or monetary decimal separator - *
                            - * Number * Yes @@ -204,7 +204,7 @@ * Number * Yes * Grouping separator - *
                            E * Number * Yes @@ -215,7 +215,7 @@ * Subpattern boundary * Yes * Separates positive and negative subpatterns - *
                            % * Prefix or suffix * Yes @@ -225,7 +225,7 @@ * Prefix or suffix * Yes * Multiply by 1000 and show as per mille value - *
                            ¤ (\u00A4) * Prefix or suffix * No @@ -248,7 +248,8 @@ * *

                            Numbers in scientific notation are expressed as the product of a mantissa * and a power of ten, for example, 1234 can be expressed as 1.234 x 10^3. The - * mantissa is often in the range 1.0 <= x < 10.0, but it need not be. + * mantissa is often in the range 1.0 ≤ x {@literal <} 10.0, but it need not + * be. * DecimalFormat can be instructed to format and parse scientific * notation only via a pattern; there is currently no factory method * that creates a scientific notation format. In a pattern, the exponent @@ -336,13 +337,13 @@ * *

                            Example

                            * - *
                            + * 
                            {@code
                              * // Print out a number using the localized number, integer, currency,
                              * // and percent format for each locale
                              * Locale[] locales = NumberFormat.getAvailableLocales();
                              * double myNumber = -1234.56;
                              * NumberFormat form;
                            - * for (int j=0; j<4; ++j) {
                            + * for (int j = 0; j < 4; ++j) {
                              *     System.out.println("FORMAT");
                              *     for (int i = 0; i < locales.length; ++i) {
                              *         if (locales[i].getCountry().length() == 0) {
                            @@ -368,7 +369,7 @@
                              *         } catch (ParseException e) {}
                              *     }
                              * }
                            - * 
                            + * }
                            * * @see Java Tutorial * @see NumberFormat @@ -421,7 +422,7 @@ * return the most appropriate sub-class of NumberFormat for a given * locale. * - * @param pattern A non-localized pattern string. + * @param pattern a non-localized pattern string. * @exception NullPointerException if pattern is null * @exception IllegalArgumentException if the given pattern is invalid. * @see java.text.NumberFormat#getInstance @@ -2382,6 +2383,8 @@ /** * Get the positive prefix. *

                            Examples: +123, $123, sFr123 + * + * @return the positive prefix */ public String getPositivePrefix () { return positivePrefix; @@ -2390,6 +2393,8 @@ /** * Set the positive prefix. *

                            Examples: +123, $123, sFr123 + * + * @param newValue the new positive prefix */ public void setPositivePrefix (String newValue) { positivePrefix = newValue; @@ -2420,6 +2425,8 @@ /** * Get the negative prefix. *

                            Examples: -123, ($123) (with negative suffix), sFr-123 + * + * @return the negative prefix */ public String getNegativePrefix () { return negativePrefix; @@ -2428,6 +2435,8 @@ /** * Set the negative prefix. *

                            Examples: -123, ($123) (with negative suffix), sFr-123 + * + * @param newValue the new negative prefix */ public void setNegativePrefix (String newValue) { negativePrefix = newValue; @@ -2457,6 +2466,8 @@ /** * Get the positive suffix. *

                            Example: 123% + * + * @return the positive suffix */ public String getPositiveSuffix () { return positiveSuffix; @@ -2465,6 +2476,8 @@ /** * Set the positive suffix. *

                            Example: 123% + * + * @param newValue the new positive suffix */ public void setPositiveSuffix (String newValue) { positiveSuffix = newValue; @@ -2494,6 +2507,8 @@ /** * Get the negative suffix. *

                            Examples: -123%, ($123) (with positive suffixes) + * + * @return the negative suffix */ public String getNegativeSuffix () { return negativeSuffix; @@ -2502,6 +2517,8 @@ /** * Set the negative suffix. *

                            Examples: 123% + * + * @param newValue the new negative suffix */ public void setNegativeSuffix (String newValue) { negativeSuffix = newValue; @@ -2532,6 +2549,7 @@ * Gets the multiplier for use in percent, per mille, and similar * formats. * + * @return the multiplier * @see #setMultiplier(int) */ public int getMultiplier () { @@ -2549,6 +2567,7 @@ *

                            Example: with multiplier 100, 1.23 is formatted as "123", and * "123" is parsed into 1.23. * + * @param newValue the new multiplier * @see #getMultiplier */ public void setMultiplier (int newValue) { @@ -2571,6 +2590,8 @@ * Return the grouping size. Grouping size is the number of digits between * grouping separators in the integer portion of a number. For example, * in the number "123,456.78", the grouping size is 3. + * + * @return the grouping size * @see #setGroupingSize * @see java.text.NumberFormat#isGroupingUsed * @see java.text.DecimalFormatSymbols#getGroupingSeparator @@ -2585,6 +2606,8 @@ * in the number "123,456.78", the grouping size is 3. *
                            * The value passed in is converted to a byte, which may lose information. + * + * @param newValue the new grouping size * @see #getGroupingSize * @see java.text.NumberFormat#setGroupingUsed * @see java.text.DecimalFormatSymbols#setGroupingSeparator @@ -2597,7 +2620,10 @@ /** * Allows you to get the behavior of the decimal separator with integers. * (The decimal separator will always appear with decimals.) - *

                            Example: Decimal ON: 12345 -> 12345.; OFF: 12345 -> 12345 + *

                            Example: Decimal ON: 12345 → 12345.; OFF: 12345 → 12345 + * + * @return {@code true} if the decimal separator is always shown; + * {@code false} otherwise */ public boolean isDecimalSeparatorAlwaysShown() { return decimalSeparatorAlwaysShown; @@ -2606,7 +2632,10 @@ /** * Allows you to set the behavior of the decimal separator with integers. * (The decimal separator will always appear with decimals.) - *

                            Example: Decimal ON: 12345 -> 12345.; OFF: 12345 -> 12345 + *

                            Example: Decimal ON: 12345 → 12345.; OFF: 12345 → 12345 + * + * @param newValue {@code true} if the decimal separator is always shown; + * {@code false} otherwise */ public void setDecimalSeparatorAlwaysShown(boolean newValue) { decimalSeparatorAlwaysShown = newValue; @@ -2616,6 +2645,9 @@ /** * Returns whether the {@link #parse(java.lang.String, java.text.ParsePosition)} * method returns BigDecimal. The default value is false. + * + * @return {@code true} if the parse method returns BigDecimal; + * {@code false} otherwise * @see #setParseBigDecimal * @since 1.5 */ @@ -2626,6 +2658,9 @@ /** * Sets whether the {@link #parse(java.lang.String, java.text.ParsePosition)} * method returns BigDecimal. + * + * @param newValue {@code true} if the parse method returns BigDecimal; + * {@code false} otherwise * @see #isParseBigDecimal * @since 1.5 */ @@ -2712,6 +2747,8 @@ /** * Synthesizes a pattern string that represents the current state * of this Format object. + * + * @return a pattern string * @see #applyPattern */ public String toPattern() { @@ -2721,6 +2758,8 @@ /** * Synthesizes a localized pattern string that represents the current * state of this Format object. + * + * @return a localized pattern string * @see #applyPattern */ public String toLocalizedPattern() { @@ -3049,7 +3088,7 @@ * by this routine, since that is the typical end-user desire; * use setMaximumInteger if you want to set a real value. * For negative numbers, use a second pattern, separated by a semicolon - *

                            Example "#,#00.0#" -> 1,234.56 + *

                            Example "#,#00.0#" → 1,234.56 *

                            This means a minimum of 2 integer digits, 1 fraction digit, and * a maximum of 2 fraction digits. *

                            Example: "#,#00.0#;(#,#00.0#)" for negatives in @@ -3057,6 +3096,7 @@ *

                            In negative patterns, the minimum and maximum counts are ignored; * these are presumed to be set in the positive pattern. * + * @param pattern a new pattern * @exception NullPointerException if pattern is null * @exception IllegalArgumentException if the given pattern is invalid. */ @@ -3075,7 +3115,7 @@ * by this routine, since that is the typical end-user desire; * use setMaximumInteger if you want to set a real value. * For negative numbers, use a second pattern, separated by a semicolon - *

                            Example "#,#00.0#" -> 1,234.56 + *

                            Example "#,#00.0#" → 1,234.56 *

                            This means a minimum of 2 integer digits, 1 fraction digit, and * a maximum of 2 fraction digits. *

                            Example: "#,#00.0#;(#,#00.0#)" for negatives in @@ -3083,6 +3123,7 @@ *

                            In negative patterns, the minimum and maximum counts are ignored; * these are presumed to be set in the positive pattern. * + * @param pattern a new pattern * @exception NullPointerException if pattern is null * @exception IllegalArgumentException if the given pattern is invalid. */ diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/text/DecimalFormatSymbols.java --- a/jdk/src/share/classes/java/text/DecimalFormatSymbols.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/text/DecimalFormatSymbols.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -106,6 +106,7 @@ * This may return a {@code NumberFormat} instance with the Thai numbering system, * instead of the Latin numbering system. * + * @param locale the desired locale * @exception NullPointerException if locale is null */ public DecimalFormatSymbols( Locale locale ) { @@ -122,7 +123,7 @@ * implementations. It must contain at least a Locale * instance equal to {@link java.util.Locale#US Locale.US}. * - * @return An array of locales for which localized + * @return an array of locales for which localized * DecimalFormatSymbols instances are available. * @since 1.6 */ @@ -166,6 +167,7 @@ * * This may return a {@code NumberFormat} instance with the Thai numbering system, * instead of the Latin numbering system. + * * @param locale the desired locale. * @return a DecimalFormatSymbols instance. * @exception NullPointerException if locale is null @@ -185,6 +187,8 @@ /** * Gets the character used for zero. Different for Arabic, etc. + * + * @return the character used for zero */ public char getZeroDigit() { return zeroDigit; @@ -192,6 +196,8 @@ /** * Sets the character used for zero. Different for Arabic, etc. + * + * @param zeroDigit the character used for zero */ public void setZeroDigit(char zeroDigit) { this.zeroDigit = zeroDigit; @@ -199,6 +205,8 @@ /** * Gets the character used for thousands separator. Different for French, etc. + * + * @return the grouping separator */ public char getGroupingSeparator() { return groupingSeparator; @@ -206,6 +214,8 @@ /** * Sets the character used for thousands separator. Different for French, etc. + * + * @param groupingSeparator the grouping separator */ public void setGroupingSeparator(char groupingSeparator) { this.groupingSeparator = groupingSeparator; @@ -213,6 +223,8 @@ /** * Gets the character used for decimal sign. Different for French, etc. + * + * @return the character used for decimal sign */ public char getDecimalSeparator() { return decimalSeparator; @@ -220,6 +232,8 @@ /** * Sets the character used for decimal sign. Different for French, etc. + * + * @param decimalSeparator the character used for decimal sign */ public void setDecimalSeparator(char decimalSeparator) { this.decimalSeparator = decimalSeparator; @@ -227,6 +241,8 @@ /** * Gets the character used for per mille sign. Different for Arabic, etc. + * + * @return the character used for per mille sign */ public char getPerMill() { return perMill; @@ -234,6 +250,8 @@ /** * Sets the character used for per mille sign. Different for Arabic, etc. + * + * @param perMill the character used for per mille sign */ public void setPerMill(char perMill) { this.perMill = perMill; @@ -241,6 +259,8 @@ /** * Gets the character used for percent sign. Different for Arabic, etc. + * + * @return the character used for percent sign */ public char getPercent() { return percent; @@ -248,6 +268,8 @@ /** * Sets the character used for percent sign. Different for Arabic, etc. + * + * @param percent the character used for percent sign */ public void setPercent(char percent) { this.percent = percent; @@ -255,6 +277,8 @@ /** * Gets the character used for a digit in a pattern. + * + * @return the character used for a digit in a pattern */ public char getDigit() { return digit; @@ -262,6 +286,8 @@ /** * Sets the character used for a digit in a pattern. + * + * @param digit the character used for a digit in a pattern */ public void setDigit(char digit) { this.digit = digit; @@ -270,6 +296,8 @@ /** * Gets the character used to separate positive and negative subpatterns * in a pattern. + * + * @return the pattern separator */ public char getPatternSeparator() { return patternSeparator; @@ -278,6 +306,8 @@ /** * Sets the character used to separate positive and negative subpatterns * in a pattern. + * + * @param patternSeparator the pattern separator */ public void setPatternSeparator(char patternSeparator) { this.patternSeparator = patternSeparator; @@ -286,6 +316,8 @@ /** * Gets the string used to represent infinity. Almost always left * unchanged. + * + * @return the string representing infinity */ public String getInfinity() { return infinity; @@ -294,6 +326,8 @@ /** * Sets the string used to represent infinity. Almost always left * unchanged. + * + * @param infinity the string representing infinity */ public void setInfinity(String infinity) { this.infinity = infinity; @@ -302,6 +336,8 @@ /** * Gets the string used to represent "not a number". Almost always left * unchanged. + * + * @return the string representing "not a number" */ public String getNaN() { return NaN; @@ -310,6 +346,8 @@ /** * Sets the string used to represent "not a number". Almost always left * unchanged. + * + * @param NaN the string representing "not a number" */ public void setNaN(String NaN) { this.NaN = NaN; @@ -319,6 +357,8 @@ * Gets the character used to represent minus sign. If no explicit * negative format is specified, one is formed by prefixing * minusSign to the positive format. + * + * @return the character representing minus sign */ public char getMinusSign() { return minusSign; @@ -328,6 +368,8 @@ * Sets the character used to represent minus sign. If no explicit * negative format is specified, one is formed by prefixing * minusSign to the positive format. + * + * @param minusSign the character representing minus sign */ public void setMinusSign(char minusSign) { this.minusSign = minusSign; @@ -336,6 +378,8 @@ /** * Returns the currency symbol for the currency of these * DecimalFormatSymbols in their locale. + * + * @return the currency symbol * @since 1.2 */ public String getCurrencySymbol() @@ -346,6 +390,8 @@ /** * Sets the currency symbol for the currency of these * DecimalFormatSymbols in their locale. + * + * @param currency the currency symbol * @since 1.2 */ public void setCurrencySymbol(String currency) @@ -356,6 +402,8 @@ /** * Returns the ISO 4217 currency code of the currency of these * DecimalFormatSymbols. + * + * @return the currency code * @since 1.2 */ public String getInternationalCurrencySymbol() @@ -374,6 +422,7 @@ * then the currency attribute is set to null and the currency symbol * attribute is not modified. * + * @param currencyCode the currency code * @see #setCurrency * @see #setCurrencySymbol * @since 1.2 @@ -427,6 +476,8 @@ /** * Returns the monetary decimal separator. + * + * @return the monetary decimal separator * @since 1.2 */ public char getMonetaryDecimalSeparator() @@ -436,6 +487,8 @@ /** * Sets the monetary decimal separator. + * + * @param sep the monetary decimal separator * @since 1.2 */ public void setMonetaryDecimalSeparator(char sep) diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/text/FieldPosition.java --- a/jdk/src/share/classes/java/text/FieldPosition.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/text/FieldPosition.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2002, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -100,6 +100,7 @@ * identified by constants, whose names typically end with _FIELD, * in the various subclasses of Format. * + * @param field the field identifier * @see java.text.NumberFormat#INTEGER_FIELD * @see java.text.NumberFormat#FRACTION_FIELD * @see java.text.DateFormat#YEAR_FIELD @@ -157,6 +158,8 @@ /** * Retrieves the field identifier. + * + * @return the field identifier */ public int getField() { return field; @@ -164,6 +167,8 @@ /** * Retrieves the index of the first character in the requested field. + * + * @return the begin index */ public int getBeginIndex() { return beginIndex; @@ -172,6 +177,8 @@ /** * Retrieves the index of the character following the last character in the * requested field. + * + * @return the end index */ public int getEndIndex() { return endIndex; @@ -179,6 +186,8 @@ /** * Sets the begin index. For use by subclasses of Format. + * + * @param bi the begin index * @since 1.2 */ public void setBeginIndex(int bi) { @@ -187,6 +196,8 @@ /** * Sets the end index. For use by subclasses of Format. + * + * @param ei the end index * @since 1.2 */ public void setEndIndex(int ei) { diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/text/Format.java --- a/jdk/src/share/classes/java/text/Format.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/text/Format.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -58,7 +58,7 @@ * no separator in between, and in this case the parseObject could * not tell which digits belong to which number. * - *

                            Subclassing

                            + *

                            Subclassing

                            * *

                            * The Java Platform provides three specialized subclasses of Format-- diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/text/MessageFormat.java --- a/jdk/src/share/classes/java/text/MessageFormat.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/text/MessageFormat.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -68,7 +68,7 @@ * behavior is defined by the pattern that you provide as well as the * subformats used for inserted arguments. * - *

                            Patterns and Their Interpretation

                            + *

                            Patterns and Their Interpretation

                            * * MessageFormat uses patterns of the following form: *
                            @@ -287,10 +287,10 @@
                              * You can create the ChoiceFormat programmatically, as in the
                              * above example, or by using a pattern. See {@link ChoiceFormat}
                              * for more information.
                            - * 
                            + * 
                            {@code
                              * form.applyPattern(
                            - *    "There {0,choice,0#are no files|1#is one file|1<are {0,number,integer} files}.");
                            - * 
                            + * "There {0,choice,0#are no files|1#is one file|1
                            * *

                            * Note: As we see above, the string produced @@ -778,7 +778,7 @@ *

                            instanceof ChoiceFormat * any - * subformat.format(argument).indexOf('{') >= 0 ?
                            + *
                            subformat.format(argument).indexOf('{') >= 0 ?
                            * (new MessageFormat(subformat.format(argument), getLocale())).format(argument) : * subformat.format(argument)
                            *
                            - * + * * + * * + * * + * * + * * + * * + * * + * * + * * + * * + * * + * *
                            Letter * Date or Time Component * Presentation @@ -103,7 +103,7 @@ * Era designator * Text * AD - *
                            y * Year * Year @@ -113,7 +113,7 @@ * Week year * Year * 2009; 09 - *
                            M * Month in year (context sensitive) * Month @@ -123,7 +123,7 @@ * Month in year (standalone form) * Month * July; Jul; 07 - *
                            w * Week in year * Number @@ -133,7 +133,7 @@ * Week in month * Number * 2 - *
                            D * Day in year * Number @@ -143,7 +143,7 @@ * Day in month * Number * 10 - *
                            F * Day of week in month * Number @@ -153,7 +153,7 @@ * Day name in week * Text * Tuesday; Tue - *
                            u * Day number of week (1 = Monday, ..., 7 = Sunday) * Number @@ -163,7 +163,7 @@ * Am/pm marker * Text * PM - *
                            H * Hour in day (0-23) * Number @@ -173,7 +173,7 @@ * Hour in day (1-24) * Number * 24 - *
                            K * Hour in am/pm (0-11) * Number @@ -183,7 +183,7 @@ * Hour in am/pm (1-12) * Number * 12 - *
                            m * Minute in hour * Number @@ -193,7 +193,7 @@ * Second in minute * Number * 55 - *
                            S * Millisecond * Number @@ -203,7 +203,7 @@ * Time zone * General time zone * Pacific Standard Time; PST; GMT-08:00 - *
                            Z * Time zone * RFC 822 time zone @@ -365,37 +365,37 @@ * in the U.S. Pacific Time time zone. *
                            * - * + * * * + * * * + * * * + * * * + * * * + * * diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/text/StringCharacterIterator.java --- a/jdk/src/share/classes/java/text/StringCharacterIterator.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/text/StringCharacterIterator.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -59,6 +59,8 @@ /** * Constructs an iterator with an initial index of 0. + * + * @param text the {@code String} to be iterated over */ public StringCharacterIterator(String text) { diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/DayOfWeek.java --- a/jdk/src/share/classes/java/time/DayOfWeek.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/DayOfWeek.java Fri Aug 02 09:38:09 2013 +0100 @@ -61,7 +61,6 @@ */ package java.time; -import java.time.temporal.UnsupportedTemporalTypeException; import static java.time.temporal.ChronoField.DAY_OF_WEEK; import static java.time.temporal.ChronoUnit.DAYS; @@ -73,6 +72,7 @@ import java.time.temporal.TemporalAdjuster; import java.time.temporal.TemporalField; import java.time.temporal.TemporalQuery; +import java.time.temporal.UnsupportedTemporalTypeException; import java.time.temporal.ValueRange; import java.time.temporal.WeekFields; import java.util.Locale; @@ -339,7 +339,7 @@ if (field == DAY_OF_WEEK) { return getValue(); } else if (field instanceof ChronoField) { - throw new UnsupportedTemporalTypeException("Unsupported field: " + field.getName()); + throw new UnsupportedTemporalTypeException("Unsupported field: " + field); } return field.getFrom(this); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/Duration.java --- a/jdk/src/share/classes/java/time/Duration.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/Duration.java Fri Aug 02 09:38:09 2013 +0100 @@ -459,9 +459,9 @@ */ public static Duration between(Temporal startInclusive, Temporal endExclusive) { try { - return ofNanos(startInclusive.periodUntil(endExclusive, NANOS)); + return ofNanos(startInclusive.until(endExclusive, NANOS)); } catch (DateTimeException | ArithmeticException ex) { - long secs = startInclusive.periodUntil(endExclusive, SECONDS); + long secs = startInclusive.until(endExclusive, SECONDS); long nanos; try { nanos = endExclusive.getLong(NANO_OF_SECOND) - startInclusive.getLong(NANO_OF_SECOND); @@ -523,7 +523,7 @@ } else if (unit == NANOS) { return nanos; } else { - throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit.getName()); + throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit); } } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/Instant.java --- a/jdk/src/share/classes/java/time/Instant.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/Instant.java Fri Aug 02 09:38:09 2013 +0100 @@ -69,6 +69,7 @@ import static java.time.temporal.ChronoField.MICRO_OF_SECOND; import static java.time.temporal.ChronoField.MILLI_OF_SECOND; import static java.time.temporal.ChronoField.NANO_OF_SECOND; +import static java.time.temporal.ChronoUnit.DAYS; import static java.time.temporal.ChronoUnit.NANOS; import java.io.DataInput; @@ -418,8 +419,9 @@ * Checks if the specified field is supported. *

                            * This checks if this instant can be queried for the specified field. - * If false, then calling the {@link #range(TemporalField) range} and - * {@link #get(TemporalField) get} methods will throw an exception. + * If false, then calling the {@link #range(TemporalField) range}, + * {@link #get(TemporalField) get} and {@link #with(TemporalField, long)} + * methods will throw an exception. *

                            * If the field is a {@link ChronoField} then the query is implemented here. * The supported fields are: @@ -448,6 +450,44 @@ } /** + * Checks if the specified unit is supported. + *

                            + * This checks if the specified unit can be added to, or subtracted from, this date-time. + * If false, then calling the {@link #plus(long, TemporalUnit)} and + * {@link #minus(long, TemporalUnit) minus} methods will throw an exception. + *

                            + * If the unit is a {@link ChronoUnit} then the query is implemented here. + * The supported units are: + *

                              + *
                            • {@code NANOS} + *
                            • {@code MICROS} + *
                            • {@code MILLIS} + *
                            • {@code SECONDS} + *
                            • {@code MINUTES} + *
                            • {@code HOURS} + *
                            • {@code HALF_DAYS} + *
                            • {@code DAYS} + *
                            + * All other {@code ChronoUnit} instances will return false. + *

                            + * If the unit is not a {@code ChronoUnit}, then the result of this method + * is obtained by invoking {@code TemporalUnit.isSupportedBy(Temporal)} + * passing {@code this} as the argument. + * Whether the unit is supported is determined by the unit. + * + * @param unit the unit to check, null returns false + * @return true if the unit can be added/subtracted, false if not + */ + @Override + public boolean isSupported(TemporalUnit unit) { + if (unit instanceof ChronoUnit) { + return unit.isTimeBased() || unit == DAYS; + } + return unit != null && unit.isSupportedBy(this); + } + + //----------------------------------------------------------------------- + /** * Gets the range of valid values for the specified field. *

                            * The range object expresses the minimum and maximum valid values for a field. @@ -511,7 +551,7 @@ case MILLI_OF_SECOND: return nanos / 1000_000; case INSTANT_SECONDS: INSTANT_SECONDS.checkValidIntValue(seconds); } - throw new UnsupportedTemporalTypeException("Unsupported field: " + field.getName()); + throw new UnsupportedTemporalTypeException("Unsupported field: " + field); } return range(field).checkValidIntValue(field.getFrom(this), field); } @@ -548,7 +588,7 @@ case MILLI_OF_SECOND: return nanos / 1000_000; case INSTANT_SECONDS: return seconds; } - throw new UnsupportedTemporalTypeException("Unsupported field: " + field.getName()); + throw new UnsupportedTemporalTypeException("Unsupported field: " + field); } return field.getFrom(this); } @@ -665,7 +705,7 @@ case NANO_OF_SECOND: return (newValue != nanos ? create(seconds, (int) newValue) : this); case INSTANT_SECONDS: return (newValue != seconds ? create(newValue, nanos) : this); } - throw new UnsupportedTemporalTypeException("Unsupported field: " + field.getName()); + throw new UnsupportedTemporalTypeException("Unsupported field: " + field); } return field.adjustInto(this, newValue); } @@ -807,7 +847,7 @@ case HALF_DAYS: return plusSeconds(Math.multiplyExact(amountToAdd, SECONDS_PER_DAY / 2)); case DAYS: return plusSeconds(Math.multiplyExact(amountToAdd, SECONDS_PER_DAY)); } - throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit.getName()); + throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit); } return unit.addTo(this, amountToAdd); } @@ -1053,14 +1093,14 @@ * complete units between the two instants. * The {@code Temporal} passed to this method must be an {@code Instant}. * For example, the amount in days between two dates can be calculated - * using {@code startInstant.periodUntil(endInstant, SECONDS)}. + * using {@code startInstant.until(endInstant, SECONDS)}. *

                            * There are two equivalent ways of using this method. * The first is to invoke this method. * The second is to use {@link TemporalUnit#between(Temporal, Temporal)}: *

                                  *   // these two lines are equivalent
                            -     *   amount = start.periodUntil(end, SECONDS);
                            +     *   amount = start.until(end, SECONDS);
                                  *   amount = SECONDS.between(start, end);
                                  * 
                            * The choice should be made based on which makes the code more readable. @@ -1085,7 +1125,7 @@ * @throws ArithmeticException if numeric overflow occurs */ @Override - public long periodUntil(Temporal endInstant, TemporalUnit unit) { + public long until(Temporal endInstant, TemporalUnit unit) { if (endInstant instanceof Instant == false) { Objects.requireNonNull(endInstant, "endInstant"); throw new DateTimeException("Unable to calculate amount as objects are of two different types"); @@ -1103,7 +1143,7 @@ case HALF_DAYS: return secondsUntil(end) / (12 * SECONDS_PER_HOUR); case DAYS: return secondsUntil(end) / (SECONDS_PER_DAY); } - throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit.getName()); + throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit); } return unit.between(this, endInstant); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/LocalDate.java --- a/jdk/src/share/classes/java/time/LocalDate.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/LocalDate.java Fri Aug 02 09:38:09 2013 +0100 @@ -127,7 +127,7 @@ * @since 1.8 */ public final class LocalDate - implements Temporal, TemporalAdjuster, ChronoLocalDate, Serializable { + implements Temporal, TemporalAdjuster, ChronoLocalDate, Serializable { /** * The minimum supported {@code LocalDate}, '-999999999-01-01'. @@ -466,8 +466,9 @@ * Checks if the specified field is supported. *

                            * This checks if this date can be queried for the specified field. - * If false, then calling the {@link #range(TemporalField) range} and - * {@link #get(TemporalField) get} methods will throw an exception. + * If false, then calling the {@link #range(TemporalField) range}, + * {@link #get(TemporalField) get} and {@link #with(TemporalField, long)} + * methods will throw an exception. *

                            * If the field is a {@link ChronoField} then the query is implemented here. * The supported fields are: @@ -502,6 +503,41 @@ } /** + * Checks if the specified unit is supported. + *

                            + * This checks if the specified unit can be added to, or subtracted from, this date-time. + * If false, then calling the {@link #plus(long, TemporalUnit)} and + * {@link #minus(long, TemporalUnit) minus} methods will throw an exception. + *

                            + * If the unit is a {@link ChronoUnit} then the query is implemented here. + * The supported units are: + *

                              + *
                            • {@code DAYS} + *
                            • {@code WEEKS} + *
                            • {@code MONTHS} + *
                            • {@code YEARS} + *
                            • {@code DECADES} + *
                            • {@code CENTURIES} + *
                            • {@code MILLENNIA} + *
                            • {@code ERAS} + *
                            + * All other {@code ChronoUnit} instances will return false. + *

                            + * If the unit is not a {@code ChronoUnit}, then the result of this method + * is obtained by invoking {@code TemporalUnit.isSupportedBy(Temporal)} + * passing {@code this} as the argument. + * Whether the unit is supported is determined by the unit. + * + * @param unit the unit to check, null returns false + * @return true if the unit can be added/subtracted, false if not + */ + @Override // override for Javadoc + public boolean isSupported(TemporalUnit unit) { + return ChronoLocalDate.super.isSupported(unit); + } + + //----------------------------------------------------------------------- + /** * Gets the range of valid values for the specified field. *

                            * The range object expresses the minimum and maximum valid values for a field. @@ -538,7 +574,7 @@ } return field.range(); } - throw new UnsupportedTemporalTypeException("Unsupported field: " + field.getName()); + throw new UnsupportedTemporalTypeException("Unsupported field: " + field); } return field.rangeRefinedBy(this); } @@ -631,7 +667,7 @@ case YEAR: return year; case ERA: return (year >= 1 ? 1 : 0); } - throw new UnsupportedTemporalTypeException("Unsupported field: " + field.getName()); + throw new UnsupportedTemporalTypeException("Unsupported field: " + field); } private long getProlepticMonth() { @@ -988,7 +1024,7 @@ case YEAR: return withYear((int) newValue); case ERA: return (getLong(ERA) == newValue ? this : withYear(1 - year)); } - throw new UnsupportedTemporalTypeException("Unsupported field: " + field.getName()); + throw new UnsupportedTemporalTypeException("Unsupported field: " + field); } return field.adjustInto(this, newValue); } @@ -1187,7 +1223,7 @@ case MILLENNIA: return plusYears(Math.multiplyExact(amountToAdd, 1000)); case ERAS: return with(ERA, Math.addExact(getLong(ERA), amountToAdd)); } - throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit.getName()); + throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit); } return unit.addTo(this, amountToAdd); } @@ -1497,7 +1533,7 @@ * The result will be negative if the end is before the start. * The {@code Temporal} passed to this method must be a {@code LocalDate}. * For example, the amount in days between two dates can be calculated - * using {@code startDate.periodUntil(endDate, DAYS)}. + * using {@code startDate.until(endDate, DAYS)}. *

                            * The calculation returns a whole number, representing the number of * complete units between the two dates. @@ -1509,7 +1545,7 @@ * The second is to use {@link TemporalUnit#between(Temporal, Temporal)}: *

                                  *   // these two lines are equivalent
                            -     *   amount = start.periodUntil(end, MONTHS);
                            +     *   amount = start.until(end, MONTHS);
                                  *   amount = MONTHS.between(start, end);
                                  * 
                            * The choice should be made based on which makes the code more readable. @@ -1534,7 +1570,7 @@ * @throws ArithmeticException if numeric overflow occurs */ @Override - public long periodUntil(Temporal endDate, TemporalUnit unit) { + public long until(Temporal endDate, TemporalUnit unit) { Objects.requireNonNull(unit, "unit"); if (endDate instanceof LocalDate == false) { Objects.requireNonNull(endDate, "endDate"); @@ -1552,7 +1588,7 @@ case MILLENNIA: return monthsUntil(end) / 12000; case ERAS: return end.getLong(ERA) - getLong(ERA); } - throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit.getName()); + throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit); } return unit.between(this, endDate); } @@ -1591,7 +1627,7 @@ * The second is to use {@link Period#between(LocalDate, LocalDate)}: *
                                  *   // these two lines are equivalent
                            -     *   period = start.periodUntil(end);
                            +     *   period = start.until(end);
                                  *   period = Period.between(start, end);
                                  * 
                            * The choice should be made based on which makes the code more readable. @@ -1600,7 +1636,7 @@ * @return the period between this date and the end date, not null */ @Override - public Period periodUntil(ChronoLocalDate endDate) { + public Period until(ChronoLocalDate endDate) { LocalDate end = LocalDate.from(endDate); long totalMonths = end.getProlepticMonth() - this.getProlepticMonth(); // safe int days = end.day - this.day; @@ -1803,7 +1839,7 @@ * @return the comparator value, negative if less, positive if greater */ @Override // override for Javadoc and performance - public int compareTo(ChronoLocalDate other) { + public int compareTo(ChronoLocalDate other) { if (other instanceof LocalDate) { return compareTo0((LocalDate) other); } @@ -1843,7 +1879,7 @@ * @return true if this date is after the specified date */ @Override // override for Javadoc and performance - public boolean isAfter(ChronoLocalDate other) { + public boolean isAfter(ChronoLocalDate other) { if (other instanceof LocalDate) { return compareTo0((LocalDate) other) > 0; } @@ -1872,7 +1908,7 @@ * @return true if this date is before the specified date */ @Override // override for Javadoc and performance - public boolean isBefore(ChronoLocalDate other) { + public boolean isBefore(ChronoLocalDate other) { if (other instanceof LocalDate) { return compareTo0((LocalDate) other) < 0; } @@ -1901,7 +1937,7 @@ * @return true if this date is equal to the specified date */ @Override // override for Javadoc and performance - public boolean isEqual(ChronoLocalDate other) { + public boolean isEqual(ChronoLocalDate other) { if (other instanceof LocalDate) { return compareTo0((LocalDate) other) == 0; } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/LocalDateTime.java --- a/jdk/src/share/classes/java/time/LocalDateTime.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/LocalDateTime.java Fri Aug 02 09:38:09 2013 +0100 @@ -515,8 +515,9 @@ * Checks if the specified field is supported. *

                            * This checks if this date-time can be queried for the specified field. - * If false, then calling the {@link #range(TemporalField) range} and - * {@link #get(TemporalField) get} methods will throw an exception. + * If false, then calling the {@link #range(TemporalField) range}, + * {@link #get(TemporalField) get} and {@link #with(TemporalField, long)} + * methods will throw an exception. *

                            * If the field is a {@link ChronoField} then the query is implemented here. * The supported fields are: @@ -570,6 +571,48 @@ } /** + * Checks if the specified unit is supported. + *

                            + * This checks if the specified unit can be added to, or subtracted from, this date-time. + * If false, then calling the {@link #plus(long, TemporalUnit)} and + * {@link #minus(long, TemporalUnit) minus} methods will throw an exception. + *

                            + * If the unit is a {@link ChronoUnit} then the query is implemented here. + * The supported units are: + *

                              + *
                            • {@code NANOS} + *
                            • {@code MICROS} + *
                            • {@code MILLIS} + *
                            • {@code SECONDS} + *
                            • {@code MINUTES} + *
                            • {@code HOURS} + *
                            • {@code HALF_DAYS} + *
                            • {@code DAYS} + *
                            • {@code WEEKS} + *
                            • {@code MONTHS} + *
                            • {@code YEARS} + *
                            • {@code DECADES} + *
                            • {@code CENTURIES} + *
                            • {@code MILLENNIA} + *
                            • {@code ERAS} + *
                            + * All other {@code ChronoUnit} instances will return false. + *

                            + * If the unit is not a {@code ChronoUnit}, then the result of this method + * is obtained by invoking {@code TemporalUnit.isSupportedBy(Temporal)} + * passing {@code this} as the argument. + * Whether the unit is supported is determined by the unit. + * + * @param unit the unit to check, null returns false + * @return true if the unit can be added/subtracted, false if not + */ + @Override // override for Javadoc + public boolean isSupported(TemporalUnit unit) { + return ChronoLocalDateTime.super.isSupported(unit); + } + + //----------------------------------------------------------------------- + /** * Gets the range of valid values for the specified field. *

                            * The range object expresses the minimum and maximum valid values for a field. @@ -1570,7 +1613,7 @@ * The result will be negative if the end is before the start. * The {@code Temporal} passed to this method must be a {@code LocalDateTime}. * For example, the amount in days between two date-times can be calculated - * using {@code startDateTime.periodUntil(endDateTime, DAYS)}. + * using {@code startDateTime.until(endDateTime, DAYS)}. *

                            * The calculation returns a whole number, representing the number of * complete units between the two date-times. @@ -1582,7 +1625,7 @@ * The second is to use {@link TemporalUnit#between(Temporal, Temporal)}: *

                                  *   // these two lines are equivalent
                            -     *   amount = start.periodUntil(end, MONTHS);
                            +     *   amount = start.until(end, MONTHS);
                                  *   amount = MONTHS.between(start, end);
                                  * 
                            * The choice should be made based on which makes the code more readable. @@ -1609,18 +1652,17 @@ * @throws ArithmeticException if numeric overflow occurs */ @Override - public long periodUntil(Temporal endDateTime, TemporalUnit unit) { + public long until(Temporal endDateTime, TemporalUnit unit) { if (endDateTime instanceof LocalDateTime == false) { Objects.requireNonNull(endDateTime, "endDateTime"); throw new DateTimeException("Unable to calculate amount as objects are of two different types"); } LocalDateTime end = (LocalDateTime) endDateTime; if (unit instanceof ChronoUnit) { - ChronoUnit f = (ChronoUnit) unit; - if (f.isTimeUnit()) { + if (unit.isTimeBased()) { long amount = date.daysUntil(end.date); if (amount == 0) { - return time.periodUntil(end.time, unit); + return time.until(end.time, unit); } long timePart = end.time.toNanoOfDay() - time.toNanoOfDay(); if (amount > 0) { @@ -1630,7 +1672,7 @@ amount++; // safe timePart -= NANOS_PER_DAY; // safe } - switch (f) { + switch ((ChronoUnit) unit) { case NANOS: amount = Math.multiplyExact(amount, NANOS_PER_DAY); break; @@ -1667,7 +1709,7 @@ } else if (endDate.isBefore(date) && end.time.isAfter(time)) { endDate = endDate.plusDays(1); } - return date.periodUntil(endDate, unit); + return date.until(endDate, unit); } return unit.between(this, endDateTime); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/LocalTime.java --- a/jdk/src/share/classes/java/time/LocalTime.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/LocalTime.java Fri Aug 02 09:38:09 2013 +0100 @@ -470,8 +470,9 @@ * Checks if the specified field is supported. *

                            * This checks if this time can be queried for the specified field. - * If false, then calling the {@link #range(TemporalField) range} and - * {@link #get(TemporalField) get} methods will throw an exception. + * If false, then calling the {@link #range(TemporalField) range}, + * {@link #get(TemporalField) get} and {@link #with(TemporalField, long)} + * methods will throw an exception. *

                            * If the field is a {@link ChronoField} then the query is implemented here. * The supported fields are: @@ -511,6 +512,43 @@ } /** + * Checks if the specified unit is supported. + *

                            + * This checks if the specified unit can be added to, or subtracted from, this date-time. + * If false, then calling the {@link #plus(long, TemporalUnit)} and + * {@link #minus(long, TemporalUnit) minus} methods will throw an exception. + *

                            + * If the unit is a {@link ChronoUnit} then the query is implemented here. + * The supported units are: + *

                              + *
                            • {@code NANOS} + *
                            • {@code MICROS} + *
                            • {@code MILLIS} + *
                            • {@code SECONDS} + *
                            • {@code MINUTES} + *
                            • {@code HOURS} + *
                            • {@code HALF_DAYS} + *
                            + * All other {@code ChronoUnit} instances will return false. + *

                            + * If the unit is not a {@code ChronoUnit}, then the result of this method + * is obtained by invoking {@code TemporalUnit.isSupportedBy(Temporal)} + * passing {@code this} as the argument. + * Whether the unit is supported is determined by the unit. + * + * @param unit the unit to check, null returns false + * @return true if the unit can be added/subtracted, false if not + */ + @Override // override for Javadoc + public boolean isSupported(TemporalUnit unit) { + if (unit instanceof ChronoUnit) { + return unit.isTimeBased(); + } + return unit != null && unit.isSupportedBy(this); + } + + //----------------------------------------------------------------------- + /** * Gets the range of valid values for the specified field. *

                            * The range object expresses the minimum and maximum valid values for a field. @@ -628,7 +666,7 @@ case CLOCK_HOUR_OF_DAY: return (hour == 0 ? 24 : hour); case AMPM_OF_DAY: return hour / 12; } - throw new UnsupportedTemporalTypeException("Unsupported field: " + field.getName()); + throw new UnsupportedTemporalTypeException("Unsupported field: " + field); } //----------------------------------------------------------------------- @@ -803,7 +841,7 @@ case CLOCK_HOUR_OF_DAY: return withHour((int) (newValue == 24 ? 0 : newValue)); case AMPM_OF_DAY: return plusHours((newValue - (hour / 12)) * 12); } - throw new UnsupportedTemporalTypeException("Unsupported field: " + field.getName()); + throw new UnsupportedTemporalTypeException("Unsupported field: " + field); } return field.adjustInto(this, newValue); } @@ -995,8 +1033,7 @@ @Override public LocalTime plus(long amountToAdd, TemporalUnit unit) { if (unit instanceof ChronoUnit) { - ChronoUnit f = (ChronoUnit) unit; - switch (f) { + switch ((ChronoUnit) unit) { case NANOS: return plusNanos(amountToAdd); case MICROS: return plusNanos((amountToAdd % MICROS_PER_DAY) * 1000); case MILLIS: return plusNanos((amountToAdd % MILLIS_PER_DAY) * 1000_000); @@ -1005,7 +1042,7 @@ case HOURS: return plusHours(amountToAdd); case HALF_DAYS: return plusHours((amountToAdd % 2) * 12); } - throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit.getName()); + throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit); } return unit.addTo(this, amountToAdd); } @@ -1295,7 +1332,7 @@ * The result will be negative if the end is before the start. * The {@code Temporal} passed to this method must be a {@code LocalTime}. * For example, the amount in hours between two times can be calculated - * using {@code startTime.periodUntil(endTime, HOURS)}. + * using {@code startTime.until(endTime, HOURS)}. *

                            * The calculation returns a whole number, representing the number of * complete units between the two times. @@ -1307,7 +1344,7 @@ * The second is to use {@link TemporalUnit#between(Temporal, Temporal)}: *

                                  *   // these two lines are equivalent
                            -     *   amount = start.periodUntil(end, MINUTES);
                            +     *   amount = start.until(end, MINUTES);
                                  *   amount = MINUTES.between(start, end);
                                  * 
                            * The choice should be made based on which makes the code more readable. @@ -1332,7 +1369,7 @@ * @throws ArithmeticException if numeric overflow occurs */ @Override - public long periodUntil(Temporal endTime, TemporalUnit unit) { + public long until(Temporal endTime, TemporalUnit unit) { if (endTime instanceof LocalTime == false) { Objects.requireNonNull(endTime, "endTime"); throw new DateTimeException("Unable to calculate amount as objects are of two different types"); @@ -1349,7 +1386,7 @@ case HOURS: return nanosUntil / NANOS_PER_HOUR; case HALF_DAYS: return nanosUntil / (12 * NANOS_PER_HOUR); } - throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit.getName()); + throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit); } return unit.between(this, endTime); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/Month.java --- a/jdk/src/share/classes/java/time/Month.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/Month.java Fri Aug 02 09:38:09 2013 +0100 @@ -61,7 +61,6 @@ */ package java.time; -import java.time.temporal.UnsupportedTemporalTypeException; import static java.time.temporal.ChronoField.MONTH_OF_YEAR; import static java.time.temporal.ChronoUnit.MONTHS; @@ -75,6 +74,7 @@ import java.time.temporal.TemporalAdjuster; import java.time.temporal.TemporalField; import java.time.temporal.TemporalQuery; +import java.time.temporal.UnsupportedTemporalTypeException; import java.time.temporal.ValueRange; import java.util.Locale; @@ -370,7 +370,7 @@ if (field == MONTH_OF_YEAR) { return getValue(); } else if (field instanceof ChronoField) { - throw new UnsupportedTemporalTypeException("Unsupported field: " + field.getName()); + throw new UnsupportedTemporalTypeException("Unsupported field: " + field); } return field.getFrom(this); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/MonthDay.java --- a/jdk/src/share/classes/java/time/MonthDay.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/MonthDay.java Fri Aug 02 09:38:09 2013 +0100 @@ -438,7 +438,7 @@ case DAY_OF_MONTH: return day; case MONTH_OF_YEAR: return month; } - throw new UnsupportedTemporalTypeException("Unsupported field: " + field.getName()); + throw new UnsupportedTemporalTypeException("Unsupported field: " + field); } return field.getFrom(this); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/OffsetDateTime.java --- a/jdk/src/share/classes/java/time/OffsetDateTime.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/OffsetDateTime.java Fri Aug 02 09:38:09 2013 +0100 @@ -65,6 +65,7 @@ import static java.time.temporal.ChronoField.INSTANT_SECONDS; import static java.time.temporal.ChronoField.NANO_OF_DAY; import static java.time.temporal.ChronoField.OFFSET_SECONDS; +import static java.time.temporal.ChronoUnit.FOREVER; import static java.time.temporal.ChronoUnit.NANOS; import java.io.IOException; @@ -137,25 +138,40 @@ public static final OffsetDateTime MAX = LocalDateTime.MAX.atOffset(ZoneOffset.MIN); /** - * Comparator for two {@code OffsetDateTime} instances based solely on the instant. + * Gets a comparator that compares two {@code OffsetDateTime} instances + * based solely on the instant. *

                            * This method differs from the comparison in {@link #compareTo} in that it * only compares the underlying instant. * + * @return a comparator that compares in time-line order + * * @see #isAfter * @see #isBefore * @see #isEqual */ - public static final Comparator INSTANT_COMPARATOR = new Comparator() { - @Override - public int compare(OffsetDateTime datetime1, OffsetDateTime datetime2) { - int cmp = Long.compare(datetime1.toEpochSecond(), datetime2.toEpochSecond()); - if (cmp == 0) { - cmp = Long.compare(datetime1.toLocalTime().toNanoOfDay(), datetime2.toLocalTime().toNanoOfDay()); - } - return cmp; + public static Comparator timeLineOrder() { + return OffsetDateTime::compareInstant; + } + + /** + * Compares this {@code OffsetDateTime} to another date-time. + * The comparison is based on the instant. + * + * @param datetime1 the first date-time to compare, not null + * @param datetime2 the other date-time to compare to, not null + * @return the comparator value, negative if less, positive if greater + */ + private static int compareInstant(OffsetDateTime datetime1, OffsetDateTime datetime2) { + if (datetime1.getOffset().equals(datetime2.getOffset())) { + return datetime1.toLocalDateTime().compareTo(datetime2.toLocalDateTime()); } - }; + int cmp = Long.compare(datetime1.toEpochSecond(), datetime2.toEpochSecond()); + if (cmp == 0) { + cmp = datetime1.toLocalTime().getNano() - datetime2.toLocalTime().getNano(); + } + return cmp; + } /** * Serialization version. @@ -406,8 +422,9 @@ * Checks if the specified field is supported. *

                            * This checks if this date-time can be queried for the specified field. - * If false, then calling the {@link #range(TemporalField) range} and - * {@link #get(TemporalField) get} methods will throw an exception. + * If false, then calling the {@link #range(TemporalField) range}, + * {@link #get(TemporalField) get} and {@link #with(TemporalField, long)} + * methods will throw an exception. *

                            * If the field is a {@link ChronoField} then the query is implemented here. * The supported fields are: @@ -459,6 +476,51 @@ } /** + * Checks if the specified unit is supported. + *

                            + * This checks if the specified unit can be added to, or subtracted from, this date-time. + * If false, then calling the {@link #plus(long, TemporalUnit)} and + * {@link #minus(long, TemporalUnit) minus} methods will throw an exception. + *

                            + * If the unit is a {@link ChronoUnit} then the query is implemented here. + * The supported units are: + *

                              + *
                            • {@code NANOS} + *
                            • {@code MICROS} + *
                            • {@code MILLIS} + *
                            • {@code SECONDS} + *
                            • {@code MINUTES} + *
                            • {@code HOURS} + *
                            • {@code HALF_DAYS} + *
                            • {@code DAYS} + *
                            • {@code WEEKS} + *
                            • {@code MONTHS} + *
                            • {@code YEARS} + *
                            • {@code DECADES} + *
                            • {@code CENTURIES} + *
                            • {@code MILLENNIA} + *
                            • {@code ERAS} + *
                            + * All other {@code ChronoUnit} instances will return false. + *

                            + * If the unit is not a {@code ChronoUnit}, then the result of this method + * is obtained by invoking {@code TemporalUnit.isSupportedBy(Temporal)} + * passing {@code this} as the argument. + * Whether the unit is supported is determined by the unit. + * + * @param unit the unit to check, null returns false + * @return true if the unit can be added/subtracted, false if not + */ + @Override // override for Javadoc + public boolean isSupported(TemporalUnit unit) { + if (unit instanceof ChronoUnit) { + return unit != FOREVER; + } + return unit != null && unit.isSupportedBy(this); + } + + //----------------------------------------------------------------------- + /** * Gets the range of valid values for the specified field. *

                            * The range object expresses the minimum and maximum valid values for a field. @@ -1528,7 +1590,7 @@ * The start and end points are {@code this} and the specified date-time. * The result will be negative if the end is before the start. * For example, the period in days between two date-times can be calculated - * using {@code startDateTime.periodUntil(endDateTime, DAYS)}. + * using {@code startDateTime.until(endDateTime, DAYS)}. *

                            * The {@code Temporal} passed to this method must be an {@code OffsetDateTime}. * If the offset differs between the two date-times, the specified @@ -1544,7 +1606,7 @@ * The second is to use {@link TemporalUnit#between(Temporal, Temporal)}: *

                                  *   // these two lines are equivalent
                            -     *   amount = start.periodUntil(end, MONTHS);
                            +     *   amount = start.until(end, MONTHS);
                                  *   amount = MONTHS.between(start, end);
                                  * 
                            * The choice should be made based on which makes the code more readable. @@ -1571,7 +1633,7 @@ * @throws ArithmeticException if numeric overflow occurs */ @Override - public long periodUntil(Temporal endDateTime, TemporalUnit unit) { + public long until(Temporal endDateTime, TemporalUnit unit) { if (endDateTime instanceof OffsetDateTime == false) { Objects.requireNonNull(endDateTime, "endDateTime"); throw new DateTimeException("Unable to calculate amount as objects are of two different types"); @@ -1579,7 +1641,7 @@ if (unit instanceof ChronoUnit) { OffsetDateTime end = (OffsetDateTime) endDateTime; end = end.withOffsetSameInstant(offset); - return dateTime.periodUntil(end.dateTime, unit); + return dateTime.until(end.dateTime, unit); } return unit.between(this, endDateTime); } @@ -1724,15 +1786,9 @@ */ @Override public int compareTo(OffsetDateTime other) { - if (getOffset().equals(other.getOffset())) { - return toLocalDateTime().compareTo(other.toLocalDateTime()); - } - int cmp = Long.compare(toEpochSecond(), other.toEpochSecond()); + int cmp = compareInstant(this, other); if (cmp == 0) { - cmp = toLocalTime().getNano() - other.toLocalTime().getNano(); - if (cmp == 0) { - cmp = toLocalDateTime().compareTo(other.toLocalDateTime()); - } + cmp = toLocalDateTime().compareTo(other.toLocalDateTime()); } return cmp; } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/OffsetTime.java --- a/jdk/src/share/classes/java/time/OffsetTime.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/OffsetTime.java Fri Aug 02 09:38:09 2013 +0100 @@ -348,8 +348,9 @@ * Checks if the specified field is supported. *

                            * This checks if this time can be queried for the specified field. - * If false, then calling the {@link #range(TemporalField) range} and - * {@link #get(TemporalField) get} methods will throw an exception. + * If false, then calling the {@link #range(TemporalField) range}, + * {@link #get(TemporalField) get} and {@link #with(TemporalField, long)} + * methods will throw an exception. *

                            * If the field is a {@link ChronoField} then the query is implemented here. * The supported fields are: @@ -390,6 +391,43 @@ } /** + * Checks if the specified unit is supported. + *

                            + * This checks if the specified unit can be added to, or subtracted from, this date-time. + * If false, then calling the {@link #plus(long, TemporalUnit)} and + * {@link #minus(long, TemporalUnit) minus} methods will throw an exception. + *

                            + * If the unit is a {@link ChronoUnit} then the query is implemented here. + * The supported units are: + *

                              + *
                            • {@code NANOS} + *
                            • {@code MICROS} + *
                            • {@code MILLIS} + *
                            • {@code SECONDS} + *
                            • {@code MINUTES} + *
                            • {@code HOURS} + *
                            • {@code HALF_DAYS} + *
                            + * All other {@code ChronoUnit} instances will return false. + *

                            + * If the unit is not a {@code ChronoUnit}, then the result of this method + * is obtained by invoking {@code TemporalUnit.isSupportedBy(Temporal)} + * passing {@code this} as the argument. + * Whether the unit is supported is determined by the unit. + * + * @param unit the unit to check, null returns false + * @return true if the unit can be added/subtracted, false if not + */ + @Override // override for Javadoc + public boolean isSupported(TemporalUnit unit) { + if (unit instanceof ChronoUnit) { + return unit.isTimeBased(); + } + return unit != null && unit.isSupportedBy(this); + } + + //----------------------------------------------------------------------- + /** * Gets the range of valid values for the specified field. *

                            * The range object expresses the minimum and maximum valid values for a field. @@ -1084,7 +1122,7 @@ * The start and end points are {@code this} and the specified time. * The result will be negative if the end is before the start. * For example, the period in hours between two times can be calculated - * using {@code startTime.periodUntil(endTime, HOURS)}. + * using {@code startTime.until(endTime, HOURS)}. *

                            * The {@code Temporal} passed to this method must be an {@code OffsetTime}. * If the offset differs between the two times, then the specified @@ -1100,7 +1138,7 @@ * The second is to use {@link TemporalUnit#between(Temporal, Temporal)}: *

                                  *   // these two lines are equivalent
                            -     *   amount = start.periodUntil(end, MINUTES);
                            +     *   amount = start.until(end, MINUTES);
                                  *   amount = MINUTES.between(start, end);
                                  * 
                            * The choice should be made based on which makes the code more readable. @@ -1125,7 +1163,7 @@ * @throws ArithmeticException if numeric overflow occurs */ @Override - public long periodUntil(Temporal endTime, TemporalUnit unit) { + public long until(Temporal endTime, TemporalUnit unit) { if (endTime instanceof OffsetTime == false) { Objects.requireNonNull(endTime, "endTime"); throw new DateTimeException("Unable to calculate amount as objects are of two different types"); @@ -1142,7 +1180,7 @@ case HOURS: return nanosUntil / NANOS_PER_HOUR; case HALF_DAYS: return nanosUntil / (12 * NANOS_PER_HOUR); } - throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit.getName()); + throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit); } return unit.between(this, endTime); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/Period.java --- a/jdk/src/share/classes/java/time/Period.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/Period.java Fri Aug 02 09:38:09 2013 +0100 @@ -139,7 +139,7 @@ * The pattern for parsing. */ private final static Pattern PATTERN = - Pattern.compile("([-+]?)P(?:([-+]?[0-9]+)Y)?(?:([-+]?[0-9]+)M)?(?:([-+]?[0-9]+)D)?", Pattern.CASE_INSENSITIVE); + Pattern.compile("([-+]?)P(?:([-+]?[0-9]+)Y)?(?:([-+]?[0-9]+)M)?(?:([-+]?[0-9]+)W)?(?:([-+]?[0-9]+)D)?", Pattern.CASE_INSENSITIVE); /** * The set of supported units. */ @@ -187,6 +187,20 @@ } /** + * Obtains a {@code Period} representing a number of weeks. + *

                            + * The resulting period will be day-based, with the amount of days + * equal to the number of weeks multiplied by 7. + * The years and months units will be zero. + * + * @param weeks the number of weeks, positive or negative + * @return the period, with the input weeks converted to days, not null + */ + public static Period ofWeeks(int weeks) { + return create(0, 0, Math.multiplyExact(weeks, 7)); + } + + /** * Obtains a {@code Period} representing a number of days. *

                            * The resulting period will have the specified days. @@ -257,22 +271,36 @@ * Obtains a {@code Period} from a text string such as {@code PnYnMnD}. *

                            * This will parse the string produced by {@code toString()} which is - * based on the ISO-8601 period format {@code PnYnMnD}. + * based on the ISO-8601 period formats {@code PnYnMnD} and {@code PnW}. *

                            * The string starts with an optional sign, denoted by the ASCII negative * or positive symbol. If negative, the whole period is negated. * The ASCII letter "P" is next in upper or lower case. - * There are then three sections, each consisting of a number and a suffix. - * At least one of the three sections must be present. - * The sections have suffixes in ASCII of "Y", "M" and "D" for - * years, months and days, accepted in upper or lower case. + * There are then four sections, each consisting of a number and a suffix. + * At least one of the four sections must be present. + * The sections have suffixes in ASCII of "Y", "M", "W" and "D" for + * years, months, weeks and days, accepted in upper or lower case. * The suffixes must occur in order. * The number part of each section must consist of ASCII digits. * The number may be prefixed by the ASCII negative or positive symbol. * The number must parse to an {@code int}. *

                            * The leading plus/minus sign, and negative values for other units are - * not part of the ISO-8601 standard. + * not part of the ISO-8601 standard. In addition, ISO-8601 does not + * permit mixing between the {@code PnYnMnD} and {@code PnW} formats. + * Any week-based input is multiplied by 7 and treated as a number of days. + *

                            + * For example, the following are valid inputs: + *

                            +     *   "P2Y"             -- Period.ofYears(2)
                            +     *   "P3M"             -- Period.ofMonths(3)
                            +     *   "P4W"             -- Period.ofWeeks(4)
                            +     *   "P5D"             -- Period.ofDays(5)
                            +     *   "P1Y2M3D"         -- Period.of(1, 2, 3)
                            +     *   "P1Y2M3W4D"       -- Period.of(1, 2, 25)
                            +     *   "P-1Y2M"          -- Period.of(-1, 2, 0)
                            +     *   "-P1Y2M"          -- Period.of(-1, -2, 0)
                            +     * 
                            * * @param text the text to parse, not null * @return the parsed period, not null @@ -285,14 +313,18 @@ int negate = ("-".equals(matcher.group(1)) ? -1 : 1); String yearMatch = matcher.group(2); String monthMatch = matcher.group(3); - String dayMatch = matcher.group(4); - if (yearMatch != null || monthMatch != null || dayMatch != null) { + String weekMatch = matcher.group(4); + String dayMatch = matcher.group(5); + if (yearMatch != null || monthMatch != null || dayMatch != null || weekMatch != null) { try { - return create(parseNumber(text, yearMatch, negate), - parseNumber(text, monthMatch, negate), - parseNumber(text, dayMatch, negate)); + int years = parseNumber(text, yearMatch, negate); + int months = parseNumber(text, monthMatch, negate); + int weeks = parseNumber(text, weekMatch, negate); + int days = parseNumber(text, dayMatch, negate); + days = Math.addExact(days, Math.multiplyExact(weeks, 7)); + return create(years, months, days); } catch (NumberFormatException ex) { - throw (DateTimeParseException) new DateTimeParseException("Text cannot be parsed to a Period", text, 0).initCause(ex); + throw new DateTimeParseException("Text cannot be parsed to a Period", text, 0, ex); } } } @@ -307,7 +339,7 @@ try { return Math.multiplyExact(val, negate); } catch (ArithmeticException ex) { - throw (DateTimeParseException) new DateTimeParseException("Text cannot be parsed to a Period", text, 0).initCause(ex); + throw new DateTimeParseException("Text cannot be parsed to a Period", text, 0, ex); } } @@ -329,10 +361,10 @@ * @param startDate the start date, inclusive, not null * @param endDate the end date, exclusive, not null * @return the period between this date and the end date, not null - * @see ChronoLocalDate#periodUntil(ChronoLocalDate) + * @see ChronoLocalDate#until(ChronoLocalDate) */ public static Period between(LocalDate startDate, LocalDate endDate) { - return startDate.periodUntil(endDate); + return startDate.until(endDate); } //----------------------------------------------------------------------- @@ -386,7 +418,7 @@ } else if (unit == ChronoUnit.DAYS) { return getDays(); } else { - throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit.getName()); + throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit); } } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/Year.java --- a/jdk/src/share/classes/java/time/Year.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/Year.java Fri Aug 02 09:38:09 2013 +0100 @@ -64,6 +64,10 @@ import static java.time.temporal.ChronoField.ERA; import static java.time.temporal.ChronoField.YEAR; import static java.time.temporal.ChronoField.YEAR_OF_ERA; +import static java.time.temporal.ChronoUnit.CENTURIES; +import static java.time.temporal.ChronoUnit.DECADES; +import static java.time.temporal.ChronoUnit.ERAS; +import static java.time.temporal.ChronoUnit.MILLENNIA; import static java.time.temporal.ChronoUnit.YEARS; import java.io.DataInput; @@ -329,8 +333,9 @@ * Checks if the specified field is supported. *

                            * This checks if this year can be queried for the specified field. - * If false, then calling the {@link #range(TemporalField) range} and - * {@link #get(TemporalField) get} methods will throw an exception. + * If false, then calling the {@link #range(TemporalField) range}, + * {@link #get(TemporalField) get} and {@link #with(TemporalField, long)} + * methods will throw an exception. *

                            * If the field is a {@link ChronoField} then the query is implemented here. * The supported fields are: @@ -358,6 +363,41 @@ } /** + * Checks if the specified unit is supported. + *

                            + * This checks if the specified unit can be added to, or subtracted from, this date-time. + * If false, then calling the {@link #plus(long, TemporalUnit)} and + * {@link #minus(long, TemporalUnit) minus} methods will throw an exception. + *

                            + * If the unit is a {@link ChronoUnit} then the query is implemented here. + * The supported units are: + *

                              + *
                            • {@code YEARS} + *
                            • {@code DECADES} + *
                            • {@code CENTURIES} + *
                            • {@code MILLENNIA} + *
                            • {@code ERAS} + *
                            + * All other {@code ChronoUnit} instances will return false. + *

                            + * If the unit is not a {@code ChronoUnit}, then the result of this method + * is obtained by invoking {@code TemporalUnit.isSupportedBy(Temporal)} + * passing {@code this} as the argument. + * Whether the unit is supported is determined by the unit. + * + * @param unit the unit to check, null returns false + * @return true if the unit can be added/subtracted, false if not + */ + @Override + public boolean isSupported(TemporalUnit unit) { + if (unit instanceof ChronoUnit) { + return unit == YEARS || unit == DECADES || unit == CENTURIES || unit == MILLENNIA || unit == ERAS; + } + return unit != null && unit.isSupportedBy(this); + } + + //----------------------------------------------------------------------- + /** * Gets the range of valid values for the specified field. *

                            * The range object expresses the minimum and maximum valid values for a field. @@ -450,7 +490,7 @@ case YEAR: return year; case ERA: return (year < 1 ? 0 : 1); } - throw new UnsupportedTemporalTypeException("Unsupported field: " + field.getName()); + throw new UnsupportedTemporalTypeException("Unsupported field: " + field); } return field.getFrom(this); } @@ -575,7 +615,7 @@ case YEAR: return Year.of((int) newValue); case ERA: return (getLong(ERA) == newValue ? this : Year.of(1 - year)); } - throw new UnsupportedTemporalTypeException("Unsupported field: " + field.getName()); + throw new UnsupportedTemporalTypeException("Unsupported field: " + field); } return field.adjustInto(this, newValue); } @@ -664,7 +704,7 @@ case MILLENNIA: return plusYears(Math.multiplyExact(amountToAdd, 1000)); case ERAS: return with(ERA, Math.addExact(getLong(ERA), amountToAdd)); } - throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit.getName()); + throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit); } return unit.addTo(this, amountToAdd); } @@ -821,7 +861,7 @@ * The result will be negative if the end is before the start. * The {@code Temporal} passed to this method must be a {@code Year}. * For example, the period in decades between two year can be calculated - * using {@code startYear.periodUntil(endYear, DECADES)}. + * using {@code startYear.until(endYear, DECADES)}. *

                            * The calculation returns a whole number, representing the number of * complete units between the two years. @@ -833,7 +873,7 @@ * The second is to use {@link TemporalUnit#between(Temporal, Temporal)}: *

                                  *   // these two lines are equivalent
                            -     *   amount = start.periodUntil(end, YEARS);
                            +     *   amount = start.until(end, YEARS);
                                  *   amount = YEARS.between(start, end);
                                  * 
                            * The choice should be made based on which makes the code more readable. @@ -858,7 +898,7 @@ * @throws ArithmeticException if numeric overflow occurs */ @Override - public long periodUntil(Temporal endYear, TemporalUnit unit) { + public long until(Temporal endYear, TemporalUnit unit) { if (endYear instanceof Year == false) { Objects.requireNonNull(endYear, "endYear"); throw new DateTimeException("Unable to calculate amount as objects are of two different types"); @@ -873,7 +913,7 @@ case MILLENNIA: return yearsUntil / 1000; case ERAS: return end.getLong(ERA) - getLong(ERA); } - throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit.getName()); + throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit); } return unit.between(this, endYear); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/YearMonth.java --- a/jdk/src/share/classes/java/time/YearMonth.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/YearMonth.java Fri Aug 02 09:38:09 2013 +0100 @@ -66,7 +66,12 @@ import static java.time.temporal.ChronoField.PROLEPTIC_MONTH; import static java.time.temporal.ChronoField.YEAR; import static java.time.temporal.ChronoField.YEAR_OF_ERA; +import static java.time.temporal.ChronoUnit.CENTURIES; +import static java.time.temporal.ChronoUnit.DECADES; +import static java.time.temporal.ChronoUnit.ERAS; +import static java.time.temporal.ChronoUnit.MILLENNIA; import static java.time.temporal.ChronoUnit.MONTHS; +import static java.time.temporal.ChronoUnit.YEARS; import java.io.DataInput; import java.io.DataOutput; @@ -313,8 +318,9 @@ * Checks if the specified field is supported. *

                            * This checks if this year-month can be queried for the specified field. - * If false, then calling the {@link #range(TemporalField) range} and - * {@link #get(TemporalField) get} methods will throw an exception. + * If false, then calling the {@link #range(TemporalField) range}, + * {@link #get(TemporalField) get} and {@link #with(TemporalField, long)} + * methods will throw an exception. *

                            * If the field is a {@link ChronoField} then the query is implemented here. * The supported fields are: @@ -345,6 +351,42 @@ } /** + * Checks if the specified unit is supported. + *

                            + * This checks if the specified unit can be added to, or subtracted from, this date-time. + * If false, then calling the {@link #plus(long, TemporalUnit)} and + * {@link #minus(long, TemporalUnit) minus} methods will throw an exception. + *

                            + * If the unit is a {@link ChronoUnit} then the query is implemented here. + * The supported units are: + *

                              + *
                            • {@code MONTHS} + *
                            • {@code YEARS} + *
                            • {@code DECADES} + *
                            • {@code CENTURIES} + *
                            • {@code MILLENNIA} + *
                            • {@code ERAS} + *
                            + * All other {@code ChronoUnit} instances will return false. + *

                            + * If the unit is not a {@code ChronoUnit}, then the result of this method + * is obtained by invoking {@code TemporalUnit.isSupportedBy(Temporal)} + * passing {@code this} as the argument. + * Whether the unit is supported is determined by the unit. + * + * @param unit the unit to check, null returns false + * @return true if the unit can be added/subtracted, false if not + */ + @Override + public boolean isSupported(TemporalUnit unit) { + if (unit instanceof ChronoUnit) { + return unit == MONTHS || unit == YEARS || unit == DECADES || unit == CENTURIES || unit == MILLENNIA || unit == ERAS; + } + return unit != null && unit.isSupportedBy(this); + } + + //----------------------------------------------------------------------- + /** * Gets the range of valid values for the specified field. *

                            * The range object expresses the minimum and maximum valid values for a field. @@ -440,7 +482,7 @@ case YEAR: return year; case ERA: return (year < 1 ? 0 : 1); } - throw new UnsupportedTemporalTypeException("Unsupported field: " + field.getName()); + throw new UnsupportedTemporalTypeException("Unsupported field: " + field); } return field.getFrom(this); } @@ -639,7 +681,7 @@ case YEAR: return withYear((int) newValue); case ERA: return (getLong(ERA) == newValue ? this : withYear(1 - year)); } - throw new UnsupportedTemporalTypeException("Unsupported field: " + field.getName()); + throw new UnsupportedTemporalTypeException("Unsupported field: " + field); } return field.adjustInto(this, newValue); } @@ -761,7 +803,7 @@ case MILLENNIA: return plusYears(Math.multiplyExact(amountToAdd, 1000)); case ERAS: return with(ERA, Math.addExact(getLong(ERA), amountToAdd)); } - throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit.getName()); + throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit); } return unit.addTo(this, amountToAdd); } @@ -952,7 +994,7 @@ * The result will be negative if the end is before the start. * The {@code Temporal} passed to this method must be a {@code YearMonth}. * For example, the period in years between two year-months can be calculated - * using {@code startYearMonth.periodUntil(endYearMonth, YEARS)}. + * using {@code startYearMonth.until(endYearMonth, YEARS)}. *

                            * The calculation returns a whole number, representing the number of * complete units between the two year-months. @@ -964,7 +1006,7 @@ * The second is to use {@link TemporalUnit#between(Temporal, Temporal)}: *

                                  *   // these two lines are equivalent
                            -     *   amount = start.periodUntil(end, MONTHS);
                            +     *   amount = start.until(end, MONTHS);
                                  *   amount = MONTHS.between(start, end);
                                  * 
                            * The choice should be made based on which makes the code more readable. @@ -989,7 +1031,7 @@ * @throws ArithmeticException if numeric overflow occurs */ @Override - public long periodUntil(Temporal endYearMonth, TemporalUnit unit) { + public long until(Temporal endYearMonth, TemporalUnit unit) { if (endYearMonth instanceof YearMonth == false) { Objects.requireNonNull(endYearMonth, "endYearMonth"); throw new DateTimeException("Unable to calculate amount as objects are of two different types"); @@ -1005,7 +1047,7 @@ case MILLENNIA: return monthsUntil / 12000; case ERAS: return end.getLong(ERA) - getLong(ERA); } - throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit.getName()); + throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit); } return unit.between(this, endYearMonth); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/ZoneId.java --- a/jdk/src/share/classes/java/time/ZoneId.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/ZoneId.java Fri Aug 02 09:38:09 2013 +0100 @@ -401,6 +401,36 @@ } /** + * Obtains an instance of {@code ZoneId} wrapping an offset. + *

                            + * If the prefix is "GMT", "UTC", or "UT" a {@code ZoneId} + * with the prefix and the non-zero offset is returned. + * If the prefix is empty {@code ""} the {@code ZoneOffset} is returned. + * + * @param prefix the time-zone ID, not null + * @param offset the offset, not null + * @return the zone ID, not null + * @throws IllegalArgumentException if the prefix is not one of + * "GMT", "UTC", or "UT", or "" + */ + public static ZoneId ofOffset(String prefix, ZoneOffset offset) { + Objects.requireNonNull(prefix, "prefix"); + Objects.requireNonNull(offset, "offset"); + if (prefix.length() == 0) { + return offset; + } + + if (!prefix.equals("GMT") && !prefix.equals("UTC") && !prefix.equals("UT")) { + throw new IllegalArgumentException("prefix should be GMT, UTC or UT, is: " + prefix); + } + + if (offset.getTotalSeconds() != 0) { + prefix = prefix.concat(offset.getId()); + } + return new ZoneRegion(prefix, offset.getRules()); + } + + /** * Parses the ID, taking a flag to indicate whether {@code ZoneRulesException} * should be thrown or not, used in deserialization. * @@ -433,7 +463,7 @@ private static ZoneId ofWithPrefix(String zoneId, int prefixLength, boolean checkAvailable) { String prefix = zoneId.substring(0, prefixLength); if (zoneId.length() == prefixLength) { - return ZoneRegion.ofPrefixedOffset(prefix, ZoneOffset.UTC); + return ofOffset(prefix, ZoneOffset.UTC); } if (zoneId.charAt(prefixLength) != '+' && zoneId.charAt(prefixLength) != '-') { return ZoneRegion.ofId(zoneId, checkAvailable); // drop through to ZoneRulesProvider @@ -441,9 +471,9 @@ try { ZoneOffset offset = ZoneOffset.of(zoneId.substring(prefixLength)); if (offset == ZoneOffset.UTC) { - return ZoneRegion.ofPrefixedOffset(prefix, offset); + return ofOffset(prefix, offset); } - return ZoneRegion.ofPrefixedOffset(prefix + offset.toString(), offset); + return ofOffset(prefix, offset); } catch (DateTimeException ex) { throw new DateTimeException("Invalid ID for offset-based ZoneId: " + zoneId, ex); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/ZoneOffset.java --- a/jdk/src/share/classes/java/time/ZoneOffset.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/ZoneOffset.java Fri Aug 02 09:38:09 2013 +0100 @@ -61,7 +61,6 @@ */ package java.time; -import java.time.temporal.UnsupportedTemporalTypeException; import static java.time.LocalTime.MINUTES_PER_HOUR; import static java.time.LocalTime.SECONDS_PER_HOUR; import static java.time.LocalTime.SECONDS_PER_MINUTE; @@ -79,6 +78,7 @@ import java.time.temporal.TemporalAdjuster; import java.time.temporal.TemporalField; import java.time.temporal.TemporalQuery; +import java.time.temporal.UnsupportedTemporalTypeException; import java.time.temporal.ValueRange; import java.time.zone.ZoneRules; import java.util.Objects; @@ -581,7 +581,7 @@ if (field == OFFSET_SECONDS) { return totalSeconds; } else if (field instanceof ChronoField) { - throw new UnsupportedTemporalTypeException("Unsupported field: " + field.getName()); + throw new UnsupportedTemporalTypeException("Unsupported field: " + field); } return range(field).checkValidIntValue(getLong(field), field); } @@ -613,7 +613,7 @@ if (field == OFFSET_SECONDS) { return totalSeconds; } else if (field instanceof ChronoField) { - throw new UnsupportedTemporalTypeException("Unsupported field: " + field.getName()); + throw new UnsupportedTemporalTypeException("Unsupported field: " + field); } return field.getFrom(this); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/ZoneRegion.java --- a/jdk/src/share/classes/java/time/ZoneRegion.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/ZoneRegion.java Fri Aug 02 09:38:09 2013 +0100 @@ -66,7 +66,6 @@ import java.time.zone.ZoneRulesException; import java.time.zone.ZoneRulesProvider; import java.util.Objects; -import java.util.regex.Pattern; /** * A geographical region where the same time-zone rules apply. @@ -153,19 +152,6 @@ } } - /** - * Obtains an instance of {@code ZoneId} wrapping an offset. - *

                            - * For example, zone IDs like 'UTC', 'GMT', 'UT' and 'UTC+01:30' will be setup here. - * - * @param zoneId the time-zone ID, not null - * @param offset the offset, not null - * @return the zone ID, not null - */ - static ZoneRegion ofPrefixedOffset(String zoneId, ZoneOffset offset) { - return new ZoneRegion(zoneId, offset.getRules()); - } - //------------------------------------------------------------------------- /** * Constructor. diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/ZonedDateTime.java --- a/jdk/src/share/classes/java/time/ZonedDateTime.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/ZonedDateTime.java Fri Aug 02 09:38:09 2013 +0100 @@ -642,8 +642,9 @@ * Checks if the specified field is supported. *

                            * This checks if this date-time can be queried for the specified field. - * If false, then calling the {@link #range(TemporalField) range} and - * {@link #get(TemporalField) get} methods will throw an exception. + * If false, then calling the {@link #range(TemporalField) range}, + * {@link #get(TemporalField) get} and {@link #with(TemporalField, long)} + * methods will throw an exception. *

                            * If the field is a {@link ChronoField} then the query is implemented here. * The supported fields are: @@ -695,6 +696,48 @@ } /** + * Checks if the specified unit is supported. + *

                            + * This checks if the specified unit can be added to, or subtracted from, this date-time. + * If false, then calling the {@link #plus(long, TemporalUnit)} and + * {@link #minus(long, TemporalUnit) minus} methods will throw an exception. + *

                            + * If the unit is a {@link ChronoUnit} then the query is implemented here. + * The supported units are: + *

                              + *
                            • {@code NANOS} + *
                            • {@code MICROS} + *
                            • {@code MILLIS} + *
                            • {@code SECONDS} + *
                            • {@code MINUTES} + *
                            • {@code HOURS} + *
                            • {@code HALF_DAYS} + *
                            • {@code DAYS} + *
                            • {@code WEEKS} + *
                            • {@code MONTHS} + *
                            • {@code YEARS} + *
                            • {@code DECADES} + *
                            • {@code CENTURIES} + *
                            • {@code MILLENNIA} + *
                            • {@code ERAS} + *
                            + * All other {@code ChronoUnit} instances will return false. + *

                            + * If the unit is not a {@code ChronoUnit}, then the result of this method + * is obtained by invoking {@code TemporalUnit.isSupportedBy(Temporal)} + * passing {@code this} as the argument. + * Whether the unit is supported is determined by the unit. + * + * @param unit the unit to check, null returns false + * @return true if the unit can be added/subtracted, false if not + */ + @Override // override for Javadoc + public boolean isSupported(TemporalUnit unit) { + return ChronoZonedDateTime.super.isSupported(unit); + } + + //----------------------------------------------------------------------- + /** * Gets the range of valid values for the specified field. *

                            * The range object expresses the minimum and maximum valid values for a field. @@ -1540,8 +1583,7 @@ @Override public ZonedDateTime plus(long amountToAdd, TemporalUnit unit) { if (unit instanceof ChronoUnit) { - ChronoUnit u = (ChronoUnit) unit; - if (u.isDateUnit()) { + if (unit.isDateBased()) { return resolveLocal(dateTime.plus(amountToAdd, unit)); } else { return resolveInstant(dateTime.plus(amountToAdd, unit)); @@ -1990,7 +2032,7 @@ * The start and end points are {@code this} and the specified date-time. * The result will be negative if the end is before the start. * For example, the period in days between two date-times can be calculated - * using {@code startDateTime.periodUntil(endDateTime, DAYS)}. + * using {@code startDateTime.until(endDateTime, DAYS)}. *

                            * The {@code Temporal} passed to this method must be a {@code ZonedDateTime}. * If the time-zone differs between the two zoned date-times, the specified @@ -2006,7 +2048,7 @@ * The second is to use {@link TemporalUnit#between(Temporal, Temporal)}: *

                                  *   // these two lines are equivalent
                            -     *   amount = start.periodUntil(end, MONTHS);
                            +     *   amount = start.until(end, MONTHS);
                                  *   amount = MONTHS.between(start, end);
                                  * 
                            * The choice should be made based on which makes the code more readable. @@ -2047,7 +2089,7 @@ * @throws ArithmeticException if numeric overflow occurs */ @Override - public long periodUntil(Temporal endDateTime, TemporalUnit unit) { + public long until(Temporal endDateTime, TemporalUnit unit) { if (endDateTime instanceof ZonedDateTime == false) { Objects.requireNonNull(endDateTime, "endDateTime"); throw new DateTimeException("Unable to calculate amount as objects are of two different types"); @@ -2055,11 +2097,10 @@ if (unit instanceof ChronoUnit) { ZonedDateTime end = (ZonedDateTime) endDateTime; end = end.withZoneSameInstant(zone); - ChronoUnit u = (ChronoUnit) unit; - if (u.isDateUnit()) { - return dateTime.periodUntil(end.dateTime, unit); + if (unit.isDateBased()) { + return dateTime.until(end.dateTime, unit); } else { - return toOffsetDateTime().periodUntil(end.toOffsetDateTime(), unit); + return toOffsetDateTime().until(end.toOffsetDateTime(), unit); } } return unit.between(this, endDateTime); diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/chrono/ChronoDateImpl.java --- a/jdk/src/share/classes/java/time/chrono/ChronoDateImpl.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/chrono/ChronoDateImpl.java Fri Aug 02 09:38:09 2013 +0100 @@ -67,6 +67,8 @@ import java.time.temporal.ChronoUnit; import java.time.temporal.Temporal; import java.time.temporal.TemporalAdjuster; +import java.time.temporal.TemporalAmount; +import java.time.temporal.TemporalField; import java.time.temporal.TemporalUnit; import java.time.temporal.UnsupportedTemporalTypeException; import java.time.temporal.ValueRange; @@ -96,12 +98,12 @@ * // Enumerate the list of available calendars and print today for each * Set<Chronology> chronos = Chronology.getAvailableChronologies(); * for (Chronology chrono : chronos) { - * ChronoLocalDate<?> date = chrono.dateNow(); + * ChronoLocalDate date = chrono.dateNow(); * System.out.printf(" %20s: %s%n", chrono.getID(), date.toString()); * } * * // Print the Hijrah date and calendar - * ChronoLocalDate<?> date = Chronology.of("Hijrah").dateNow(); + * ChronoLocalDate date = Chronology.of("Hijrah").dateNow(); * int day = date.get(ChronoField.DAY_OF_MONTH); * int dow = date.get(ChronoField.DAY_OF_WEEK); * int month = date.get(ChronoField.MONTH_OF_YEAR); @@ -110,10 +112,10 @@ * dow, day, month, year); * // Print today's date and the last day of the year - * ChronoLocalDate<?> now1 = Chronology.of("Hijrah").dateNow(); - * ChronoLocalDate<?> first = now1.with(ChronoField.DAY_OF_MONTH, 1) + * ChronoLocalDate now1 = Chronology.of("Hijrah").dateNow(); + * ChronoLocalDate first = now1.with(ChronoField.DAY_OF_MONTH, 1) * .with(ChronoField.MONTH_OF_YEAR, 1); - * ChronoLocalDate<?> last = first.plus(1, ChronoUnit.YEARS) + * ChronoLocalDate last = first.plus(1, ChronoUnit.YEARS) * .minus(1, ChronoUnit.DAYS); * System.out.printf(" Today is %s: start: %s; end: %s%n", last.getChronology().getID(), * first, last); @@ -138,8 +140,8 @@ * @param the ChronoLocalDate of this date-time * @since 1.8 */ -abstract class ChronoDateImpl> - implements ChronoLocalDate, Temporal, TemporalAdjuster, Serializable { +abstract class ChronoDateImpl + implements ChronoLocalDate, Temporal, TemporalAdjuster, Serializable { /** * Serialization version. @@ -147,13 +149,52 @@ private static final long serialVersionUID = 6282433883239719096L; /** + * Casts the {@code Temporal} to {@code ChronoLocalDate} ensuring it bas the specified chronology. + * + * @param chrono the chronology to check for, not null + * @param temporal a date-time to cast, not null + * @return the date-time checked and cast to {@code ChronoLocalDate}, not null + * @throws ClassCastException if the date-time cannot be cast to ChronoLocalDate + * or the chronology is not equal this Chronology + */ + static D ensureValid(Chronology chrono, Temporal temporal) { + @SuppressWarnings("unchecked") + D other = (D) temporal; + if (chrono.equals(other.getChronology()) == false) { + throw new ClassCastException("Chronology mismatch, expected: " + chrono.getId() + ", actual: " + other.getChronology().getId()); + } + return other; + } + + //----------------------------------------------------------------------- + /** * Creates an instance. */ ChronoDateImpl() { } + @Override + @SuppressWarnings("unchecked") + public D with(TemporalAdjuster adjuster) { + return (D) ChronoLocalDate.super.with(adjuster); + } + + @Override + @SuppressWarnings("unchecked") + public D with(TemporalField field, long value) { + return (D) ChronoLocalDate.super.with(field, value); + } + //----------------------------------------------------------------------- @Override + @SuppressWarnings("unchecked") + public D plus(TemporalAmount amount) { + return (D) ChronoLocalDate.super.plus(amount); + } + + //----------------------------------------------------------------------- + @Override + @SuppressWarnings("unchecked") public D plus(long amountToAdd, TemporalUnit unit) { if (unit instanceof ChronoUnit) { ChronoUnit f = (ChronoUnit) unit; @@ -167,9 +208,21 @@ case MILLENNIA: return plusYears(Math.multiplyExact(amountToAdd, 1000)); case ERAS: return with(ERA, Math.addExact(getLong(ERA), amountToAdd)); } - throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit.getName()); + throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit); } - return ChronoLocalDate.super.plus(amountToAdd, unit); + return (D) ChronoLocalDate.super.plus(amountToAdd, unit); + } + + @Override + @SuppressWarnings("unchecked") + public D minus(TemporalAmount amount) { + return (D) ChronoLocalDate.super.minus(amount); + } + + @Override + @SuppressWarnings("unchecked") + public D minus(long amountToSubtract, TemporalUnit unit) { + return (D) ChronoLocalDate.super.minus(amountToSubtract, unit); } //----------------------------------------------------------------------- @@ -254,6 +307,7 @@ * @return a date based on this one with the years subtracted, not null * @throws DateTimeException if the result exceeds the supported date range */ + @SuppressWarnings("unchecked") D minusYears(long yearsToSubtract) { return (yearsToSubtract == Long.MIN_VALUE ? ((ChronoDateImpl)plusYears(Long.MAX_VALUE)).plusYears(1) : plusYears(-yearsToSubtract)); } @@ -274,6 +328,7 @@ * @return a date based on this one with the months subtracted, not null * @throws DateTimeException if the result exceeds the supported date range */ + @SuppressWarnings("unchecked") D minusMonths(long monthsToSubtract) { return (monthsToSubtract == Long.MIN_VALUE ? ((ChronoDateImpl)plusMonths(Long.MAX_VALUE)).plusMonths(1) : plusMonths(-monthsToSubtract)); } @@ -293,6 +348,7 @@ * @return a date based on this one with the weeks subtracted, not null * @throws DateTimeException if the result exceeds the supported date range */ + @SuppressWarnings("unchecked") D minusWeeks(long weeksToSubtract) { return (weeksToSubtract == Long.MIN_VALUE ? ((ChronoDateImpl)plusWeeks(Long.MAX_VALUE)).plusWeeks(1) : plusWeeks(-weeksToSubtract)); } @@ -310,6 +366,7 @@ * @return a date based on this one with the days subtracted, not null * @throws DateTimeException if the result exceeds the supported date range */ + @SuppressWarnings("unchecked") D minusDays(long daysToSubtract) { return (daysToSubtract == Long.MIN_VALUE ? ((ChronoDateImpl)plusDays(Long.MAX_VALUE)).plusDays(1) : plusDays(-daysToSubtract)); } @@ -321,13 +378,13 @@ * @throws ArithmeticException {@inheritDoc} */ @Override - public long periodUntil(Temporal endDateTime, TemporalUnit unit) { + public long until(Temporal endDateTime, TemporalUnit unit) { Objects.requireNonNull(endDateTime, "endDateTime"); Objects.requireNonNull(unit, "unit"); if (endDateTime instanceof ChronoLocalDate == false) { throw new DateTimeException("Unable to calculate amount as objects are of two different types"); } - ChronoLocalDate end = (ChronoLocalDate) endDateTime; + ChronoLocalDate end = (ChronoLocalDate) endDateTime; if (getChronology().equals(end.getChronology()) == false) { throw new DateTimeException("Unable to calculate amount as objects have different chronologies"); } @@ -342,16 +399,16 @@ case MILLENNIA: return monthsUntil(end) / 12000; case ERAS: return end.getLong(ERA) - getLong(ERA); } - throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit.getName()); + throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit); } return unit.between(this, endDateTime); } - private long daysUntil(ChronoLocalDate end) { + private long daysUntil(ChronoLocalDate end) { return end.toEpochDay() - toEpochDay(); // no overflow } - private long monthsUntil(ChronoLocalDate end) { + private long monthsUntil(ChronoLocalDate end) { ValueRange range = getChronology().range(MONTH_OF_YEAR); if (range.getMaximum() != 12) { throw new IllegalStateException("ChronoDateImpl only supports Chronologies with 12 months per year"); @@ -367,7 +424,7 @@ return true; } if (obj instanceof ChronoLocalDate) { - return compareTo((ChronoLocalDate) obj) == 0; + return compareTo((ChronoLocalDate) obj) == 0; } return false; } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/chrono/ChronoLocalDate.java --- a/jdk/src/share/classes/java/time/chrono/ChronoLocalDate.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/chrono/ChronoLocalDate.java Fri Aug 02 09:38:09 2013 +0100 @@ -242,11 +242,10 @@ * Additional calendar systems may be added to the system. * See {@link Chronology} for more details. * - * @param the concrete type for the date * @since 1.8 */ -public interface ChronoLocalDate> - extends Temporal, TemporalAdjuster, Comparable> { +public interface ChronoLocalDate + extends Temporal, TemporalAdjuster, Comparable { /** * Gets a comparator that compares {@code ChronoLocalDate} in @@ -263,7 +262,7 @@ * @see #isBefore * @see #isEqual */ - static Comparator> timeLineOrder() { + static Comparator timeLineOrder() { return Chronology.DATE_ORDER; } @@ -289,9 +288,9 @@ * @throws DateTimeException if unable to convert to a {@code ChronoLocalDate} * @see Chronology#date(TemporalAccessor) */ - static ChronoLocalDate from(TemporalAccessor temporal) { + static ChronoLocalDate from(TemporalAccessor temporal) { if (temporal instanceof ChronoLocalDate) { - return (ChronoLocalDate) temporal; + return (ChronoLocalDate) temporal; } Chronology chrono = temporal.query(TemporalQuery.chronology()); if (chrono == null) { @@ -367,6 +366,25 @@ return (isLeapYear() ? 366 : 365); } + /** + * Checks if the specified field is supported. + *

                            + * This checks if the specified field can be queried on this date. + * If false, then calling the {@link #range(TemporalField) range}, + * {@link #get(TemporalField) get} and {@link #with(TemporalField, long)} + * methods will throw an exception. + *

                            + * The set of supported fields is defined by the chronology and normally includes + * all {@code ChronoField} date fields. + *

                            + * If the field is not a {@code ChronoField}, then the result of this method + * is obtained by invoking {@code TemporalField.isSupportedBy(TemporalAccessor)} + * passing {@code this} as the argument. + * Whether the field is supported is determined by the field. + * + * @param field the field to check, null returns false + * @return true if the field can be queried, false if not + */ @Override default boolean isSupported(TemporalField field) { if (field instanceof ChronoField) { @@ -375,6 +393,32 @@ return field != null && field.isSupportedBy(this); } + /** + * Checks if the specified unit is supported. + *

                            + * This checks if the specified unit can be added to or subtracted from this date. + * If false, then calling the {@link #plus(long, TemporalUnit)} and + * {@link #minus(long, TemporalUnit) minus} methods will throw an exception. + *

                            + * The set of supported units is defined by the chronology and normally includes + * all {@code ChronoUnit} date units except {@code FOREVER}. + *

                            + * If the unit is not a {@code ChronoUnit}, then the result of this method + * is obtained by invoking {@code TemporalUnit.isSupportedBy(Temporal)} + * passing {@code this} as the argument. + * Whether the unit is supported is determined by the unit. + * + * @param unit the unit to check, null returns false + * @return true if the unit can be added/subtracted, false if not + */ + @Override + default boolean isSupported(TemporalUnit unit) { + if (unit instanceof ChronoUnit) { + return unit.isDateBased(); + } + return unit != null && unit.isSupportedBy(this); + } + //----------------------------------------------------------------------- // override for covariant return type /** @@ -383,8 +427,8 @@ * @throws ArithmeticException {@inheritDoc} */ @Override - default D with(TemporalAdjuster adjuster) { - return (D) getChronology().ensureChronoLocalDate(Temporal.super.with(adjuster)); + default ChronoLocalDate with(TemporalAdjuster adjuster) { + return ChronoDateImpl.ensureValid(getChronology(), Temporal.super.with(adjuster)); } /** @@ -394,11 +438,11 @@ * @throws ArithmeticException {@inheritDoc} */ @Override - default D with(TemporalField field, long newValue) { + default ChronoLocalDate with(TemporalField field, long newValue) { if (field instanceof ChronoField) { - throw new UnsupportedTemporalTypeException("Unsupported field: " + field.getName()); + throw new UnsupportedTemporalTypeException("Unsupported field: " + field); } - return (D) getChronology().ensureChronoLocalDate(field.adjustInto(this, newValue)); + return ChronoDateImpl.ensureValid(getChronology(), field.adjustInto(this, newValue)); } /** @@ -407,8 +451,8 @@ * @throws ArithmeticException {@inheritDoc} */ @Override - default D plus(TemporalAmount amount) { - return (D) getChronology().ensureChronoLocalDate(Temporal.super.plus(amount)); + default ChronoLocalDate plus(TemporalAmount amount) { + return ChronoDateImpl.ensureValid(getChronology(), Temporal.super.plus(amount)); } /** @@ -417,11 +461,11 @@ * @throws ArithmeticException {@inheritDoc} */ @Override - default D plus(long amountToAdd, TemporalUnit unit) { + default ChronoLocalDate plus(long amountToAdd, TemporalUnit unit) { if (unit instanceof ChronoUnit) { - throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit.getName()); + throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit); } - return (D) getChronology().ensureChronoLocalDate(unit.addTo(this, amountToAdd)); + return ChronoDateImpl.ensureValid(getChronology(), unit.addTo(this, amountToAdd)); } /** @@ -430,8 +474,8 @@ * @throws ArithmeticException {@inheritDoc} */ @Override - default D minus(TemporalAmount amount) { - return (D) getChronology().ensureChronoLocalDate(Temporal.super.minus(amount)); + default ChronoLocalDate minus(TemporalAmount amount) { + return ChronoDateImpl.ensureValid(getChronology(), Temporal.super.minus(amount)); } /** @@ -441,8 +485,8 @@ * @throws ArithmeticException {@inheritDoc} */ @Override - default D minus(long amountToSubtract, TemporalUnit unit) { - return (D) getChronology().ensureChronoLocalDate(Temporal.super.minus(amountToSubtract, unit)); + default ChronoLocalDate minus(long amountToSubtract, TemporalUnit unit) { + return ChronoDateImpl.ensureValid(getChronology(), Temporal.super.minus(amountToSubtract, unit)); } //----------------------------------------------------------------------- @@ -522,14 +566,14 @@ * The calculation returns a whole number, representing the number of * complete units between the two dates. * For example, the amount in days between two dates can be calculated - * using {@code startDate.periodUntil(endDate, DAYS)}. + * using {@code startDate.until(endDate, DAYS)}. *

                            * There are two equivalent ways of using this method. * The first is to invoke this method. * The second is to use {@link TemporalUnit#between(Temporal, Temporal)}: *

                                  *   // these two lines are equivalent
                            -     *   amount = start.periodUntil(end, MONTHS);
                            +     *   amount = start.until(end, MONTHS);
                                  *   amount = MONTHS.between(start, end);
                                  * 
                            * The choice should be made based on which makes the code more readable. @@ -555,7 +599,7 @@ * @throws ArithmeticException if numeric overflow occurs */ @Override // override for Javadoc - long periodUntil(Temporal endDate, TemporalUnit unit); + long until(Temporal endDate, TemporalUnit unit); /** * Calculates the period between this date and another date as a {@code Period}. @@ -575,7 +619,7 @@ * @throws DateTimeException if the period cannot be calculated * @throws ArithmeticException if numeric overflow occurs */ - Period periodUntil(ChronoLocalDate endDate); + Period until(ChronoLocalDate endDate); /** * Formats this date using the specified formatter. @@ -606,8 +650,9 @@ * @param localTime the local time to use, not null * @return the local date-time formed from this date and the specified time, not null */ - default ChronoLocalDateTime atTime(LocalTime localTime) { - return (ChronoLocalDateTime)ChronoLocalDateTimeImpl.of(this, localTime); + @SuppressWarnings("unchecked") + default ChronoLocalDateTime atTime(LocalTime localTime) { + return ChronoLocalDateTimeImpl.of(this, localTime); } //----------------------------------------------------------------------- @@ -656,7 +701,7 @@ * @return the comparator value, negative if less, positive if greater */ @Override - default int compareTo(ChronoLocalDate other) { + default int compareTo(ChronoLocalDate other) { int cmp = Long.compare(toEpochDay(), other.toEpochDay()); if (cmp == 0) { cmp = getChronology().compareTo(other.getChronology()); @@ -678,7 +723,7 @@ * @param other the other date to compare to, not null * @return true if this is after the specified date */ - default boolean isAfter(ChronoLocalDate other) { + default boolean isAfter(ChronoLocalDate other) { return this.toEpochDay() > other.toEpochDay(); } @@ -696,7 +741,7 @@ * @param other the other date to compare to, not null * @return true if this is before the specified date */ - default boolean isBefore(ChronoLocalDate other) { + default boolean isBefore(ChronoLocalDate other) { return this.toEpochDay() < other.toEpochDay(); } @@ -714,7 +759,7 @@ * @param other the other date to compare to, not null * @return true if the underlying date is equal to the specified date */ - default boolean isEqual(ChronoLocalDate other) { + default boolean isEqual(ChronoLocalDate other) { return this.toEpochDay() == other.toEpochDay(); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/chrono/ChronoLocalDateTime.java --- a/jdk/src/share/classes/java/time/chrono/ChronoLocalDateTime.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/chrono/ChronoLocalDateTime.java Fri Aug 02 09:38:09 2013 +0100 @@ -63,6 +63,7 @@ import static java.time.temporal.ChronoField.EPOCH_DAY; import static java.time.temporal.ChronoField.NANO_OF_DAY; +import static java.time.temporal.ChronoUnit.FOREVER; import static java.time.temporal.ChronoUnit.NANOS; import java.time.DateTimeException; @@ -73,6 +74,7 @@ import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoField; +import java.time.temporal.ChronoUnit; import java.time.temporal.Temporal; import java.time.temporal.TemporalAccessor; import java.time.temporal.TemporalAdjuster; @@ -114,7 +116,7 @@ * @param the concrete type for the date of this date-time * @since 1.8 */ -public interface ChronoLocalDateTime> +public interface ChronoLocalDateTime extends Temporal, TemporalAdjuster, Comparable> { /** @@ -191,9 +193,54 @@ */ LocalTime toLocalTime(); - @Override // Override to provide javadoc + /** + * Checks if the specified field is supported. + *

                            + * This checks if the specified field can be queried on this date-time. + * If false, then calling the {@link #range(TemporalField) range}, + * {@link #get(TemporalField) get} and {@link #with(TemporalField, long)} + * methods will throw an exception. + *

                            + * The set of supported fields is defined by the chronology and normally includes + * all {@code ChronoField} date and time fields. + *

                            + * If the field is not a {@code ChronoField}, then the result of this method + * is obtained by invoking {@code TemporalField.isSupportedBy(TemporalAccessor)} + * passing {@code this} as the argument. + * Whether the field is supported is determined by the field. + * + * @param field the field to check, null returns false + * @return true if the field can be queried, false if not + */ + @Override boolean isSupported(TemporalField field); + /** + * Checks if the specified unit is supported. + *

                            + * This checks if the specified unit can be added to or subtracted from this date-time. + * If false, then calling the {@link #plus(long, TemporalUnit)} and + * {@link #minus(long, TemporalUnit) minus} methods will throw an exception. + *

                            + * The set of supported units is defined by the chronology and normally includes + * all {@code ChronoUnit} units except {@code FOREVER}. + *

                            + * If the unit is not a {@code ChronoUnit}, then the result of this method + * is obtained by invoking {@code TemporalUnit.isSupportedBy(Temporal)} + * passing {@code this} as the argument. + * Whether the unit is supported is determined by the unit. + * + * @param unit the unit to check, null returns false + * @return true if the unit can be added/subtracted, false if not + */ + @Override + default boolean isSupported(TemporalUnit unit) { + if (unit instanceof ChronoUnit) { + return unit != FOREVER; + } + return unit != null && unit.isSupportedBy(this); + } + //----------------------------------------------------------------------- // override for covariant return type /** @@ -203,7 +250,7 @@ */ @Override default ChronoLocalDateTime with(TemporalAdjuster adjuster) { - return (ChronoLocalDateTime)(toLocalDate().getChronology().ensureChronoLocalDateTime(Temporal.super.with(adjuster))); + return ChronoLocalDateTimeImpl.ensureValid(toLocalDate().getChronology(), Temporal.super.with(adjuster)); } /** @@ -221,7 +268,7 @@ */ @Override default ChronoLocalDateTime plus(TemporalAmount amount) { - return (ChronoLocalDateTime)(toLocalDate().getChronology().ensureChronoLocalDateTime(Temporal.super.plus(amount))); + return ChronoLocalDateTimeImpl.ensureValid(toLocalDate().getChronology(), Temporal.super.plus(amount)); } /** @@ -239,7 +286,7 @@ */ @Override default ChronoLocalDateTime minus(TemporalAmount amount) { - return (ChronoLocalDateTime)(toLocalDate().getChronology().ensureChronoLocalDateTime(Temporal.super.minus(amount))); + return ChronoLocalDateTimeImpl.ensureValid(toLocalDate().getChronology(), Temporal.super.minus(amount)); } /** @@ -249,7 +296,7 @@ */ @Override default ChronoLocalDateTime minus(long amountToSubtract, TemporalUnit unit) { - return (ChronoLocalDateTime)(toLocalDate().getChronology().ensureChronoLocalDateTime(Temporal.super.minus(amountToSubtract, unit))); + return ChronoLocalDateTimeImpl.ensureValid(toLocalDate().getChronology(), Temporal.super.minus(amountToSubtract, unit)); } //----------------------------------------------------------------------- diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/chrono/ChronoLocalDateTimeImpl.java --- a/jdk/src/share/classes/java/time/chrono/ChronoLocalDateTimeImpl.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/chrono/ChronoLocalDateTimeImpl.java Fri Aug 02 09:38:09 2013 +0100 @@ -98,7 +98,7 @@ * @param the concrete type for the date of this date-time * @since 1.8 */ -final class ChronoLocalDateTimeImpl> +final class ChronoLocalDateTimeImpl implements ChronoLocalDateTime, Temporal, TemporalAdjuster, Serializable { /** @@ -171,9 +171,27 @@ * @param time the local time, not null * @return the local date-time, not null */ - @SuppressWarnings("rawtypes") - static ChronoLocalDateTimeImpl of(ChronoLocalDate date, LocalTime time) { - return new ChronoLocalDateTimeImpl(date, time); + static ChronoLocalDateTimeImpl of(R date, LocalTime time) { + return new ChronoLocalDateTimeImpl<>(date, time); + } + + /** + * Casts the {@code Temporal} to {@code ChronoLocalDateTime} ensuring it bas the specified chronology. + * + * @param chrono the chronology to check for, not null + * @param temporal a date-time to cast, not null + * @return the date-time checked and cast to {@code ChronoLocalDateTime}, not null + * @throws ClassCastException if the date-time cannot be cast to ChronoLocalDateTimeImpl + * or the chronology is not equal this Chronology + */ + static ChronoLocalDateTimeImpl ensureValid(Chronology chrono, Temporal temporal) { + @SuppressWarnings("unchecked") + ChronoLocalDateTimeImpl other = (ChronoLocalDateTimeImpl) temporal; + if (chrono.equals(other.toLocalDate().getChronology()) == false) { + throw new ClassCastException("Chronology mismatch, required: " + chrono.getId() + + ", actual: " + other.toLocalDate().getChronology().getId()); + } + return other; } /** @@ -202,7 +220,7 @@ return this; } // Validate that the new Temporal is a ChronoLocalDate (and not something else) - D cd = (D) date.getChronology().ensureChronoLocalDate(newDate); + D cd = ChronoDateImpl.ensureValid(date.getChronology(), newDate); return new ChronoLocalDateTimeImpl<>(cd, newTime); } @@ -260,13 +278,13 @@ public ChronoLocalDateTimeImpl with(TemporalAdjuster adjuster) { if (adjuster instanceof ChronoLocalDate) { // The Chronology is checked in with(date,time) - return with((ChronoLocalDate) adjuster, time); + return with((ChronoLocalDate) adjuster, time); } else if (adjuster instanceof LocalTime) { return with(date, (LocalTime) adjuster); } else if (adjuster instanceof ChronoLocalDateTimeImpl) { - return (ChronoLocalDateTimeImpl)(date.getChronology().ensureChronoLocalDateTime((ChronoLocalDateTimeImpl) adjuster)); + return ChronoLocalDateTimeImpl.ensureValid(date.getChronology(), (ChronoLocalDateTimeImpl) adjuster); } - return (ChronoLocalDateTimeImpl)(date.getChronology().ensureChronoLocalDateTime((ChronoLocalDateTimeImpl) adjuster.adjustInto(this))); + return ChronoLocalDateTimeImpl.ensureValid(date.getChronology(), (ChronoLocalDateTimeImpl) adjuster.adjustInto(this)); } @Override @@ -279,7 +297,7 @@ return with(date.with(field, newValue), time); } } - return (ChronoLocalDateTimeImpl)(date.getChronology().ensureChronoLocalDateTime(field.adjustInto(this, newValue))); + return ChronoLocalDateTimeImpl.ensureValid(date.getChronology(), field.adjustInto(this, newValue)); } //----------------------------------------------------------------------- @@ -298,7 +316,7 @@ } return with(date.plus(amountToAdd, unit), time); } - return (ChronoLocalDateTimeImpl)(date.getChronology().ensureChronoLocalDateTime(unit.addTo(this, amountToAdd))); + return ChronoLocalDateTimeImpl.ensureValid(date.getChronology(), unit.addTo(this, amountToAdd)); } private ChronoLocalDateTimeImpl plusDays(long days) { @@ -322,7 +340,7 @@ } //----------------------------------------------------------------------- - private ChronoLocalDateTimeImpl plusWithOverflow(ChronoLocalDate newDate, long hours, long minutes, long seconds, long nanos) { + private ChronoLocalDateTimeImpl plusWithOverflow(D newDate, long hours, long minutes, long seconds, long nanos) { // 9223372036854775808 long, 2147483648 int if ((hours | minutes | seconds | nanos) == 0) { return with(newDate, time); @@ -351,7 +369,7 @@ //----------------------------------------------------------------------- @Override - public long periodUntil(Temporal endDateTime, TemporalUnit unit) { + public long until(Temporal endDateTime, TemporalUnit unit) { if (endDateTime instanceof ChronoLocalDateTime == false) { throw new DateTimeException("Unable to calculate amount as objects are of two different types"); } @@ -361,10 +379,9 @@ throw new DateTimeException("Unable to calculate amount as objects have different chronologies"); } if (unit instanceof ChronoUnit) { - ChronoUnit f = (ChronoUnit) unit; - if (f.isTimeUnit()) { + if (unit.isTimeBased()) { long amount = end.getLong(EPOCH_DAY) - date.getLong(EPOCH_DAY); - switch (f) { + switch ((ChronoUnit) unit) { case NANOS: amount = Math.multiplyExact(amount, NANOS_PER_DAY); break; case MICROS: amount = Math.multiplyExact(amount, MICROS_PER_DAY); break; case MILLIS: amount = Math.multiplyExact(amount, MILLIS_PER_DAY); break; @@ -373,13 +390,13 @@ case HOURS: amount = Math.multiplyExact(amount, HOURS_PER_DAY); break; case HALF_DAYS: amount = Math.multiplyExact(amount, 2); break; } - return Math.addExact(amount, time.periodUntil(end.toLocalTime(), unit)); + return Math.addExact(amount, time.until(end.toLocalTime(), unit)); } - D endDate = end.toLocalDate(); + ChronoLocalDate endDate = end.toLocalDate(); if (end.toLocalTime().isBefore(time)) { endDate = endDate.minus(1, ChronoUnit.DAYS); } - return date.periodUntil(endDate, unit); + return date.until(endDate, unit); } return unit.between(this, endDateTime); } @@ -404,7 +421,7 @@ } static ChronoLocalDateTime readExternal(ObjectInput in) throws IOException, ClassNotFoundException { - ChronoLocalDate date = (ChronoLocalDate) in.readObject(); + ChronoLocalDate date = (ChronoLocalDate) in.readObject(); LocalTime time = (LocalTime) in.readObject(); return date.atTime(time); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/chrono/ChronoZonedDateTime.java --- a/jdk/src/share/classes/java/time/chrono/ChronoZonedDateTime.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/chrono/ChronoZonedDateTime.java Fri Aug 02 09:38:09 2013 +0100 @@ -63,6 +63,7 @@ import static java.time.temporal.ChronoField.INSTANT_SECONDS; import static java.time.temporal.ChronoField.OFFSET_SECONDS; +import static java.time.temporal.ChronoUnit.FOREVER; import static java.time.temporal.ChronoUnit.NANOS; import java.time.DateTimeException; @@ -73,6 +74,7 @@ import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoField; +import java.time.temporal.ChronoUnit; import java.time.temporal.Temporal; import java.time.temporal.TemporalAccessor; import java.time.temporal.TemporalAdjuster; @@ -115,7 +117,7 @@ * @param the concrete type for the date of this date-time * @since 1.8 */ -public interface ChronoZonedDateTime> +public interface ChronoZonedDateTime extends Temporal, Comparable> { /** @@ -338,9 +340,54 @@ */ ChronoZonedDateTime withZoneSameInstant(ZoneId zone); - @Override // Override to provide javadoc + /** + * Checks if the specified field is supported. + *

                            + * This checks if the specified field can be queried on this date-time. + * If false, then calling the {@link #range(TemporalField) range}, + * {@link #get(TemporalField) get} and {@link #with(TemporalField, long)} + * methods will throw an exception. + *

                            + * The set of supported fields is defined by the chronology and normally includes + * all {@code ChronoField} fields. + *

                            + * If the field is not a {@code ChronoField}, then the result of this method + * is obtained by invoking {@code TemporalField.isSupportedBy(TemporalAccessor)} + * passing {@code this} as the argument. + * Whether the field is supported is determined by the field. + * + * @param field the field to check, null returns false + * @return true if the field can be queried, false if not + */ + @Override boolean isSupported(TemporalField field); + /** + * Checks if the specified unit is supported. + *

                            + * This checks if the specified unit can be added to or subtracted from this date-time. + * If false, then calling the {@link #plus(long, TemporalUnit)} and + * {@link #minus(long, TemporalUnit) minus} methods will throw an exception. + *

                            + * The set of supported units is defined by the chronology and normally includes + * all {@code ChronoUnit} units except {@code FOREVER}. + *

                            + * If the unit is not a {@code ChronoUnit}, then the result of this method + * is obtained by invoking {@code TemporalUnit.isSupportedBy(Temporal)} + * passing {@code this} as the argument. + * Whether the unit is supported is determined by the unit. + * + * @param unit the unit to check, null returns false + * @return true if the unit can be added/subtracted, false if not + */ + @Override + default boolean isSupported(TemporalUnit unit) { + if (unit instanceof ChronoUnit) { + return unit != FOREVER; + } + return unit != null && unit.isSupportedBy(this); + } + //----------------------------------------------------------------------- // override for covariant return type /** @@ -350,7 +397,7 @@ */ @Override default ChronoZonedDateTime with(TemporalAdjuster adjuster) { - return (ChronoZonedDateTime)(toLocalDate().getChronology().ensureChronoZonedDateTime(Temporal.super.with(adjuster))); + return ChronoZonedDateTimeImpl.ensureValid(toLocalDate().getChronology(), Temporal.super.with(adjuster)); } /** @@ -368,7 +415,7 @@ */ @Override default ChronoZonedDateTime plus(TemporalAmount amount) { - return (ChronoZonedDateTime)(toLocalDate().getChronology().ensureChronoZonedDateTime(Temporal.super.plus(amount))); + return ChronoZonedDateTimeImpl.ensureValid(toLocalDate().getChronology(), Temporal.super.plus(amount)); } /** @@ -386,7 +433,7 @@ */ @Override default ChronoZonedDateTime minus(TemporalAmount amount) { - return (ChronoZonedDateTime)(toLocalDate().getChronology().ensureChronoZonedDateTime(Temporal.super.minus(amount))); + return ChronoZonedDateTimeImpl.ensureValid(toLocalDate().getChronology(), Temporal.super.minus(amount)); } /** @@ -396,7 +443,7 @@ */ @Override default ChronoZonedDateTime minus(long amountToSubtract, TemporalUnit unit) { - return (ChronoZonedDateTime)(toLocalDate().getChronology().ensureChronoZonedDateTime(Temporal.super.minus(amountToSubtract, unit))); + return ChronoZonedDateTimeImpl.ensureValid(toLocalDate().getChronology(), Temporal.super.minus(amountToSubtract, unit)); } //----------------------------------------------------------------------- diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/chrono/ChronoZonedDateTimeImpl.java --- a/jdk/src/share/classes/java/time/chrono/ChronoZonedDateTimeImpl.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/chrono/ChronoZonedDateTimeImpl.java Fri Aug 02 09:38:09 2013 +0100 @@ -101,7 +101,7 @@ * @param the concrete type for the date of this date-time * @since 1.8 */ -final class ChronoZonedDateTimeImpl> +final class ChronoZonedDateTimeImpl implements ChronoZonedDateTime, Serializable { /** @@ -131,7 +131,7 @@ * @param preferredOffset the zone offset, null if no preference * @return the zoned date-time, not null */ - static > ChronoZonedDateTime ofBest( + static ChronoZonedDateTime ofBest( ChronoLocalDateTimeImpl localDateTime, ZoneId zone, ZoneOffset preferredOffset) { Objects.requireNonNull(localDateTime, "localDateTime"); Objects.requireNonNull(zone, "zone"); @@ -167,14 +167,13 @@ * @param zone the zone identifier, not null * @return the zoned date-time, not null */ - @SuppressWarnings("rawtypes") static ChronoZonedDateTimeImpl ofInstant(Chronology chrono, Instant instant, ZoneId zone) { ZoneRules rules = zone.getRules(); ZoneOffset offset = rules.getOffset(instant); Objects.requireNonNull(offset, "offset"); // protect against bad ZoneRules LocalDateTime ldt = LocalDateTime.ofEpochSecond(instant.getEpochSecond(), instant.getNano(), offset); - ChronoLocalDateTimeImpl cldt = (ChronoLocalDateTimeImpl) chrono.localDateTime(ldt); - return new ChronoZonedDateTimeImpl(cldt, offset, zone); + ChronoLocalDateTimeImpl cldt = (ChronoLocalDateTimeImpl)chrono.localDateTime(ldt); + return new ChronoZonedDateTimeImpl<>(cldt, offset, zone); } /** @@ -184,10 +183,30 @@ * @param zone the time-zone to use, validated not null * @return the zoned date-time, validated not null */ + @SuppressWarnings("unchecked") private ChronoZonedDateTimeImpl create(Instant instant, ZoneId zone) { return (ChronoZonedDateTimeImpl)ofInstant(toLocalDate().getChronology(), instant, zone); } + /** + * Casts the {@code Temporal} to {@code ChronoZonedDateTimeImpl} ensuring it bas the specified chronology. + * + * @param chrono the chronology to check for, not null + * @param temporal a date-time to cast, not null + * @return the date-time checked and cast to {@code ChronoZonedDateTimeImpl}, not null + * @throws ClassCastException if the date-time cannot be cast to ChronoZonedDateTimeImpl + * or the chronology is not equal this Chronology + */ + static ChronoZonedDateTimeImpl ensureValid(Chronology chrono, Temporal temporal) { + @SuppressWarnings("unchecked") + ChronoZonedDateTimeImpl other = (ChronoZonedDateTimeImpl) temporal; + if (chrono.equals(other.toLocalDate().getChronology()) == false) { + throw new ClassCastException("Chronology mismatch, required: " + chrono.getId() + + ", actual: " + other.toLocalDate().getChronology().getId()); + } + return other; + } + //----------------------------------------------------------------------- /** * Constructor. @@ -271,7 +290,7 @@ } return ofBest(dateTime.with(field, newValue), zone, offset); } - return (ChronoZonedDateTime)(toLocalDate().getChronology().ensureChronoZonedDateTime(field.adjustInto(this, newValue))); + return ChronoZonedDateTimeImpl.ensureValid(toLocalDate().getChronology(), field.adjustInto(this, newValue)); } //----------------------------------------------------------------------- @@ -280,12 +299,12 @@ if (unit instanceof ChronoUnit) { return with(dateTime.plus(amountToAdd, unit)); } - return (ChronoZonedDateTime)(toLocalDate().getChronology().ensureChronoZonedDateTime(unit.addTo(this, amountToAdd))); /// TODO: Generics replacement Risk! + return ChronoZonedDateTimeImpl.ensureValid(toLocalDate().getChronology(), unit.addTo(this, amountToAdd)); /// TODO: Generics replacement Risk! } //----------------------------------------------------------------------- @Override - public long periodUntil(Temporal endDateTime, TemporalUnit unit) { + public long until(Temporal endDateTime, TemporalUnit unit) { if (endDateTime instanceof ChronoZonedDateTime == false) { throw new DateTimeException("Unable to calculate amount as objects are of two different types"); } @@ -296,7 +315,7 @@ } if (unit instanceof ChronoUnit) { end = end.withZoneSameInstant(offset); - return dateTime.periodUntil(end.toLocalDateTime(), unit); + return dateTime.until(end.toLocalDateTime(), unit); } return unit.between(this, endDateTime); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/chrono/Chronology.java --- a/jdk/src/share/classes/java/time/chrono/Chronology.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/chrono/Chronology.java Fri Aug 02 09:38:09 2013 +0100 @@ -74,6 +74,9 @@ import static java.time.temporal.ChronoField.PROLEPTIC_MONTH; import static java.time.temporal.ChronoField.YEAR; import static java.time.temporal.ChronoField.YEAR_OF_ERA; +import static java.time.temporal.ChronoUnit.DAYS; +import static java.time.temporal.ChronoUnit.MONTHS; +import static java.time.temporal.ChronoUnit.WEEKS; import static java.time.temporal.TemporalAdjuster.nextOrSame; import java.io.DataInput; @@ -88,14 +91,16 @@ import java.time.Instant; import java.time.LocalDate; import java.time.LocalTime; +import java.time.Month; +import java.time.Year; import java.time.ZoneId; import java.time.format.DateTimeFormatterBuilder; import java.time.format.ResolverStyle; import java.time.format.TextStyle; import java.time.temporal.ChronoField; -import java.time.temporal.ChronoUnit; import java.time.temporal.Temporal; import java.time.temporal.TemporalAccessor; +import java.time.temporal.TemporalAdjuster; import java.time.temporal.TemporalField; import java.time.temporal.TemporalQuery; import java.time.temporal.UnsupportedTemporalTypeException; @@ -188,8 +193,8 @@ /** * ChronoLocalDate order constant. */ - static final Comparator> DATE_ORDER = - (Comparator> & Serializable) (date1, date2) -> { + static final Comparator DATE_ORDER = + (Comparator & Serializable) (date1, date2) -> { return Long.compare(date1.toEpochDay(), date2.toEpochDay()); }; /** @@ -482,60 +487,6 @@ //----------------------------------------------------------------------- /** - * Casts the {@code Temporal} to {@code ChronoLocalDate} with the same chronology. - * - * @param temporal a date-time to cast, not null - * @return the date-time checked and cast to {@code ChronoLocalDate}, not null - * @throws ClassCastException if the date-time cannot be cast to ChronoLocalDate - * or the chronology is not equal this Chronology - */ - ChronoLocalDate ensureChronoLocalDate(Temporal temporal) { - @SuppressWarnings("unchecked") - ChronoLocalDate other = (ChronoLocalDate) temporal; - if (this.equals(other.getChronology()) == false) { - throw new ClassCastException("Chronology mismatch, expected: " + getId() + ", actual: " + other.getChronology().getId()); - } - return other; - } - - /** - * Casts the {@code Temporal} to {@code ChronoLocalDateTime} with the same chronology. - * - * @param temporal a date-time to cast, not null - * @return the date-time checked and cast to {@code ChronoLocalDateTime}, not null - * @throws ClassCastException if the date-time cannot be cast to ChronoLocalDateTimeImpl - * or the chronology is not equal this Chronology - */ - ChronoLocalDateTimeImpl ensureChronoLocalDateTime(Temporal temporal) { - @SuppressWarnings("unchecked") - ChronoLocalDateTimeImpl other = (ChronoLocalDateTimeImpl) temporal; - if (this.equals(other.toLocalDate().getChronology()) == false) { - throw new ClassCastException("Chronology mismatch, required: " + getId() - + ", supplied: " + other.toLocalDate().getChronology().getId()); - } - return other; - } - - /** - * Casts the {@code Temporal} to {@code ChronoZonedDateTimeImpl} with the same chronology. - * - * @param temporal a date-time to cast, not null - * @return the date-time checked and cast to {@code ChronoZonedDateTimeImpl}, not null - * @throws ClassCastException if the date-time cannot be cast to ChronoZonedDateTimeImpl - * or the chronology is not equal this Chronology - */ - ChronoZonedDateTimeImpl ensureChronoZonedDateTime(Temporal temporal) { - @SuppressWarnings("unchecked") - ChronoZonedDateTimeImpl other = (ChronoZonedDateTimeImpl) temporal; - if (this.equals(other.toLocalDate().getChronology()) == false) { - throw new ClassCastException("Chronology mismatch, required: " + getId() - + ", supplied: " + other.toLocalDate().getChronology().getId()); - } - return other; - } - - //----------------------------------------------------------------------- - /** * Gets the ID of the chronology. *

                            * The ID uniquely identifies the {@code Chronology}. @@ -574,7 +525,7 @@ * @throws DateTimeException if unable to create the date * @throws ClassCastException if the {@code era} is not of the correct type for the chronology */ - public ChronoLocalDate date(Era era, int yearOfEra, int month, int dayOfMonth) { + public ChronoLocalDate date(Era era, int yearOfEra, int month, int dayOfMonth) { return date(prolepticYear(era, yearOfEra), month, dayOfMonth); } @@ -588,7 +539,7 @@ * @return the local date in this chronology, not null * @throws DateTimeException if unable to create the date */ - public abstract ChronoLocalDate date(int prolepticYear, int month, int dayOfMonth); + public abstract ChronoLocalDate date(int prolepticYear, int month, int dayOfMonth); /** * Obtains a local date in this chronology from the era, year-of-era and @@ -601,7 +552,7 @@ * @throws DateTimeException if unable to create the date * @throws ClassCastException if the {@code era} is not of the correct type for the chronology */ - public ChronoLocalDate dateYearDay(Era era, int yearOfEra, int dayOfYear) { + public ChronoLocalDate dateYearDay(Era era, int yearOfEra, int dayOfYear) { return dateYearDay(prolepticYear(era, yearOfEra), dayOfYear); } @@ -614,7 +565,7 @@ * @return the local date in this chronology, not null * @throws DateTimeException if unable to create the date */ - public abstract ChronoLocalDate dateYearDay(int prolepticYear, int dayOfYear); + public abstract ChronoLocalDate dateYearDay(int prolepticYear, int dayOfYear); /** * Obtains a local date in this chronology from the epoch-day. @@ -626,7 +577,7 @@ * @return the local date in this chronology, not null * @throws DateTimeException if unable to create the date */ - public abstract ChronoLocalDate dateEpochDay(long epochDay); + public abstract ChronoLocalDate dateEpochDay(long epochDay); //----------------------------------------------------------------------- /** @@ -643,7 +594,7 @@ * @return the current local date using the system clock and default time-zone, not null * @throws DateTimeException if unable to create the date */ - public ChronoLocalDate dateNow() { + public ChronoLocalDate dateNow() { return dateNow(Clock.systemDefaultZone()); } @@ -660,7 +611,7 @@ * @return the current local date using the system clock, not null * @throws DateTimeException if unable to create the date */ - public ChronoLocalDate dateNow(ZoneId zone) { + public ChronoLocalDate dateNow(ZoneId zone) { return dateNow(Clock.system(zone)); } @@ -675,7 +626,7 @@ * @return the current local date, not null * @throws DateTimeException if unable to create the date */ - public ChronoLocalDate dateNow(Clock clock) { + public ChronoLocalDate dateNow(Clock clock) { Objects.requireNonNull(clock, "clock"); return date(LocalDate.now(clock)); } @@ -699,7 +650,7 @@ * @throws DateTimeException if unable to create the date * @see ChronoLocalDate#from(TemporalAccessor) */ - public abstract ChronoLocalDate date(TemporalAccessor temporal); + public abstract ChronoLocalDate date(TemporalAccessor temporal); /** * Obtains a local date-time in this chronology from another temporal object. @@ -722,7 +673,7 @@ * @throws DateTimeException if unable to create the date-time * @see ChronoLocalDateTime#from(TemporalAccessor) */ - public ChronoLocalDateTime localDateTime(TemporalAccessor temporal) { + public ChronoLocalDateTime localDateTime(TemporalAccessor temporal) { try { return date(temporal).atTime(LocalTime.from(temporal)); } catch (DateTimeException ex) { @@ -754,7 +705,7 @@ * @throws DateTimeException if unable to create the date-time * @see ChronoZonedDateTime#from(TemporalAccessor) */ - public ChronoZonedDateTime zonedDateTime(TemporalAccessor temporal) { + public ChronoZonedDateTime zonedDateTime(TemporalAccessor temporal) { try { ZoneId zone = ZoneId.from(temporal); try { @@ -762,8 +713,7 @@ return zonedDateTime(instant, zone); } catch (DateTimeException ex1) { - @SuppressWarnings("rawtypes") - ChronoLocalDateTimeImpl cldt = ensureChronoLocalDateTime(localDateTime(temporal)); + ChronoLocalDateTimeImpl cldt = ChronoLocalDateTimeImpl.ensureValid(this, localDateTime(temporal)); return ChronoZonedDateTimeImpl.ofBest(cldt, zone, null); } } catch (DateTimeException ex) { @@ -781,7 +731,7 @@ * @return the zoned date-time, not null * @throws DateTimeException if the result exceeds the supported range */ - public ChronoZonedDateTime zonedDateTime(Instant instant, ZoneId zone) { + public ChronoZonedDateTime zonedDateTime(Instant instant, ZoneId zone) { return ChronoZonedDateTimeImpl.ofInstant(this, instant, zone); } @@ -929,11 +879,82 @@ * As such, {@code ChronoField} date fields are resolved here in the * context of a specific chronology. *

                            + * {@code ChronoField} instances are resolved by this method, which may + * be overridden in subclasses. + *

                              + *
                            • {@code EPOCH_DAY} - If present, this is converted to a date and + * all other date fields are then cross-checked against the date. + *
                            • {@code PROLEPTIC_MONTH} - If present, then it is split into the + * {@code YEAR} and {@code MONTH_OF_YEAR}. If the mode is strict or smart + * then the field is validated. + *
                            • {@code YEAR_OF_ERA} and {@code ERA} - If both are present, then they + * are combined to form a {@code YEAR}. In lenient mode, the {@code YEAR_OF_ERA} + * range is not validated, in smart and strict mode it is. The {@code ERA} is + * validated for range in all three modes. If only the {@code YEAR_OF_ERA} is + * present, and the mode is smart or lenient, then the last available era + * is assumed. In strict mode, no era is assumed and the {@code YEAR_OF_ERA} is + * left untouched. If only the {@code ERA} is present, then it is left untouched. + *
                            • {@code YEAR}, {@code MONTH_OF_YEAR} and {@code DAY_OF_MONTH} - + * If all three are present, then they are combined to form a date. + * In all three modes, the {@code YEAR} is validated. + * If the mode is smart or strict, then the month and day are validated. + * If the mode is lenient, then the date is combined in a manner equivalent to + * creating a date on the first day of the first month in the requested year, + * then adding the difference in months, then the difference in days. + * If the mode is smart, and the day-of-month is greater than the maximum for + * the year-month, then the day-of-month is adjusted to the last day-of-month. + * If the mode is strict, then the three fields must form a valid date. + *
                            • {@code YEAR} and {@code DAY_OF_YEAR} - + * If both are present, then they are combined to form a date. + * In all three modes, the {@code YEAR} is validated. + * If the mode is lenient, then the date is combined in a manner equivalent to + * creating a date on the first day of the requested year, then adding + * the difference in days. + * If the mode is smart or strict, then the two fields must form a valid date. + *
                            • {@code YEAR}, {@code MONTH_OF_YEAR}, {@code ALIGNED_WEEK_OF_MONTH} and + * {@code ALIGNED_DAY_OF_WEEK_IN_MONTH} - + * If all four are present, then they are combined to form a date. + * In all three modes, the {@code YEAR} is validated. + * If the mode is lenient, then the date is combined in a manner equivalent to + * creating a date on the first day of the first month in the requested year, then adding + * the difference in months, then the difference in weeks, then in days. + * If the mode is smart or strict, then the all four fields are validated to + * their outer ranges. The date is then combined in a manner equivalent to + * creating a date on the first day of the requested year and month, then adding + * the amount in weeks and days to reach their values. If the mode is strict, + * the date is additionally validated to check that the day and week adjustment + * did not change the month. + *
                            • {@code YEAR}, {@code MONTH_OF_YEAR}, {@code ALIGNED_WEEK_OF_MONTH} and + * {@code DAY_OF_WEEK} - If all four are present, then they are combined to + * form a date. The approach is the same as described above for + * years, months and weeks in {@code ALIGNED_DAY_OF_WEEK_IN_MONTH}. + * The day-of-week is adjusted as the next or same matching day-of-week once + * the years, months and weeks have been handled. + *
                            • {@code YEAR}, {@code ALIGNED_WEEK_OF_YEAR} and {@code ALIGNED_DAY_OF_WEEK_IN_YEAR} - + * If all three are present, then they are combined to form a date. + * In all three modes, the {@code YEAR} is validated. + * If the mode is lenient, then the date is combined in a manner equivalent to + * creating a date on the first day of the requested year, then adding + * the difference in weeks, then in days. + * If the mode is smart or strict, then the all three fields are validated to + * their outer ranges. The date is then combined in a manner equivalent to + * creating a date on the first day of the requested year, then adding + * the amount in weeks and days to reach their values. If the mode is strict, + * the date is additionally validated to check that the day and week adjustment + * did not change the year. + *
                            • {@code YEAR}, {@code ALIGNED_WEEK_OF_YEAR} and {@code DAY_OF_WEEK} - + * If all three are present, then they are combined to form a date. + * The approach is the same as described above for years and weeks in + * {@code ALIGNED_DAY_OF_WEEK_IN_YEAR}. The day-of-week is adjusted as the + * next or same matching day-of-week once the years and weeks have been handled. + *
                            + *

                            * The default implementation is suitable for most calendar systems. * If {@link ChronoField#YEAR_OF_ERA} is found without an {@link ChronoField#ERA} * then the last era in {@link #eras()} is used. * The implementation assumes a 7 day week, that the first day-of-month - * has the value 1, and that first day-of-year has the value 1. + * has the value 1, that first day-of-year has the value 1, and that the + * first of the month and year always exists. * * @param fieldValues the map of fields to values, which can be updated, not null * @param resolverStyle the requested type of resolve, not null @@ -941,99 +962,214 @@ * @throws DateTimeException if the date cannot be resolved, typically * because of a conflict in the input data */ - public ChronoLocalDate resolveDate(Map fieldValues, ResolverStyle resolverStyle) { + public ChronoLocalDate resolveDate(Map fieldValues, ResolverStyle resolverStyle) { // check epoch-day before inventing era if (fieldValues.containsKey(EPOCH_DAY)) { return dateEpochDay(fieldValues.remove(EPOCH_DAY)); } // fix proleptic month before inventing era - Long pMonth = fieldValues.remove(PROLEPTIC_MONTH); - if (pMonth != null) { - // first day-of-month is likely to be safest for setting proleptic-month - // cannot add to year zero, as not all chronologies have a year zero - ChronoLocalDate chronoDate = dateNow() - .with(DAY_OF_MONTH, 1).with(PROLEPTIC_MONTH, pMonth); - addFieldValue(fieldValues, MONTH_OF_YEAR, chronoDate.get(MONTH_OF_YEAR)); - addFieldValue(fieldValues, YEAR, chronoDate.get(YEAR)); - } + resolveProlepticMonth(fieldValues, resolverStyle); // invent era if necessary to resolve year-of-era - Long yoeLong = fieldValues.remove(YEAR_OF_ERA); - if (yoeLong != null) { - Long eraLong = fieldValues.remove(ERA); - int yoe = range(YEAR_OF_ERA).checkValidIntValue(yoeLong, YEAR_OF_ERA); - if (eraLong != null) { - Era eraObj = eraOf(Math.toIntExact(eraLong)); - addFieldValue(fieldValues, YEAR, prolepticYear(eraObj, yoe)); - } else if (fieldValues.containsKey(YEAR)) { - int year = range(YEAR).checkValidIntValue(fieldValues.get(YEAR), YEAR); - ChronoLocalDate chronoDate = dateYearDay(year, 1); - addFieldValue(fieldValues, YEAR, prolepticYear(chronoDate.getEra(), yoe)); - } else { - List eras = eras(); - if (eras.isEmpty()) { - addFieldValue(fieldValues, YEAR, yoe); - } else { - Era eraObj = eras.get(eras.size() - 1); - addFieldValue(fieldValues, YEAR, prolepticYear(eraObj, yoe)); - } - } + ChronoLocalDate resolved = resolveYearOfEra(fieldValues, resolverStyle); + if (resolved != null) { + return resolved; } // build date if (fieldValues.containsKey(YEAR)) { if (fieldValues.containsKey(MONTH_OF_YEAR)) { if (fieldValues.containsKey(DAY_OF_MONTH)) { - int y = range(YEAR).checkValidIntValue(fieldValues.remove(YEAR), YEAR); - int moy = range(MONTH_OF_YEAR).checkValidIntValue(fieldValues.remove(MONTH_OF_YEAR), MONTH_OF_YEAR); - int dom = range(DAY_OF_MONTH).checkValidIntValue(fieldValues.remove(DAY_OF_MONTH), DAY_OF_MONTH); - return date(y, moy, dom); + return resolveYMD(fieldValues, resolverStyle); } if (fieldValues.containsKey(ALIGNED_WEEK_OF_MONTH)) { if (fieldValues.containsKey(ALIGNED_DAY_OF_WEEK_IN_MONTH)) { - int y = range(YEAR).checkValidIntValue(fieldValues.remove(YEAR), YEAR); - int moy = range(MONTH_OF_YEAR).checkValidIntValue(fieldValues.remove(MONTH_OF_YEAR), MONTH_OF_YEAR); - int aw = range(ALIGNED_WEEK_OF_MONTH).checkValidIntValue(fieldValues.remove(ALIGNED_WEEK_OF_MONTH), ALIGNED_WEEK_OF_MONTH); - int ad = range(ALIGNED_DAY_OF_WEEK_IN_MONTH).checkValidIntValue(fieldValues.remove(ALIGNED_DAY_OF_WEEK_IN_MONTH), ALIGNED_DAY_OF_WEEK_IN_MONTH); - ChronoLocalDate chronoDate = date(y, moy, 1); - return chronoDate.plus((aw - 1) * 7 + (ad - 1), ChronoUnit.DAYS); + return resolveYMAA(fieldValues, resolverStyle); } if (fieldValues.containsKey(DAY_OF_WEEK)) { - int y = range(YEAR).checkValidIntValue(fieldValues.remove(YEAR), YEAR); - int moy = range(MONTH_OF_YEAR).checkValidIntValue(fieldValues.remove(MONTH_OF_YEAR), MONTH_OF_YEAR); - int aw = range(ALIGNED_WEEK_OF_MONTH).checkValidIntValue(fieldValues.remove(ALIGNED_WEEK_OF_MONTH), ALIGNED_WEEK_OF_MONTH); - int dow = range(DAY_OF_WEEK).checkValidIntValue(fieldValues.remove(DAY_OF_WEEK), DAY_OF_WEEK); - ChronoLocalDate chronoDate = date(y, moy, 1); - return chronoDate.plus((aw - 1) * 7, ChronoUnit.DAYS).with(nextOrSame(DayOfWeek.of(dow))); + return resolveYMAD(fieldValues, resolverStyle); } } } if (fieldValues.containsKey(DAY_OF_YEAR)) { - int y = range(YEAR).checkValidIntValue(fieldValues.remove(YEAR), YEAR); - int doy = range(DAY_OF_YEAR).checkValidIntValue(fieldValues.remove(DAY_OF_YEAR), DAY_OF_YEAR); - return dateYearDay(y, doy); + return resolveYD(fieldValues, resolverStyle); } if (fieldValues.containsKey(ALIGNED_WEEK_OF_YEAR)) { if (fieldValues.containsKey(ALIGNED_DAY_OF_WEEK_IN_YEAR)) { - int y = range(YEAR).checkValidIntValue(fieldValues.remove(YEAR), YEAR); - int aw = range(ALIGNED_WEEK_OF_YEAR).checkValidIntValue(fieldValues.remove(ALIGNED_WEEK_OF_YEAR), ALIGNED_WEEK_OF_YEAR); - int ad = range(ALIGNED_DAY_OF_WEEK_IN_YEAR).checkValidIntValue(fieldValues.remove(ALIGNED_DAY_OF_WEEK_IN_YEAR), ALIGNED_DAY_OF_WEEK_IN_YEAR); - ChronoLocalDate chronoDate = dateYearDay(y, 1); - return chronoDate.plus((aw - 1) * 7 + (ad - 1), ChronoUnit.DAYS); + return resolveYAA(fieldValues, resolverStyle); } if (fieldValues.containsKey(DAY_OF_WEEK)) { - int y = range(YEAR).checkValidIntValue(fieldValues.remove(YEAR), YEAR); - int aw = range(ALIGNED_WEEK_OF_YEAR).checkValidIntValue(fieldValues.remove(ALIGNED_WEEK_OF_YEAR), ALIGNED_WEEK_OF_YEAR); - int dow = range(DAY_OF_WEEK).checkValidIntValue(fieldValues.remove(DAY_OF_WEEK), DAY_OF_WEEK); - ChronoLocalDate chronoDate = dateYearDay(y, 1); - return chronoDate.plus((aw - 1) * 7, ChronoUnit.DAYS).with(nextOrSame(DayOfWeek.of(dow))); + return resolveYAD(fieldValues, resolverStyle); } } } return null; } + void resolveProlepticMonth(Map fieldValues, ResolverStyle resolverStyle) { + Long pMonth = fieldValues.remove(PROLEPTIC_MONTH); + if (pMonth != null) { + if (resolverStyle != ResolverStyle.LENIENT) { + PROLEPTIC_MONTH.checkValidValue(pMonth); + } + // first day-of-month is likely to be safest for setting proleptic-month + // cannot add to year zero, as not all chronologies have a year zero + ChronoLocalDate chronoDate = dateNow() + .with(DAY_OF_MONTH, 1).with(PROLEPTIC_MONTH, pMonth); + addFieldValue(fieldValues, MONTH_OF_YEAR, chronoDate.get(MONTH_OF_YEAR)); + addFieldValue(fieldValues, YEAR, chronoDate.get(YEAR)); + } + } + + ChronoLocalDate resolveYearOfEra(Map fieldValues, ResolverStyle resolverStyle) { + Long yoeLong = fieldValues.remove(YEAR_OF_ERA); + if (yoeLong != null) { + Long eraLong = fieldValues.remove(ERA); + int yoe; + if (resolverStyle != ResolverStyle.LENIENT) { + yoe = range(YEAR_OF_ERA).checkValidIntValue(yoeLong, YEAR_OF_ERA); + } else { + yoe = Math.toIntExact(yoeLong); + } + if (eraLong != null) { + Era eraObj = eraOf(range(ERA).checkValidIntValue(eraLong, ERA)); + addFieldValue(fieldValues, YEAR, prolepticYear(eraObj, yoe)); + } else { + if (fieldValues.containsKey(YEAR)) { + int year = range(YEAR).checkValidIntValue(fieldValues.get(YEAR), YEAR); + ChronoLocalDate chronoDate = dateYearDay(year, 1); + addFieldValue(fieldValues, YEAR, prolepticYear(chronoDate.getEra(), yoe)); + } else if (resolverStyle == ResolverStyle.STRICT) { + // do not invent era if strict + // reinstate the field removed earlier, no cross-check issues + fieldValues.put(YEAR_OF_ERA, yoeLong); + } else { + List eras = eras(); + if (eras.isEmpty()) { + addFieldValue(fieldValues, YEAR, yoe); + } else { + Era eraObj = eras.get(eras.size() - 1); + addFieldValue(fieldValues, YEAR, prolepticYear(eraObj, yoe)); + } + } + } + } else if (fieldValues.containsKey(ERA)) { + range(ERA).checkValidValue(fieldValues.get(ERA), ERA); // always validated + } + return null; + } + + ChronoLocalDate resolveYMD(Map fieldValues, ResolverStyle resolverStyle) { + int y = range(YEAR).checkValidIntValue(fieldValues.remove(YEAR), YEAR); + if (resolverStyle == ResolverStyle.LENIENT) { + long months = Math.subtractExact(fieldValues.remove(MONTH_OF_YEAR), 1); + long days = Math.subtractExact(fieldValues.remove(DAY_OF_MONTH), 1); + return date(y, 1, 1).plus(months, MONTHS).plus(days, DAYS); + } + int moy = range(MONTH_OF_YEAR).checkValidIntValue(fieldValues.remove(MONTH_OF_YEAR), MONTH_OF_YEAR); + ValueRange domRange = range(DAY_OF_MONTH); + int dom = domRange.checkValidIntValue(fieldValues.remove(DAY_OF_MONTH), DAY_OF_MONTH); + if (resolverStyle == ResolverStyle.SMART) { // previous valid + try { + return date(y, moy, dom); + } catch (DateTimeException ex) { + return date(y, moy, 1).with(TemporalAdjuster.lastDayOfMonth()); + } + } + return date(y, moy, dom); + } + + ChronoLocalDate resolveYD(Map fieldValues, ResolverStyle resolverStyle) { + int y = range(YEAR).checkValidIntValue(fieldValues.remove(YEAR), YEAR); + if (resolverStyle == ResolverStyle.LENIENT) { + long days = Math.subtractExact(fieldValues.remove(DAY_OF_YEAR), 1); + return dateYearDay(y, 1).plus(days, DAYS); + } + int doy = range(DAY_OF_YEAR).checkValidIntValue(fieldValues.remove(DAY_OF_YEAR), DAY_OF_YEAR); + return dateYearDay(y, doy); // smart is same as strict + } + + ChronoLocalDate resolveYMAA(Map fieldValues, ResolverStyle resolverStyle) { + int y = range(YEAR).checkValidIntValue(fieldValues.remove(YEAR), YEAR); + if (resolverStyle == ResolverStyle.LENIENT) { + long months = Math.subtractExact(fieldValues.remove(MONTH_OF_YEAR), 1); + long weeks = Math.subtractExact(fieldValues.remove(ALIGNED_WEEK_OF_MONTH), 1); + long days = Math.subtractExact(fieldValues.remove(ALIGNED_DAY_OF_WEEK_IN_MONTH), 1); + return date(y, 1, 1).plus(months, MONTHS).plus(weeks, WEEKS).plus(days, DAYS); + } + int moy = range(MONTH_OF_YEAR).checkValidIntValue(fieldValues.remove(MONTH_OF_YEAR), MONTH_OF_YEAR); + int aw = range(ALIGNED_WEEK_OF_MONTH).checkValidIntValue(fieldValues.remove(ALIGNED_WEEK_OF_MONTH), ALIGNED_WEEK_OF_MONTH); + int ad = range(ALIGNED_DAY_OF_WEEK_IN_MONTH).checkValidIntValue(fieldValues.remove(ALIGNED_DAY_OF_WEEK_IN_MONTH), ALIGNED_DAY_OF_WEEK_IN_MONTH); + ChronoLocalDate date = date(y, moy, 1).plus((aw - 1) * 7 + (ad - 1), DAYS); + if (resolverStyle == ResolverStyle.STRICT && date.get(MONTH_OF_YEAR) != moy) { + throw new DateTimeException("Strict mode rejected resolved date as it is in a different month"); + } + return date; + } + + ChronoLocalDate resolveYMAD(Map fieldValues, ResolverStyle resolverStyle) { + int y = range(YEAR).checkValidIntValue(fieldValues.remove(YEAR), YEAR); + if (resolverStyle == ResolverStyle.LENIENT) { + long months = Math.subtractExact(fieldValues.remove(MONTH_OF_YEAR), 1); + long weeks = Math.subtractExact(fieldValues.remove(ALIGNED_WEEK_OF_MONTH), 1); + long dow = Math.subtractExact(fieldValues.remove(DAY_OF_WEEK), 1); + return resolveAligned(date(y, 1, 1), months, weeks, dow); + } + int moy = range(MONTH_OF_YEAR).checkValidIntValue(fieldValues.remove(MONTH_OF_YEAR), MONTH_OF_YEAR); + int aw = range(ALIGNED_WEEK_OF_MONTH).checkValidIntValue(fieldValues.remove(ALIGNED_WEEK_OF_MONTH), ALIGNED_WEEK_OF_MONTH); + int dow = range(DAY_OF_WEEK).checkValidIntValue(fieldValues.remove(DAY_OF_WEEK), DAY_OF_WEEK); + ChronoLocalDate date = date(y, moy, 1).plus((aw - 1) * 7, DAYS).with(nextOrSame(DayOfWeek.of(dow))); + if (resolverStyle == ResolverStyle.STRICT && date.get(MONTH_OF_YEAR) != moy) { + throw new DateTimeException("Strict mode rejected resolved date as it is in a different month"); + } + return date; + } + + ChronoLocalDate resolveYAA(Map fieldValues, ResolverStyle resolverStyle) { + int y = range(YEAR).checkValidIntValue(fieldValues.remove(YEAR), YEAR); + if (resolverStyle == ResolverStyle.LENIENT) { + long weeks = Math.subtractExact(fieldValues.remove(ALIGNED_WEEK_OF_YEAR), 1); + long days = Math.subtractExact(fieldValues.remove(ALIGNED_DAY_OF_WEEK_IN_YEAR), 1); + return dateYearDay(y, 1).plus(weeks, WEEKS).plus(days, DAYS); + } + int aw = range(ALIGNED_WEEK_OF_YEAR).checkValidIntValue(fieldValues.remove(ALIGNED_WEEK_OF_YEAR), ALIGNED_WEEK_OF_YEAR); + int ad = range(ALIGNED_DAY_OF_WEEK_IN_YEAR).checkValidIntValue(fieldValues.remove(ALIGNED_DAY_OF_WEEK_IN_YEAR), ALIGNED_DAY_OF_WEEK_IN_YEAR); + ChronoLocalDate date = dateYearDay(y, 1).plus((aw - 1) * 7 + (ad - 1), DAYS); + if (resolverStyle == ResolverStyle.STRICT && date.get(YEAR) != y) { + throw new DateTimeException("Strict mode rejected resolved date as it is in a different year"); + } + return date; + } + + ChronoLocalDate resolveYAD(Map fieldValues, ResolverStyle resolverStyle) { + int y = range(YEAR).checkValidIntValue(fieldValues.remove(YEAR), YEAR); + if (resolverStyle == ResolverStyle.LENIENT) { + long weeks = Math.subtractExact(fieldValues.remove(ALIGNED_WEEK_OF_YEAR), 1); + long dow = Math.subtractExact(fieldValues.remove(DAY_OF_WEEK), 1); + return resolveAligned(dateYearDay(y, 1), 0, weeks, dow); + } + int aw = range(ALIGNED_WEEK_OF_YEAR).checkValidIntValue(fieldValues.remove(ALIGNED_WEEK_OF_YEAR), ALIGNED_WEEK_OF_YEAR); + int dow = range(DAY_OF_WEEK).checkValidIntValue(fieldValues.remove(DAY_OF_WEEK), DAY_OF_WEEK); + ChronoLocalDate date = dateYearDay(y, 1).plus((aw - 1) * 7, DAYS).with(nextOrSame(DayOfWeek.of(dow))); + if (resolverStyle == ResolverStyle.STRICT && date.get(YEAR) != y) { + throw new DateTimeException("Strict mode rejected resolved date as it is in a different year"); + } + return date; + } + + ChronoLocalDate resolveAligned(ChronoLocalDate base, long months, long weeks, long dow) { + ChronoLocalDate date = base.plus(months, MONTHS).plus(weeks, WEEKS); + if (dow > 7) { + date = date.plus((dow - 1) / 7, WEEKS); + dow = ((dow - 1) % 7) + 1; + } else if (dow < 1) { + date = date.plus(Math.subtractExact(dow, 7) / 7, WEEKS); + dow = ((dow + 6) % 7) + 1; + } + return date.with(nextOrSame(DayOfWeek.of((int) dow))); + } + /** * Adds a field-value pair to the map, checking for conflicts. *

                            diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/chrono/Era.java --- a/jdk/src/share/classes/java/time/chrono/Era.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/chrono/Era.java Fri Aug 02 09:38:09 2013 +0100 @@ -238,7 +238,7 @@ if (field == ERA) { return getValue(); } else if (field instanceof ChronoField) { - throw new UnsupportedTemporalTypeException("Unsupported field: " + field.getName()); + throw new UnsupportedTemporalTypeException("Unsupported field: " + field); } return field.getFrom(this); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/chrono/HijrahChronology.java --- a/jdk/src/share/classes/java/time/chrono/HijrahChronology.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/chrono/HijrahChronology.java Fri Aug 02 09:38:09 2013 +0100 @@ -71,8 +71,10 @@ import java.time.Instant; import java.time.LocalDate; import java.time.ZoneId; +import java.time.format.ResolverStyle; import java.time.temporal.ChronoField; import java.time.temporal.TemporalAccessor; +import java.time.temporal.TemporalField; import java.time.temporal.ValueRange; import java.util.Arrays; import java.util.HashMap; @@ -115,7 +117,7 @@ *

                            * * - * + * * * * @@ -126,10 +128,10 @@ *

                            * Selecting the chronology from the locale uses {@link Chronology#ofLocale} * to find the Chronology based on Locale supported BCP 47 extension mechanism - * to request a specific calendar ("ca") and variant ("cv"). For example, + * to request a specific calendar ("ca"). For example, *

                            *
                            - *      Locale locale = Locale.forLanguageTag("en-US-u-ca-islamic-cv-umalqura");
                            + *      Locale locale = Locale.forLanguageTag("en-US-u-ca-islamic-umalqura");
                              *      Chronology chrono = Chronology.ofLocale(locale);
                              * 
                            * @@ -472,11 +474,16 @@ * @param prolepticYear the proleptic-year * @param dayOfYear the day-of-year * @return the Hijrah local date, not null - * @throws DateTimeException if unable to create the date + * @throws DateTimeException if the value of the year is out of range, + * or if the day-of-year is invalid for the year */ @Override public HijrahDate dateYearDay(int prolepticYear, int dayOfYear) { - return HijrahDate.of(this, prolepticYear, 1, 1).plusDays(dayOfYear - 1); // TODO better + HijrahDate date = HijrahDate.of(this, prolepticYear, 1, 1); + if (dayOfYear > date.lengthOfYear()) { + throw new DateTimeException("Invalid dayOfYear: " + dayOfYear); + } + return date.plusDays(dayOfYear - 1); } /** @@ -515,16 +522,19 @@ } @Override + @SuppressWarnings("unchecked") public ChronoLocalDateTime localDateTime(TemporalAccessor temporal) { return (ChronoLocalDateTime) super.localDateTime(temporal); } @Override + @SuppressWarnings("unchecked") public ChronoZonedDateTime zonedDateTime(TemporalAccessor temporal) { return (ChronoZonedDateTime) super.zonedDateTime(temporal); } @Override + @SuppressWarnings("unchecked") public ChronoZonedDateTime zonedDateTime(Instant instant, ZoneId zone) { return (ChronoZonedDateTime) super.zonedDateTime(instant, zone); } @@ -550,7 +560,7 @@ } @Override - public Era eraOf(int eraValue) { + public HijrahEra eraOf(int eraValue) { switch (eraValue) { case 1: return HijrahEra.AH; @@ -580,6 +590,8 @@ case YEAR: case YEAR_OF_ERA: return ValueRange.of(getMinimumYear(), getMaximumYear()); + case ERA: + return ValueRange.of(1, 1); default: return field.range(); } @@ -587,6 +599,13 @@ return field.range(); } + //----------------------------------------------------------------------- + @Override // override for return type + public HijrahDate resolveDate(Map fieldValues, ResolverStyle resolverStyle) { + return (HijrahDate) super.resolveDate(fieldValues, resolverStyle); + } + + //----------------------------------------------------------------------- /** * Check the validity of a year. * diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/chrono/HijrahDate.java --- a/jdk/src/share/classes/java/time/chrono/HijrahDate.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/chrono/HijrahDate.java Fri Aug 02 09:38:09 2013 +0100 @@ -109,7 +109,7 @@ */ public final class HijrahDate extends ChronoDateImpl - implements ChronoLocalDate, Serializable { + implements ChronoLocalDate, Serializable { /** * Serialization version. @@ -204,7 +204,7 @@ * @throws DateTimeException if the current date cannot be obtained */ public static HijrahDate now(Clock clock) { - return HijrahChronology.INSTANCE.date(LocalDate.now(clock)); + return HijrahDate.ofEpochDay(HijrahChronology.INSTANCE, LocalDate.now(clock).toEpochDay()); } /** @@ -349,7 +349,7 @@ } return getChronology().range(f); } - throw new UnsupportedTemporalTypeException("Unsupported field: " + field.getName()); + throw new UnsupportedTemporalTypeException("Unsupported field: " + field); } return field.rangeRefinedBy(this); } @@ -372,7 +372,7 @@ case YEAR: return prolepticYear; case ERA: return getEraValue(); } - throw new UnsupportedTemporalTypeException("Unsupported field: " + field.getName()); + throw new UnsupportedTemporalTypeException("Unsupported field: " + field); } return field.getFrom(this); } @@ -393,7 +393,7 @@ case ALIGNED_DAY_OF_WEEK_IN_MONTH: return plusDays(newValue - getLong(ALIGNED_DAY_OF_WEEK_IN_MONTH)); case ALIGNED_DAY_OF_WEEK_IN_YEAR: return plusDays(newValue - getLong(ALIGNED_DAY_OF_WEEK_IN_YEAR)); case DAY_OF_MONTH: return resolvePreviousValid(prolepticYear, monthOfYear, nvalue); - case DAY_OF_YEAR: return resolvePreviousValid(prolepticYear, ((nvalue - 1) / 30) + 1, ((nvalue - 1) % 30) + 1); + case DAY_OF_YEAR: return plusDays(Math.min(nvalue, lengthOfYear()) - getDayOfYear()); case EPOCH_DAY: return new HijrahDate(chrono, newValue); case ALIGNED_WEEK_OF_MONTH: return plusDays((newValue - getLong(ALIGNED_WEEK_OF_MONTH)) * 7); case ALIGNED_WEEK_OF_YEAR: return plusDays((newValue - getLong(ALIGNED_WEEK_OF_YEAR)) * 7); @@ -403,9 +403,9 @@ case YEAR: return resolvePreviousValid(nvalue, monthOfYear, dayOfMonth); case ERA: return resolvePreviousValid(1 - prolepticYear, monthOfYear, dayOfMonth); } - throw new UnsupportedTemporalTypeException("Unsupported field: " + field.getName()); + throw new UnsupportedTemporalTypeException("Unsupported field: " + field); } - return ChronoLocalDate.super.with(field, newValue); + return super.with(field, newValue); } private HijrahDate resolvePreviousValid(int prolepticYear, int month, int day) { @@ -479,7 +479,7 @@ * @return the day-of-year */ private int getDayOfYear() { - return chrono.getDayOfYear(prolepticYear, monthOfYear); + return chrono.getDayOfYear(prolepticYear, monthOfYear) + dayOfMonth; } /** @@ -575,12 +575,13 @@ } @Override // for javadoc and covariant return type + @SuppressWarnings("unchecked") public final ChronoLocalDateTime atTime(LocalTime localTime) { - return super.atTime(localTime); + return (ChronoLocalDateTime)super.atTime(localTime); } @Override - public Period periodUntil(ChronoLocalDate endDate) { + public Period until(ChronoLocalDate endDate) { // TODO: untested HijrahDate end = getChronology().date(endDate); long totalMonths = (end.prolepticYear - this.prolepticYear) * 12 + (end.monthOfYear - this.monthOfYear); // safe @@ -622,7 +623,7 @@ return this; } - static ChronoLocalDate readExternal(ObjectInput in) throws IOException, ClassNotFoundException { + static HijrahDate readExternal(ObjectInput in) throws IOException, ClassNotFoundException { HijrahChronology chrono = (HijrahChronology) in.readObject(); int year = in.readInt(); int month = in.readByte(); diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/chrono/IsoChronology.java --- a/jdk/src/share/classes/java/time/chrono/IsoChronology.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/chrono/IsoChronology.java Fri Aug 02 09:38:09 2013 +0100 @@ -61,25 +61,16 @@ */ package java.time.chrono; -import static java.time.temporal.ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH; -import static java.time.temporal.ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR; -import static java.time.temporal.ChronoField.ALIGNED_WEEK_OF_MONTH; -import static java.time.temporal.ChronoField.ALIGNED_WEEK_OF_YEAR; import static java.time.temporal.ChronoField.DAY_OF_MONTH; -import static java.time.temporal.ChronoField.DAY_OF_WEEK; -import static java.time.temporal.ChronoField.DAY_OF_YEAR; -import static java.time.temporal.ChronoField.EPOCH_DAY; import static java.time.temporal.ChronoField.ERA; import static java.time.temporal.ChronoField.MONTH_OF_YEAR; import static java.time.temporal.ChronoField.PROLEPTIC_MONTH; import static java.time.temporal.ChronoField.YEAR; import static java.time.temporal.ChronoField.YEAR_OF_ERA; -import static java.time.temporal.TemporalAdjuster.nextOrSame; import java.io.Serializable; import java.time.Clock; import java.time.DateTimeException; -import java.time.DayOfWeek; import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; @@ -398,7 +389,7 @@ } @Override - public Era eraOf(int eraValue) { + public IsoEra eraOf(int eraValue) { return IsoEra.of(eraValue); } @@ -421,7 +412,7 @@ * as follows. *
                              *
                            • {@code EPOCH_DAY} - If present, this is converted to a {@code LocalDate} - * all other date fields are then cross-checked against the date + * and all other date fields are then cross-checked against the date. *
                            • {@code PROLEPTIC_MONTH} - If present, then it is split into the * {@code YEAR} and {@code MONTH_OF_YEAR}. If the mode is strict or smart * then the field is validated. @@ -430,7 +421,7 @@ * range is not validated, in smart and strict mode it is. The {@code ERA} is * validated for range in all three modes. If only the {@code YEAR_OF_ERA} is * present, and the mode is smart or lenient, then the current era (CE/AD) - * is assumed. In strict mode, no ers is assumed and the {@code YEAR_OF_ERA} is + * is assumed. In strict mode, no era is assumed and the {@code YEAR_OF_ERA} is * left untouched. If only the {@code ERA} is present, then it is left untouched. *
                            • {@code YEAR}, {@code MONTH_OF_YEAR} and {@code DAY_OF_MONTH} - * If all three are present, then they are combined to form a {@code LocalDate}. @@ -495,48 +486,11 @@ */ @Override // override for performance public LocalDate resolveDate(Map fieldValues, ResolverStyle resolverStyle) { - // check epoch-day before inventing era - if (fieldValues.containsKey(EPOCH_DAY)) { - return LocalDate.ofEpochDay(fieldValues.remove(EPOCH_DAY)); - } - - // fix proleptic month before inventing era - resolveProlepticMonth(fieldValues, resolverStyle); - - // invent era if necessary to resolve year-of-era - resolveYearOfEra(fieldValues, resolverStyle); - - // build date - if (fieldValues.containsKey(YEAR)) { - if (fieldValues.containsKey(MONTH_OF_YEAR)) { - if (fieldValues.containsKey(DAY_OF_MONTH)) { - return resolveYMD(fieldValues, resolverStyle); - } - if (fieldValues.containsKey(ALIGNED_WEEK_OF_MONTH)) { - if (fieldValues.containsKey(ALIGNED_DAY_OF_WEEK_IN_MONTH)) { - return resolveYMAA(fieldValues, resolverStyle); - } - if (fieldValues.containsKey(DAY_OF_WEEK)) { - return resolveYMAD(fieldValues, resolverStyle); - } - } - } - if (fieldValues.containsKey(DAY_OF_YEAR)) { - return resolveYD(fieldValues, resolverStyle); - } - if (fieldValues.containsKey(ALIGNED_WEEK_OF_YEAR)) { - if (fieldValues.containsKey(ALIGNED_DAY_OF_WEEK_IN_YEAR)) { - return resolveYAA(fieldValues, resolverStyle); - } - if (fieldValues.containsKey(DAY_OF_WEEK)) { - return resolveYAD(fieldValues, resolverStyle); - } - } - } - return null; + return (LocalDate) super.resolveDate(fieldValues, resolverStyle); } - private void resolveProlepticMonth(Map fieldValues, ResolverStyle resolverStyle) { + @Override // override for better proleptic algorithm + void resolveProlepticMonth(Map fieldValues, ResolverStyle resolverStyle) { Long pMonth = fieldValues.remove(PROLEPTIC_MONTH); if (pMonth != null) { if (resolverStyle != ResolverStyle.LENIENT) { @@ -547,7 +501,8 @@ } } - private void resolveYearOfEra(Map fieldValues, ResolverStyle resolverStyle) { + @Override // override for enhanced behaviour + LocalDate resolveYearOfEra(Map fieldValues, ResolverStyle resolverStyle) { Long yoeLong = fieldValues.remove(YEAR_OF_ERA); if (yoeLong != null) { if (resolverStyle != ResolverStyle.LENIENT) { @@ -575,10 +530,14 @@ } else { throw new DateTimeException("Invalid value for era: " + era); } + } else if (fieldValues.containsKey(ERA)) { + ERA.checkValidValue(fieldValues.get(ERA)); // always validated } + return null; } - private LocalDate resolveYMD(Map fieldValues, ResolverStyle resolverStyle) { + @Override // override for performance + LocalDate resolveYMD(Map fieldValues, ResolverStyle resolverStyle) { int y = YEAR.checkValidIntValue(fieldValues.remove(YEAR)); if (resolverStyle == ResolverStyle.LENIENT) { long months = Math.subtractExact(fieldValues.remove(MONTH_OF_YEAR), 1); @@ -598,96 +557,6 @@ return LocalDate.of(y, moy, dom); } - private LocalDate resolveYD(Map fieldValues, ResolverStyle resolverStyle) { - int y = YEAR.checkValidIntValue(fieldValues.remove(YEAR)); - if (resolverStyle == ResolverStyle.LENIENT) { - long days = Math.subtractExact(fieldValues.remove(DAY_OF_YEAR), 1); - return LocalDate.of(y, 1, 1).plusDays(days); - } - int doy = DAY_OF_YEAR.checkValidIntValue(fieldValues.remove(DAY_OF_YEAR)); - return LocalDate.ofYearDay(y, doy); // smart is same as strict - } - - private LocalDate resolveYMAA(Map fieldValues, ResolverStyle resolverStyle) { - int y = YEAR.checkValidIntValue(fieldValues.remove(YEAR)); - if (resolverStyle == ResolverStyle.LENIENT) { - long months = Math.subtractExact(fieldValues.remove(MONTH_OF_YEAR), 1); - long weeks = Math.subtractExact(fieldValues.remove(ALIGNED_WEEK_OF_MONTH), 1); - long days = Math.subtractExact(fieldValues.remove(ALIGNED_DAY_OF_WEEK_IN_MONTH), 1); - return LocalDate.of(y, 1, 1).plusMonths(months).plusWeeks(weeks).plusDays(days); - } - int moy = MONTH_OF_YEAR.checkValidIntValue(fieldValues.remove(MONTH_OF_YEAR)); - int aw = ALIGNED_WEEK_OF_MONTH.checkValidIntValue(fieldValues.remove(ALIGNED_WEEK_OF_MONTH)); - int ad = ALIGNED_DAY_OF_WEEK_IN_MONTH.checkValidIntValue(fieldValues.remove(ALIGNED_DAY_OF_WEEK_IN_MONTH)); - LocalDate date = LocalDate.of(y, moy, 1).plusDays((aw - 1) * 7 + (ad - 1)); - if (resolverStyle == ResolverStyle.STRICT && date.getMonthValue() != moy) { - throw new DateTimeException("Strict mode rejected resolved date as it is in a different month"); - } - return date; - } - - private LocalDate resolveYMAD(Map fieldValues, ResolverStyle resolverStyle) { - int y = YEAR.checkValidIntValue(fieldValues.remove(YEAR)); - if (resolverStyle == ResolverStyle.LENIENT) { - long months = Math.subtractExact(fieldValues.remove(MONTH_OF_YEAR), 1); - long weeks = Math.subtractExact(fieldValues.remove(ALIGNED_WEEK_OF_MONTH), 1); - long dow = Math.subtractExact(fieldValues.remove(DAY_OF_WEEK), 1); - return resolveAligned(y, months, weeks, dow); - } - int moy = MONTH_OF_YEAR.checkValidIntValue(fieldValues.remove(MONTH_OF_YEAR)); - int aw = ALIGNED_WEEK_OF_MONTH.checkValidIntValue(fieldValues.remove(ALIGNED_WEEK_OF_MONTH)); - int dow = DAY_OF_WEEK.checkValidIntValue(fieldValues.remove(DAY_OF_WEEK)); - LocalDate date = LocalDate.of(y, moy, 1).plusDays((aw - 1) * 7).with(nextOrSame(DayOfWeek.of(dow))); - if (resolverStyle == ResolverStyle.STRICT && date.getMonthValue() != moy) { - throw new DateTimeException("Strict mode rejected resolved date as it is in a different month"); - } - return date; - } - - private LocalDate resolveYAA(Map fieldValues, ResolverStyle resolverStyle) { - int y = YEAR.checkValidIntValue(fieldValues.remove(YEAR)); - if (resolverStyle == ResolverStyle.LENIENT) { - long weeks = Math.subtractExact(fieldValues.remove(ALIGNED_WEEK_OF_YEAR), 1); - long days = Math.subtractExact(fieldValues.remove(ALIGNED_DAY_OF_WEEK_IN_YEAR), 1); - return LocalDate.of(y, 1, 1).plusWeeks(weeks).plusDays(days); - } - int aw = ALIGNED_WEEK_OF_YEAR.checkValidIntValue(fieldValues.remove(ALIGNED_WEEK_OF_YEAR)); - int ad = ALIGNED_DAY_OF_WEEK_IN_YEAR.checkValidIntValue(fieldValues.remove(ALIGNED_DAY_OF_WEEK_IN_YEAR)); - LocalDate date = LocalDate.of(y, 1, 1).plusDays((aw - 1) * 7 + (ad - 1)); - if (resolverStyle == ResolverStyle.STRICT && date.getYear() != y) { - throw new DateTimeException("Strict mode rejected resolved date as it is in a different year"); - } - return date; - } - - private LocalDate resolveYAD(Map fieldValues, ResolverStyle resolverStyle) { - int y = YEAR.checkValidIntValue(fieldValues.remove(YEAR)); - if (resolverStyle == ResolverStyle.LENIENT) { - long weeks = Math.subtractExact(fieldValues.remove(ALIGNED_WEEK_OF_YEAR), 1); - long dow = Math.subtractExact(fieldValues.remove(DAY_OF_WEEK), 1); - return resolveAligned(y, 0, weeks, dow); - } - int aw = ALIGNED_WEEK_OF_YEAR.checkValidIntValue(fieldValues.remove(ALIGNED_WEEK_OF_YEAR)); - int dow = DAY_OF_WEEK.checkValidIntValue(fieldValues.remove(DAY_OF_WEEK)); - LocalDate date = LocalDate.of(y, 1, 1).plusDays((aw - 1) * 7).with(nextOrSame(DayOfWeek.of(dow))); - if (resolverStyle == ResolverStyle.STRICT && date.getYear() != y) { - throw new DateTimeException("Strict mode rejected resolved date as it is in a different year"); - } - return date; - } - - private LocalDate resolveAligned(int y, long months, long weeks, long dow) { - LocalDate date = LocalDate.of(y, 1, 1).plusMonths(months).plusWeeks(weeks); - if (dow > 7) { - date = date.plusWeeks((dow - 1) / 7); - dow = ((dow - 1) % 7) + 1; - } else if (dow < 1) { - date = date.plusWeeks(Math.subtractExact(dow, 7) / 7); - dow = ((dow + 6) % 7) + 1; - } - return date.with(nextOrSame(DayOfWeek.of((int) dow))); - } - //----------------------------------------------------------------------- @Override public ValueRange range(ChronoField field) { diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/chrono/JapaneseChronology.java --- a/jdk/src/share/classes/java/time/chrono/JapaneseChronology.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/chrono/JapaneseChronology.java Fri Aug 02 09:38:09 2013 +0100 @@ -56,6 +56,15 @@ */ package java.time.chrono; +import static java.time.temporal.ChronoField.DAY_OF_MONTH; +import static java.time.temporal.ChronoField.DAY_OF_YEAR; +import static java.time.temporal.ChronoField.ERA; +import static java.time.temporal.ChronoField.MONTH_OF_YEAR; +import static java.time.temporal.ChronoField.YEAR; +import static java.time.temporal.ChronoField.YEAR_OF_ERA; +import static java.time.temporal.ChronoUnit.DAYS; +import static java.time.temporal.ChronoUnit.MONTHS; + import java.io.Serializable; import java.time.Clock; import java.time.DateTimeException; @@ -63,13 +72,18 @@ import java.time.LocalDate; import java.time.Year; import java.time.ZoneId; +import java.time.format.ResolverStyle; import java.time.temporal.ChronoField; import java.time.temporal.TemporalAccessor; +import java.time.temporal.TemporalAdjuster; +import java.time.temporal.TemporalField; +import java.time.temporal.UnsupportedTemporalTypeException; import java.time.temporal.ValueRange; import java.util.Arrays; import java.util.Calendar; import java.util.List; import java.util.Locale; +import java.util.Map; import sun.util.calendar.CalendarSystem; import sun.util.calendar.LocalGregorianCalendar; @@ -82,8 +96,22 @@ * The Japanese Imperial calendar system is the same as the ISO calendar system * apart from the era-based year numbering. *

                              - * Only Meiji (1865-04-07 - 1868-09-07) and later eras are supported. - * Older eras are handled as an unknown era where the year-of-era is the ISO year. + * Japan introduced the Gregorian calendar starting with Meiji 6. + * Only Meiji and later eras are supported; + * dates before Meiji 6, January 1 are not supported. + *

                              + * The supported {@code ChronoField} instances are: + *

                                + *
                              • {@code DAY_OF_WEEK} + *
                              • {@code DAY_OF_MONTH} + *
                              • {@code DAY_OF_YEAR} + *
                              • {@code EPOCH_DAY} + *
                              • {@code MONTH_OF_YEAR} + *
                              • {@code PROLEPTIC_MONTH} + *
                              • {@code YEAR_OF_ERA} + *
                              • {@code YEAR} + *
                              • {@code ERA} + *
                              * * @implSpec * This class is immutable and thread-safe. @@ -91,7 +119,6 @@ * @since 1.8 */ public final class JapaneseChronology extends Chronology implements Serializable { - // TODO: definition for unknown era may break requirement that year-of-era >= 1 static final LocalGregorianCalendar JCAL = (LocalGregorianCalendar) CalendarSystem.forName("japanese"); @@ -152,6 +179,16 @@ /** * Obtains a local date in Japanese calendar system from the * era, year-of-era, month-of-year and day-of-month fields. + *

                              + * The Japanese month and day-of-month are the same as those in the + * ISO calendar system. They are not reset when the era changes. + * For example: + *

                              +     *  6th Jan Showa 64 = ISO 1989-01-06
                              +     *  7th Jan Showa 64 = ISO 1989-01-07
                              +     *  8th Jan Heisei 1 = ISO 1989-01-08
                              +     *  9th Jan Heisei 1 = ISO 1989-01-09
                              +     * 
                              * * @param era the Japanese era, not null * @param yearOfEra the year-of-era @@ -172,6 +209,9 @@ /** * Obtains a local date in Japanese calendar system from the * proleptic-year, month-of-year and day-of-month fields. + *

                              + * The Japanese proleptic year, month and day-of-month are the same as those + * in the ISO calendar system. They are not reset when the era changes. * * @param prolepticYear the proleptic-year * @param month the month-of-year @@ -187,6 +227,17 @@ /** * Obtains a local date in Japanese calendar system from the * era, year-of-era and day-of-year fields. + *

                              + * The day-of-year in this factory is expressed relative to the start of the year-of-era. + * This definition changes the normal meaning of day-of-year only in those years + * where the year-of-era is reset to one due to a change in the era. + * For example: + *

                              +     *  6th Jan Showa 64 = day-of-year 6
                              +     *  7th Jan Showa 64 = day-of-year 7
                              +     *  8th Jan Heisei 1 = day-of-year 1
                              +     *  9th Jan Heisei 1 = day-of-year 2
                              +     * 
                              * * @param era the Japanese era, not null * @param yearOfEra the year-of-era @@ -203,6 +254,10 @@ /** * Obtains a local date in Japanese calendar system from the * proleptic-year and day-of-year fields. + *

                              + * The day-of-year in this factory is expressed relative to the start of the proleptic year. + * The Japanese proleptic year and day-of-year are the same as those in the ISO calendar system. + * They are not reset when the era changes. * * @param prolepticYear the proleptic-year * @param dayOfYear the day-of-year @@ -211,8 +266,7 @@ */ @Override public JapaneseDate dateYearDay(int prolepticYear, int dayOfYear) { - LocalDate date = LocalDate.ofYearDay(prolepticYear, dayOfYear); - return date(prolepticYear, date.getMonthValue(), date.getDayOfMonth()); + return new JapaneseDate(LocalDate.ofYearDay(prolepticYear, dayOfYear)); } /** @@ -290,15 +344,6 @@ throw new ClassCastException("Era must be JapaneseEra"); } - if (era == JapaneseEra.SEIREKI) { - JapaneseEra nextEra = JapaneseEra.values()[1]; - int nextEraYear = nextEra.getPrivateEra().getSinceDate().getYear(); - if (yearOfEra >= nextEraYear || yearOfEra < Year.MIN_VALUE) { - throw new DateTimeException("Invalid yearOfEra value"); - } - return yearOfEra; - } - JapaneseEra jera = (JapaneseEra) era; int gregorianYear = jera.getPrivateEra().getSinceDate().getYear() + yearOfEra - 1; if (yearOfEra == 1) { @@ -320,14 +365,13 @@ * See the description of each Era for the numeric values of: * {@link JapaneseEra#HEISEI}, {@link JapaneseEra#SHOWA},{@link JapaneseEra#TAISHO}, * {@link JapaneseEra#MEIJI}), only Meiji and later eras are supported. - * Prior to Meiji {@link JapaneseEra#SEIREKI} is used. * * @param eraValue the era value * @return the Japanese {@code Era} for the given numeric era value * @throws DateTimeException if {@code eraValue} is invalid */ @Override - public Era eraOf(int eraValue) { + public JapaneseEra eraOf(int eraValue) { return JapaneseEra.of(eraValue); } @@ -346,49 +390,117 @@ @Override public ValueRange range(ChronoField field) { switch (field) { - case YEAR: - case DAY_OF_MONTH: - case DAY_OF_WEEK: - case MICRO_OF_DAY: - case MICRO_OF_SECOND: - case HOUR_OF_DAY: - case HOUR_OF_AMPM: - case MINUTE_OF_DAY: - case MINUTE_OF_HOUR: - case SECOND_OF_DAY: - case SECOND_OF_MINUTE: - case MILLI_OF_DAY: - case MILLI_OF_SECOND: - case NANO_OF_DAY: - case NANO_OF_SECOND: - case CLOCK_HOUR_OF_DAY: - case CLOCK_HOUR_OF_AMPM: - case EPOCH_DAY: - case PROLEPTIC_MONTH: - case MONTH_OF_YEAR: - return field.range(); - case ERA: - return ValueRange.of(JapaneseEra.SEIREKI.getValue(), - getCurrentEra().getValue()); - } - Calendar jcal = Calendar.getInstance(LOCALE); - int fieldIndex; - switch (field) { + case ALIGNED_DAY_OF_WEEK_IN_MONTH: + case ALIGNED_DAY_OF_WEEK_IN_YEAR: + case ALIGNED_WEEK_OF_MONTH: + case ALIGNED_WEEK_OF_YEAR: + throw new UnsupportedTemporalTypeException("Unsupported field: " + field); case YEAR_OF_ERA: { + Calendar jcal = Calendar.getInstance(LOCALE); int startYear = getCurrentEra().getPrivateEra().getSinceDate().getYear(); - return ValueRange.of(Year.MIN_VALUE, jcal.getGreatestMinimum(Calendar.YEAR), + return ValueRange.of(1, jcal.getGreatestMinimum(Calendar.YEAR), jcal.getLeastMaximum(Calendar.YEAR) + 1, // +1 due to the different definitions Year.MAX_VALUE - startYear); } - case DAY_OF_YEAR: - fieldIndex = Calendar.DAY_OF_YEAR; - break; + case DAY_OF_YEAR: { + Calendar jcal = Calendar.getInstance(LOCALE); + int fieldIndex = Calendar.DAY_OF_YEAR; + return ValueRange.of(jcal.getMinimum(fieldIndex), jcal.getGreatestMinimum(fieldIndex), + jcal.getLeastMaximum(fieldIndex), jcal.getMaximum(fieldIndex)); + } + case YEAR: + return ValueRange.of(JapaneseDate.MEIJI_6_ISODATE.getYear(), Year.MAX_VALUE); + case ERA: + return ValueRange.of(JapaneseEra.MEIJI.getValue(), getCurrentEra().getValue()); default: - // TODO: review the remaining fields - throw new UnsupportedOperationException("Unimplementable field: " + field); + return field.range(); + } + } + + //----------------------------------------------------------------------- + @Override // override for return type + public JapaneseDate resolveDate(Map fieldValues, ResolverStyle resolverStyle) { + return (JapaneseDate) super.resolveDate(fieldValues, resolverStyle); + } + + @Override // override for special Japanese behavior + ChronoLocalDate resolveYearOfEra(Map fieldValues, ResolverStyle resolverStyle) { + // validate era and year-of-era + Long eraLong = fieldValues.get(ERA); + JapaneseEra era = null; + if (eraLong != null) { + era = eraOf(range(ERA).checkValidIntValue(eraLong, ERA)); // always validated + } + Long yoeLong = fieldValues.get(YEAR_OF_ERA); + int yoe = 0; + if (yoeLong != null) { + yoe = range(YEAR_OF_ERA).checkValidIntValue(yoeLong, YEAR_OF_ERA); // always validated + } + // if only year-of-era and no year then invent era unless strict + if (era == null && yoeLong != null && fieldValues.containsKey(YEAR) == false && resolverStyle != ResolverStyle.STRICT) { + era = JapaneseEra.values()[JapaneseEra.values().length - 1]; + } + // if both present, then try to create date + if (yoeLong != null && era != null) { + if (fieldValues.containsKey(MONTH_OF_YEAR)) { + if (fieldValues.containsKey(DAY_OF_MONTH)) { + return resolveYMD(era, yoe, fieldValues, resolverStyle); + } + } + if (fieldValues.containsKey(DAY_OF_YEAR)) { + return resolveYD(era, yoe, fieldValues, resolverStyle); + } } - return ValueRange.of(jcal.getMinimum(fieldIndex), jcal.getGreatestMinimum(fieldIndex), - jcal.getLeastMaximum(fieldIndex), jcal.getMaximum(fieldIndex)); + return null; + } + + private int prolepticYearLenient(JapaneseEra era, int yearOfEra) { + return era.getPrivateEra().getSinceDate().getYear() + yearOfEra - 1; + } + + private ChronoLocalDate resolveYMD(JapaneseEra era, int yoe, Map fieldValues, ResolverStyle resolverStyle) { + fieldValues.remove(ERA); + fieldValues.remove(YEAR_OF_ERA); + if (resolverStyle == ResolverStyle.LENIENT) { + int y = prolepticYearLenient(era, yoe); + long months = Math.subtractExact(fieldValues.remove(MONTH_OF_YEAR), 1); + long days = Math.subtractExact(fieldValues.remove(DAY_OF_MONTH), 1); + return date(y, 1, 1).plus(months, MONTHS).plus(days, DAYS); + } + int moy = range(MONTH_OF_YEAR).checkValidIntValue(fieldValues.remove(MONTH_OF_YEAR), MONTH_OF_YEAR); + int dom = range(DAY_OF_MONTH).checkValidIntValue(fieldValues.remove(DAY_OF_MONTH), DAY_OF_MONTH); + if (resolverStyle == ResolverStyle.SMART) { // previous valid + if (yoe < 1) { + throw new DateTimeException("Invalid YearOfEra: " + yoe); + } + int y = prolepticYearLenient(era, yoe); + JapaneseDate result; + try { + result = date(y, moy, dom); + } catch (DateTimeException ex) { + result = date(y, moy, 1).with(TemporalAdjuster.lastDayOfMonth()); + } + // handle the era being changed + // only allow if the new date is in the same Jan-Dec as the era change + // determine by ensuring either original yoe or result yoe is 1 + if (result.getEra() != era && result.get(YEAR_OF_ERA) > 1 && yoe > 1) { + throw new DateTimeException("Invalid YearOfEra for Era: " + era + " " + yoe); + } + return result; + } + return date(era, yoe, moy, dom); + } + + private ChronoLocalDate resolveYD(JapaneseEra era, int yoe, Map fieldValues, ResolverStyle resolverStyle) { + fieldValues.remove(ERA); + fieldValues.remove(YEAR_OF_ERA); + if (resolverStyle == ResolverStyle.LENIENT) { + int y = prolepticYearLenient(era, yoe); + long days = Math.subtractExact(fieldValues.remove(DAY_OF_YEAR), 1); + return dateYearDay(y, 1).plus(days, DAYS); + } + int doy = range(DAY_OF_YEAR).checkValidIntValue(fieldValues.remove(DAY_OF_YEAR), DAY_OF_YEAR); + return dateYearDay(era, yoe, doy); // smart is same as strict } } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/chrono/JapaneseDate.java --- a/jdk/src/share/classes/java/time/chrono/JapaneseDate.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/chrono/JapaneseDate.java Fri Aug 02 09:38:09 2013 +0100 @@ -56,9 +56,15 @@ */ package java.time.chrono; +import static java.time.temporal.ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH; +import static java.time.temporal.ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR; +import static java.time.temporal.ChronoField.ALIGNED_WEEK_OF_MONTH; +import static java.time.temporal.ChronoField.ALIGNED_WEEK_OF_YEAR; import static java.time.temporal.ChronoField.DAY_OF_MONTH; +import static java.time.temporal.ChronoField.DAY_OF_YEAR; import static java.time.temporal.ChronoField.MONTH_OF_YEAR; import static java.time.temporal.ChronoField.YEAR; +import static java.time.temporal.ChronoField.YEAR_OF_ERA; import java.io.DataInput; import java.io.DataOutput; @@ -96,6 +102,10 @@ * apart from the era-based year numbering. The proleptic-year is defined to be * equal to the ISO proleptic-year. *

                              + * Japan introduced the Gregorian calendar starting with Meiji 6. + * Only Meiji and later eras are supported; + * dates before Meiji 6, January 1 are not supported. + *

                              * For example, the Japanese year "Heisei 24" corresponds to ISO year "2012".
                              * Calling {@code japaneseDate.get(YEAR_OF_ERA)} will return 24.
                              * Calling {@code japaneseDate.get(YEAR)} will return 2012.
                              @@ -109,7 +119,7 @@ */ public final class JapaneseDate extends ChronoDateImpl - implements ChronoLocalDate, Serializable { + implements ChronoLocalDate, Serializable { /** * Serialization version. @@ -129,6 +139,11 @@ */ private transient int yearOfEra; + /** + * The first day supported by the JapaneseChronology is Meiji 6, January 1st. + */ + final static LocalDate MEIJI_6_ISODATE = LocalDate.of(1873, 1, 1); + //----------------------------------------------------------------------- /** * Obtains the current {@code JapaneseDate} from the system clock in the default time-zone. @@ -173,7 +188,7 @@ * @throws DateTimeException if the current date cannot be obtained */ public static JapaneseDate now(Clock clock) { - return JapaneseChronology.INSTANCE.date(LocalDate.now(clock)); + return new JapaneseDate(LocalDate.now(clock)); } /** @@ -182,6 +197,16 @@ *

                              * This returns a {@code JapaneseDate} with the specified fields. * The day must be valid for the year and month, otherwise an exception will be thrown. + *

                              + * The Japanese month and day-of-month are the same as those in the + * ISO calendar system. They are not reset when the era changes. + * For example: + *

                              +     *  6th Jan Showa 64 = ISO 1989-01-06
                              +     *  7th Jan Showa 64 = ISO 1989-01-07
                              +     *  8th Jan Heisei 1 = ISO 1989-01-08
                              +     *  9th Jan Heisei 1 = ISO 1989-01-09
                              +     * 
                              * * @param era the Japanese era, not null * @param yearOfEra the Japanese year-of-era @@ -192,11 +217,15 @@ * or if the day-of-month is invalid for the month-year, * or if the date is not a Japanese era */ - public static JapaneseDate of(Era era, int yearOfEra, int month, int dayOfMonth) { - if (era instanceof JapaneseEra == false) { - throw new ClassCastException("Era must be JapaneseEra"); + public static JapaneseDate of(JapaneseEra era, int yearOfEra, int month, int dayOfMonth) { + Objects.requireNonNull(era, "era"); + LocalGregorianCalendar.Date jdate = JapaneseChronology.JCAL.newCalendarDate(null); + jdate.setEra(era.getPrivateEra()).setDate(yearOfEra, month, dayOfMonth); + if (!JapaneseChronology.JCAL.validate(jdate)) { + throw new DateTimeException("year, month, and day not valid for Era"); } - return JapaneseDate.of((JapaneseEra) era, yearOfEra, month, dayOfMonth); + LocalDate date = LocalDate.of(jdate.getNormalizedYear(), month, dayOfMonth); + return new JapaneseDate(era, yearOfEra, date); } /** @@ -205,6 +234,9 @@ *

                              * This returns a {@code JapaneseDate} with the specified fields. * The day must be valid for the year and month, otherwise an exception will be thrown. + *

                              + * The Japanese proleptic year, month and day-of-month are the same as those + * in the ISO calendar system. They are not reset when the era changes. * * @param prolepticYear the Japanese proleptic-year * @param month the Japanese month-of-year, from 1 to 12 @@ -219,23 +251,31 @@ /** * Obtains a {@code JapaneseDate} representing a date in the Japanese calendar - * system from the proleptic-year and day-of-year fields. + * system from the era, year-of-era and day-of-year fields. *

                              * This returns a {@code JapaneseDate} with the specified fields. * The day must be valid for the year, otherwise an exception will be thrown. + *

                              + * The day-of-year in this factory is expressed relative to the start of the year-of-era. + * This definition changes the normal meaning of day-of-year only in those years + * where the year-of-era is reset to one due to a change in the era. + * For example: + *

                              +     *  6th Jan Showa 64 = day-of-year 6
                              +     *  7th Jan Showa 64 = day-of-year 7
                              +     *  8th Jan Heisei 1 = day-of-year 1
                              +     *  9th Jan Heisei 1 = day-of-year 2
                              +     * 
                              * - * @param prolepticYear the chronology proleptic-year + * @param era the Japanese era, not null + * @param yearOfEra the Japanese year-of-era * @param dayOfYear the chronology day-of-year, from 1 to 366 * @return the date in Japanese calendar system, not null * @throws DateTimeException if the value of any field is out of range, * or if the day-of-year is invalid for the year */ - public static JapaneseDate ofYearDay(int prolepticYear, int dayOfYear) { - LocalDate date = LocalDate.ofYearDay(prolepticYear, dayOfYear); - return of(prolepticYear, date.getMonthValue(), date.getDayOfMonth()); - } - static JapaneseDate ofYearDay(JapaneseEra era, int yearOfEra, int dayOfYear) { + Objects.requireNonNull(era, "era"); CalendarDate firstDay = era.getPrivateEra().getSinceDate(); LocalGregorianCalendar.Date jdate = JapaneseChronology.JCAL.newCalendarDate(null); jdate.setEra(era.getPrivateEra()); @@ -254,32 +294,6 @@ } /** - * Obtains a {@code JapaneseDate} representing a date in the Japanese calendar - * system from the era, year-of-era, month-of-year and day-of-month fields. - *

                              - * This returns a {@code JapaneseDate} with the specified fields. - * The day must be valid for the year and month, otherwise an exception will be thrown. - * - * @param era the Japanese era, not null - * @param yearOfEra the Japanese year-of-era - * @param month the Japanese month-of-year, from 1 to 12 - * @param dayOfMonth the Japanese day-of-month, from 1 to 31 - * @return the date in Japanese calendar system, not null - * @throws DateTimeException if the value of any field is out of range, - * or if the day-of-month is invalid for the month-year - */ - static JapaneseDate of(JapaneseEra era, int yearOfEra, int month, int dayOfMonth) { - Objects.requireNonNull(era, "era"); - LocalGregorianCalendar.Date jdate = JapaneseChronology.JCAL.newCalendarDate(null); - jdate.setEra(era.getPrivateEra()).setDate(yearOfEra, month, dayOfMonth); - if (!JapaneseChronology.JCAL.validate(jdate)) { - throw new DateTimeException("year, month, and day not valid for Era"); - } - LocalDate date = LocalDate.of(jdate.getNormalizedYear(), month, dayOfMonth); - return new JapaneseDate(era, yearOfEra, date); - } - - /** * Obtains a {@code JapaneseDate} from a temporal object. *

                              * This obtains a date in the Japanese calendar system based on the specified temporal. @@ -307,6 +321,9 @@ * @param isoDate the standard local date, validated not null */ JapaneseDate(LocalDate isoDate) { + if (isoDate.isBefore(MEIJI_6_ISODATE)) { + throw new DateTimeException("JapaneseDate before Meiji 6 is not supported"); + } LocalGregorianCalendar.Date jdate = toPrivateJapaneseDate(isoDate); this.era = JapaneseEra.toJapaneseEra(jdate.getEra()); this.yearOfEra = jdate.getYear(); @@ -322,6 +339,9 @@ * @param isoDate the standard local date, validated not null */ JapaneseDate(JapaneseEra era, int year, LocalDate isoDate) { + if (isoDate.isBefore(MEIJI_6_ISODATE)) { + throw new DateTimeException("JapaneseDate before Meiji 6 is not supported"); + } this.era = era; this.yearOfEra = year; this.isoDate = isoDate; @@ -366,55 +386,99 @@ return isoDate.lengthOfMonth(); } + @Override + public int lengthOfYear() { + Calendar jcal = Calendar.getInstance(JapaneseChronology.LOCALE); + jcal.set(Calendar.ERA, era.getValue() + JapaneseEra.ERA_OFFSET); + jcal.set(yearOfEra, isoDate.getMonthValue() - 1, isoDate.getDayOfMonth()); + return jcal.getActualMaximum(Calendar.DAY_OF_YEAR); + } + //----------------------------------------------------------------------- + /** + * Checks if the specified field is supported. + *

                              + * This checks if this date can be queried for the specified field. + * If false, then calling the {@link #range(TemporalField) range} and + * {@link #get(TemporalField) get} methods will throw an exception. + *

                              + * If the field is a {@link ChronoField} then the query is implemented here. + * The supported fields are: + *

                                + *
                              • {@code DAY_OF_WEEK} + *
                              • {@code DAY_OF_MONTH} + *
                              • {@code DAY_OF_YEAR} + *
                              • {@code EPOCH_DAY} + *
                              • {@code MONTH_OF_YEAR} + *
                              • {@code PROLEPTIC_MONTH} + *
                              • {@code YEAR_OF_ERA} + *
                              • {@code YEAR} + *
                              • {@code ERA} + *
                              + * All other {@code ChronoField} instances will return false. + *

                              + * If the field is not a {@code ChronoField}, then the result of this method + * is obtained by invoking {@code TemporalField.isSupportedBy(TemporalAccessor)} + * passing {@code this} as the argument. + * Whether the field is supported is determined by the field. + * + * @param field the field to check, null returns false + * @return true if the field is supported on this date, false if not + */ + @Override + public boolean isSupported(TemporalField field) { + if (field == ALIGNED_DAY_OF_WEEK_IN_MONTH || field == ALIGNED_DAY_OF_WEEK_IN_YEAR || + field == ALIGNED_WEEK_OF_MONTH || field == ALIGNED_WEEK_OF_YEAR) { + return false; + } + return ChronoLocalDate.super.isSupported(field); + } + @Override public ValueRange range(TemporalField field) { if (field instanceof ChronoField) { if (isSupported(field)) { ChronoField f = (ChronoField) field; switch (f) { - case DAY_OF_MONTH: - case ALIGNED_WEEK_OF_MONTH: - return isoDate.range(field); - case DAY_OF_YEAR: - return actualRange(Calendar.DAY_OF_YEAR); - case YEAR_OF_ERA: - return actualRange(Calendar.YEAR); + case DAY_OF_MONTH: return ValueRange.of(1, lengthOfMonth()); + case DAY_OF_YEAR: return ValueRange.of(1, lengthOfYear()); + case YEAR_OF_ERA: { + Calendar jcal = Calendar.getInstance(JapaneseChronology.LOCALE); + jcal.set(Calendar.ERA, era.getValue() + JapaneseEra.ERA_OFFSET); + jcal.set(yearOfEra, isoDate.getMonthValue() - 1, isoDate.getDayOfMonth()); + return ValueRange.of(1, jcal.getActualMaximum(Calendar.YEAR)); + } } return getChronology().range(f); } - throw new UnsupportedTemporalTypeException("Unsupported field: " + field.getName()); + throw new UnsupportedTemporalTypeException("Unsupported field: " + field); } return field.rangeRefinedBy(this); } - private ValueRange actualRange(int calendarField) { - Calendar jcal = Calendar.getInstance(JapaneseChronology.LOCALE); - jcal.set(Calendar.ERA, era.getValue() + JapaneseEra.ERA_OFFSET); // TODO: cannot calculate this way for SEIREKI - jcal.set(yearOfEra, isoDate.getMonthValue() - 1, isoDate.getDayOfMonth()); - return ValueRange.of(jcal.getActualMinimum(calendarField), - jcal.getActualMaximum(calendarField)); - } - @Override public long getLong(TemporalField field) { if (field instanceof ChronoField) { // same as ISO: - // DAY_OF_WEEK, ALIGNED_DAY_OF_WEEK_IN_MONTH, DAY_OF_MONTH, EPOCH_DAY, - // ALIGNED_WEEK_OF_MONTH, MONTH_OF_YEAR, PROLEPTIC_MONTH, YEAR + // DAY_OF_WEEK, DAY_OF_MONTH, EPOCH_DAY, MONTH_OF_YEAR, PROLEPTIC_MONTH, YEAR // // calendar specific fields - // ALIGNED_DAY_OF_WEEK_IN_YEAR, DAY_OF_YEAR, ALIGNED_WEEK_OF_YEAR, YEAR_OF_ERA, ERA + // DAY_OF_YEAR, YEAR_OF_ERA, ERA switch ((ChronoField) field) { + case ALIGNED_DAY_OF_WEEK_IN_MONTH: + case ALIGNED_DAY_OF_WEEK_IN_YEAR: + case ALIGNED_WEEK_OF_MONTH: + case ALIGNED_WEEK_OF_YEAR: + throw new UnsupportedTemporalTypeException("Unsupported field: " + field); case YEAR_OF_ERA: return yearOfEra; case ERA: return era.getValue(); - case DAY_OF_YEAR: { - LocalGregorianCalendar.Date jdate = toPrivateJapaneseDate(isoDate); - return JapaneseChronology.JCAL.getDayOfYear(jdate); - } - // TODO: ALIGNED_DAY_OF_WEEK_IN_YEAR and ALIGNED_WEEK_OF_YEAR ??? + case DAY_OF_YEAR: + Calendar jcal = Calendar.getInstance(JapaneseChronology.LOCALE); + jcal.set(Calendar.ERA, era.getValue() + JapaneseEra.ERA_OFFSET); + jcal.set(yearOfEra, isoDate.getMonthValue() - 1, isoDate.getDayOfMonth()); + return jcal.get(Calendar.DAY_OF_YEAR); } return isoDate.getLong(field); } @@ -444,7 +508,7 @@ public JapaneseDate with(TemporalField field, long newValue) { if (field instanceof ChronoField) { ChronoField f = (ChronoField) field; - if (getLong(f) == newValue) { + if (getLong(f) == newValue) { // getLong() validates for supported fields return this; } switch (f) { @@ -464,10 +528,9 @@ } } // YEAR, PROLEPTIC_MONTH and others are same as ISO - // TODO: review other fields, such as WEEK_OF_YEAR return with(isoDate.with(field, newValue)); } - return ChronoLocalDate.super.with(field, newValue); + return super.with(field, newValue); } /** @@ -592,13 +655,14 @@ } @Override // for javadoc and covariant return type + @SuppressWarnings("unchecked") public final ChronoLocalDateTime atTime(LocalTime localTime) { - return super.atTime(localTime); + return (ChronoLocalDateTime)super.atTime(localTime); } @Override - public Period periodUntil(ChronoLocalDate endDate) { - return isoDate.periodUntil(endDate); + public Period until(ChronoLocalDate endDate) { + return isoDate.until(endDate); } @Override // override for performance @@ -624,14 +688,6 @@ return getChronology().getId().hashCode() ^ isoDate.hashCode(); } - @Override - public String toString() { - if (era == JapaneseEra.SEIREKI) { - return getChronology().getId() + " " + isoDate.toString(); - } - return super.toString(); - } - //----------------------------------------------------------------------- private Object writeReplace() { return new Ser(Ser.JAPANESE_DATE_TYPE, this); diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/chrono/JapaneseEra.java --- a/jdk/src/share/classes/java/time/chrono/JapaneseEra.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/chrono/JapaneseEra.java Fri Aug 02 09:38:09 2013 +0100 @@ -61,6 +61,7 @@ */ package java.time.chrono; +import static java.time.chrono.JapaneseDate.MEIJI_6_ISODATE; import static java.time.temporal.ChronoField.ERA; import java.io.DataInput; @@ -84,12 +85,9 @@ * An era in the Japanese Imperial calendar system. *

                              * This class defines the valid eras for the Japanese chronology. - * Only Meiji (1868-09-08 - 1912-07-29) and later eras are supported. - * Japan introduced the Gregorian calendar since Meiji 6. The dates - * between Meiji 1 - 5 are not historically correct. - * The older eras are recognized as Seireki (Western calendar) era, - * and the year of era of Seireki is proleptic Gregorian year. - * (The Julian to Gregorian transition is not supported.) + * Japan introduced the Gregorian calendar starting with Meiji 6. + * Only Meiji and later eras are supported; + * dates before Meiji 6, January 1 are not supported. * * @implSpec * This class is immutable and thread-safe. @@ -100,17 +98,12 @@ implements Era, Serializable { // The offset value to 0-based index from the era value. - // i.e., getValue() + ERA_OFFSET == 0-based index; except that -999 is mapped to zero + // i.e., getValue() + ERA_OFFSET == 0-based index static final int ERA_OFFSET = 2; static final sun.util.calendar.Era[] ERA_CONFIG; /** - * The singleton instance for the before Meiji era ( - 1868-09-07) - * which has the value -999. - */ - public static final JapaneseEra SEIREKI = new JapaneseEra(-999, LocalDate.MIN); - /** * The singleton instance for the 'Meiji' era (1868-09-08 - 1912-07-29) * which has the value -1. */ @@ -144,17 +137,13 @@ private static final JapaneseEra[] KNOWN_ERAS; static { - sun.util.calendar.Era[] sunEras = JapaneseChronology.JCAL.getEras(); - ERA_CONFIG = new sun.util.calendar.Era[sunEras.length + 1]; - for (int i = 1; i < ERA_CONFIG.length; i++) { - ERA_CONFIG[i] = sunEras[i - 1]; - } + ERA_CONFIG = JapaneseChronology.JCAL.getEras(); + KNOWN_ERAS = new JapaneseEra[ERA_CONFIG.length]; - KNOWN_ERAS[0] = SEIREKI; - KNOWN_ERAS[1] = MEIJI; - KNOWN_ERAS[2] = TAISHO; - KNOWN_ERAS[3] = SHOWA; - KNOWN_ERAS[4] = HEISEI; + KNOWN_ERAS[0] = MEIJI; + KNOWN_ERAS[1] = TAISHO; + KNOWN_ERAS[2] = SHOWA; + KNOWN_ERAS[3] = HEISEI; for (int i = N_ERA_CONSTANTS; i < ERA_CONFIG.length; i++) { CalendarDate date = ERA_CONFIG[i].getSinceDate(); LocalDate isoDate = LocalDate.of(date.getYear(), date.getMonth(), date.getDayOfMonth()); @@ -203,10 +192,8 @@ //----------------------------------------------------------------------- /** * Returns the Sun private Era instance corresponding to this {@code JapaneseEra}. - * SEIREKI doesn't have its corresponding one. * - * @return the Sun private Era instance for this {@code JapaneseEra}, - * or null for SEIREKI. + * @return the Sun private Era instance for this {@code JapaneseEra}. */ sun.util.calendar.Era getPrivateEra() { return ERA_CONFIG[ordinal(eraValue)]; @@ -218,16 +205,14 @@ *

                              * The {@link #SHOWA} era that contains 1970-01-01 (ISO calendar system) has the value 1 * Later era is numbered 2 ({@link #HEISEI}). Earlier eras are numbered 0 ({@link #TAISHO}), - * -1 ({@link #MEIJI}), only Meiji and later eras are supported. The prior to Meiji, - * {@link #SEIREKI} is used. + * -1 ({@link #MEIJI}), only Meiji and later eras are supported. * * @param japaneseEra the era to represent * @return the {@code JapaneseEra} singleton, not null * @throws DateTimeException if the value is invalid */ public static JapaneseEra of(int japaneseEra) { - if (japaneseEra != SEIREKI.eraValue && - (japaneseEra < MEIJI.eraValue || japaneseEra > HEISEI.eraValue)) { + if (japaneseEra < MEIJI.eraValue || japaneseEra > HEISEI.eraValue) { throw new DateTimeException("Invalid era: " + japaneseEra); } return KNOWN_ERAS[ordinal(japaneseEra)]; @@ -276,22 +261,25 @@ * @return the Era singleton, never null */ static JapaneseEra from(LocalDate date) { + if (date.isBefore(MEIJI_6_ISODATE)) { + throw new DateTimeException("JapaneseDate before Meiji 6 are not supported"); + } for (int i = KNOWN_ERAS.length - 1; i > 0; i--) { JapaneseEra era = KNOWN_ERAS[i]; if (date.compareTo(era.since) >= 0) { return era; } } - return SEIREKI; + return null; } static JapaneseEra toJapaneseEra(sun.util.calendar.Era privateEra) { - for (int i = ERA_CONFIG.length - 1; i > 0; i--) { + for (int i = ERA_CONFIG.length - 1; i >= 0; i--) { if (ERA_CONFIG[i].equals(privateEra)) { return KNOWN_ERAS[i]; } } - return SEIREKI; + return null; } static sun.util.calendar.Era privateEraFrom(LocalDate isoDate) { @@ -306,13 +294,13 @@ /** * Returns the index into the arrays from the Era value. - * the eraValue is a valid Era number, -999, -1..2. + * the eraValue is a valid Era number, -1..2. * * @param eraValue the era value to convert to the index * @return the index of the current Era */ private static int ordinal(int eraValue) { - return (eraValue == SEIREKI.eraValue) ? 0 : eraValue + ERA_OFFSET; + return eraValue + ERA_OFFSET - 1; } //----------------------------------------------------------------------- @@ -321,7 +309,7 @@ *

                              * The {@link #SHOWA} era that contains 1970-01-01 (ISO calendar system) has the value 1. * Later eras are numbered from 2 ({@link #HEISEI}). - * Earlier eras are numbered 0 ({@link #TAISHO}), -1 ({@link #MEIJI}), and -999 ({@link #SEIREKI}). + * Earlier eras are numbered 0 ({@link #TAISHO}), -1 ({@link #MEIJI})). * * @return the era value */ @@ -374,11 +362,7 @@ } String getName() { - int index = ordinal(getValue()); - if (index == 0) { - return "Seireki"; - } - return ERA_CONFIG[index].getName(); + return ERA_CONFIG[ordinal(getValue())].getName(); } @Override diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/chrono/MinguoChronology.java --- a/jdk/src/share/classes/java/time/chrono/MinguoChronology.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/chrono/MinguoChronology.java Fri Aug 02 09:38:09 2013 +0100 @@ -65,12 +65,15 @@ import java.time.Instant; import java.time.LocalDate; import java.time.ZoneId; +import java.time.format.ResolverStyle; import java.time.temporal.ChronoField; import java.time.temporal.TemporalAccessor; +import java.time.temporal.TemporalField; import java.time.temporal.ValueRange; import java.util.Arrays; import java.util.List; import java.util.Locale; +import java.util.Map; /** * The Minguo calendar system. @@ -253,16 +256,19 @@ } @Override + @SuppressWarnings("unchecked") public ChronoLocalDateTime localDateTime(TemporalAccessor temporal) { return (ChronoLocalDateTime)super.localDateTime(temporal); } @Override + @SuppressWarnings("unchecked") public ChronoZonedDateTime zonedDateTime(TemporalAccessor temporal) { return (ChronoZonedDateTime)super.zonedDateTime(temporal); } @Override + @SuppressWarnings("unchecked") public ChronoZonedDateTime zonedDateTime(Instant instant, ZoneId zone) { return (ChronoZonedDateTime)super.zonedDateTime(instant, zone); } @@ -292,7 +298,7 @@ } @Override - public Era eraOf(int eraValue) { + public MinguoEra eraOf(int eraValue) { return MinguoEra.of(eraValue); } @@ -321,4 +327,10 @@ return field.range(); } + //----------------------------------------------------------------------- + @Override // override for return type + public MinguoDate resolveDate(Map fieldValues, ResolverStyle resolverStyle) { + return (MinguoDate) super.resolveDate(fieldValues, resolverStyle); + } + } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/chrono/MinguoDate.java --- a/jdk/src/share/classes/java/time/chrono/MinguoDate.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/chrono/MinguoDate.java Fri Aug 02 09:38:09 2013 +0100 @@ -96,7 +96,7 @@ */ public final class MinguoDate extends ChronoDateImpl - implements ChronoLocalDate, Serializable { + implements ChronoLocalDate, Serializable { /** * Serialization version. @@ -152,7 +152,7 @@ * @throws DateTimeException if the current date cannot be obtained */ public static MinguoDate now(Clock clock) { - return MinguoChronology.INSTANCE.date(LocalDate.now(clock)); + return new MinguoDate(LocalDate.now(clock)); } /** @@ -264,7 +264,7 @@ } return getChronology().range(f); } - throw new UnsupportedTemporalTypeException("Unsupported field: " + field.getName()); + throw new UnsupportedTemporalTypeException("Unsupported field: " + field); } return field.rangeRefinedBy(this); } @@ -325,7 +325,7 @@ } return with(isoDate.with(field, newValue)); } - return ChronoLocalDate.super.with(field, newValue); + return super.with(field, newValue); } /** @@ -370,6 +370,11 @@ } @Override + MinguoDate plusWeeks(long weeksToAdd) { + return super.plusWeeks(weeksToAdd); + } + + @Override MinguoDate plusDays(long days) { return with(isoDate.plusDays(days)); } @@ -385,11 +390,6 @@ } @Override - MinguoDate plusWeeks(long weeksToAdd) { - return super.plusWeeks(weeksToAdd); - } - - @Override MinguoDate minusYears(long yearsToSubtract) { return super.minusYears(yearsToSubtract); } @@ -414,13 +414,14 @@ } @Override // for javadoc and covariant return type + @SuppressWarnings("unchecked") public final ChronoLocalDateTime atTime(LocalTime localTime) { - return super.atTime(localTime); + return (ChronoLocalDateTime)super.atTime(localTime); } @Override - public Period periodUntil(ChronoLocalDate endDate) { - return isoDate.periodUntil(endDate); + public Period until(ChronoLocalDate endDate) { + return isoDate.until(endDate); } @Override // override for performance @@ -458,7 +459,7 @@ out.writeByte(get(DAY_OF_MONTH)); } - static ChronoLocalDate readExternal(DataInput in) throws IOException { + static MinguoDate readExternal(DataInput in) throws IOException { int year = in.readInt(); int month = in.readByte(); int dayOfMonth = in.readByte(); diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/chrono/ThaiBuddhistChronology.java --- a/jdk/src/share/classes/java/time/chrono/ThaiBuddhistChronology.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/chrono/ThaiBuddhistChronology.java Fri Aug 02 09:38:09 2013 +0100 @@ -65,13 +65,16 @@ import java.time.Instant; import java.time.LocalDate; import java.time.ZoneId; +import java.time.format.ResolverStyle; import java.time.temporal.ChronoField; import java.time.temporal.TemporalAccessor; +import java.time.temporal.TemporalField; import java.time.temporal.ValueRange; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Locale; +import java.util.Map; /** * The Thai Buddhist calendar system. @@ -289,16 +292,19 @@ } @Override + @SuppressWarnings("unchecked") public ChronoLocalDateTime localDateTime(TemporalAccessor temporal) { return (ChronoLocalDateTime)super.localDateTime(temporal); } @Override + @SuppressWarnings("unchecked") public ChronoZonedDateTime zonedDateTime(TemporalAccessor temporal) { return (ChronoZonedDateTime)super.zonedDateTime(temporal); } @Override + @SuppressWarnings("unchecked") public ChronoZonedDateTime zonedDateTime(Instant instant, ZoneId zone) { return (ChronoZonedDateTime)super.zonedDateTime(instant, zone); } @@ -328,7 +334,7 @@ } @Override - public Era eraOf(int eraValue) { + public ThaiBuddhistEra eraOf(int eraValue) { return ThaiBuddhistEra.of(eraValue); } @@ -357,4 +363,10 @@ return field.range(); } + //----------------------------------------------------------------------- + @Override // override for return type + public ThaiBuddhistDate resolveDate(Map fieldValues, ResolverStyle resolverStyle) { + return (ThaiBuddhistDate) super.resolveDate(fieldValues, resolverStyle); + } + } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/chrono/ThaiBuddhistDate.java --- a/jdk/src/share/classes/java/time/chrono/ThaiBuddhistDate.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/chrono/ThaiBuddhistDate.java Fri Aug 02 09:38:09 2013 +0100 @@ -96,7 +96,7 @@ */ public final class ThaiBuddhistDate extends ChronoDateImpl - implements ChronoLocalDate, Serializable { + implements ChronoLocalDate, Serializable { /** * Serialization version. @@ -152,7 +152,7 @@ * @throws DateTimeException if the current date cannot be obtained */ public static ThaiBuddhistDate now(Clock clock) { - return ThaiBuddhistChronology.INSTANCE.date(LocalDate.now(clock)); + return new ThaiBuddhistDate(LocalDate.now(clock)); } /** @@ -264,7 +264,7 @@ } return getChronology().range(f); } - throw new UnsupportedTemporalTypeException("Unsupported field: " + field.getName()); + throw new UnsupportedTemporalTypeException("Unsupported field: " + field); } return field.rangeRefinedBy(this); } @@ -325,7 +325,7 @@ } return with(isoDate.with(field, newValue)); } - return ChronoLocalDate.super.with(field, newValue); + return super.with(field, newValue); } /** @@ -414,13 +414,14 @@ } @Override // for javadoc and covariant return type + @SuppressWarnings("unchecked") public final ChronoLocalDateTime atTime(LocalTime localTime) { - return super.atTime(localTime); + return (ChronoLocalDateTime) super.atTime(localTime); } @Override - public Period periodUntil(ChronoLocalDate endDate) { - return isoDate.periodUntil(endDate); + public Period until(ChronoLocalDate endDate) { + return isoDate.until(endDate); } @Override // override for performance diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/chrono/package-info.java --- a/jdk/src/share/classes/java/time/chrono/package-info.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/chrono/package-info.java Fri Aug 02 09:38:09 2013 +0100 @@ -103,7 +103,7 @@ * // Enumerate the list of available calendars and print todays date for each. * Set<Chronology> chronos = Chronology.getAvailableChronologies(); * for (Chronology chrono : chronos) { - * ChronoLocalDate<?> date = chrono.dateNow(); + * ChronoLocalDate date = chrono.dateNow(); * System.out.printf(" %20s: %s%n", chrono.getId(), date.toString()); * } * @@ -113,7 +113,7 @@ *

                              *
                                *   // Print the Thai Buddhist date
                              - *       ChronoLocalDate<?> now1 = Chronology.of("ThaiBuddhist").dateNow();
                              + *       ChronoLocalDate now1 = Chronology.of("ThaiBuddhist").dateNow();
                                *       int day = now1.get(ChronoField.DAY_OF_MONTH);
                                *       int dow = now1.get(ChronoField.DAY_OF_WEEK);
                                *       int month = now1.get(ChronoField.MONTH_OF_YEAR);
                              @@ -121,10 +121,10 @@
                                *       System.out.printf("  Today is %s %s %d-%s-%d%n", now1.getChronology().getId(),
                                *                 dow, day, month, year);
                                *   // Print today's date and the last day of the year for the Thai Buddhist Calendar.
                              - *       ChronoLocalDate<?> first = now1
                              + *       ChronoLocalDate first = now1
                                *                 .with(ChronoField.DAY_OF_MONTH, 1)
                                *                 .with(ChronoField.MONTH_OF_YEAR, 1);
                              - *       ChronoLocalDate<?> last = first
                              + *       ChronoLocalDate last = first
                                *                 .plus(1, ChronoUnit.YEARS)
                                *                 .minus(1, ChronoUnit.DAYS);
                                *       System.out.printf("  %s: 1st of year: %s; end of year: %s%n", last.getChronology().getId(),
                              diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/format/DateTimeFormatter.java
                              --- a/jdk/src/share/classes/java/time/format/DateTimeFormatter.java	Thu Jul 25 17:32:23 2013 +0100
                              +++ b/jdk/src/share/classes/java/time/format/DateTimeFormatter.java	Fri Aug 02 09:38:09 2013 +0100
                              @@ -265,7 +265,7 @@
                                * 

                              * For example: *

                              - *  DateTimeFormatter formatter = DateTimeFormatter.pattern("yyyy MM dd");
                              + *  DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy MM dd");
                                *  String text = date.toString(formatter);
                                *  LocalDate date = LocalDate.parse(text, formatter);
                                * 
                              @@ -460,7 +460,7 @@ *
                            • The {@code ChronoField} time fields are resolved. * This is documented on {@link ChronoField} and is the same for all chronologies. *
                            • Any fields that are not {@code ChronoField} are processed. - * This is achieved using {@link TemporalField#resolve(TemporalAccessor, long, ResolverStyle)}. + * This is achieved using {@link TemporalField#resolve(Map, Chronology, ZoneId, ResolverStyle)}. * Documentation about field resolution is located in the implementation * of {@code TemporalField}. *
                            • The {@code ChronoField} date and time fields are re-resolved. diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/format/DateTimeFormatterBuilder.java --- a/jdk/src/share/classes/java/time/format/DateTimeFormatterBuilder.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/format/DateTimeFormatterBuilder.java Fri Aug 02 09:38:09 2013 +0100 @@ -77,7 +77,6 @@ import java.math.RoundingMode; import java.text.ParsePosition; import java.time.DateTimeException; -import java.time.Duration; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; @@ -962,12 +961,9 @@ *
                                    *   "Europe/London"           -- ZoneId.of("Europe/London")
                                    *   "Z"                       -- ZoneOffset.UTC
                              -     *   "UT"                      -- ZoneOffset.UTC
                              -     *   "UTC"                     -- ZoneOffset.UTC
                              -     *   "GMT"                     -- ZoneOffset.UTC
                              -     *   "UT0"                     -- ZoneOffset.UTC
                              -     *   "UTC0"                    -- ZoneOffset.UTC
                              -     *   "GMT0"                    -- ZoneOffset.UTC
                              +     *   "UT"                      -- ZoneId.of("UT")
                              +     *   "UTC"                     -- ZoneId.of("UTC")
                              +     *   "GMT"                     -- ZoneId.of("GMT")
                                    *   "+01:30"                  -- ZoneOffset.of("+01:30")
                                    *   "UT+01:30"                -- ZoneOffset.of("+01:30")
                                    *   "UTC+01:30"               -- ZoneOffset.of("+01:30")
                              @@ -1016,12 +1012,9 @@
                                    * 
                                    *   "Europe/London"           -- ZoneId.of("Europe/London")
                                    *   "Z"                       -- ZoneOffset.UTC
                              -     *   "UT"                      -- ZoneOffset.UTC
                              -     *   "UTC"                     -- ZoneOffset.UTC
                              -     *   "GMT"                     -- ZoneOffset.UTC
                              -     *   "UT0"                     -- ZoneOffset.UTC
                              -     *   "UTC0"                    -- ZoneOffset.UTC
                              -     *   "GMT0"                    -- ZoneOffset.UTC
                              +     *   "UT"                      -- ZoneId.of("UT")
                              +     *   "UTC"                     -- ZoneId.of("UTC")
                              +     *   "GMT"                     -- ZoneId.of("GMT")
                                    *   "+01:30"                  -- ZoneOffset.of("+01:30")
                                    *   "UT+01:30"                -- ZoneOffset.of("+01:30")
                                    *   "UTC+01:30"               -- ZoneOffset.of("+01:30")
                              @@ -1077,16 +1070,13 @@
                                    * 
                                    *   "Europe/London"           -- ZoneId.of("Europe/London")
                                    *   "Z"                       -- ZoneOffset.UTC
                              -     *   "UT"                      -- ZoneOffset.UTC
                              -     *   "UTC"                     -- ZoneOffset.UTC
                              -     *   "GMT"                     -- ZoneOffset.UTC
                              -     *   "UT0"                     -- ZoneOffset.UTC
                              -     *   "UTC0"                    -- ZoneOffset.UTC
                              -     *   "GMT0"                    -- ZoneOffset.UTC
                              +     *   "UT"                      -- ZoneId.of("UT")
                              +     *   "UTC"                     -- ZoneId.of("UTC")
                              +     *   "GMT"                     -- ZoneId.of("GMT")
                                    *   "+01:30"                  -- ZoneOffset.of("+01:30")
                              -     *   "UT+01:30"                -- ZoneOffset.of("+01:30")
                              -     *   "UTC+01:30"               -- ZoneOffset.of("+01:30")
                              -     *   "GMT+01:30"               -- ZoneOffset.of("+01:30")
                              +     *   "UT+01:30"                -- ZoneOffset.of("UT+01:30")
                              +     *   "UTC+01:30"               -- ZoneOffset.of("UTC+01:30")
                              +     *   "GMT+01:30"               -- ZoneOffset.of("GMT+01:30")
                                    * 
                              *

                              * Note that this method is is identical to {@code appendZoneId()} except @@ -2530,7 +2520,7 @@ DecimalStyle decimalStyle = context.getDecimalStyle(); String str = (value == Long.MIN_VALUE ? "9223372036854775808" : Long.toString(Math.abs(value))); if (str.length() > maxWidth) { - throw new DateTimeException("Field " + field.getName() + + throw new DateTimeException("Field " + field + " cannot be printed as the value " + value + " exceeds the maximum print width of " + maxWidth); } @@ -2555,7 +2545,7 @@ buf.append(decimalStyle.getNegativeSign()); break; case NOT_NEGATIVE: - throw new DateTimeException("Field " + field.getName() + + throw new DateTimeException("Field " + field + " cannot be printed as the value " + value + " cannot be negative according to the SignStyle"); } @@ -2699,12 +2689,12 @@ @Override public String toString() { if (minWidth == 1 && maxWidth == 19 && signStyle == SignStyle.NORMAL) { - return "Value(" + field.getName() + ")"; + return "Value(" + field + ")"; } if (minWidth == maxWidth && signStyle == SignStyle.NOT_NEGATIVE) { - return "Value(" + field.getName() + "," + minWidth + ")"; + return "Value(" + field + "," + minWidth + ")"; } - return "Value(" + field.getName() + "," + minWidth + "," + maxWidth + "," + signStyle + ")"; + return "Value(" + field + "," + minWidth + "," + maxWidth + "," + signStyle + ")"; } } @@ -2817,7 +2807,7 @@ @Override public String toString() { - return "ReducedValue(" + field.getName() + "," + minWidth + "," + maxWidth + "," + baseValue + ")"; + return "ReducedValue(" + field + "," + minWidth + "," + maxWidth + "," + baseValue + ")"; } } @@ -2842,7 +2832,7 @@ FractionPrinterParser(TemporalField field, int minWidth, int maxWidth, boolean decimalPoint) { Objects.requireNonNull(field, "field"); if (field.range().isFixed() == false) { - throw new IllegalArgumentException("Field must have a fixed set of values: " + field.getName()); + throw new IllegalArgumentException("Field must have a fixed set of values: " + field); } if (minWidth < 0 || minWidth > 9) { throw new IllegalArgumentException("Minimum width must be from 0 to 9 inclusive but was " + minWidth); @@ -2984,7 +2974,7 @@ @Override public String toString() { String decimal = (decimalPoint ? ",DecimalPoint" : ""); - return "Fraction(" + field.getName() + "," + minWidth + "," + maxWidth + decimal + ")"; + return "Fraction(" + field + "," + minWidth + "," + maxWidth + decimal + ")"; } } @@ -3079,9 +3069,9 @@ @Override public String toString() { if (textStyle == TextStyle.FULL) { - return "Text(" + field.getName() + ")"; + return "Text(" + field + ")"; } - return "Text(" + field.getName() + "," + textStyle + ")"; + return "Text(" + field + "," + textStyle + ")"; } } @@ -3756,17 +3746,17 @@ // handle fixed time-zone IDs char nextChar = text.charAt(position); if (nextChar == '+' || nextChar == '-') { - return parseOffsetBased(context, text, position, OffsetIdPrinterParser.INSTANCE_ID_Z); + return parseOffsetBased(context, text, position, position, OffsetIdPrinterParser.INSTANCE_ID_Z); } else if (length >= position + 2) { char nextNextChar = text.charAt(position + 1); if (context.charEquals(nextChar, 'U') && context.charEquals(nextNextChar, 'T')) { if (length >= position + 3 && context.charEquals(text.charAt(position + 2), 'C')) { - return parseOffsetBased(context, text, position + 3, OffsetIdPrinterParser.INSTANCE_ID_ZERO); + return parseOffsetBased(context, text, position, position + 3, OffsetIdPrinterParser.INSTANCE_ID_ZERO); } - return parseOffsetBased(context, text, position + 2, OffsetIdPrinterParser.INSTANCE_ID_ZERO); + return parseOffsetBased(context, text, position, position + 2, OffsetIdPrinterParser.INSTANCE_ID_ZERO); } else if (context.charEquals(nextChar, 'G') && length >= position + 3 && context.charEquals(nextNextChar, 'M') && context.charEquals(text.charAt(position + 2), 'T')) { - return parseOffsetBased(context, text, position + 3, OffsetIdPrinterParser.INSTANCE_ID_ZERO); + return parseOffsetBased(context, text, position, position + 3, OffsetIdPrinterParser.INSTANCE_ID_ZERO); } } @@ -3785,20 +3775,49 @@ return ppos.getIndex(); } - private int parseOffsetBased(DateTimeParseContext context, CharSequence text, int position, OffsetIdPrinterParser parser) { + /** + * Parse an offset following a prefix and set the ZoneId if it is valid. + * To matching the parsing of ZoneId.of the values are not normalized + * to ZoneOffsets. + * + * @param context the parse context + * @param text the input text + * @param prefixPos start of the prefix + * @param position start of text after the prefix + * @param parser parser for the value after the prefix + * @return the position after the parse + */ + private int parseOffsetBased(DateTimeParseContext context, CharSequence text, int prefixPos, int position, OffsetIdPrinterParser parser) { + String prefix = text.toString().substring(prefixPos, position).toUpperCase(); + if (position >= text.length()) { + context.setParsed(ZoneId.of(prefix)); + return position; + } + + // '0' or 'Z' after prefix is not part of a valid ZoneId; use bare prefix + if (text.charAt(position) == '0' || + context.charEquals(text.charAt(position), 'Z')) { + context.setParsed(ZoneId.of(prefix)); + return position; + } + DateTimeParseContext newContext = context.copy(); int endPos = parser.parse(newContext, text, position); - if (endPos < 0) { - if (parser == OffsetIdPrinterParser.INSTANCE_ID_Z) { - return ~position; + try { + if (endPos < 0) { + if (parser == OffsetIdPrinterParser.INSTANCE_ID_Z) { + return ~prefixPos; + } + context.setParsed(ZoneId.of(prefix)); + return position; } - context.setParsed(ZoneOffset.UTC); - return position; + int offset = (int) newContext.getParsed(OFFSET_SECONDS).longValue(); + ZoneOffset zoneOffset = ZoneOffset.ofTotalSeconds(offset); + context.setParsed(ZoneId.ofOffset(prefix, zoneOffset)); + return endPos; + } catch (DateTimeException dte) { + return ~prefixPos; } - int offset = (int) newContext.getParsed(OFFSET_SECONDS).longValue(); - ZoneId zone = ZoneOffset.ofTotalSeconds(offset); - context.setParsed(zone); - return endPos; } @Override diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/format/DateTimePrintContext.java --- a/jdk/src/share/classes/java/time/format/DateTimePrintContext.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/format/DateTimePrintContext.java Fri Aug 02 09:38:09 2013 +0100 @@ -157,7 +157,7 @@ } } final ZoneId effectiveZone = (overrideZone != null ? overrideZone : temporalZone); - final ChronoLocalDate effectiveDate; + final ChronoLocalDate effectiveDate; if (overrideChrono != null) { if (temporal.isSupported(EPOCH_DAY)) { effectiveDate = effectiveChrono.date(temporal); diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/format/Parsed.java --- a/jdk/src/share/classes/java/time/format/Parsed.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/format/Parsed.java Fri Aug 02 09:38:09 2013 +0100 @@ -143,7 +143,7 @@ /** * The resolved date. */ - private ChronoLocalDate date; + private ChronoLocalDate date; /** * The resolved time. */ @@ -197,7 +197,7 @@ return time.getLong(field); } if (field instanceof ChronoField) { - throw new UnsupportedTemporalTypeException("Unsupported field: " + field.getName()); + throw new UnsupportedTemporalTypeException("Unsupported field: " + field); } return field.getFrom(this); } @@ -255,42 +255,34 @@ // if any other fields, handle them // any lenient date resolution should return epoch-day if (fieldValues.size() > 0) { - boolean changed = false; + int changedCount = 0; outer: - while (true) { + while (changedCount < 50) { for (Map.Entry entry : fieldValues.entrySet()) { TemporalField targetField = entry.getKey(); - Map changes = targetField.resolve(this, entry.getValue(), resolverStyle); - if (changes != null) { - changed = true; - resolveFieldsMakeChanges(targetField, changes); - fieldValues.remove(targetField); // helps avoid infinite loops + ChronoLocalDate resolvedDate = targetField.resolve(fieldValues, chrono, zone, resolverStyle); + if (resolvedDate != null) { + updateCheckConflict(resolvedDate); + changedCount++; + continue outer; // have to restart to avoid concurrent modification + } else if (fieldValues.containsKey(targetField) == false) { + changedCount++; continue outer; // have to restart to avoid concurrent modification } } break; } + if (changedCount == 50) { // catch infinite loops + throw new DateTimeException("One of the parsed fields has an incorrectly implemented resolve method"); + } // if something changed then have to redo ChronoField resolve - if (changed) { + if (changedCount > 0) { resolveDateFields(); resolveTimeFields(); } } } - private void resolveFieldsMakeChanges(TemporalField targetField, Map changes) { - for (Map.Entry change : changes.entrySet()) { - TemporalField changeField = change.getKey(); - Long changeValue = change.getValue(); - Objects.requireNonNull(changeField, "changeField"); - if (changeValue != null) { - updateCheckConflict(targetField, changeField, changeValue); - } else { - fieldValues.remove(changeField); - } - } - } - private void updateCheckConflict(TemporalField targetField, TemporalField changeField, Long changeValue) { Long old = fieldValues.put(changeField, changeValue); if (old != null && old.longValue() != changeValue.longValue()) { @@ -305,7 +297,7 @@ updateCheckConflict(chrono.resolveDate(fieldValues, resolverStyle)); } - private void updateCheckConflict(ChronoLocalDate cld) { + private void updateCheckConflict(ChronoLocalDate cld) { if (date != null) { if (cld != null && date.equals(cld) == false) { throw new DateTimeException("Conflict found: Fields resolved to two different dates: " + date + " " + cld); diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/temporal/ChronoField.java --- a/jdk/src/share/classes/java/time/temporal/ChronoField.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/temporal/ChronoField.java Fri Aug 02 09:38:09 2013 +0100 @@ -403,6 +403,12 @@ * Non-ISO calendar systems should implement this field using the most recognized * day-of-year values for users of the calendar system. * Normally, this is a count of days from 1 to the length of the year. + *

                              + * Note that a non-ISO calendar system may have year numbering system that changes + * at a different point to the natural reset in the month numbering. An example + * of this is the Japanese calendar system where a change of era, which resets + * the year number to 1, can happen on any date. The era and year reset also cause + * the day-of-year to be reset to 1, but not the month-of-year or day-of-month. */ DAY_OF_YEAR("DayOfYear", DAYS, YEARS, ValueRange.of(1, 365, 366)), /** @@ -559,12 +565,11 @@ *

                              * This represents the concept of the sequential count of seconds where * 1970-01-01T00:00Z (ISO) is zero. - * This field may be used with {@link #NANO_OF_DAY} to represent the fraction of the day. + * This field may be used with {@link #NANO_OF_SECOND} to represent the fraction of the second. *

                              * An {@link Instant} represents an instantaneous point on the time-line. - * On their own they have no elements which allow a local date-time to be obtained. - * Only when paired with an offset or time-zone can the local date or time be found. - * This field allows the seconds part of the instant to be queried. + * On their own, an instant has insufficient information to allow a local date-time to be obtained. + * Only when paired with an offset or time-zone can the local date or time be calculated. *

                              * This field is strictly defined to have the same meaning in all calendar systems. * This is necessary to ensure interoperation between calendars. @@ -608,24 +613,18 @@ this.displayNameKey = displayNameKey; } - //----------------------------------------------------------------------- - @Override - public String getName() { - return name; - } - @Override public String getDisplayName(Locale locale) { Objects.requireNonNull(locale, "locale"); if (displayNameKey == null) { - return getName(); + return name; } LocaleResources lr = LocaleProviderAdapter.getResourceBundleBased() .getLocaleResources(locale); ResourceBundle rb = lr.getJavaTimeFormatData(); String key = "field." + displayNameKey; - return rb.containsKey(key) ? rb.getString(key) : getName(); + return rb.containsKey(key) ? rb.getString(key) : name; } @Override @@ -748,7 +747,7 @@ //----------------------------------------------------------------------- @Override public String toString() { - return getName(); + return name; } } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/temporal/ChronoUnit.java --- a/jdk/src/share/classes/java/time/temporal/ChronoUnit.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/temporal/ChronoUnit.java Fri Aug 02 09:38:09 2013 +0100 @@ -57,9 +57,6 @@ package java.time.temporal; import java.time.Duration; -import java.time.chrono.ChronoLocalDate; -import java.time.chrono.ChronoLocalDateTime; -import java.time.chrono.ChronoZonedDateTime; /** * A standard set of date periods units. @@ -201,12 +198,6 @@ } //----------------------------------------------------------------------- - @Override - public String getName() { - return name; - } - - //----------------------------------------------------------------------- /** * Gets the estimated duration of this unit in the ISO calendar system. *

                              @@ -233,41 +224,40 @@ */ @Override public boolean isDurationEstimated() { - return isDateUnit(); + return this.compareTo(DAYS) >= 0; } //----------------------------------------------------------------------- /** * Checks if this unit is a date unit. + *

                              + * All units from days to eras inclusive are date-based. + * Time-based units and {@code FOREVER} return false. * * @return true if a date unit, false if a time unit */ - public boolean isDateUnit() { - return this.compareTo(DAYS) >= 0; + @Override + public boolean isDateBased() { + return this.compareTo(DAYS) >= 0 && this != FOREVER; } /** * Checks if this unit is a time unit. + *

                              + * All units from nanos to half-days inclusive are time-based. + * Date-based units and {@code FOREVER} return false. * * @return true if a time unit, false if a date unit */ - public boolean isTimeUnit() { + @Override + public boolean isTimeBased() { return this.compareTo(DAYS) < 0; } //----------------------------------------------------------------------- @Override public boolean isSupportedBy(Temporal temporal) { - if (this == FOREVER) { - return false; - } - if (temporal instanceof ChronoLocalDate) { - return isDateUnit(); - } - if (temporal instanceof ChronoLocalDateTime || temporal instanceof ChronoZonedDateTime) { - return true; - } - return TemporalUnit.super.isSupportedBy(temporal); + return temporal.isSupported(this); } @SuppressWarnings("unchecked") @@ -279,13 +269,13 @@ //----------------------------------------------------------------------- @Override public long between(Temporal temporal1, Temporal temporal2) { - return temporal1.periodUntil(temporal2, this); + return temporal1.until(temporal2, this); } //----------------------------------------------------------------------- @Override public String toString() { - return getName(); + return name; } } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/temporal/IsoFields.java --- a/jdk/src/share/classes/java/time/temporal/IsoFields.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/temporal/IsoFields.java Fri Aug 02 09:38:09 2013 +0100 @@ -71,6 +71,8 @@ import java.time.Duration; import java.time.LocalDate; +import java.time.ZoneId; +import java.time.chrono.ChronoLocalDate; import java.time.chrono.Chronology; import java.time.chrono.IsoChronology; import java.time.format.ResolverStyle; @@ -289,10 +291,6 @@ private static enum Field implements TemporalField { DAY_OF_QUARTER { @Override - public String getName() { - return "DayOfQuarter"; - } - @Override public TemporalUnit getBaseUnit() { return DAYS; } @@ -344,17 +342,21 @@ return (R) temporal.with(DAY_OF_YEAR, temporal.getLong(DAY_OF_YEAR) + (newValue - curValue)); } @Override - public Map resolve(TemporalAccessor temporal, long doq, ResolverStyle resolverStyle) { - if ((temporal.isSupported(YEAR) && temporal.isSupported(QUARTER_OF_YEAR)) == false) { + public ChronoLocalDate resolve( + Map fieldValues, Chronology chronology, ZoneId zone, ResolverStyle resolverStyle) { + Long yearLong = fieldValues.get(YEAR); + Long qoyLong = fieldValues.get(QUARTER_OF_YEAR); + if (yearLong == null || qoyLong == null) { return null; } - int y = temporal.get(YEAR); // validated + int y = YEAR.checkValidIntValue(yearLong); // always validate + long doq = fieldValues.get(DAY_OF_QUARTER); LocalDate date; if (resolverStyle == ResolverStyle.LENIENT) { - long qoy = temporal.getLong(QUARTER_OF_YEAR); // unvalidated - date = LocalDate.of(y, 1, 1).plusMonths(Math.multiplyExact(Math.subtractExact(qoy, 1), 3)); + date = LocalDate.of(y, 1, 1).plusMonths(Math.multiplyExact(Math.subtractExact(qoyLong, 1), 3)); + doq = Math.subtractExact(doq, 1); } else { - int qoy = temporal.get(QUARTER_OF_YEAR); // validated + int qoy = QUARTER_OF_YEAR.range().checkValidIntValue(qoyLong, QUARTER_OF_YEAR); // validated date = LocalDate.of(y, ((qoy - 1) * 3) + 1, 1); if (doq < 1 || doq > 90) { if (resolverStyle == ResolverStyle.STRICT) { @@ -363,21 +365,20 @@ range().checkValidValue(doq, this); // allow 1-92 rolling into next quarter } } + doq--; } - long epochDay = Math.addExact(date.toEpochDay(), Math.subtractExact(doq, 1)); - Map result = new HashMap<>(4, 1.0f); - result.put(EPOCH_DAY, epochDay); - result.put(YEAR, null); - result.put(QUARTER_OF_YEAR, null); - return result; + fieldValues.remove(this); + fieldValues.remove(YEAR); + fieldValues.remove(QUARTER_OF_YEAR); + return date.plusDays(doq); + } + @Override + public String toString() { + return "DayOfQuarter"; } }, QUARTER_OF_YEAR { @Override - public String getName() { - return "QuarterOfYear"; - } - @Override public TemporalUnit getBaseUnit() { return QUARTER_YEARS; } @@ -409,20 +410,19 @@ range().checkValidValue(newValue, this); // strictly check from 1 to 4 return (R) temporal.with(MONTH_OF_YEAR, temporal.getLong(MONTH_OF_YEAR) + (newValue - curValue) * 3); } + @Override + public String toString() { + return "QuarterOfYear"; + } }, WEEK_OF_WEEK_BASED_YEAR { @Override - public String getName() { - return "WeekOfWeekBasedYear"; - } - - @Override public String getDisplayName(Locale locale) { Objects.requireNonNull(locale, "locale"); LocaleResources lr = LocaleProviderAdapter.getResourceBundleBased() .getLocaleResources(locale); ResourceBundle rb = lr.getJavaTimeFormatData(); - return rb.containsKey("field.week") ? rb.getString("field.week") : getName(); + return rb.containsKey("field.week") ? rb.getString("field.week") : toString(); } @Override @@ -463,14 +463,18 @@ return (R) temporal.plus(Math.subtractExact(newValue, getFrom(temporal)), WEEKS); } @Override - public Map resolve(TemporalAccessor temporal, long wowby, ResolverStyle resolverStyle) { - if ((temporal.isSupported(WEEK_BASED_YEAR) && temporal.isSupported(DAY_OF_WEEK)) == false) { + public ChronoLocalDate resolve( + Map fieldValues, Chronology chronology, ZoneId zone, ResolverStyle resolverStyle) { + Long wbyLong = fieldValues.get(WEEK_BASED_YEAR); + Long dowLong = fieldValues.get(DAY_OF_WEEK); + if (wbyLong == null || dowLong == null) { return null; } - int wby = temporal.get(WEEK_BASED_YEAR); // validated + int wby = WEEK_BASED_YEAR.range().checkValidIntValue(wbyLong, WEEK_BASED_YEAR); // always validate + long wowby = fieldValues.get(WEEK_OF_WEEK_BASED_YEAR); LocalDate date = LocalDate.of(wby, 1, 4); if (resolverStyle == ResolverStyle.LENIENT) { - long dow = temporal.getLong(DAY_OF_WEEK); // unvalidated + long dow = dowLong; // unvalidated if (dow > 7) { date = date.plusWeeks((dow - 1) / 7); dow = ((dow - 1) % 7) + 1; @@ -480,7 +484,7 @@ } date = date.plusWeeks(Math.subtractExact(wowby, 1)).with(DAY_OF_WEEK, dow); } else { - int dow = temporal.get(DAY_OF_WEEK); // validated + int dow = DAY_OF_WEEK.checkValidIntValue(dowLong); // validated if (wowby < 1 || wowby > 52) { if (resolverStyle == ResolverStyle.STRICT) { getWeekRange(date).checkValidValue(wowby, this); // only allow exact range @@ -490,19 +494,18 @@ } date = date.plusWeeks(wowby - 1).with(DAY_OF_WEEK, dow); } - Map result = new HashMap<>(2, 1.0f); - result.put(EPOCH_DAY, date.toEpochDay()); - result.put(WEEK_BASED_YEAR, null); - result.put(DAY_OF_WEEK, null); - return result; + fieldValues.remove(this); + fieldValues.remove(WEEK_BASED_YEAR); + fieldValues.remove(DAY_OF_WEEK); + return date; + } + @Override + public String toString() { + return "WeekOfWeekBasedYear"; } }, WEEK_BASED_YEAR { @Override - public String getName() { - return "WeekBasedYear"; - } - @Override public TemporalUnit getBaseUnit() { return WEEK_BASED_YEARS; } @@ -537,6 +540,10 @@ date = date.withDayOfYear(180).withYear(newVal).with(WEEK_OF_WEEK_BASED_YEAR, week); return (R) date.with(date); } + @Override + public String toString() { + return "WeekBasedYear"; + } }; @Override @@ -545,13 +552,13 @@ } @Override - public ValueRange rangeRefinedBy(TemporalAccessor temporal) { - return range(); + public boolean isTimeBased() { + return false; } @Override - public String toString() { - return getName(); + public ValueRange rangeRefinedBy(TemporalAccessor temporal) { + return range(); } //------------------------------------------------------------------------- @@ -636,11 +643,6 @@ } @Override - public String getName() { - return name; - } - - @Override public Duration getDuration() { return duration; } @@ -651,6 +653,16 @@ } @Override + public boolean isDateBased() { + return true; + } + + @Override + public boolean isTimeBased() { + return false; + } + + @Override public boolean isSupportedBy(Temporal temporal) { return temporal.isSupported(EPOCH_DAY); } @@ -658,7 +670,7 @@ @SuppressWarnings("unchecked") @Override public R addTo(R temporal, long amount) { - switch(this) { + switch (this) { case WEEK_BASED_YEARS: return (R) temporal.with(WEEK_BASED_YEAR, Math.addExact(temporal.get(WEEK_BASED_YEAR), amount)); @@ -678,7 +690,7 @@ return Math.subtractExact(temporal2.getLong(WEEK_BASED_YEAR), temporal1.getLong(WEEK_BASED_YEAR)); case QUARTER_YEARS: - return temporal1.periodUntil(temporal2, MONTHS) / 3; + return temporal1.until(temporal2, MONTHS) / 3; default: throw new IllegalStateException("Unreachable"); } @@ -686,8 +698,7 @@ @Override public String toString() { - return getName(); - + return name; } } } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/temporal/JulianFields.java --- a/jdk/src/share/classes/java/time/temporal/JulianFields.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/temporal/JulianFields.java Fri Aug 02 09:38:09 2013 +0100 @@ -66,6 +66,9 @@ import static java.time.temporal.ChronoUnit.FOREVER; import java.time.DateTimeException; +import java.time.ZoneId; +import java.time.chrono.ChronoLocalDate; +import java.time.chrono.Chronology; import java.time.format.ResolverStyle; import java.util.Collections; import java.util.Map; @@ -233,11 +236,6 @@ //----------------------------------------------------------------------- @Override - public String getName() { - return name; - } - - @Override public TemporalUnit getBaseUnit() { return baseUnit; } @@ -253,6 +251,11 @@ } @Override + public boolean isTimeBased() { + return false; + } + + @Override public ValueRange range() { return range; } @@ -287,15 +290,14 @@ //----------------------------------------------------------------------- @Override - public Map resolve(TemporalAccessor temporal, long value, ResolverStyle resolverStyle) { - long epochDay; + public ChronoLocalDate resolve( + Map fieldValues, Chronology chronology, ZoneId zone, ResolverStyle resolverStyle) { + long value = fieldValues.remove(this); if (resolverStyle == ResolverStyle.LENIENT) { - epochDay = Math.subtractExact(value, offset); - } else { - range().checkValidValue(value, this); - epochDay = value - offset; + return chronology.dateEpochDay(Math.subtractExact(value, offset)); } - return Collections.singletonMap(EPOCH_DAY, epochDay); + range().checkValidValue(value, this); + return chronology.dateEpochDay(value - offset); } //----------------------------------------------------------------------- diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/temporal/Temporal.java --- a/jdk/src/share/classes/java/time/temporal/Temporal.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/temporal/Temporal.java Fri Aug 02 09:38:09 2013 +0100 @@ -62,7 +62,6 @@ package java.time.temporal; import java.time.DateTimeException; -import java.time.ZoneId; /** * Framework-level interface defining read-write access to a temporal object, @@ -81,7 +80,8 @@ * See {@link ChronoField} for the standard set of fields. *

                              * Two pieces of date/time information cannot be represented by numbers, - * the {@linkplain java.time.chrono.Chronology chronology} and the {@linkplain ZoneId time-zone}. + * the {@linkplain java.time.chrono.Chronology chronology} and the + * {@linkplain java.time.ZoneId time-zone}. * These can be accessed via {@link #query(TemporalQuery) queries} using * the static methods defined on {@link TemporalQuery}. *

                              @@ -129,6 +129,29 @@ public interface Temporal extends TemporalAccessor { /** + * Checks if the specified unit is supported. + *

                              + * This checks if the specified unit can be added to, or subtracted from, this date-time. + * If false, then calling the {@link #plus(long, TemporalUnit)} and + * {@link #minus(long, TemporalUnit) minus} methods will throw an exception. + * + * @implSpec + * Implementations must check and handle all units defined in {@link ChronoUnit}. + * If the unit is supported, then true must be returned, otherwise false must be returned. + *

                              + * If the field is not a {@code ChronoUnit}, then the result of this method + * is obtained by invoking {@code TemporalUnit.isSupportedBy(Temporal)} + * passing {@code this} as the argument. + *

                              + * Implementations must ensure that no observable state is altered when this + * read-only method is invoked. + * + * @param unit the unit to check, null returns false + * @return true if the unit can be added/subtracted, false if not + */ + boolean isSupported(TemporalUnit unit); + + /** * Returns an adjusted object of the same type as this object with the adjustment made. *

                              * This adjusts this date-time according to the rules of the specified adjuster. @@ -352,7 +375,7 @@ * The start and end points are {@code this} and the specified temporal. * The result will be negative if the end is before the start. * For example, the period in hours between two temporal objects can be - * calculated using {@code startTime.periodUntil(endTime, HOURS)}. + * calculated using {@code startTime.until(endTime, HOURS)}. *

                              * The calculation returns a whole number, representing the number of * complete units between the two temporals. @@ -364,7 +387,7 @@ * The second is to use {@link TemporalUnit#between(Temporal, Temporal)}: *

                                    *   // these two lines are equivalent
                              -     *   temporal = start.periodUntil(end, unit);
                              +     *   temporal = start.until(end, unit);
                                    *   temporal = unit.between(start, end);
                                    * 
                              * The choice should be made based on which makes the code more readable. @@ -372,7 +395,7 @@ * For example, this method allows the number of days between two dates to * be calculated: *
                              -     *  long daysBetween = start.periodUntil(end, DAYS);
                              +     *  long daysBetween = start.until(end, DAYS);
                                    *  // or alternatively
                                    *  long daysBetween = DAYS.between(start, end);
                                    * 
                              @@ -399,7 +422,8 @@ * return unit.between(this, endTemporal); *
                              *

                              - * Neither this object, nor the specified temporal, may be altered. + * Implementations must ensure that no observable state is altered when this + * read-only method is invoked. * * @param endTemporal the end temporal, of the same type as this object, not null * @param unit the unit to measure the amount in, not null @@ -410,6 +434,6 @@ * @throws UnsupportedTemporalTypeException if the unit is not supported * @throws ArithmeticException if numeric overflow occurs */ - long periodUntil(Temporal endTemporal, TemporalUnit unit); + long until(Temporal endTemporal, TemporalUnit unit); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/temporal/TemporalAccessor.java --- a/jdk/src/share/classes/java/time/temporal/TemporalAccessor.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/temporal/TemporalAccessor.java Fri Aug 02 09:38:09 2013 +0100 @@ -62,7 +62,6 @@ package java.time.temporal; import java.time.DateTimeException; -import java.time.ZoneId; import java.util.Objects; /** @@ -80,7 +79,8 @@ * See {@link ChronoField} for the standard set of fields. *

                              * Two pieces of date/time information cannot be represented by numbers, - * the {@linkplain java.time.chrono.Chronology chronology} and the {@linkplain ZoneId time-zone}. + * the {@linkplain java.time.chrono.Chronology chronology} and the + * {@linkplain java.time.ZoneId time-zone}. * These can be accessed via {@linkplain #query(TemporalQuery) queries} using * the static methods defined on {@link TemporalQuery}. *

                              @@ -111,13 +111,14 @@ * * @implSpec * Implementations must check and handle all fields defined in {@link ChronoField}. - * If the field is supported, then true is returned, otherwise false + * If the field is supported, then true must be returned, otherwise false must be returned. *

                              * If the field is not a {@code ChronoField}, then the result of this method * is obtained by invoking {@code TemporalField.isSupportedBy(TemporalAccessor)} * passing {@code this} as the argument. *

                              - * Implementations must not alter either this object. + * Implementations must ensure that no observable state is altered when this + * read-only method is invoked. * * @param field the field to check, null returns false * @return true if this date-time can be queried for the field, false if not @@ -146,7 +147,8 @@ * is obtained by invoking {@code TemporalField.rangeRefinedBy(TemporalAccessorl)} * passing {@code this} as the argument. *

                              - * Implementations must not alter either this object. + * Implementations must ensure that no observable state is altered when this + * read-only method is invoked. *

                              * The default implementation must behave equivalent to this code: *

                              @@ -154,7 +156,7 @@
                                    *    if (isSupported(field)) {
                                    *      return field.range();
                                    *    }
                              -     *    throw new UnsupportedTemporalTypeException("Unsupported field: " + field.getName());
                              +     *    throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
                                    *  }
                                    *  return field.rangeRefinedBy(this);
                                    * 
                              @@ -169,7 +171,7 @@ if (isSupported(field)) { return field.range(); } - throw new UnsupportedTemporalTypeException("Unsupported field: " + field.getName()); + throw new UnsupportedTemporalTypeException("Unsupported field: " + field); } Objects.requireNonNull(field, "field"); return field.rangeRefinedBy(this); @@ -193,7 +195,8 @@ * is obtained by invoking {@code TemporalField.getFrom(TemporalAccessor)} * passing {@code this} as the argument. *

                              - * Implementations must not alter this object. + * Implementations must ensure that no observable state is altered when this + * read-only method is invoked. *

                              * The default implementation must behave equivalent to this code: *

                              @@ -240,7 +243,8 @@
                                    * is obtained by invoking {@code TemporalField.getFrom(TemporalAccessor)}
                                    * passing {@code this} as the argument.
                                    * 

                              - * Implementations must not alter either this object. + * Implementations must ensure that no observable state is altered when this + * read-only method is invoked. * * @param field the field to get, not null * @return the value for the field @@ -291,6 +295,9 @@ * } * return TemporalAccessor.super.query(query); *

                              + *

                              + * Implementations must ensure that no observable state is altered when this + * read-only method is invoked. * * @param the type of the result * @param query the query to invoke, not null diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/temporal/TemporalField.java --- a/jdk/src/share/classes/java/time/temporal/TemporalField.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/temporal/TemporalField.java Fri Aug 02 09:38:09 2013 +0100 @@ -62,6 +62,9 @@ package java.time.temporal; import java.time.DateTimeException; +import java.time.ZoneId; +import java.time.chrono.ChronoLocalDate; +import java.time.chrono.Chronology; import java.time.format.ResolverStyle; import java.util.Locale; import java.util.Map; @@ -93,29 +96,19 @@ public interface TemporalField { /** - * Gets a descriptive name for the field. - *

                              - * The should be of the format 'BaseOfRange', such as 'MonthOfYear', - * unless the field has a range of {@code FOREVER}, when only - * the base unit is mentioned, such as 'Year' or 'Era'. - * - * @return the name, not null - */ - String getName(); - - /** * Gets the display name for the field in the requested locale. *

                              - * If there is no display name for the locale the value of {@code getName} - * is returned. + * If there is no display name for the locale then a suitable default must be returned. + *

                              + * The default implementation must check the locale is not null + * and return {@code toString()}. * * @param locale the locale to use, not null - * @return the display name for the locale or the value of {@code getName}, - * not null + * @return the display name for the locale or a suitable default, not null */ default String getDisplayName(Locale locale) { - Objects.requireNonNull(locale, "local"); - return getName(); + Objects.requireNonNull(locale, "locale"); + return toString(); } /** @@ -164,28 +157,24 @@ *

                              * A field is date-based if it can be derived from * {@link ChronoField#EPOCH_DAY EPOCH_DAY}. - *

                              - * The default implementation must return false. + * Note that it is valid for both {@code isDateBased()} and {@code isTimeBased()} + * to return false, such as when representing a field like minute-of-week. * * @return true if this field is a component of a date */ - default boolean isDateBased() { - return false; - } + boolean isDateBased(); /** * Checks if this field represents a component of a time. *

                              * A field is time-based if it can be derived from * {@link ChronoField#NANO_OF_DAY NANO_OF_DAY}. - *

                              - * The default implementation must return false. + * Note that it is valid for both {@code isDateBased()} and {@code isTimeBased()} + * to return false, such as when representing a field like minute-of-week. * * @return true if this field is a component of a time */ - default boolean isTimeBased() { - return false; - } + boolean isTimeBased(); //----------------------------------------------------------------------- /** @@ -319,45 +308,79 @@ R adjustInto(R temporal, long newValue); /** - * Resolves this field to provide a simpler alternative. + * Resolves this field to provide a simpler alternative or a date. *

                              * This method is invoked during the resolve phase of parsing. * It is designed to allow application defined fields to be simplified into - * more standard fields, such as those on {@code ChronoField}. - *

                              - * The method will only be invoked if the specified temporal supports this field. - * The value of this field is provided. + * more standard fields, such as those on {@code ChronoField}, or into a date. *

                              - * The temporal must be queried using the methods of {@code TemporalAccessor}, - * not using {@code getFrom}, {@code isSupportedBy} or {@code rangeRefinedBy}. - * Before querying any field, implementations must ensure it is supported, as - * exceptions of this type would negatively affect the calculation of a parsed result. + * Applications should not normally invoke this method directly. + * + * @implSpec + * If an implementation represents a field that can be simplified, or + * combined with others, then this method must be implemented. + *

                              + * The specified map contains the current state of the parse. + * The map is mutable and must be mutated to resolve the field and + * any related fields. This method will only be invoked during parsing + * if the map contains this field, and implementations should therefore + * assume this field is present. *

                              - * If this field can resolve, it must return a map, if not it must return null. - * The returned map contains the changes to be made to the temporal, expressed - * as field-value pairs. If the value for a field is null, the field is to be - * removed from the temporal. A null key must not be added to the result map. + * Resolving a field will consist of looking at the value of this field, + * and potentially other fields, and either updating the map with a + * simpler value, such as a {@code ChronoField}, or returning a + * complete {@code ChronoLocalDate}. If a resolve is successful, + * the code must remove all the fields that were resolved from the map, + * including this field. + *

                              + * For example, the {@code IsoFields} class contains the quarter-of-year + * and day-of-quarter fields. The implementation of this method in that class + * resolves the two fields plus the {@link ChronoField#YEAR YEAR} into a + * complete {@code LocalDate}. The resolve method will remove all three + * fields from the map before returning the {@code LocalDate}. *

                              - * If the result is non-null, this field will be removed from the temporal. - * This field should not be added to the result map. + * If resolution should be possible, but the data is invalid, the resolver + * style should be used to determine an appropriate level of leniency, which + * may require throwing a {@code DateTimeException} or {@code ArithmeticException}. + * If no resolution is possible, the resolve method must return null. *

                              - * The {@link ResolverStyle} should be used by implementations to determine - * how to perform the resolve. + * When resolving time fields, the map will be altered and null returned. + * When resolving date fields, the date is normally returned from the method, + * with the map altered to remove the resolved fields. However, it would also + * be acceptable for the date fields to be resolved into other {@code ChronoField} + * instances that can produce a date, such as {@code EPOCH_DAY}. + *

                              + * The zone is not normally required for resolution, but is provided for completeness. *

                              * The default implementation must return null. * - * @param temporal the temporal to resolve, not null - * @param value the value of this field + * @param fieldValues the map of fields to values, which can be updated, not null + * @param chronology the effective chronology, not null + * @param zone the effective zone, not null * @param resolverStyle the requested type of resolve, not null - * @return a map of fields to update in the temporal, with a mapping to null - * indicating a deletion. The whole map must be null if no resolving occurred + * @return the resolved date; null if resolving only changed the map, + * or no resolve occurred + * @throws ArithmeticException if numeric overflow occurs * @throws DateTimeException if resolving results in an error. This must not be thrown * by querying a field on the temporal without first checking if it is supported - * @throws ArithmeticException if numeric overflow occurs */ - default Map resolve( - TemporalAccessor temporal, long value, ResolverStyle resolverStyle) { + default ChronoLocalDate resolve( + Map fieldValues, Chronology chronology, + ZoneId zone, ResolverStyle resolverStyle) { return null; } + /** + * Gets a descriptive name for the field. + *

                              + * The should be of the format 'BaseOfRange', such as 'MonthOfYear', + * unless the field has a range of {@code FOREVER}, when only + * the base unit is mentioned, such as 'Year' or 'Era'. + * + * @return the name of the field, not null + */ + @Override + String toString(); + + } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/temporal/TemporalUnit.java --- a/jdk/src/share/classes/java/time/temporal/TemporalUnit.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/temporal/TemporalUnit.java Fri Aug 02 09:38:09 2013 +0100 @@ -63,7 +63,11 @@ import java.time.DateTimeException; import java.time.Duration; +import java.time.LocalTime; import java.time.Period; +import java.time.chrono.ChronoLocalDate; +import java.time.chrono.ChronoLocalDateTime; +import java.time.chrono.ChronoZonedDateTime; /** * A unit of date-time, such as Days or Hours. @@ -93,15 +97,6 @@ public interface TemporalUnit { /** - * Gets a descriptive name for the unit. - *

                              - * This should be in the plural and upper-first camel case, such as 'Days' or 'Minutes'. - * - * @return the name, not null - */ - String getName(); - - /** * Gets the duration of this unit, which may be an estimate. *

                              * All units return a duration measured in standard nanoseconds from this method. @@ -132,6 +127,33 @@ //----------------------------------------------------------------------- /** + * Checks if this unit represents a component of a date. + *

                              + * A date is time-based if it can be used to imply meaning from a date. + * It must have a {@linkplain #getDuration() duration} that is an integral + * multiple of the length of a standard day. + * Note that it is valid for both {@code isDateBased()} and {@code isTimeBased()} + * to return false, such as when representing a unit like 36 hours. + * + * @return true if this unit is a component of a date + */ + boolean isDateBased(); + + /** + * Checks if this unit represents a component of a time. + *

                              + * A unit is time-based if it can be used to imply meaning from a time. + * It must have a {@linkplain #getDuration() duration} that divides into + * the length of a standard day without remainder. + * Note that it is valid for both {@code isDateBased()} and {@code isTimeBased()} + * to return false, such as when representing a unit like 36 hours. + * + * @return true if this unit is a component of a time + */ + boolean isTimeBased(); + + //----------------------------------------------------------------------- + /** * Checks if this unit is supported by the specified temporal object. *

                              * This checks that the implementing date-time can add/subtract this unit. @@ -144,6 +166,15 @@ * @return true if the unit is supported */ default boolean isSupportedBy(Temporal temporal) { + if (temporal instanceof LocalTime) { + return isTimeBased(); + } + if (temporal instanceof ChronoLocalDate) { + return isDateBased(); + } + if (temporal instanceof ChronoLocalDateTime || temporal instanceof ChronoZonedDateTime) { + return true; + } try { temporal.plus(1, this); return true; @@ -212,11 +243,11 @@ *

                              * There are two equivalent ways of using this method. * The first is to invoke this method directly. - * The second is to use {@link Temporal#periodUntil(Temporal, TemporalUnit)}: + * The second is to use {@link Temporal#until(Temporal, TemporalUnit)}: *

                                    *   // these two lines are equivalent
                                    *   between = thisUnit.between(start, end);
                              -     *   between = start.periodUntil(end, thisUnit);
                              +     *   between = start.until(end, thisUnit);
                                    * 
                              * The choice should be made based on which makes the code more readable. *

                              @@ -225,7 +256,7 @@ *

                                    *  long daysBetween = DAYS.between(start, end);
                                    *  // or alternatively
                              -     *  long daysBetween = start.periodUntil(end, DAYS);
                              +     *  long daysBetween = start.until(end, DAYS);
                                    * 
                              *

                              * Implementations should perform any queries or calculations using the units @@ -245,7 +276,9 @@ //----------------------------------------------------------------------- /** - * Outputs this unit as a {@code String} using the name. + * Gets a descriptive name for the unit. + *

                              + * This should be in the plural and upper-first camel case, such as 'Days' or 'Minutes'. * * @return the name of this unit, not null */ diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/temporal/ValueRange.java --- a/jdk/src/share/classes/java/time/temporal/ValueRange.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/temporal/ValueRange.java Fri Aug 02 09:38:09 2013 +0100 @@ -331,7 +331,7 @@ private String genInvalidFieldMessage(TemporalField field, long value) { if (field != null) { - return "Invalid value for " + field.getName() + " (valid values " + this + "): " + value; + return "Invalid value for " + field + " (valid values " + this + "): " + value; } else { return "Invalid value (valid values " + this + "): " + value; } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/time/temporal/WeekFields.java --- a/jdk/src/share/classes/java/time/temporal/WeekFields.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/time/temporal/WeekFields.java Fri Aug 02 09:38:09 2013 +0100 @@ -75,7 +75,9 @@ import java.io.InvalidObjectException; import java.io.Serializable; +import java.time.DateTimeException; import java.time.DayOfWeek; +import java.time.ZoneId; import java.time.chrono.ChronoLocalDate; import java.time.chrono.Chronology; import java.time.format.ResolverStyle; @@ -395,6 +397,11 @@ *

                              * For example, if the first day-of-week is Sunday, then that will have the * value 1, with other days ranging from Monday as 2 to Saturday as 7. + *

                              + * In the resolving phase of parsing, a localized day-of-week will be converted + * to a standardized {@code ChronoField} day-of-week. + * The day-of-week must be in the valid range 1 to 7. + * Other fields in this class build dates using the standardized day-of-week. * * @return a field providing access to the day-of-week with localized numbering, not null */ @@ -421,6 +428,26 @@ * - if the 5th day of the month is a Monday, week two starts on the 5th and the 1st to 4th is in week one
                              *

                              * This field can be used with any calendar system. + *

                              + * In the resolving phase of parsing, a date can be created from a year, + * week-of-month, month-of-year and day-of-week. + *

                              + * In {@linkplain ResolverStyle#STRICT strict mode}, all four fields are + * validated against their range of valid values. The week-of-month field + * is validated to ensure that the resulting month is the month requested. + *

                              + * In {@linkplain ResolverStyle#SMART smart mode}, all four fields are + * validated against their range of valid values. The week-of-month field + * is validated from 0 to 6, meaning that the resulting date can be in a + * different month to that specified. + *

                              + * In {@linkplain ResolverStyle#LENIENT lenient mode}, the year and day-of-week + * are validated against the range of valid values. The resulting date is calculated + * equivalent to the following four stage approach. + * First, create a date on the first day of the first week of January in the requested year. + * Then take the month-of-year, subtract one, and add the amount in months to the date. + * Then take the week-of-month, subtract one, and add the amount in weeks to the date. + * Finally, adjust to the correct day-of-week within the localized week. * * @return a field providing access to the week-of-month, not null */ @@ -447,6 +474,25 @@ * - if the 5th day of the year is a Monday, week two starts on the 5th and the 1st to 4th is in week one
                              *

                              * This field can be used with any calendar system. + *

                              + * In the resolving phase of parsing, a date can be created from a year, + * week-of-year and day-of-week. + *

                              + * In {@linkplain ResolverStyle#STRICT strict mode}, all three fields are + * validated against their range of valid values. The week-of-year field + * is validated to ensure that the resulting year is the year requested. + *

                              + * In {@linkplain ResolverStyle#SMART smart mode}, all three fields are + * validated against their range of valid values. The week-of-year field + * is validated from 0 to 54, meaning that the resulting date can be in a + * different year to that specified. + *

                              + * In {@linkplain ResolverStyle#LENIENT lenient mode}, the year and day-of-week + * are validated against the range of valid values. The resulting date is calculated + * equivalent to the following three stage approach. + * First, create a date on the first day of the first week in the requested year. + * Then take the week-of-year, subtract one, and add the amount in weeks to the date. + * Finally, adjust to the correct day-of-week within the localized week. * * @return a field providing access to the week-of-year, not null */ @@ -477,6 +523,26 @@ * the 1st to 4th is in week one
                              *

                              * This field can be used with any calendar system. + *

                              + * In the resolving phase of parsing, a date can be created from a week-based-year, + * week-of-year and day-of-week. + *

                              + * In {@linkplain ResolverStyle#STRICT strict mode}, all three fields are + * validated against their range of valid values. The week-of-year field + * is validated to ensure that the resulting week-based-year is the + * week-based-year requested. + *

                              + * In {@linkplain ResolverStyle#SMART smart mode}, all three fields are + * validated against their range of valid values. The week-of-week-based-year field + * is validated from 1 to 53, meaning that the resulting date can be in the + * following week-based-year to that specified. + *

                              + * In {@linkplain ResolverStyle#LENIENT lenient mode}, the year and day-of-week + * are validated against the range of valid values. The resulting date is calculated + * equivalent to the following three stage approach. + * First, create a date on the first day of the first week in the requested week-based-year. + * Then take the week-of-week-based-year, subtract one, and add the amount in weeks to the date. + * Finally, adjust to the correct day-of-week within the localized week. * * @return a field providing access to the week-of-week-based-year, not null */ @@ -499,6 +565,26 @@ * is in the last week of the previous year. *

                              * This field can be used with any calendar system. + *

                              + * In the resolving phase of parsing, a date can be created from a week-based-year, + * week-of-year and day-of-week. + *

                              + * In {@linkplain ResolverStyle#STRICT strict mode}, all three fields are + * validated against their range of valid values. The week-of-year field + * is validated to ensure that the resulting week-based-year is the + * week-based-year requested. + *

                              + * In {@linkplain ResolverStyle#SMART smart mode}, all three fields are + * validated against their range of valid values. The week-of-week-based-year field + * is validated from 1 to 53, meaning that the resulting date can be in the + * following week-based-year to that specified. + *

                              + * In {@linkplain ResolverStyle#LENIENT lenient mode}, the year and day-of-week + * are validated against the range of valid values. The resulting date is calculated + * equivalent to the following three stage approach. + * First, create a date on the first day of the first week in the requested week-based-year. + * Then take the week-of-week-based-year, subtract one, and add the amount in weeks to the date. + * Finally, adjust to the correct day-of-week within the localized week. * * @return a field providing access to the week-based-year, not null */ @@ -615,9 +701,9 @@ * @param dow the day of the week * @return a ChronoLocalDate for the requested year, week of year, and day of week */ - private ChronoLocalDate ofWeekBasedYear(Chronology chrono, + private ChronoLocalDate ofWeekBasedYear(Chronology chrono, int yowby, int wowby, int dow) { - ChronoLocalDate date = chrono.date(yowby, 1, 1); + ChronoLocalDate date = chrono.date(yowby, 1, 1); int ldow = localizedDayOfWeek(date); int offset = startOfWeekOffset(1, ldow); @@ -671,6 +757,11 @@ return Math.floorMod(isoDow - sow, 7) + 1; } + private int localizedDayOfWeek(int isoDow) { + int sow = weekDef.getFirstDayOfWeek().getValue(); + return Math.floorMod(isoDow - sow, 7) + 1; + } + private long localizedWeekOfMonth(TemporalAccessor temporal) { int dow = localizedDayOfWeek(temporal); int dom = temporal.get(DAY_OF_MONTH); @@ -800,75 +891,121 @@ } @Override - public Map resolve(TemporalAccessor temporal, long value, ResolverStyle resolverStyle) { - int newValue = range.checkValidIntValue(value, this); - int sow = weekDef.getFirstDayOfWeek().getValue(); + public ChronoLocalDate resolve( + Map fieldValues, Chronology chronology, ZoneId zone, ResolverStyle resolverStyle) { + final long value = fieldValues.get(this); + final int newValue = Math.toIntExact(value); // broad limit makes overflow checking lighter + // first convert localized day-of-week to ISO day-of-week + // doing this first handles case where both ISO and localized were parsed and might mismatch + // day-of-week is always strict as two different day-of-week values makes lenient complex if (rangeUnit == WEEKS) { // day-of-week - int isoDow = Math.floorMod((sow - 1) + (newValue - 1), 7) + 1; - return Collections.singletonMap(DAY_OF_WEEK, (long) isoDow); - } - if (temporal.isSupported(DAY_OF_WEEK) == false) { + final int checkedValue = range.checkValidIntValue(value, this); // no leniency as too complex + final int startDow = weekDef.getFirstDayOfWeek().getValue(); + long isoDow = Math.floorMod((startDow - 1) + (checkedValue - 1), 7) + 1; + fieldValues.remove(this); + fieldValues.put(DAY_OF_WEEK, isoDow); return null; } - Chronology chrono = Chronology.from(temporal); // defaults to ISO - int dow = localizedDayOfWeek(temporal); - if (temporal.isSupported(YEAR)) { - int year = temporal.get(YEAR); - if (rangeUnit == MONTHS) { // week-of-month - if (temporal.isSupported(MONTH_OF_YEAR) == false) { - return null; - } - int month = temporal.get(ChronoField.MONTH_OF_YEAR); - @SuppressWarnings("rawtypes") - ChronoLocalDate date = chrono.date(year, month, 1); - int dateDow = localizedDayOfWeek(date); - long weeks = newValue - localizedWeekOfMonth(date); - int days = dow - dateDow; - date = date.plus(weeks * 7 + days, DAYS); - Map result = new HashMap<>(4, 1.0f); - result.put(EPOCH_DAY, date.toEpochDay()); - result.put(YEAR, null); - result.put(MONTH_OF_YEAR, null); - result.put(DAY_OF_WEEK, null); - return result; - } else if (rangeUnit == YEARS) { // week-of-year - @SuppressWarnings("rawtypes") - ChronoLocalDate date = chrono.date(year, 1, 1); - int dateDow = localizedDayOfWeek(date); - long weeks = newValue - localizedWeekOfYear(date); - int days = dow - dateDow; - date = date.plus(weeks * 7 + days, DAYS); - Map result = new HashMap<>(4, 1.0f); - result.put(EPOCH_DAY, date.toEpochDay()); - result.put(YEAR, null); - result.put(DAY_OF_WEEK, null); - return result; + + // can only build date if ISO day-of-week is present + if (fieldValues.containsKey(DAY_OF_WEEK) == false) { + return null; + } + int isoDow = DAY_OF_WEEK.checkValidIntValue(fieldValues.get(DAY_OF_WEEK)); + int dow = localizedDayOfWeek(isoDow); + + // build date + if (fieldValues.containsKey(YEAR)) { + int year = YEAR.checkValidIntValue(fieldValues.get(YEAR)); // validate + if (rangeUnit == MONTHS && fieldValues.containsKey(MONTH_OF_YEAR)) { // week-of-month + long month = fieldValues.get(MONTH_OF_YEAR); // not validated yet + return resolveWoM(fieldValues, chronology, year, month, newValue, dow, resolverStyle); } - } else if (rangeUnit == WEEK_BASED_YEARS || rangeUnit == FOREVER) { - if (temporal.isSupported(weekDef.weekBasedYear) && - temporal.isSupported(weekDef.weekOfWeekBasedYear)) { - // week-of-week-based-year and year-of-week-based-year - int yowby = temporal.get(weekDef.weekBasedYear); - int wowby = temporal.get(weekDef.weekOfWeekBasedYear); - ChronoLocalDate date = ofWeekBasedYear(Chronology.from(temporal), yowby, wowby, dow); - - Map result = new HashMap<>(4, 1.0f); - result.put(EPOCH_DAY, date.toEpochDay()); - result.put(DAY_OF_WEEK, null); - result.put(weekDef.weekOfWeekBasedYear, null); - result.put(weekDef.weekBasedYear, null); - return result; + if (rangeUnit == YEARS) { // week-of-year + return resolveWoY(fieldValues, chronology, year, newValue, dow, resolverStyle); } + } else if ((rangeUnit == WEEK_BASED_YEARS || rangeUnit == FOREVER) && + fieldValues.containsKey(weekDef.weekBasedYear) && + fieldValues.containsKey(weekDef.weekOfWeekBasedYear)) { // week-of-week-based-year and year-of-week-based-year + return resolveWBY(fieldValues, chronology, dow, resolverStyle); } return null; } - //----------------------------------------------------------------------- - @Override - public String getName() { - return name; + private ChronoLocalDate resolveWoM( + Map fieldValues, Chronology chrono, int year, long month, long wom, int localDow, ResolverStyle resolverStyle) { + ChronoLocalDate date; + if (resolverStyle == ResolverStyle.LENIENT) { + date = chrono.date(year, 1, 1).plus(Math.subtractExact(month, 1), MONTHS); + long weeks = Math.subtractExact(wom, localizedWeekOfMonth(date)); + int days = localDow - localizedDayOfWeek(date); // safe from overflow + date = date.plus(Math.addExact(Math.multiplyExact(weeks, 7), days), DAYS); + } else { + int monthValid = MONTH_OF_YEAR.checkValidIntValue(month); // validate + date = chrono.date(year, monthValid, 1); + int womInt = range.checkValidIntValue(wom, this); // validate + int weeks = (int) (womInt - localizedWeekOfMonth(date)); // safe from overflow + int days = localDow - localizedDayOfWeek(date); // safe from overflow + date = date.plus(weeks * 7 + days, DAYS); + if (resolverStyle == ResolverStyle.STRICT && date.getLong(MONTH_OF_YEAR) != month) { + throw new DateTimeException("Strict mode rejected resolved date as it is in a different month"); + } + } + fieldValues.remove(this); + fieldValues.remove(YEAR); + fieldValues.remove(MONTH_OF_YEAR); + fieldValues.remove(DAY_OF_WEEK); + return date; } + private ChronoLocalDate resolveWoY( + Map fieldValues, Chronology chrono, int year, long woy, int localDow, ResolverStyle resolverStyle) { + ChronoLocalDate date = chrono.date(year, 1, 1); + if (resolverStyle == ResolverStyle.LENIENT) { + long weeks = Math.subtractExact(woy, localizedWeekOfYear(date)); + int days = localDow - localizedDayOfWeek(date); // safe from overflow + date = date.plus(Math.addExact(Math.multiplyExact(weeks, 7), days), DAYS); + } else { + int womInt = range.checkValidIntValue(woy, this); // validate + int weeks = (int) (womInt - localizedWeekOfYear(date)); // safe from overflow + int days = localDow - localizedDayOfWeek(date); // safe from overflow + date = date.plus(weeks * 7 + days, DAYS); + if (resolverStyle == ResolverStyle.STRICT && date.getLong(YEAR) != year) { + throw new DateTimeException("Strict mode rejected resolved date as it is in a different year"); + } + } + fieldValues.remove(this); + fieldValues.remove(YEAR); + fieldValues.remove(DAY_OF_WEEK); + return date; + } + + private ChronoLocalDate resolveWBY( + Map fieldValues, Chronology chrono, int localDow, ResolverStyle resolverStyle) { + int yowby = weekDef.weekBasedYear.range().checkValidIntValue( + fieldValues.get(weekDef.weekBasedYear), weekDef.weekBasedYear); + ChronoLocalDate date; + if (resolverStyle == ResolverStyle.LENIENT) { + date = ofWeekBasedYear(chrono, yowby, 1, localDow); + long wowby = fieldValues.get(weekDef.weekOfWeekBasedYear); + long weeks = Math.subtractExact(wowby, 1); + date = date.plus(weeks, WEEKS); + } else { + int wowby = weekDef.weekOfWeekBasedYear.range().checkValidIntValue( + fieldValues.get(weekDef.weekOfWeekBasedYear), weekDef.weekOfWeekBasedYear); // validate + date = ofWeekBasedYear(chrono, yowby, wowby, localDow); + if (resolverStyle == ResolverStyle.STRICT && localizedWeekBasedYear(date) != yowby) { + throw new DateTimeException("Strict mode rejected resolved date as it is in a different week-based-year"); + } + } + fieldValues.remove(this); + fieldValues.remove(weekDef.weekBasedYear); + fieldValues.remove(weekDef.weekOfWeekBasedYear); + fieldValues.remove(DAY_OF_WEEK); + return date; + } + + //----------------------------------------------------------------------- @Override public String getDisplayName(Locale locale) { Objects.requireNonNull(locale, "locale"); @@ -876,9 +1013,9 @@ LocaleResources lr = LocaleProviderAdapter.getResourceBundleBased() .getLocaleResources(locale); ResourceBundle rb = lr.getJavaTimeFormatData(); - return rb.containsKey("field.week") ? rb.getString("field.week") : getName(); + return rb.containsKey("field.week") ? rb.getString("field.week") : name; } - return getName(); + return name; } @Override @@ -897,6 +1034,11 @@ } @Override + public boolean isTimeBased() { + return false; + } + + @Override public ValueRange range() { return range; } @@ -988,7 +1130,7 @@ //----------------------------------------------------------------------- @Override public String toString() { - return getName() + "[" + weekDef.toString() + "]"; + return name + "[" + weekDef.toString() + "]"; } } } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/List.java --- a/jdk/src/share/classes/java/util/List.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/List.java Fri Aug 02 09:38:09 2013 +0100 @@ -384,10 +384,12 @@ * @implSpec * The default implementation is equivalent to, for this {@code list}: *

                              +     * {@code
                                    * final ListIterator li = list.listIterator();
                                    * while (li.hasNext()) {
                                    *   li.set(operator.apply(li.next()));
                                    * }
                              +     * }
                                    * 
                              * If the list's list-iterator does not support the {@code set} operation * then an {@code UnsupportedOperationException} will be thrown when diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/Map.java --- a/jdk/src/share/classes/java/util/Map.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/Map.java Fri Aug 02 09:38:09 2013 +0100 @@ -561,6 +561,7 @@ * concurrency properties. * * @param key the key whose associated value is to be returned + * @param defaultValue the default mapping of the key * @return the value to which the specified key is mapped, or * {@code defaultValue} if this map contains no mapping for the key * @throws ClassCastException if the key is of an inappropriate type for diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/Optional.java --- a/jdk/src/share/classes/java/util/Optional.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/Optional.java Fri Aug 02 09:38:09 2013 +0100 @@ -93,6 +93,7 @@ /** * Returns an {@code Optional} with the specified present non-null value. * + * @param the class of the value * @param value the value to be present, which must be non-null * @return an {@code Optional} with the value present */ @@ -104,6 +105,7 @@ * Returns an {@code Optional} describing the specified value, if non-null, * otherwise returns an empty {@code Optional}. * + * @param the class of the value * @param value the possibly-null value to describe * @return an {@code Optional} with a present value if the specified value * is non-null, otherwise an empty {@code Optional} diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/PriorityQueue.java --- a/jdk/src/share/classes/java/util/PriorityQueue.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/PriorityQueue.java Fri Aug 02 09:38:09 2013 +0100 @@ -136,6 +136,19 @@ } /** + * Creates a {@code PriorityQueue} with the default initial capacity and + * whose elements are ordered according to the specified comparator. + * + * @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. + * @since 1.8 + */ + public PriorityQueue(Comparator comparator) { + this(DEFAULT_INITIAL_CAPACITY, comparator); + } + + /** * Creates a {@code PriorityQueue} with the specified initial capacity * that orders its elements according to the specified comparator. * diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/Random.java --- a/jdk/src/share/classes/java/util/Random.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/Random.java Fri Aug 02 09:38:09 2013 +0100 @@ -225,9 +225,8 @@ * Returns the next pseudorandom, uniformly distributed {@code int} * value from this random number generator's sequence. The general * contract of {@code nextInt} is that one {@code int} value is - * pseudorandomly generated and returned. All 232 - * possible {@code int} values are produced with - * (approximately) equal probability. + * pseudorandomly generated and returned. All 232 possible + * {@code int} values are produced with (approximately) equal probability. * *

                              The method {@code nextInt} is implemented by class {@code Random} * as if by: @@ -370,11 +369,9 @@ *

                              The general contract of {@code nextFloat} is that one * {@code float} value, chosen (approximately) uniformly from the * range {@code 0.0f} (inclusive) to {@code 1.0f} (exclusive), is - * pseudorandomly generated and returned. All 224 possible {@code float} values - * of the form m x 2-24, where m is a positive - * integer less than 224 , are + * pseudorandomly generated and returned. All 224 possible + * {@code float} values of the form m x 2-24, + * where m is a positive integer less than 224, are * produced with (approximately) equal probability. * *

                              The method {@code nextFloat} is implemented by class {@code Random} diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/Scanner.java --- a/jdk/src/share/classes/java/util/Scanner.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/Scanner.java Fri Aug 02 09:38:09 2013 +0100 @@ -76,7 +76,7 @@ * }

                              *

                              * prints the following output: - *

                              {@code
                              + * 
                              {@code
                                *     1
                                *     2
                                *     red
                              @@ -149,8 +149,7 @@
                                * {@link #reset} method will reset the value of the scanner's radix to
                                * 10 regardless of whether it was previously changed.
                                *
                              - * 
                              - * 

                              Localized numbers

                              + *

                              Localized numbers

                              * *

                              An instance of this class is capable of scanning numbers in the standard * formats as well as in the formats of the scanner's locale. A scanner's @@ -167,186 +166,139 @@ * {@link java.text.DecimalFormatSymbols DecimalFormatSymbols} object, * dfs. * - *

                            Date and Time Pattern * Result *
                            "yyyy.MM.dd G 'at' HH:mm:ss z" * 2001.07.04 AD at 12:08:56 PDT - *
                            "EEE, MMM d, ''yy" * Wed, Jul 4, '01 *
                            "h:mm a" * 12:08 PM - *
                            "hh 'o''clock' a, zzzz" * 12 o'clock PM, Pacific Daylight Time *
                            "K:mm a, z" * 0:08 PM, PDT - *
                            "yyyyy.MMMMM.dd GGG hh:mm aaa" * 02001.July.04 AD 12:08 PM *
                            "EEE, d MMM yyyy HH:mm:ss Z" * Wed, 4 Jul 2001 12:08:56 -0700 - *
                            "yyMMddHHmmssZ" * 010704120856-0700 *
                            "yyyy-MM-dd'T'HH:mm:ss.SSSZ" * 2001-07-04T12:08:56.235-0700 - *
                            "yyyy-MM-dd'T'HH:mm:ss.SSSXXX" * 2001-07-04T12:08:56.235-07:00 *
                            Hijrah-umalquraislamic-umalquraca-islamic-cv-umalquraca-islamic-umalquraIslamic - Umm Al-Qura calendar of Saudi Arabia
                            - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
                            LocalGroupSeparator  The character used to separate thousands groups, - * i.e., dfs.{@link - * java.text.DecimalFormatSymbols#getGroupingSeparator - * getGroupingSeparator()}
                            LocalDecimalSeparator  The character used for the decimal point, - * i.e., dfs.{@link - * java.text.DecimalFormatSymbols#getDecimalSeparator - * getDecimalSeparator()}
                            LocalPositivePrefix  The string that appears before a positive number (may - * be empty), i.e., df.{@link - * java.text.DecimalFormat#getPositivePrefix - * getPositivePrefix()}
                            LocalPositiveSuffix  The string that appears after a positive number (may be - * empty), i.e., df.{@link - * java.text.DecimalFormat#getPositiveSuffix - * getPositiveSuffix()}
                            LocalNegativePrefix  The string that appears before a negative number (may - * be empty), i.e., df.{@link - * java.text.DecimalFormat#getNegativePrefix - * getNegativePrefix()}
                            LocalNegativeSuffix  The string that appears after a negative number (may be - * empty), i.e., df.{@link - * java.text.DecimalFormat#getNegativeSuffix - * getNegativeSuffix()}
                            LocalNaN  The string that represents not-a-number for - * floating-point values, - * i.e., dfs.{@link - * java.text.DecimalFormatSymbols#getNaN - * getNaN()}
                            LocalInfinity  The string that represents infinity for floating-point - * values, i.e., dfs.{@link - * java.text.DecimalFormatSymbols#getInfinity - * getInfinity()}
                            + *
                            + *
                            LocalGroupSeparator   + *
                            The character used to separate thousands groups, + * i.e., dfs.{@link + * java.text.DecimalFormatSymbols#getGroupingSeparator + * getGroupingSeparator()} + *
                            LocalDecimalSeparator   + *
                            The character used for the decimal point, + * i.e., dfs.{@link + * java.text.DecimalFormatSymbols#getDecimalSeparator + * getDecimalSeparator()} + *
                            LocalPositivePrefix   + *
                            The string that appears before a positive number (may + * be empty), i.e., df.{@link + * java.text.DecimalFormat#getPositivePrefix + * getPositivePrefix()} + *
                            LocalPositiveSuffix   + *
                            The string that appears after a positive number (may be + * empty), i.e., df.{@link + * java.text.DecimalFormat#getPositiveSuffix + * getPositiveSuffix()} + *
                            LocalNegativePrefix   + *
                            The string that appears before a negative number (may + * be empty), i.e., df.{@link + * java.text.DecimalFormat#getNegativePrefix + * getNegativePrefix()} + *
                            LocalNegativeSuffix   + *
                            The string that appears after a negative number (may be + * empty), i.e., df.{@link + * java.text.DecimalFormat#getNegativeSuffix + * getNegativeSuffix()} + *
                            LocalNaN   + *
                            The string that represents not-a-number for + * floating-point values, + * i.e., dfs.{@link + * java.text.DecimalFormatSymbols#getNaN + * getNaN()} + *
                            LocalInfinity   + *
                            The string that represents infinity for floating-point + * values, i.e., dfs.{@link + * java.text.DecimalFormatSymbols#getInfinity + * getInfinity()} + *
                            * - * - *

                            Number syntax

                            + *

                            Number syntax

                            * *

                            The strings that can be parsed as numbers by an instance of this class * are specified in terms of the following regular-expression grammar, where - * Rmax is the highest digit in the radix being used (for example, Rmax is 9 - * in base 10). + * Rmax is the highest digit in the radix being used (for example, Rmax is 9 in base 10). * *

                            - * - * - * - * - * - * + * returns true * - * - * - * - * + *
                            Non0Digit: + *
                            [1-Rmax] | NonASCIIDigit * - *
                            - * - * - * + *
                            Digit: + *
                            [0-Rmax] | NonASCIIDigit * - *
                            - * + *
                            GroupedNumeral: + *
                            Non0Digit + * Digit? + * Digit? + *
                                LocalGroupSeparator + * Digit + * Digit + * Digit )+ ) * - *
                            - * - * - * - * - * + *
                            Numeral: + *
                            ( ( Digit+ ) + * | GroupedNumeral ) * - *
                            - * - * - * - * - * - * - * + *
                            Integer: + *
                            ( [-+]? ( Numeral + * ) ) + *
                            | LocalPositivePrefix Numeral + * LocalPositiveSuffix + *
                            | LocalNegativePrefix Numeral + * LocalNegativeSuffix * - *
                            - * - * - * - * - * + *
                            DecimalNumeral: + *
                            Numeral + *
                            | Numeral + * LocalDecimalSeparator + * Digit* + *
                            | LocalDecimalSeparator + * Digit+ * - *
                            - * - * - * + *
                            Exponent: + *
                            ( [eE] [+-]? Digit+ ) * - *
                            + *
                            Decimal: + *
                            ( [-+]? DecimalNumeral + * Exponent? ) + *
                            | LocalPositivePrefix + * DecimalNumeral + * LocalPositiveSuffix + * Exponent? + *
                            | LocalNegativePrefix + * DecimalNumeral + * LocalNegativeSuffix + * Exponent? * - *
                            - * - * - * - * - * + *
                            HexFloat: + *
                            [-+]? 0[xX][0-9a-fA-F]*\.[0-9a-fA-F]+ + * ([pP][-+]?[0-9]+)? * - *
                            - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * + * | LocalInfinity * - * + *
                            SignedNonNumber: + *
                            ( [-+]? NonNumber ) + *
                            | LocalPositivePrefix + * NonNumber + * LocalPositiveSuffix + *
                            | LocalNegativePrefix + * NonNumber + * LocalNegativeSuffix * - *
                            - * - * - * - * - * + *
                            Float: + *
                            Decimal + * | HexFloat + * | SignedNonNumber * - *
                            NonASCIIDigit  ::= A non-ASCII character c for which + *
                            + *
                            NonAsciiDigit: + *
                            A non-ASCII character c for which * {@link java.lang.Character#isDigit Character.isDigit}(c) - * returns true
                             
                            Non0Digit  ::= [1-Rmax] | NonASCIIDigit
                             
                            Digit  ::= [0-Rmax] | NonASCIIDigit
                             
                            GroupedNumeral  :: - * - * - * - * - * - *
                            = ( Non0Digit - * Digit? - * Digit?
                            LocalGroupSeparator - * Digit - * Digit - * Digit )+ )
                             
                            Numeral  ::= ( ( Digit+ ) - * | GroupedNumeral )
                             
                            - * Integer  ::= ( [-+]? ( Numeral - * ) )
                            | LocalPositivePrefix Numeral - * LocalPositiveSuffix
                            | LocalNegativePrefix Numeral - * LocalNegativeSuffix
                             
                            DecimalNumeral  ::= Numeral
                            | Numeral - * LocalDecimalSeparator - * Digit*
                            | LocalDecimalSeparator - * Digit+
                             
                            Exponent  ::= ( [eE] [+-]? Digit+ )
                             
                            - * Decimal  ::= ( [-+]? DecimalNumeral - * Exponent? )
                            | LocalPositivePrefix - * DecimalNumeral - * LocalPositiveSuffix - * Exponent?
                            | LocalNegativePrefix - * DecimalNumeral - * LocalNegativeSuffix - * Exponent?
                             
                            HexFloat  ::= [-+]? 0[xX][0-9a-fA-F]*\.[0-9a-fA-F]+ - * ([pP][-+]?[0-9]+)?
                             
                            NonNumber  ::= NaN + *
                            NonNumber: + *
                            NaN * | LocalNan * | Infinity - * | LocalInfinity
                             
                            SignedNonNumber  ::= ( [-+]? NonNumber )
                            | LocalPositivePrefix - * NonNumber - * LocalPositiveSuffix
                            | LocalNegativePrefix - * NonNumber - * LocalNegativeSuffix
                             
                            - * Float  ::= Decimal
                            | HexFloat
                            | SignedNonNumber
                            - * - * - *

                            Whitespace is not significant in the above regular expressions. + * + *

                            Whitespace is not significant in the above regular expressions. * * @since 1.5 */ @@ -1675,6 +1627,7 @@ * findWithinHorizon(Pattern.compile(pattern, horizon)). * * @param pattern a string specifying the pattern to search for + * @param horizon the search horizon * @return the text that matched the specified pattern * @throws IllegalStateException if this scanner is closed * @throws IllegalArgumentException if horizon is negative @@ -1709,6 +1662,7 @@ * thrown. * * @param pattern the pattern to scan for + * @param horizon the search horizon * @return the text that matched the specified pattern * @throws IllegalStateException if this scanner is closed * @throws IllegalArgumentException if horizon is negative diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/ServiceLoader.java --- a/jdk/src/share/classes/java/util/ServiceLoader.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/ServiceLoader.java Fri Aug 02 09:38:09 2013 +0100 @@ -68,12 +68,13 @@ * *

                            A service provider is identified by placing a * provider-configuration file in the resource directory - * META-INF/services. The file's name is the fully-qualified META-INF/services. The file's name is the fully-qualified binary name of the service's type. * The file contains a list of fully-qualified binary names of concrete * provider classes, one per line. Space and tab characters surrounding each * name, as well as blank lines, are ignored. The comment character is - * '#' ('\u0023', NUMBER SIGN); on + * '#' ('\u0023', + * NUMBER SIGN); on * each line all characters following the first comment character are ignored. * The file must be encoded in UTF-8. * @@ -484,6 +485,8 @@ * Creates a new service loader for the given service type and class * loader. * + * @param the class of the service type + * * @param service * The interface or abstract class representing the service * @@ -517,6 +520,8 @@ * ServiceLoader.load(service, * Thread.currentThread().getContextClassLoader()) * + * @param the class of the service type + * * @param service * The interface or abstract class representing the service * @@ -546,6 +551,8 @@ * have been installed into the current Java virtual machine; providers on * the application's class path will be ignored. * + * @param the class of the service type + * * @param service * The interface or abstract class representing the service * diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/StringJoiner.java --- a/jdk/src/share/classes/java/util/StringJoiner.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/StringJoiner.java Fri Aug 02 09:38:09 2013 +0100 @@ -202,15 +202,17 @@ * @param other The {@code StringJoiner} whose contents should be merged * into this one * @throws NullPointerException if the other {@code StringJoiner} is null + * @return This {@code StringJoiner} */ public StringJoiner merge(StringJoiner other) { Objects.requireNonNull(other); if (other.value != null) { + final int length = other.value.length(); + // lock the length so that we can seize the data to be appended + // before initiate copying to avoid interference, especially when + // merge 'this' StringBuilder builder = prepareBuilder(); - StringBuilder otherBuilder = other.value; - if (other.prefix.length() < otherBuilder.length()) { - builder.append(otherBuilder, other.prefix.length(), otherBuilder.length()); - } + builder.append(other.value, other.prefix.length(), length); } return this; } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/TimeZone.java --- a/jdk/src/share/classes/java/util/TimeZone.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/TimeZone.java Fri Aug 02 09:38:09 2013 +0100 @@ -118,7 +118,7 @@ * * For example, TimeZone.getTimeZone("GMT-8").getID() returns "GMT-08:00". * - *

                            Three-letter time zone IDs

                            + *

                            Three-letter time zone IDs

                            * * For compatibility with JDK 1.1.x, some other three-letter time zone IDs * (such as "PST", "CTT", "AST") are also supported. However, their @@ -304,10 +304,10 @@ * presentation to the user in the default locale. * *

                            This method is equivalent to: - *

                            + *
                                  * getDisplayName(false, {@link #LONG},
                                  *                Locale.getDefault({@link Locale.Category#DISPLAY}))
                            -     * 
                            + * * * @return the human-readable name of this time zone in the default locale. * @since 1.2 @@ -325,9 +325,9 @@ * presentation to the user in the specified {@code locale}. * *

                            This method is equivalent to: - *

                            + *
                                  * getDisplayName(false, {@link #LONG}, locale)
                            -     * 
                            + * * * @param locale the locale in which to supply the display name. * @return the human-readable name of this time zone in the given locale. @@ -347,10 +347,10 @@ * Time). Otherwise, a Standard Time name is returned. * *

                            This method is equivalent to: - *

                            + *
                                  * getDisplayName(daylight, style,
                                  *                Locale.getDefault({@link Locale.Category#DISPLAY}))
                            -     * 
                            + * * * @param daylight {@code true} specifying a Daylight Saving Time name, or * {@code false} specifying a Standard Time name diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/TreeMap.java --- a/jdk/src/share/classes/java/util/TreeMap.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/TreeMap.java Fri Aug 02 09:38:09 2013 +0100 @@ -25,6 +25,7 @@ package java.util; +import java.io.Serializable; import java.util.function.BiConsumer; import java.util.function.BiFunction; import java.util.function.Consumer; @@ -2865,7 +2866,7 @@ } public int characteristics() { - return (side == 0 ? Spliterator.SIZED : 0); + return (side == 0 ? Spliterator.SIZED : 0) | Spliterator.ORDERED; } } @@ -2942,9 +2943,23 @@ } @Override - public Comparator> getComparator() { - return tree.comparator != null ? - Map.Entry.comparingByKey(tree.comparator) : null; + public Comparator> getComparator() { + // Since SORTED is reported and Map.Entry elements are not comparable + // then a non-null comparator needs to be returned + if (tree.comparator != null) { + // Adapt the existing non-null comparator to compare entries + // by key + return Map.Entry.comparingByKey(tree.comparator); + } + else { + // Return a comparator of entries by key, with K assumed to be + // of Comparable + return (Comparator> & Serializable) (e1, e2) -> { + @SuppressWarnings("unchecked") + Comparable k1 = (Comparable) e1.getKey(); + return k1.compareTo(e2.getKey()); + }; + } } } } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/UUID.java --- a/jdk/src/share/classes/java/util/UUID.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/UUID.java Fri Aug 02 09:38:09 2013 +0100 @@ -286,6 +286,7 @@ * * @throws UnsupportedOperationException * If this UUID is not a version 1 UUID + * @return The timestamp of this {@code UUID}. */ public long timestamp() { if (version() != 1) { diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/Vector.java --- a/jdk/src/share/classes/java/util/Vector.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/Vector.java Fri Aug 02 09:38:09 2013 +0100 @@ -45,9 +45,9 @@ * capacity of a vector before inserting a large number of * components; this reduces the amount of incremental reallocation. * - *

                            + *

                            * The iterators returned by this class's {@link #iterator() iterator} and - * {@link #listIterator(int) listIterator} methods are fail-fast: + * {@link #listIterator(int) listIterator} methods are fail-fast: * if the vector is structurally modified at any time after the iterator is * created, in any way except through the iterator's own * {@link ListIterator#remove() remove} or diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/concurrent/AbstractExecutorService.java --- a/jdk/src/share/classes/java/util/concurrent/AbstractExecutorService.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/concurrent/AbstractExecutorService.java Fri Aug 02 09:38:09 2013 +0100 @@ -76,6 +76,7 @@ * * @param runnable the runnable task being wrapped * @param value the default value for the returned future + * @param the type of the given value * @return a {@code RunnableFuture} which, when run, will run the * underlying runnable and which, as a {@code Future}, will yield * the given value as its result and provide for cancellation of @@ -90,6 +91,7 @@ * Returns a {@code RunnableFuture} for the given callable task. * * @param callable the callable task being wrapped + * @param the type of the callable's result * @return a {@code RunnableFuture} which, when run, will call the * underlying callable and which, as a {@code Future}, will yield * the callable's result as its result and provide for diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/concurrent/ConcurrentHashMap.java --- a/jdk/src/share/classes/java/util/concurrent/ConcurrentHashMap.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/concurrent/ConcurrentHashMap.java Fri Aug 02 09:38:09 2013 +0100 @@ -265,7 +265,8 @@ * @param the type of keys maintained by this map * @param the type of mapped values */ -public class ConcurrentHashMap extends AbstractMap implements ConcurrentMap, Serializable { +public class ConcurrentHashMap extends AbstractMap + implements ConcurrentMap, Serializable { private static final long serialVersionUID = 7249069246763182397L; /* @@ -439,16 +440,18 @@ * related operations (which is the main reason we cannot use * existing collections such as TreeMaps). TreeBins contain * Comparable elements, but may contain others, as well as - * elements that are Comparable but not necessarily Comparable - * for the same T, so we cannot invoke compareTo among them. To - * handle this, the tree is ordered primarily by hash value, then - * by Comparable.compareTo order if applicable. On lookup at a - * node, if elements are not comparable or compare as 0 then both - * left and right children may need to be searched in the case of - * tied hash values. (This corresponds to the full list search - * that would be necessary if all elements were non-Comparable and - * had tied hashes.) The red-black balancing code is updated from - * pre-jdk-collections + * elements that are Comparable but not necessarily Comparable for + * the same T, so we cannot invoke compareTo among them. To handle + * this, the tree is ordered primarily by hash value, then by + * Comparable.compareTo order if applicable. On lookup at a node, + * if elements are not comparable or compare as 0 then both left + * and right children may need to be searched in the case of tied + * hash values. (This corresponds to the full list search that + * would be necessary if all elements were non-Comparable and had + * tied hashes.) On insertion, to keep a total ordering (or as + * close as is required here) across rebalancings, we compare + * classes and identityHashCodes as tie-breakers. The red-black + * balancing code is updated from pre-jdk-collections * (http://gee.cs.oswego.edu/dl/classes/collections/RBCell.java) * based in turn on Cormen, Leiserson, and Rivest "Introduction to * Algorithms" (CLR). @@ -478,6 +481,10 @@ * unused "Segment" class that is instantiated in minimal form * only when serializing. * + * Also, solely for compatibility with previous versions of this + * class, it extends AbstractMap, even though all of its methods + * are overridden, so it is just useless baggage. + * * This file is organized to make things a little easier to follow * while reading than they might otherwise: First the main static * declarations and utilities, then fields, then main public @@ -1352,6 +1359,7 @@ * Saves the state of the {@code ConcurrentHashMap} instance to a * stream (i.e., serializes it). * @param s the stream + * @throws java.io.IOException if an I/O error occurs * @serialData * the key (Object) and value (Object) * for each key-value mapping, followed by a null pair. @@ -1394,6 +1402,9 @@ /** * Reconstitutes the instance from a stream (that is, deserializes it). * @param s the stream + * @throws ClassNotFoundException if the class of a serialized object + * could not be found + * @throws java.io.IOException if an I/O error occurs */ private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException { @@ -2080,6 +2091,7 @@ * Creates a new {@link Set} backed by a ConcurrentHashMap * from the given type to {@code Boolean.TRUE}. * + * @param the element type of the returned set * @return the new set * @since 1.8 */ @@ -2094,9 +2106,10 @@ * * @param initialCapacity The implementation performs internal * sizing to accommodate this many elements. + * @param the element type of the returned set + * @return the new set * @throws IllegalArgumentException if the initial capacity of * elements is negative - * @return the new set * @since 1.8 */ public static KeySetView newKeySet(int initialCapacity) { @@ -2643,19 +2656,18 @@ p = pr; else if ((pk = p.key) == k || (pk != null && k.equals(pk))) return p; - else if (pl == null && pr == null) - break; + else if (pl == null) + p = pr; + else if (pr == null) + p = pl; else if ((kc != null || (kc = comparableClassFor(k)) != null) && (dir = compareComparables(kc, k, pk)) != 0) p = (dir < 0) ? pl : pr; - else if (pl == null) - p = pr; - else if (pr == null || - (q = pr.findTreeNode(h, k, kc)) == null) + else if ((q = pr.findTreeNode(h, k, kc)) != null) + return q; + else p = pl; - else - return q; } while (p != null); } return null; @@ -2682,6 +2694,23 @@ static final int READER = 4; // increment value for setting read lock /** + * Tie-breaking utility for ordering insertions when equal + * hashCodes and non-comparable. We don't require a total + * order, just a consistent insertion rule to maintain + * equivalence across rebalancings. Tie-breaking further than + * necessary simplifies testing a bit. + */ + static int tieBreakOrder(Object a, Object b) { + int d; + if (a == null || b == null || + (d = a.getClass().getName(). + compareTo(b.getClass().getName())) == 0) + d = (System.identityHashCode(a) <= System.identityHashCode(b) ? + -1 : 1); + return d; + } + + /** * Creates bin with initial set of nodes headed by b. */ TreeBin(TreeNode b) { @@ -2697,21 +2726,21 @@ r = x; } else { - Object key = x.key; - int hash = x.hash; + K k = x.key; + int h = x.hash; Class kc = null; for (TreeNode p = r;;) { int dir, ph; - if ((ph = p.hash) > hash) + K pk = p.key; + if ((ph = p.hash) > h) dir = -1; - else if (ph < hash) + else if (ph < h) dir = 1; - else if ((kc != null || - (kc = comparableClassFor(key)) != null)) - dir = compareComparables(kc, key, p.key); - else - dir = 0; - TreeNode xp = p; + else if ((kc == null && + (kc = comparableClassFor(k)) == null) || + (dir = compareComparables(kc, k, pk)) == 0) + dir = tieBreakOrder(k, pk); + TreeNode xp = p; if ((p = (dir <= 0) ? p.left : p.right) == null) { x.parent = xp; if (dir <= 0) @@ -2725,6 +2754,7 @@ } } this.root = r; + assert checkInvariants(root); } /** @@ -2805,8 +2835,9 @@ */ final TreeNode putTreeVal(int h, K k, V v) { Class kc = null; + boolean searched = false; for (TreeNode p = root;;) { - int dir, ph; K pk; TreeNode q, pr; + int dir, ph; K pk; if (p == null) { first = root = new TreeNode(h, k, v, null, null); break; @@ -2820,21 +2851,25 @@ else if ((kc == null && (kc = comparableClassFor(k)) == null) || (dir = compareComparables(kc, k, pk)) == 0) { - if (p.left == null) - dir = 1; - else if ((pr = p.right) == null || - (q = pr.findTreeNode(h, k, kc)) == null) - dir = -1; - else - return q; + if (!searched) { + TreeNode q, ch; + searched = true; + if (((ch = p.left) != null && + (q = ch.findTreeNode(h, k, kc)) != null) || + ((ch = p.right) != null && + (q = ch.findTreeNode(h, k, kc)) != null)) + return q; + } + dir = tieBreakOrder(k, pk); } + TreeNode xp = p; - if ((p = (dir < 0) ? p.left : p.right) == null) { + if ((p = (dir <= 0) ? p.left : p.right) == null) { TreeNode x, f = first; first = x = new TreeNode(h, k, v, f, xp); if (f != null) f.prev = x; - if (dir < 0) + if (dir <= 0) xp.left = x; else xp.right = x; @@ -3546,6 +3581,7 @@ * for an element, or null if there is no transformation (in * which case the action is not applied) * @param action the action + * @param the return type of the transformer * @since 1.8 */ public void forEach(long parallelismThreshold, @@ -3569,6 +3605,7 @@ * needed for this operation to be executed in parallel * @param searchFunction a function returning a non-null * result on success, else null + * @param the return type of the search function * @return a non-null result from applying the given search * function on each (key, value), or null if none * @since 1.8 @@ -3592,6 +3629,7 @@ * for an element, or null if there is no transformation (in * which case it is not combined) * @param reducer a commutative associative combining function + * @param the return type of the transformer * @return the result of accumulating the given transformation * of all (key, value) pairs * @since 1.8 @@ -3710,6 +3748,7 @@ * for an element, or null if there is no transformation (in * which case the action is not applied) * @param action the action + * @param the return type of the transformer * @since 1.8 */ public void forEachKey(long parallelismThreshold, @@ -3733,6 +3772,7 @@ * needed for this operation to be executed in parallel * @param searchFunction a function returning a non-null * result on success, else null + * @param the return type of the search function * @return a non-null result from applying the given search * function on each key, or null if none * @since 1.8 @@ -3775,6 +3815,7 @@ * for an element, or null if there is no transformation (in * which case it is not combined) * @param reducer a commutative associative combining function + * @param the return type of the transformer * @return the result of accumulating the given transformation * of all keys * @since 1.8 @@ -3894,6 +3935,7 @@ * for an element, or null if there is no transformation (in * which case the action is not applied) * @param action the action + * @param the return type of the transformer * @since 1.8 */ public void forEachValue(long parallelismThreshold, @@ -3917,6 +3959,7 @@ * needed for this operation to be executed in parallel * @param searchFunction a function returning a non-null * result on success, else null + * @param the return type of the search function * @return a non-null result from applying the given search * function on each value, or null if none * @since 1.8 @@ -3958,6 +4001,7 @@ * for an element, or null if there is no transformation (in * which case it is not combined) * @param reducer a commutative associative combining function + * @param the return type of the transformer * @return the result of accumulating the given transformation * of all values * @since 1.8 @@ -4075,6 +4119,7 @@ * for an element, or null if there is no transformation (in * which case the action is not applied) * @param action the action + * @param the return type of the transformer * @since 1.8 */ public void forEachEntry(long parallelismThreshold, @@ -4098,6 +4143,7 @@ * needed for this operation to be executed in parallel * @param searchFunction a function returning a non-null * result on success, else null + * @param the return type of the search function * @return a non-null result from applying the given search * function on each entry, or null if none * @since 1.8 @@ -4139,6 +4185,7 @@ * for an element, or null if there is no transformation (in * which case it is not combined) * @param reducer a commutative associative combining function + * @param the return type of the transformer * @return the result of accumulating the given transformation * of all entries * @since 1.8 diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/concurrent/ExecutorService.java --- a/jdk/src/share/classes/java/util/concurrent/ExecutorService.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/concurrent/ExecutorService.java Fri Aug 02 09:38:09 2013 +0100 @@ -227,6 +227,7 @@ * {@link Callable} form so they can be submitted. * * @param task the task to submit + * @param the type of the task's result * @return a Future representing pending completion of the task * @throws RejectedExecutionException if the task cannot be * scheduled for execution @@ -241,6 +242,7 @@ * * @param task the task to submit * @param result the result to return + * @param the type of the result * @return a Future representing pending completion of the task * @throws RejectedExecutionException if the task cannot be * scheduled for execution @@ -272,6 +274,7 @@ * collection is modified while this operation is in progress. * * @param tasks the collection of tasks + * @param the type of the values returned from the 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 @@ -299,6 +302,7 @@ * @param tasks the collection of tasks * @param timeout the maximum time to wait * @param unit the time unit of the timeout argument + * @param the type of the values returned from the tasks * @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, @@ -324,6 +328,7 @@ * collection is modified while this operation is in progress. * * @param tasks the collection of tasks + * @param the type of the values returned from the tasks * @return the result returned by one of the tasks * @throws InterruptedException if interrupted while waiting * @throws NullPointerException if tasks or any element task @@ -348,6 +353,7 @@ * @param tasks the collection of tasks * @param timeout the maximum time to wait * @param unit the time unit of the timeout argument + * @param the type of the values returned from the tasks * @return the result returned by one of the tasks * @throws InterruptedException if interrupted while waiting * @throws NullPointerException if tasks, or unit, or any element diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/concurrent/Executors.java --- a/jdk/src/share/classes/java/util/concurrent/Executors.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/concurrent/Executors.java Fri Aug 02 09:38:09 2013 +0100 @@ -397,6 +397,7 @@ * {@code Callable} to an otherwise resultless action. * @param task the task to run * @param result the result to return + * @param the type of the result * @return a callable object * @throws NullPointerException if task null */ @@ -458,6 +459,7 @@ * action; or if not possible, throw an associated {@link * AccessControlException}. * @param callable the underlying task + * @param the type of the callable's result * @return a callable object * @throws NullPointerException if callable null */ @@ -480,6 +482,7 @@ * AccessControlException}. * * @param callable the underlying task + * @param the type of the callable's result * @return a callable object * @throws NullPointerException if callable null * @throws AccessControlException if the current access control diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/concurrent/ForkJoinPool.java --- a/jdk/src/share/classes/java/util/concurrent/ForkJoinPool.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/concurrent/ForkJoinPool.java Fri Aug 02 09:38:09 2013 +0100 @@ -561,8 +561,8 @@ * Returns a new worker thread operating in the given pool. * * @param pool the pool this thread works in + * @return the new worker thread * @throws NullPointerException if the pool is null - * @return the new worker thread */ public ForkJoinWorkerThread newThread(ForkJoinPool pool); } @@ -2497,6 +2497,7 @@ * minimally only the latter. * * @param task the task + * @param the type of the task's result * @return the task's result * @throws NullPointerException if the task is null * @throws RejectedExecutionException if the task cannot be @@ -2545,6 +2546,7 @@ * Submits a ForkJoinTask for execution. * * @param task the task to submit + * @param the type of the task's result * @return the task * @throws NullPointerException if the task is null * @throws RejectedExecutionException if the task cannot be diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/concurrent/ForkJoinTask.java --- a/jdk/src/share/classes/java/util/concurrent/ForkJoinTask.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/concurrent/ForkJoinTask.java Fri Aug 02 09:38:09 2013 +0100 @@ -810,6 +810,7 @@ * unprocessed. * * @param tasks the collection of tasks + * @param the type of the values returned from the tasks * @return the tasks argument, to simplify usage * @throws NullPointerException if tasks or any element are null */ @@ -1472,6 +1473,7 @@ * * @param runnable the runnable action * @param result the result upon completion + * @param the type of the result * @return the task */ public static ForkJoinTask adapt(Runnable runnable, T result) { @@ -1485,6 +1487,7 @@ * encountered into {@code RuntimeException}. * * @param callable the callable action + * @param the type of the callable's result * @return the task */ public static ForkJoinTask adapt(Callable callable) { @@ -1498,6 +1501,8 @@ /** * Saves this task to a stream (that is, serializes it). * + * @param s the stream + * @throws java.io.IOException if an I/O error occurs * @serialData the current run status and the exception thrown * during execution, or {@code null} if none */ @@ -1509,6 +1514,10 @@ /** * Reconstitutes this task from a stream (that is, deserializes it). + * @param s the stream + * @throws ClassNotFoundException if the class of a serialized object + * could not be found + * @throws java.io.IOException if an I/O error occurs */ private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException { diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/concurrent/ScheduledExecutorService.java --- a/jdk/src/share/classes/java/util/concurrent/ScheduledExecutorService.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/concurrent/ScheduledExecutorService.java Fri Aug 02 09:38:09 2013 +0100 @@ -117,6 +117,7 @@ * @param callable the function to execute * @param delay the time from now to delay execution * @param unit the time unit of the delay parameter + * @param the type of the callable's result * @return a ScheduledFuture that can be used to extract result or cancel * @throws RejectedExecutionException if the task cannot be * scheduled for execution diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/concurrent/ScheduledThreadPoolExecutor.java --- a/jdk/src/share/classes/java/util/concurrent/ScheduledThreadPoolExecutor.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/concurrent/ScheduledThreadPoolExecutor.java Fri Aug 02 09:38:09 2013 +0100 @@ -392,6 +392,7 @@ * * @param runnable the submitted Runnable * @param task the task created to execute the runnable + * @param the type of the task's result * @return a task that can execute the runnable * @since 1.6 */ @@ -408,6 +409,7 @@ * * @param callable the submitted Callable * @param task the task created to execute the callable + * @param the type of the task's result * @return a task that can execute the callable * @since 1.6 */ diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/concurrent/TimeUnit.java --- a/jdk/src/share/classes/java/util/concurrent/TimeUnit.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/concurrent/TimeUnit.java Fri Aug 02 09:38:09 2013 +0100 @@ -69,6 +69,9 @@ * @author Doug Lea */ public enum TimeUnit { + /** + * Time unit representing one thousandth of a microsecond + */ NANOSECONDS { public long toNanos(long d) { return d; } public long toMicros(long d) { return d/(C1/C0); } @@ -80,6 +83,10 @@ public long convert(long d, TimeUnit u) { return u.toNanos(d); } int excessNanos(long d, long m) { return (int)(d - (m*C2)); } }, + + /** + * Time unit representing one thousandth of a millisecond + */ MICROSECONDS { public long toNanos(long d) { return x(d, C1/C0, MAX/(C1/C0)); } public long toMicros(long d) { return d; } @@ -91,6 +98,10 @@ public long convert(long d, TimeUnit u) { return u.toMicros(d); } int excessNanos(long d, long m) { return (int)((d*C1) - (m*C2)); } }, + + /** + * Time unit representing one thousandth of a second + */ MILLISECONDS { 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)); } @@ -102,6 +113,10 @@ public long convert(long d, TimeUnit u) { return u.toMillis(d); } int excessNanos(long d, long m) { return 0; } }, + + /** + * Time unit representing one second + */ SECONDS { 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)); } @@ -113,6 +128,10 @@ public long convert(long d, TimeUnit u) { return u.toSeconds(d); } int excessNanos(long d, long m) { return 0; } }, + + /** + * Time unit representing sixty seconds + */ MINUTES { 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)); } @@ -124,6 +143,10 @@ public long convert(long d, TimeUnit u) { return u.toMinutes(d); } int excessNanos(long d, long m) { return 0; } }, + + /** + * Time unit representing sixty minutes + */ HOURS { 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)); } @@ -135,6 +158,10 @@ public long convert(long d, TimeUnit u) { return u.toHours(d); } int excessNanos(long d, long m) { return 0; } }, + + /** + * Time unit representing twenty four hours + */ DAYS { 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)); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/concurrent/atomic/AtomicIntegerFieldUpdater.java --- a/jdk/src/share/classes/java/util/concurrent/atomic/AtomicIntegerFieldUpdater.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/concurrent/atomic/AtomicIntegerFieldUpdater.java Fri Aug 02 09:38:09 2013 +0100 @@ -71,6 +71,7 @@ * * @param tclass the class of the objects holding the field * @param fieldName the name of the field to be updated + * @param the type of instances of tclass * @return the updater * @throws IllegalArgumentException if the field is not a * volatile integer type diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/concurrent/atomic/AtomicLongFieldUpdater.java --- a/jdk/src/share/classes/java/util/concurrent/atomic/AtomicLongFieldUpdater.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/concurrent/atomic/AtomicLongFieldUpdater.java Fri Aug 02 09:38:09 2013 +0100 @@ -71,6 +71,7 @@ * * @param tclass the class of the objects holding the field * @param fieldName the name of the field to be updated + * @param the type of instances of tclass * @return the updater * @throws IllegalArgumentException if the field is not a * volatile long type diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/concurrent/atomic/AtomicReferenceFieldUpdater.java --- a/jdk/src/share/classes/java/util/concurrent/atomic/AtomicReferenceFieldUpdater.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/concurrent/atomic/AtomicReferenceFieldUpdater.java Fri Aug 02 09:38:09 2013 +0100 @@ -91,6 +91,8 @@ * @param tclass the class of the objects holding the field * @param vclass the class of the field * @param fieldName the name of the field to be updated + * @param the type of instances of tclass + * @param the type of instances of vclass * @return the updater * @throws ClassCastException if the field is of the wrong type * @throws IllegalArgumentException if the field is not volatile diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/BiConsumer.java --- a/jdk/src/share/classes/java/util/function/BiConsumer.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/BiConsumer.java Fri Aug 02 09:38:09 2013 +0100 @@ -27,13 +27,16 @@ import java.util.Objects; /** - * An operation which accepts two input arguments and returns no result. This is - * the two-arity specialization of {@link Consumer}. Unlike most other - * functional interfaces, {@code BiConsumer} is expected to operate via - * side-effects. + * Represents an operation that accepts two input arguments and returns no + * result. This is the two-arity specialization of {@link Consumer}. + * Unlike most other functional interfaces, {@code BiConsumer} is expected + * to operate via side-effects. * - * @param the type of the first argument to the {@code accept} operation - * @param the type of the second argument to the {@code accept} operation + *

                            This is a functional interface + * whose functional method is {@link #accept(Object, Object)}. + * + * @param the type of the first argument to the operation + * @param the type of the second argument to the operation * * @see Consumer * @since 1.8 @@ -42,35 +45,31 @@ public interface BiConsumer { /** - * Performs operations upon the provided objects which may modify those - * objects and/or external state. + * Performs this operation on the given arguments. * - * @param t an input object - * @param u an input object + * @param t the first input argument + * @param u the second input argument */ void accept(T t, U u); /** - * Returns a {@code BiConsumer} which performs, in sequence, the operation - * represented by this object followed by the operation represented by - * the other {@code BiConsumer}. - * - *

                            Any exceptions thrown by either {@code accept} method are relayed - * to the caller; if performing this operation throws an exception, the - * other operation will not be performed. + * Returns a composed {@code BiConsumer} that performs, in sequence, this + * operation followed by the {@code after} operation. If performing either + * operation throws an exception, it is relayed to the caller of the + * composed operation. If performing this operation throws an exception, + * the {@code after} operation will not be performed. * - * @param other a BiConsumer which will be chained after this BiConsumer - * @return a BiConsumer which performs in sequence the {@code accept} method - * of this BiConsumer and the {@code accept} method of the specified - * BiConsumer operation - * @throws NullPointerException if other is null + * @param after the operation to perform after this operation + * @return a composed {@code BiConsumer} that performs in sequence this + * operation followed by the {@code after} operation + * @throws NullPointerException if {@code after} is null */ - default BiConsumer chain(BiConsumer other) { - Objects.requireNonNull(other); + default BiConsumer andThen(BiConsumer after) { + Objects.requireNonNull(after); return (l, r) -> { accept(l, r); - other.accept(l, r); + after.accept(l, r); }; } } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/BiFunction.java --- a/jdk/src/share/classes/java/util/function/BiFunction.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/BiFunction.java Fri Aug 02 09:38:09 2013 +0100 @@ -27,14 +27,15 @@ import java.util.Objects; /** - * Apply a function to the input arguments, yielding an appropriate result. This - * is the two-arity specialization of {@link Function}. A function may - * variously provide a mapping between types, object instances or keys and - * values or any other form of transformation upon the input. + * Represents a function that accepts two arguments and produces a result. + * This is the two-arity specialization of {@link Function}. * - * @param the type of the first argument to the {@code apply} operation - * @param the type of the second argument to the {@code apply} operation - * @param the type of results returned by the {@code apply} operation + *

                            This is a functional interface + * whose functional method is {@link #apply(Object, Object)}. + * + * @param the type of the first argument to the function + * @param the type of the second argument to the function + * @param the type of the result of the function * * @see Function * @since 1.8 @@ -43,25 +44,25 @@ public interface BiFunction { /** - * Compute the result of applying the function to the input arguments + * Applies this function to the given arguments. * - * @param t an input object - * @param u an input object + * @param t the first function argument + * @param u the second function argument * @return the function result */ R apply(T t, U u); /** - * Returns a new function which applies this function followed by the - * provided function. If either function throws an exception, it is relayed - * to the caller. + * Returns a composed function that first applies this function to + * its input, and then applies the {@code after} function to the result. + * If evaluation of either function throws an exception, it is relayed to + * the caller of the composed function. * - * @param Type of output objects to the combined function. May be the - * same type as {@code }, {@code } or {@code } - * @param after An additional function to be applied after this function is - * applied - * @return A function which performs this function followed by the provided - * function + * @param the type of output of the {@code after} function, and of the + * composed function + * @param after the function to apply after this function is applied + * @return a composed function that first applies this function and then + * applies the {@code after} function * @throws NullPointerException if after is null */ default BiFunction andThen(Function after) { diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/BiPredicate.java --- a/jdk/src/share/classes/java/util/function/BiPredicate.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/BiPredicate.java Fri Aug 02 09:38:09 2013 +0100 @@ -27,11 +27,14 @@ import java.util.Objects; /** - * Determines if the input objects match some criteria. This is the two-arity - * specialization of {@link Predicate}. + * Represents a predicate (boolean-valued function) of two arguments. This is + * the two-arity specialization of {@link Predicate}. * - * @param the type of the first argument to {@code test} - * @param the type of the second argument to {@code test} + *

                            This is a functional interface + * whose functional method is {@link #test(Object, Object)}. + * + * @param the type of the first argument to the predicate + * @param the type of the second argument the predicate * * @see Predicate * @since 1.8 @@ -40,34 +43,41 @@ public interface BiPredicate { /** - * Return {@code true} if the inputs match some criteria. + * Evaluates this predicate on the given arguments. * - * @param t an input object - * @param u an input object - * @return {@code true} if the inputs match some criteria + * @param t the first input argument + * @param u the second input argument + * @return {@code true} if the input arguments match the predicate, + * otherwise {@code false} */ boolean test(T t, U u); /** - * Returns a predicate which evaluates to {@code true} only if this - * predicate and the provided predicate both evaluate to {@code true}. If - * this predicate returns {@code false} then the remaining predicate is not - * evaluated. + * Returns a composed predicate that represents a short-circuiting logical + * AND of this predicate and another. When evaluating the composed + * predicate, if this predicate is {@code false}, then the {@code other} + * predicate is not evaluated. + * + *

                            Any exceptions thrown during evaluation of either predicate are relayed + * to the caller; if evaluation of this predicate throws an exception, the + * {@code other} predicate will not be evaluated. * - * @param p a predicate which will be logically-ANDed with this predicate - * @return a new predicate which returns {@code true} only if both - * predicates return {@code true} - * @throws NullPointerException if p is null + * @param other a predicate that will be logically-ANDed with this + * predicate + * @return a composed predicate that represents the short-circuiting logical + * AND of this predicate and the {@code other} predicate + * @throws NullPointerException if other is null */ - default BiPredicate and(BiPredicate p) { - Objects.requireNonNull(p); - return (T t, U u) -> test(t, u) && p.test(t, u); + default BiPredicate and(BiPredicate other) { + Objects.requireNonNull(other); + return (T t, U u) -> test(t, u) && other.test(t, u); } /** - * Returns a predicate which negates the result of this predicate. + * Returns a predicate that represents the logical negation of this + * predicate. * - * @return a new predicate who's result is always the opposite of this + * @return a predicate that represents the logical negation of this * predicate */ default BiPredicate negate() { @@ -75,18 +85,23 @@ } /** - * Returns a predicate which evaluates to {@code true} if either this - * predicate or the provided predicate evaluates to {@code true}. If this - * predicate returns {@code true} then the remaining predicate is not - * evaluated. + * Returns a composed predicate that represents a short-circuiting logical + * OR of this predicate and another. When evaluating the composed + * predicate, if this predicate is {@code true}, then the {@code other} + * predicate is not evaluated. + * + *

                            Any exceptions thrown during evaluation of either predicate are relayed + * to the caller; if evaluation of this predicate throws an exception, the + * {@code other} predicate will not be evaluated. * - * @param p a predicate which will be logically-ORed with this predicate - * @return a new predicate which returns {@code true} if either predicate - * returns {@code true} - * @throws NullPointerException if p is null + * @param other a predicate that will be logically-ORed with this + * predicate + * @return a composed predicate that represents the short-circuiting logical + * OR of this predicate and the {@code other} predicate + * @throws NullPointerException if other is null */ - default BiPredicate or(BiPredicate p) { - Objects.requireNonNull(p); - return (T t, U u) -> test(t, u) || p.test(t, u); + default BiPredicate or(BiPredicate other) { + Objects.requireNonNull(other); + return (T t, U u) -> test(t, u) || other.test(t, u); } } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/BinaryOperator.java --- a/jdk/src/share/classes/java/util/function/BinaryOperator.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/BinaryOperator.java Fri Aug 02 09:38:09 2013 +0100 @@ -28,42 +28,48 @@ import java.util.Comparator; /** - * An operation upon two operands yielding a result. This is a specialization of - * {@code BiFunction} where the operands and the result are all of the same type. + * Represents an operation upon two operands of the same type, producing a result + * of the same type as the operands. This is a specialization of + * {@link BiFunction} for the case where the operands and the result are all of + * the same type. * - * @param the type of operands to {@code apply} and of the result + *

                            This is a functional interface + * whose functional method is {@link #apply(Object, Object)}. + * + * @param the type of the operands and result of the operator * * @see BiFunction + * @see UnaryOperator * @since 1.8 */ @FunctionalInterface public interface BinaryOperator extends BiFunction { /** * Returns a {@link BinaryOperator} which returns the lesser of two elements - * according to the specified {@code Comparator} + * according to the specified {@code Comparator}. * - * @param the type of values to be compared and returned - * @param comparator a {@code Comparator} for comparing the two values + * @param the type of the input arguments of the comparator + * @param comparator a {@code Comparator} for comparing the two values * @return a {@code BinaryOperator} which returns the lesser of its operands, * according to the supplied {@code Comparator} * @throws NullPointerException if the argument is null */ - public static BinaryOperator minBy(Comparator comparator) { + public static BinaryOperator minBy(Comparator comparator) { Objects.requireNonNull(comparator); return (a, b) -> comparator.compare(a, b) <= 0 ? a : b; } /** * Returns a {@link BinaryOperator} which returns the greater of two elements - * according to the specified {@code Comparator} + * according to the specified {@code Comparator}. * - * @param the type of values to be compared and returned - * @param comparator a {@code Comparator} for comparing the two values + * @param the type of the input arguments of the comparator + * @param comparator a {@code Comparator} for comparing the two values * @return a {@code BinaryOperator} which returns the greater of its operands, * according to the supplied {@code Comparator} * @throws NullPointerException if the argument is null */ - public static BinaryOperator maxBy(Comparator comparator) { + public static BinaryOperator maxBy(Comparator comparator) { Objects.requireNonNull(comparator); return (a, b) -> comparator.compare(a, b) >= 0 ? a : b; } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/BooleanSupplier.java --- a/jdk/src/share/classes/java/util/function/BooleanSupplier.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/BooleanSupplier.java Fri Aug 02 09:38:09 2013 +0100 @@ -26,8 +26,14 @@ /** - * A supplier of {@code boolean} values. This is the {@code boolean}-providing - * primitive specialization of {@link Supplier}. + * Represents a supplier of {@code boolean}-valued results. This is the + * {@code boolean}-producing primitive specialization of {@link Supplier}. + * + *

                            There is no requirement that a new or distinct result be returned each + * time the supplier is invoked. + * + *

                            This is a functional interface + * whose functional method is {@link #getAsBoolean()}. * * @see Supplier * @since 1.8 @@ -36,9 +42,9 @@ public interface BooleanSupplier { /** - * Returns a {@code boolean} value. + * Gets a result. * - * @return a {@code boolean} value + * @return a result */ boolean getAsBoolean(); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/Consumer.java --- a/jdk/src/share/classes/java/util/function/Consumer.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/Consumer.java Fri Aug 02 09:38:09 2013 +0100 @@ -27,11 +27,14 @@ import java.util.Objects; /** - * An operation which accepts a single input argument and returns no result. - * Unlike most other functional interfaces, {@code Consumer} is expected to - * operate via side-effects. + * Represents an operation that accepts a single input argument and returns no + * result. Unlike most other functional interfaces, {@code Consumer} is expected + * to operate via side-effects. * - * @param The type of input objects to {@code accept} + *

                            This is a functional interface + * whose functional method is {@link #accept(Object)}. + * + * @param the type of the input to the operation * * @since 1.8 */ @@ -39,29 +42,26 @@ public interface Consumer { /** - * Accept an input value. + * Performs this operation on the given argument. * - * @param t the input object + * @param t the input argument */ void accept(T t); /** - * Returns a {@code Consumer} which performs, in sequence, the operation - * represented by this object followed by the operation represented by - * the other {@code Consumer}. - * - *

                            Any exceptions thrown by either {@code accept} method are relayed - * to the caller; if performing this operation throws an exception, the - * other operation will not be performed. + * Returns a composed {@code Consumer} that performs, in sequence, this + * operation followed by the {@code after} operation. If performing either + * operation throws an exception, it is relayed to the caller of the + * composed operation. If performing this operation throws an exception, + * the {@code after} operation will not be performed. * - * @param other a Consumer which will be chained after this Consumer - * @return a Consumer which performs in sequence the {@code accept} method - * of this Consumer and the {@code accept} method of the specified Consumer - * operation - * @throws NullPointerException if other is null + * @param after the operation to perform after this operation + * @return a composed {@code Consumer} that performs in sequence this + * operation followed by the {@code after} operation + * @throws NullPointerException if {@code after} is null */ - default Consumer chain(Consumer other) { - Objects.requireNonNull(other); - return (T t) -> { accept(t); other.accept(t); }; + default Consumer andThen(Consumer after) { + Objects.requireNonNull(after); + return (T t) -> { accept(t); after.accept(t); }; } } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/DoubleBinaryOperator.java --- a/jdk/src/share/classes/java/util/function/DoubleBinaryOperator.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/DoubleBinaryOperator.java Fri Aug 02 09:38:09 2013 +0100 @@ -25,23 +25,25 @@ package java.util.function; /** - * An operation on two {@code double} operands yielding a {@code double} result. - * This is the primitive type specialization of {@link BinaryOperator} for - * {@code double}. + * Represents an operation upon two {@code double}-valued operands and producing a + * {@code double}-valued result. This is the primitive type specialization of + * {@link BinaryOperator} for {@code double}. + * + *

                            This is a functional interface + * whose functional method is {@link #applyAsDouble(double, double)}. * * @see BinaryOperator + * @see DoubleUnaryOperator * @since 1.8 */ @FunctionalInterface public interface DoubleBinaryOperator { /** - * Returns the {@code double} result of the operation upon the - * {@code double} operands. The parameters are named {@code left} and - * {@code right} for operations where the order of parameters matters. + * Applies this operator to the given operands. * - * @param left the left operand value - * @param right the right operand value - * @return the result of the operation + * @param left the first operand + * @param right the second operand + * @return the operator result */ double applyAsDouble(double left, double right); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/DoubleConsumer.java --- a/jdk/src/share/classes/java/util/function/DoubleConsumer.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/DoubleConsumer.java Fri Aug 02 09:38:09 2013 +0100 @@ -27,11 +27,14 @@ import java.util.Objects; /** - * An operation which accepts a single double argument and returns no result. - * This is the primitive type specialization of {@link Consumer} for - * {@code double}. Unlike most other functional interfaces, + * Represents an operation that accepts a single {@code double}-valued argument and + * returns no result. This is the primitive type specialization of + * {@link Consumer} for {@code double}. Unlike most other functional interfaces, * {@code DoubleConsumer} is expected to operate via side-effects. * + *

                            This is a functional interface + * whose functional method is {@link #accept(double)}. + * * @see Consumer * @since 1.8 */ @@ -39,30 +42,26 @@ public interface DoubleConsumer { /** - * Accept an input value. + * Performs this operation on the given argument. * - * @param value the input value + * @param value the input argument */ void accept(double value); /** - * Returns a {@code DoubleConsumer} which performs, in sequence, the operation - * represented by this object followed by the operation represented by - * another {@code DoubleConsumer}. - * - *

                            Any exceptions thrown by either {@code accept} method are relayed - * to the caller; if performing this operation throws an exception, the - * other operation will not be performed. + * Returns a composed {@code DoubleConsumer} that performs, in sequence, this + * operation followed by the {@code after} operation. If performing either + * operation throws an exception, it is relayed to the caller of the + * composed operation. If performing this operation throws an exception, + * the {@code after} operation will not be performed. * - * @param other a DoubleConsumer which will be chained after this - * DoubleConsumer - * @return an DoubleConsumer which performs in sequence the {@code accept} method - * of this DoubleConsumer and the {@code accept} method of the specified IntConsumer - * operation - * @throws NullPointerException if other is null + * @param after the operation to perform after this operation + * @return a composed {@code DoubleConsumer} that performs in sequence this + * operation followed by the {@code after} operation + * @throws NullPointerException if {@code after} is null */ - default DoubleConsumer chain(DoubleConsumer other) { - Objects.requireNonNull(other); - return (double t) -> { accept(t); other.accept(t); }; + default DoubleConsumer andThen(DoubleConsumer after) { + Objects.requireNonNull(after); + return (double t) -> { accept(t); after.accept(t); }; } } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/DoubleFunction.java --- a/jdk/src/share/classes/java/util/function/DoubleFunction.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/DoubleFunction.java Fri Aug 02 09:38:09 2013 +0100 @@ -25,11 +25,14 @@ package java.util.function; /** - * Apply a function to the double-valued input argument, yielding an appropriate - * result. This is the {@code double}-consuming primitive specialization for + * Represents a function that accepts a double-valued argument and produces a + * result. This is the {@code double}-consuming primitive specialization for * {@link Function}. * - * @param the type of output objects from the function + *

                            This is a functional interface + * whose functional method is {@link #apply(double)}. + * + * @param the type of the result of the function * * @see Function * @since 1.8 @@ -38,9 +41,9 @@ public interface DoubleFunction { /** - * Compute the result of applying the function to the input argument + * Applies this function to the given argument. * - * @param value the input value + * @param value the function argument * @return the function result */ R apply(double value); diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/DoublePredicate.java --- a/jdk/src/share/classes/java/util/function/DoublePredicate.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/DoublePredicate.java Fri Aug 02 09:38:09 2013 +0100 @@ -27,9 +27,12 @@ import java.util.Objects; /** - * Determines if the {@code double} input value matches some criteria. This is - * the {@code double}-consuming primitive type specialization of - * {@link Predicate}. + * Represents a predicate (boolean-valued function) of one {@code double}-valued + * argument. This is the {@code double}-consuming primitive type specialization + * of {@link Predicate}. + * + *

                            This is a functional interface + * whose functional method is {@link #test(double)}. * * @see Predicate * @since 1.8 @@ -38,38 +41,40 @@ public interface DoublePredicate { /** - * Returns {@code true} if the input value matches some criteria. + * Evaluates this predicate on the given argument. * - * @param value the value to be tested - * @return {@code true} if the input value matches some criteria, otherwise - * {@code false} + * @param value the input argument + * @return {@code true} if the input argument matches the predicate, + * otherwise {@code false} */ boolean test(double value); /** - * Returns a predicate which evaluates to {@code true} only if this - * predicate and the provided predicate both evaluate to {@code true}. If - * this predicate returns {@code false} then the remaining predicate is not - * evaluated. + * Returns a composed predicate that represents a short-circuiting logical + * AND of this predicate and another. When evaluating the composed + * predicate, if this predicate is {@code false}, then the {@code other} + * predicate is not evaluated. * - *

                            Any exceptions thrown by either {@code test} method are relayed - * to the caller; if performing first operation throws an exception, the - * second operation will not be performed. + *

                            Any exceptions thrown during evaluation of either predicate are relayed + * to the caller; if evaluation of this predicate throws an exception, the + * {@code other} predicate will not be evaluated. * - * @param p a predicate which will be logically-ANDed with this predicate - * @return a new predicate which returns {@code true} only if both - * predicates return {@code true} - * @throws NullPointerException if p is null + * @param other a predicate that will be logically-ANDed with this + * predicate + * @return a composed predicate that represents the short-circuiting logical + * AND of this predicate and the {@code other} predicate + * @throws NullPointerException if other is null */ - default DoublePredicate and(DoublePredicate p) { - Objects.requireNonNull(p); - return (value) -> test(value) && p.test(value); + default DoublePredicate and(DoublePredicate other) { + Objects.requireNonNull(other); + return (value) -> test(value) && other.test(value); } /** - * Returns a predicate which negates the result of this predicate. + * Returns a predicate that represents the logical negation of this + * predicate. * - * @return a new predicate who's result is always the opposite of this + * @return a predicate that represents the logical negation of this * predicate */ default DoublePredicate negate() { @@ -77,22 +82,23 @@ } /** - * Returns a predicate which evaluates to {@code true} if either this - * predicate or the provided predicate evaluates to {@code true}. If this - * predicate returns {@code true} then the remaining predicate is not - * evaluated. + * Returns a composed predicate that represents a short-circuiting logical + * OR of this predicate and another. When evaluating the composed + * predicate, if this predicate is {@code true}, then the {@code other} + * predicate is not evaluated. * - *

                            Any exceptions thrown by either {@code test} method are relayed - * to the caller; if performing first operation throws an exception, the - * second operation will not be performed. + *

                            Any exceptions thrown during evaluation of either predicate are relayed + * to the caller; if evaluation of this predicate throws an exception, the + * {@code other} predicate will not be evaluated. * - * @param p a predicate which will be logically-ANDed with this predicate - * @return a new predicate which returns {@code true} if either predicate - * returns {@code true} - * @throws NullPointerException if p is null + * @param other a predicate that will be logically-ORed with this + * predicate + * @return a composed predicate that represents the short-circuiting logical + * OR of this predicate and the {@code other} predicate + * @throws NullPointerException if other is null */ - default DoublePredicate or(DoublePredicate p) { - Objects.requireNonNull(p); - return (value) -> test(value) || p.test(value); + default DoublePredicate or(DoublePredicate other) { + Objects.requireNonNull(other); + return (value) -> test(value) || other.test(value); } } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/DoubleSupplier.java --- a/jdk/src/share/classes/java/util/function/DoubleSupplier.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/DoubleSupplier.java Fri Aug 02 09:38:09 2013 +0100 @@ -25,8 +25,14 @@ package java.util.function; /** - * A supplier of {@code double} values. This is the {@code double}-providing - * primitive specialization of {@link Supplier}. + * Represents a supplier of {@code double}-valued results. This is the + * {@code double}-producing primitive specialization of {@link Supplier}. + * + *

                            There is no requirement that a distinct result be returned each + * time the supplier is invoked. + * + *

                            This is a functional interface + * whose functional method is {@link #getAsDouble()}. * * @see Supplier * @since 1.8 @@ -35,9 +41,9 @@ public interface DoubleSupplier { /** - * Returns a {@code double} value. + * Gets a result. * - * @return a {@code double} value + * @return a result */ double getAsDouble(); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/DoubleToIntFunction.java --- a/jdk/src/share/classes/java/util/function/DoubleToIntFunction.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/DoubleToIntFunction.java Fri Aug 02 09:38:09 2013 +0100 @@ -25,22 +25,24 @@ package java.util.function; /** - * Apply a function to the input argument, yielding an appropriate result. - * This is the {@code double}-to-{@code int} specialization for {@link Function}. + * Represents a function that accepts a double-valued argument and produces an + * int-valued result. This is the {@code double}-to-{@code int} primitive + * specialization for {@link Function}. + * + *

                            This is a functional interface + * whose functional method is {@link #applyAsInt(double)}. * * @see Function - * @see IntToDoubleFunction - * @see LongToIntFunction * @since 1.8 */ @FunctionalInterface public interface DoubleToIntFunction { /** - * Compute the result of applying the function to the input arguments. + * Applies this function to the given argument. * - * @param value the input value - * @return the function result value + * @param value the function argument + * @return the function result */ int applyAsInt(double value); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/DoubleToLongFunction.java --- a/jdk/src/share/classes/java/util/function/DoubleToLongFunction.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/DoubleToLongFunction.java Fri Aug 02 09:38:09 2013 +0100 @@ -25,22 +25,24 @@ package java.util.function; /** - * Apply a function to the input argument, yielding an appropriate result. - * This is the {@code double}-to-{@code long} specialization for {@link Function}. + * Represents a function that accepts a double-valued argument and produces a + * long-valued result. This is the {@code double}-to-{@code long} primitive + * specialization for {@link Function}. + * + *

                            This is a functional interface + * whose functional method is {@link #applyAsLong(double)}. * * @see Function - * @see LongToDoubleFunction - * @see IntToLongFunction * @since 1.8 */ @FunctionalInterface public interface DoubleToLongFunction { /** - * Compute the result of applying the function to the input arguments. + * Applies this function to the given argument. * - * @param value the input value - * @return the function result value + * @param value the function argument + * @return the function result */ long applyAsLong(double value); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/DoubleUnaryOperator.java --- a/jdk/src/share/classes/java/util/function/DoubleUnaryOperator.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/DoubleUnaryOperator.java Fri Aug 02 09:38:09 2013 +0100 @@ -27,9 +27,12 @@ import java.util.Objects; /** - * An operation on a {@code double} operand yielding a {@code double} - * result. This is the primitive type specialization of {@link UnaryOperator} - * for {@code double}. + * Represents an operation on a single {@code double}-valued operand that produces + * a {@code double}-valued result. This is the primitive type specialization of + * {@link UnaryOperator} for {@code double}. + * + *

                            This is a functional interface + * whose functional method is {@link #applyAsDouble(double)}. * * @see UnaryOperator * @since 1.8 @@ -38,24 +41,25 @@ public interface DoubleUnaryOperator { /** - * Returns the {@code double} result of the operation upon the - * {@code double} operand. + * Applies this operator to the given operand. * - * @param operand the operand value - * @return the operation result value + * @param operand the operand + * @return the operator result */ double applyAsDouble(double operand); /** - * Compose a new function which applies the provided function followed by - * this function. If either function throws an exception, it is relayed - * to the caller. + * Returns a composed operator that first applies the {@code before} + * operator to its input, and then applies this operator to the result. + * If evaluation of either operator throws an exception, it is relayed to + * the caller of the composed operator. * - * @param before An additional function to be applied before this function - * is applied - * @return A function which performs the provided function followed by this - * function + * @param before the operator to apply before this operator is applied + * @return a composed operator that first applies the {@code before} + * operator and then applies this operator * @throws NullPointerException if before is null + * + * @see #andThen(DoubleUnaryOperator) */ default DoubleUnaryOperator compose(DoubleUnaryOperator before) { Objects.requireNonNull(before); @@ -63,15 +67,17 @@ } /** - * Compose a new function which applies this function followed by the - * provided function. If either function throws an exception, it is relayed - * to the caller. + * Returns a composed operator that first applies this operator to + * its input, and then applies the {@code after} operator to the result. + * If evaluation of either operator throws an exception, it is relayed to + * the caller of the composed operator. * - * @param after An additional function to be applied after this function is - * applied - * @return A function which performs this function followed by the provided - * function followed + * @param after the operator to apply after this operator is applied + * @return a composed operator that first applies this operator and then + * applies the {@code after} operator * @throws NullPointerException if after is null + * + * @see #compose(DoubleUnaryOperator) */ default DoubleUnaryOperator andThen(DoubleUnaryOperator after) { Objects.requireNonNull(after); @@ -79,9 +85,9 @@ } /** - * Returns a unary operator that provides its input value as the result. + * Returns a unary operator that always returns its input argument. * - * @return a unary operator that provides its input value as the result + * @return a unary operator that always returns its input argument */ static DoubleUnaryOperator identity() { return t -> t; diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/Function.java --- a/jdk/src/share/classes/java/util/function/Function.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/Function.java Fri Aug 02 09:38:09 2013 +0100 @@ -27,12 +27,13 @@ import java.util.Objects; /** - * Apply a function to the input argument, yielding an appropriate result. A - * function may variously provide a mapping between types, object instances or - * keys and values or any other form of transformation upon the input. + * Represents a function that accepts one argument and produces a result. * - * @param the type of the input to the {@code apply} operation - * @param the type of the result of the {@code apply} operation + *

                            This is a functional interface + * whose functional method is {@link #apply(Object)}. + * + * @param the type of the input to the function + * @param the type of the result of the function * * @since 1.8 */ @@ -40,25 +41,27 @@ public interface Function { /** - * Compute the result of applying the function to the input argument + * Applies this function to the given argument. * - * @param t the input object + * @param t the function argument * @return the function result */ R apply(T t); /** - * Returns a new function which applies the provided function followed by - * this function. If either function throws an exception, it is relayed - * to the caller. + * Returns a composed function that first applies the {@code before} + * function to its input, and then applies this function to the result. + * If evaluation of either function throws an exception, it is relayed to + * the caller of the composed function. * - * @param type of input objects to the combined function. May be the - * same type as {@code } or {@code } - * @param before an additional function to be applied before this function - * is applied - * @return a function which performs the provided function followed by this - * function + * @param the type of input to the {@code before} function, and to the + * composed function + * @param before the function to apply before this function is applied + * @return a composed function that first applies the {@code before} + * function and then applies this function * @throws NullPointerException if before is null + * + * @see #andThen(Function) */ default Function compose(Function before) { Objects.requireNonNull(before); @@ -66,17 +69,19 @@ } /** - * Returns a new function which applies this function followed by the - * provided function. If either function throws an exception, it is relayed - * to the caller. + * Returns a composed function that first applies this function to + * its input, and then applies the {@code after} function to the result. + * If evaluation of either function throws an exception, it is relayed to + * the caller of the composed function. * - * @param type of output objects to the combined function. May be the - * same type as {@code } or {@code } - * @param after an additional function to be applied after this function is - * applied - * @return a function which performs this function followed by the provided - * function + * @param the type of output of the {@code after} function, and of the + * composed function + * @param after the function to apply after this function is applied + * @return a composed function that first applies this function and then + * applies the {@code after} function * @throws NullPointerException if after is null + * + * @see #compose(Function) */ default Function andThen(Function after) { Objects.requireNonNull(after); @@ -84,10 +89,10 @@ } /** - * Returns a {@code Function} whose {@code apply} method returns its input. + * Returns a function that always returns its input argument. * * @param the type of the input and output objects to the function - * @return a {@code Function} whose {@code apply} method returns its input + * @return a function that always returns its input argument */ static Function identity() { return t -> t; diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/IntBinaryOperator.java --- a/jdk/src/share/classes/java/util/function/IntBinaryOperator.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/IntBinaryOperator.java Fri Aug 02 09:38:09 2013 +0100 @@ -25,24 +25,26 @@ package java.util.function; /** - * An operation on two {@code int} operands yielding an {@code int} result. - * This is the primitive type specialization of {@link BinaryOperator} for - * {@code int}. + * Represents an operation upon two {@code int}-valued operands and producing an + * {@code int}-valued result. This is the primitive type specialization of + * {@link BinaryOperator} for {@code int}. + * + *

                            This is a functional interface + * whose functional method is {@link #applyAsInt(int, int)}. * * @see BinaryOperator + * @see IntUnaryOperator * @since 1.8 */ @FunctionalInterface public interface IntBinaryOperator { /** - * Returns the {@code int} result of the operation upon the {@code int} - * operands. The parameters are named {@code left} and {@code right} for - * operations where the order of parameters matters. + * Applies this operator to the given operands. * - * @param left the left operand value - * @param right the right operand value - * @return the result of the operation + * @param left the first operand + * @param right the second operand + * @return the operator result */ int applyAsInt(int left, int right); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/IntConsumer.java --- a/jdk/src/share/classes/java/util/function/IntConsumer.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/IntConsumer.java Fri Aug 02 09:38:09 2013 +0100 @@ -27,10 +27,13 @@ import java.util.Objects; /** - * An operation which accepts a single integer argument and returns no result. - * This is the primitive type specialization of {@link Consumer} for {@code int}. - * Unlike most other functional interfaces, {@code IntConsumer} is expected to - * operate via side-effects. + * Represents an operation that accepts a single {@code int}-valued argument and + * returns no result. This is the primitive type specialization of + * {@link Consumer} for {@code int}. Unlike most other functional interfaces, + * {@code IntConsumer} is expected to operate via side-effects. + * + *

                            This is a functional interface + * whose functional method is {@link #accept(int)}. * * @see Consumer * @since 1.8 @@ -39,30 +42,26 @@ public interface IntConsumer { /** - * Accept an input value. + * Performs this operation on the given argument. * - * @param value the input value + * @param value the input argument */ void accept(int value); /** - * Returns an {@code IntConsumer} which performs, in sequence, the operation - * represented by this object followed by the operation represented by - * another {@code IntConsumer}. - * - *

                            Any exceptions thrown by either {@code accept} method are relayed - * to the caller; if performing this operation throws an exception, the - * other operation will not be performed. + * Returns a composed {@code IntConsumer} that performs, in sequence, this + * operation followed by the {@code after} operation. If performing either + * operation throws an exception, it is relayed to the caller of the + * composed operation. If performing this operation throws an exception, + * the {@code after} operation will not be performed. * - * @param other an IntConsumer which will be chained after this - * IntConsumer - * @return an IntConsumer which performs in sequence the {@code accept} method - * of this IntConsumer and the {@code accept} method of the specified IntConsumer - * operation - * @throws NullPointerException if other is null + * @param after the operation to perform after this operation + * @return a composed {@code IntConsumer} that performs in sequence this + * operation followed by the {@code after} operation + * @throws NullPointerException if {@code after} is null */ - default IntConsumer chain(IntConsumer other) { - Objects.requireNonNull(other); - return (int t) -> { accept(t); other.accept(t); }; + default IntConsumer andThen(IntConsumer after) { + Objects.requireNonNull(after); + return (int t) -> { accept(t); after.accept(t); }; } } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/IntFunction.java --- a/jdk/src/share/classes/java/util/function/IntFunction.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/IntFunction.java Fri Aug 02 09:38:09 2013 +0100 @@ -25,11 +25,14 @@ package java.util.function; /** - * Apply a function to the integer-valued input argument, yielding an - * appropriate result. This is the {@code int}-consuming primitive - * specialization for {@link Function}. + * Represents a function that accepts an int-valued argument and produces a + * result. This is the {@code int}-consuming primitive specialization for + * {@link Function}. * - * @param the type of output objects from the function + *

                            This is a functional interface + * whose functional method is {@link #apply(int)}. + * + * @param the type of the result of the function * * @see Function * @since 1.8 @@ -38,9 +41,9 @@ public interface IntFunction { /** - * Compute the result of applying the function to the input argument + * Applies this function to the given argument. * - * @param value the input value + * @param value the function argument * @return the function result */ R apply(int value); diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/IntPredicate.java --- a/jdk/src/share/classes/java/util/function/IntPredicate.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/IntPredicate.java Fri Aug 02 09:38:09 2013 +0100 @@ -27,8 +27,12 @@ import java.util.Objects; /** - * Determines if the {@code int} input value matches some criteria. This is the - * {@code int}-consuming primitive type specialization of {@link Predicate}. + * Represents a predicate (boolean-valued function) of one {@code int}-valued + * argument. This is the {@code int}-consuming primitive type specialization of + * {@link Predicate}. + * + *

                            This is a functional interface + * whose functional method is {@link #test(int)}. * * @see Predicate * @since 1.8 @@ -37,38 +41,40 @@ public interface IntPredicate { /** - * Returns {@code true} if the input value matches some criteria. + * Evaluates this predicate on the given argument. * - * @param value the value to be tested - * @return {@code true} if the input value matches some criteria, otherwise - * {@code false} + * @param value the input argument + * @return {@code true} if the input argument matches the predicate, + * otherwise {@code false} */ boolean test(int value); /** - * Returns a predicate which evaluates to {@code true} only if this - * predicate and the provided predicate both evaluate to {@code true}. If - * this predicate returns {@code false} then the remaining predicate is not - * evaluated. + * Returns a composed predicate that represents a short-circuiting logical + * AND of this predicate and another. When evaluating the composed + * predicate, if this predicate is {@code false}, then the {@code other} + * predicate is not evaluated. * - *

                            Any exceptions thrown by either {@code test} method are relayed - * to the caller; if performing first operation throws an exception, the - * second operation will not be performed. + *

                            Any exceptions thrown during evaluation of either predicate are relayed + * to the caller; if evaluation of this predicate throws an exception, the + * {@code other} predicate will not be evaluated. * - * @param p a predicate which will be logically-ANDed with this predicate - * @return a new predicate which returns {@code true} only if both - * predicates return {@code true} - * @throws NullPointerException if p is null + * @param other a predicate that will be logically-ANDed with this + * predicate + * @return a composed predicate that represents the short-circuiting logical + * AND of this predicate and the {@code other} predicate + * @throws NullPointerException if other is null */ - default IntPredicate and(IntPredicate p) { - Objects.requireNonNull(p); - return (value) -> test(value) && p.test(value); + default IntPredicate and(IntPredicate other) { + Objects.requireNonNull(other); + return (value) -> test(value) && other.test(value); } /** - * Returns a predicate which negates the result of this predicate. + * Returns a predicate that represents the logical negation of this + * predicate. * - * @return a new predicate who's result is always the opposite of this + * @return a predicate that represents the logical negation of this * predicate */ default IntPredicate negate() { @@ -76,22 +82,23 @@ } /** - * Returns a predicate which evaluates to {@code true} if either this - * predicate or the provided predicate evaluates to {@code true}. If this - * predicate returns {@code true} then the remaining predicate is not - * evaluated. + * Returns a composed predicate that represents a short-circuiting logical + * OR of this predicate and another. When evaluating the composed + * predicate, if this predicate is {@code true}, then the {@code other} + * predicate is not evaluated. * - *

                            Any exceptions thrown by either {@code test} method are relayed - * to the caller; if performing first operation throws an exception, the - * second operation will not be performed. + *

                            Any exceptions thrown during evaluation of either predicate are relayed + * to the caller; if evaluation of this predicate throws an exception, the + * {@code other} predicate will not be evaluated. * - * @param p a predicate which will be logically-ORed with this predicate - * @return a new predicate which returns {@code true} if either predicate - * returns {@code true} - * @throws NullPointerException if p is null + * @param other a predicate that will be logically-ORed with this + * predicate + * @return a composed predicate that represents the short-circuiting logical + * OR of this predicate and the {@code other} predicate + * @throws NullPointerException if other is null */ - default IntPredicate or(IntPredicate p) { - Objects.requireNonNull(p); - return (value) -> test(value) || p.test(value); + default IntPredicate or(IntPredicate other) { + Objects.requireNonNull(other); + return (value) -> test(value) || other.test(value); } } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/IntSupplier.java --- a/jdk/src/share/classes/java/util/function/IntSupplier.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/IntSupplier.java Fri Aug 02 09:38:09 2013 +0100 @@ -25,8 +25,14 @@ package java.util.function; /** - * A supplier of {@code int} values. This is the {@code int}-providing - * primitive specialization of {@link Supplier}. + * Represents a supplier of {@code int}-valued results. This is the + * {@code int}-producing primitive specialization of {@link Supplier}. + * + *

                            There is no requirement that a distinct result be returned each + * time the supplier is invoked. + * + *

                            This is a functional interface + * whose functional method is {@link #getAsInt()}. * * @see Supplier * @since 1.8 @@ -35,9 +41,9 @@ public interface IntSupplier { /** - * Returns an {@code int} value. + * Gets a result. * - * @return an {@code int} value + * @return a result */ int getAsInt(); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/IntToDoubleFunction.java --- a/jdk/src/share/classes/java/util/function/IntToDoubleFunction.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/IntToDoubleFunction.java Fri Aug 02 09:38:09 2013 +0100 @@ -25,22 +25,24 @@ package java.util.function; /** - * Apply a function to the input argument, yielding an appropriate result. - * This is the {@code int}-to-{@code double} specialization for {@link Function}. + * Represents a function that accepts an int-valued argument and produces a + * double-valued result. This is the {@code int}-to-{@code double} primitive + * specialization for {@link Function}. + * + *

                            This is a functional interface + * whose functional method is {@link #applyAsDouble(int)}. * * @see Function - * @see DoubleToIntFunction - * @see LongToDoubleFunction * @since 1.8 */ @FunctionalInterface public interface IntToDoubleFunction { /** - * Compute the result of applying the function to the input arguments. + * Applies this function to the given argument. * - * @param value the input value - * @return the function result value + * @param value the function argument + * @return the function result */ double applyAsDouble(int value); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/IntToLongFunction.java --- a/jdk/src/share/classes/java/util/function/IntToLongFunction.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/IntToLongFunction.java Fri Aug 02 09:38:09 2013 +0100 @@ -25,22 +25,24 @@ package java.util.function; /** - * Apply a function to the input argument, yielding an appropriate result. - * This is the {@code int}-to-{@code long} specialization for {@link Function}. + * Represents a function that accepts an int-valued argument and produces a + * long-valued result. This is the {@code int}-to-{@code long} primitive + * specialization for {@link Function}. + * + *

                            This is a functional interface + * whose functional method is {@link #applyAsLong(int)}. * * @see Function - * @see LongToIntFunction - * @see DoubleToLongFunction * @since 1.8 */ @FunctionalInterface public interface IntToLongFunction { /** - * Compute the result of applying the function to the input arguments. + * Applies this function to the given argument. * - * @param value the input value - * @return the function result value + * @param value the function argument + * @return the function result */ long applyAsLong(int value); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/IntUnaryOperator.java --- a/jdk/src/share/classes/java/util/function/IntUnaryOperator.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/IntUnaryOperator.java Fri Aug 02 09:38:09 2013 +0100 @@ -27,9 +27,12 @@ import java.util.Objects; /** - * An operation on a single {@code int} operand yielding an {@code int} result. - * This is the primitive type specialization of {@link UnaryOperator} for - * {@code int}. + * Represents an operation on a single {@code int}-valued operand that produces + * an {@code int}-valued result. This is the primitive type specialization of + * {@link UnaryOperator} for {@code int}. + * + *

                            This is a functional interface + * whose functional method is {@link #applyAsInt(int)}. * * @see UnaryOperator * @since 1.8 @@ -38,24 +41,25 @@ public interface IntUnaryOperator { /** - * Returns the {@code int} value result of the operation upon the - * {@code int} operand. + * Applies this operator to the given operand. * - * @param operand the operand value - * @return the operation result value + * @param operand the operand + * @return the operator result */ int applyAsInt(int operand); /** - * Compose a new function which applies the provided function followed by - * this function. If either function throws an exception, it is relayed - * to the caller. + * Returns a composed operator that first applies the {@code before} + * operator to its input, and then applies this operator to the result. + * If evaluation of either operator throws an exception, it is relayed to + * the caller of the composed operator. * - * @param before an additional function to be applied before this function - * is applied - * @return a function which performs the provided function followed by this - * function + * @param before the operator to apply before this operator is applied + * @return a composed operator that first applies the {@code before} + * operator and then applies this operator * @throws NullPointerException if before is null + * + * @see #andThen(IntUnaryOperator) */ default IntUnaryOperator compose(IntUnaryOperator before) { Objects.requireNonNull(before); @@ -63,15 +67,17 @@ } /** - * Compose a new function which applies this function followed by the - * provided function. If either function throws an exception, it is relayed - * to the caller. + * Returns a composed operator that first applies this operator to + * its input, and then applies the {@code after} operator to the result. + * If evaluation of either operator throws an exception, it is relayed to + * the caller of the composed operator. * - * @param after an additional function to be applied after this function is - * applied - * @return a function which performs this function followed by the provided - * function followed + * @param after the operator to apply after this operator is applied + * @return a composed operator that first applies this operator and then + * applies the {@code after} operator * @throws NullPointerException if after is null + * + * @see #compose(IntUnaryOperator) */ default IntUnaryOperator andThen(IntUnaryOperator after) { Objects.requireNonNull(after); @@ -79,9 +85,9 @@ } /** - * Returns a unary operator that provides its input value as the result. + * Returns a unary operator that always returns its input argument. * - * @return a unary operator that provides its input value as the result + * @return a unary operator that always returns its input argument */ static IntUnaryOperator identity() { return t -> t; diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/LongBinaryOperator.java --- a/jdk/src/share/classes/java/util/function/LongBinaryOperator.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/LongBinaryOperator.java Fri Aug 02 09:38:09 2013 +0100 @@ -25,24 +25,26 @@ package java.util.function; /** - * An operation on two {@code long} operands yielding a {@code long} result. - * This is the primitive type specialization of {@link BinaryOperator} for - * {@code long}. + * Represents an operation upon two {@code long}-valued operands and producing a + * {@code long}-valued result. This is the primitive type specialization of + * {@link BinaryOperator} for {@code long}. + * + *

                            This is a functional interface + * whose functional method is {@link #applyAsLong(long, long)}. * * @see BinaryOperator + * @see LongUnaryOperator * @since 1.8 */ @FunctionalInterface public interface LongBinaryOperator { /** - * Returns the {@code long} result of the operation upon the {@code long} - * operands. The parameters are named {@code left} and {@code right} for - * operations where the order of parameters matters. + * Applies this operator to the given operands. * - * @param left the left operand value - * @param right the right operand value - * @return the result of the operation + * @param left the first operand + * @param right the second operand + * @return the operator result */ long applyAsLong(long left, long right); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/LongConsumer.java --- a/jdk/src/share/classes/java/util/function/LongConsumer.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/LongConsumer.java Fri Aug 02 09:38:09 2013 +0100 @@ -27,10 +27,13 @@ import java.util.Objects; /** - * An operation which accepts a single long argument and returns no result. - * This is the {@code long}-consuming primitive type specialization of - * {@link Consumer}. Unlike most other functional interfaces, {@code LongConsumer} - * is expected to operate via side-effects. + * Represents an operation that accepts a single {@code long}-valued argument and + * returns no result. This is the primitive type specialization of + * {@link Consumer} for {@code long}. Unlike most other functional interfaces, + * {@code LongConsumer} is expected to operate via side-effects. + * + *

                            This is a functional interface + * whose functional method is {@link #accept(long)}. * * @see Consumer * @since 1.8 @@ -39,30 +42,26 @@ public interface LongConsumer { /** - * Accept an input value. + * Performs this operation on the given argument. * - * @param value the input value + * @param value the input argument */ void accept(long value); /** - * Returns a {@code LongConsumer} which performs, in sequence, the operation - * represented by this object followed by the operation represented by - * another {@code LongConsumer}. - * - *

                            Any exceptions thrown by either {@code accept} method are relayed - * to the caller; if performing this operation throws an exception, the - * other operation will not be performed. + * Returns a composed {@code LongConsumer} that performs, in sequence, this + * operation followed by the {@code after} operation. If performing either + * operation throws an exception, it is relayed to the caller of the + * composed operation. If performing this operation throws an exception, + * the {@code after} operation will not be performed. * - * @param other a LongConsumer which will be chained after this - * LongConsumer - * @return a LongConsumer which performs in sequence the {@code accept} method - * of this LongConsumer and the {@code accept} method of the specified LongConsumer - * operation - * @throws NullPointerException if other is null + * @param after the operation to perform after this operation + * @return a composed {@code LongConsumer} that performs in sequence this + * operation followed by the {@code after} operation + * @throws NullPointerException if {@code after} is null */ - default LongConsumer chain(LongConsumer other) { - Objects.requireNonNull(other); - return (long t) -> { accept(t); other.accept(t); }; + default LongConsumer andThen(LongConsumer after) { + Objects.requireNonNull(after); + return (long t) -> { accept(t); after.accept(t); }; } } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/LongFunction.java --- a/jdk/src/share/classes/java/util/function/LongFunction.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/LongFunction.java Fri Aug 02 09:38:09 2013 +0100 @@ -25,11 +25,14 @@ package java.util.function; /** - * Apply a function to the long-valued input argument, yielding an appropriate - * result. This is the {@code long}-consuming primitive specialization for + * Represents a function that accepts a long-valued argument and produces a + * result. This is the {@code long}-consuming primitive specialization for * {@link Function}. * - * @param the type of output objects from the function + *

                            This is a functional interface + * whose functional method is {@link #apply(long)}. + * + * @param the type of the result of the function * * @see Function * @since 1.8 @@ -38,9 +41,9 @@ public interface LongFunction { /** - * Compute the result of applying the function to the input argument + * Applies this function to the given argument. * - * @param value the input value + * @param value the function argument * @return the function result */ R apply(long value); diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/LongPredicate.java --- a/jdk/src/share/classes/java/util/function/LongPredicate.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/LongPredicate.java Fri Aug 02 09:38:09 2013 +0100 @@ -27,8 +27,12 @@ import java.util.Objects; /** - * Determines if the {@code long} input value matches some criteria. This is the - * {@code long}-consuming primitive type specialization of {@link Predicate}. + * Represents a predicate (boolean-valued function) of one {@code long}-valued + * argument. This is the {@code long}-consuming primitive type specialization of + * {@link Predicate}. + * + *

                            This is a functional interface + * whose functional method is {@link #test(long)}. * * @see Predicate * @since 1.8 @@ -37,37 +41,40 @@ public interface LongPredicate { /** - * Returns {@code true} if the input value matches some criteria. + * Evaluates this predicate on the given argument. * - * @param value the value to be tested - * @return {@code true} if the input value matches some criteria, otherwise - * {@code false} + * @param value the input argument + * @return {@code true} if the input argument matches the predicate, + * otherwise {@code false} */ boolean test(long value); /** - * Returns a predicate which evaluates to {@code true} only if this - * predicate and the provided predicate both evaluate to {@code true}. If - * this predicate returns {@code false} then the remaining predicate is not - * evaluated. + * Returns a composed predicate that represents a short-circuiting logical + * AND of this predicate and another. When evaluating the composed + * predicate, if this predicate is {@code false}, then the {@code other} + * predicate is not evaluated. + * + *

                            Any exceptions thrown during evaluation of either predicate are relayed + * to the caller; if evaluation of this predicate throws an exception, the + * {@code other} predicate will not be evaluated. * - *

                            Any exceptions thrown by either {@code test} method are relayed - * to the caller; if performing first operation throws an exception, the - * second operation will not be performed. - * - * @param p a predicate which will be logically-ANDed with this predicate - * @return a new predicate which returns {@code true} only if both - * predicates return {@code true} + * @param other a predicate that will be logically-ANDed with this + * predicate + * @return a composed predicate that represents the short-circuiting logical + * AND of this predicate and the {@code other} predicate + * @throws NullPointerException if other is null */ - default LongPredicate and(LongPredicate p) { - Objects.requireNonNull(p); - return (value) -> test(value) && p.test(value); + default LongPredicate and(LongPredicate other) { + Objects.requireNonNull(other); + return (value) -> test(value) && other.test(value); } /** - * Returns a predicate which negates the result of this predicate. + * Returns a predicate that represents the logical negation of this + * predicate. * - * @return a new predicate who's result is always the opposite of this + * @return a predicate that represents the logical negation of this * predicate */ default LongPredicate negate() { @@ -75,22 +82,23 @@ } /** - * Returns a predicate which evaluates to {@code true} if either this - * predicate or the provided predicate evaluates to {@code true}. If this - * predicate returns {@code true} then the remaining predicate is not - * evaluated. + * Returns a composed predicate that represents a short-circuiting logical + * OR of this predicate and another. When evaluating the composed + * predicate, if this predicate is {@code true}, then the {@code other} + * predicate is not evaluated. * - *

                            Any exceptions thrown by either {@code test} method are relayed - * to the caller; if performing first operation throws an exception, the - * second operation will not be performed. + *

                            Any exceptions thrown during evaluation of either predicate are relayed + * to the caller; if evaluation of this predicate throws an exception, the + * {@code other} predicate will not be evaluated. * - * @param p a predicate which will be logically-ORed with this predicate - * @return a new predicate which returns {@code true} if either predicate - * returns {@code true} - * @throws NullPointerException if p is null + * @param other a predicate that will be logically-ORed with this + * predicate + * @return a composed predicate that represents the short-circuiting logical + * OR of this predicate and the {@code other} predicate + * @throws NullPointerException if other is null */ - default LongPredicate or(LongPredicate p) { - Objects.requireNonNull(p); - return (value) -> test(value) || p.test(value); + default LongPredicate or(LongPredicate other) { + Objects.requireNonNull(other); + return (value) -> test(value) || other.test(value); } } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/LongSupplier.java --- a/jdk/src/share/classes/java/util/function/LongSupplier.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/LongSupplier.java Fri Aug 02 09:38:09 2013 +0100 @@ -25,8 +25,14 @@ package java.util.function; /** - * A supplier of {@code long} values. This is the {@code long}-providing - * primitive specialization of {@link Supplier}. + * Represents a supplier of {@code long}-valued results. This is the + * {@code long}-producing primitive specialization of {@link Supplier}. + * + *

                            There is no requirement that a distinct result be returned each + * time the supplier is invoked. + * + *

                            This is a functional interface + * whose functional method is {@link #getAsLong()}. * * @see Supplier * @since 1.8 @@ -35,9 +41,9 @@ public interface LongSupplier { /** - * Returns a {@code long} value. + * Gets a result. * - * @return a {@code long} value + * @return a result */ long getAsLong(); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/LongToDoubleFunction.java --- a/jdk/src/share/classes/java/util/function/LongToDoubleFunction.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/LongToDoubleFunction.java Fri Aug 02 09:38:09 2013 +0100 @@ -25,22 +25,24 @@ package java.util.function; /** - * Apply a function to the input argument, yielding an appropriate result. - * This is the {@code long}-to-{@code double} specialization for {@link Function}. + * Represents a function that accepts a long-valued argument and produces a + * double-valued result. This is the {@code long}-to-{@code double} primitive + * specialization for {@link Function}. + * + *

                            This is a functional interface + * whose functional method is {@link #applyAsDouble(long)}. * * @see Function - * @see DoubleToLongFunction - * @see IntToDoubleFunction * @since 1.8 */ @FunctionalInterface public interface LongToDoubleFunction { /** - * Compute the result of applying the function to the input arguments. + * Applies this function to the given argument. * - * @param value the input value - * @return the function result value + * @param value the function argument + * @return the function result */ double applyAsDouble(long value); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/LongToIntFunction.java --- a/jdk/src/share/classes/java/util/function/LongToIntFunction.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/LongToIntFunction.java Fri Aug 02 09:38:09 2013 +0100 @@ -25,22 +25,24 @@ package java.util.function; /** - * Apply a function to the input argument, yielding an appropriate result. - * This is the {@code long}-to-{@code int} specialization for {@link Function}. + * Represents a function that accepts a long-valued argument and produces an + * int-valued result. This is the {@code long}-to-{@code int} primitive + * specialization for {@link Function}. + * + *

                            This is a functional interface + * whose functional method is {@link #applyAsInt(long)}. * * @see Function - * @see IntToLongFunction - * @see DoubleToIntFunction * @since 1.8 */ @FunctionalInterface public interface LongToIntFunction { /** - * Compute the result of applying the function to the input arguments. + * Applies this function to the given argument. * - * @param value the input value - * @return the function result value + * @param value the function argument + * @return the function result */ int applyAsInt(long value); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/LongUnaryOperator.java --- a/jdk/src/share/classes/java/util/function/LongUnaryOperator.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/LongUnaryOperator.java Fri Aug 02 09:38:09 2013 +0100 @@ -27,9 +27,12 @@ import java.util.Objects; /** - * An operation on a single {@code long} operand yielding a {@code long} result. - * This is the primitive type specialization of {@link UnaryOperator} for - * {@code long}. + * Represents an operation on a single {@code long}-valued operand that produces + * a {@code long}-valued result. This is the primitive type specialization of + * {@link UnaryOperator} for {@code long}. + * + *

                            This is a functional interface + * whose functional method is {@link #applyAsLong(long)}. * * @see UnaryOperator * @since 1.8 @@ -38,24 +41,25 @@ public interface LongUnaryOperator { /** - * Returns the {@code long} result of the operation upon the {@code long} - * operand. + * Applies this operator to the given operand. * - * @param operand the operand value - * @return the operation result value + * @param operand the operand + * @return the operator result */ long applyAsLong(long operand); /** - * Compose a new function which applies the provided function followed by - * this function. If either function throws an exception, it is relayed - * to the caller. + * Returns a composed operator that first applies the {@code before} + * operator to its input, and then applies this operator to the result. + * If evaluation of either operator throws an exception, it is relayed to + * the caller of the composed operator. * - * @param before An additional function to be applied before this function - * is applied - * @return A function which performs the provided function followed by this - * function + * @param before the operator to apply before this operator is applied + * @return a composed operator that first applies the {@code before} + * operator and then applies this operator * @throws NullPointerException if before is null + * + * @see #andThen(LongUnaryOperator) */ default LongUnaryOperator compose(LongUnaryOperator before) { Objects.requireNonNull(before); @@ -63,15 +67,17 @@ } /** - * Compose a new function which applies this function followed by the - * provided function. If either function throws an exception, it is relayed - * to the caller. + * Returns a composed operator that first applies this operator to + * its input, and then applies the {@code after} operator to the result. + * If evaluation of either operator throws an exception, it is relayed to + * the caller of the composed operator. * - * @param after An additional function to be applied after this function is - * applied - * @return A function which performs this function followed by the provided - * function followed + * @param after the operator to apply after this operator is applied + * @return a composed operator that first applies this operator and then + * applies the {@code after} operator * @throws NullPointerException if after is null + * + * @see #compose(LongUnaryOperator) */ default LongUnaryOperator andThen(LongUnaryOperator after) { Objects.requireNonNull(after); @@ -79,9 +85,9 @@ } /** - * Returns a unary operator that provides its input value as the result. + * Returns a unary operator that always returns its input argument. * - * @return a unary operator that provides its input value as the result + * @return a unary operator that always returns its input argument */ static LongUnaryOperator identity() { return t -> t; diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/ObjDoubleConsumer.java --- a/jdk/src/share/classes/java/util/function/ObjDoubleConsumer.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/ObjDoubleConsumer.java Fri Aug 02 09:38:09 2013 +0100 @@ -25,12 +25,16 @@ package java.util.function; /** - * An operation which accepts an object reference and a double, and returns no - * result. This is the {@code (reference, double)} specialization of - * {@link BiConsumer}. Unlike most other functional interfaces, - * {@code ObjDoubleConsumer} is expected to operate via side-effects. + * Represents an operation that accepts an object-valued and a + * {@code double}-valued argument, and returns no result. This is the + * {@code (reference, double)} specialization of {@link BiConsumer}. + * Unlike most other functional interfaces, {@code ObjDoubleConsumer} is + * expected to operate via side-effects. * - * @param Type of reference argument to {@code accept()}. + *

                            This is a functional interface + * whose functional method is {@link #accept(Object, double)}. + * + * @param the type of the object argument to the operation * * @see BiConsumer * @since 1.8 @@ -39,10 +43,10 @@ public interface ObjDoubleConsumer { /** - * Accept a set of input values. + * Performs this operation on the given arguments. * - * @param t an input object - * @param value an input value + * @param t the first input argument + * @param value the second input argument */ void accept(T t, double value); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/ObjIntConsumer.java --- a/jdk/src/share/classes/java/util/function/ObjIntConsumer.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/ObjIntConsumer.java Fri Aug 02 09:38:09 2013 +0100 @@ -25,12 +25,16 @@ package java.util.function; /** - * An operation which accepts an object reference and an int, and returns no - * result. This is the {@code (reference, int)} specialization of - * {@link BiConsumer}. Unlike most other functional interfaces, - * {@code ObjIntConsumer} is expected to operate via side-effects. + * Represents an operation that accepts an object-valued and a + * {@code int}-valued argument, and returns no result. This is the + * {@code (reference, int)} specialization of {@link BiConsumer}. + * Unlike most other functional interfaces, {@code ObjIntConsumer} is + * expected to operate via side-effects. * - * @param Type of reference argument to {@code accept()} + *

                            This is a functional interface + * whose functional method is {@link #accept(Object, int)}. + * + * @param the type of the object argument to the operation * * @see BiConsumer * @since 1.8 @@ -39,10 +43,10 @@ public interface ObjIntConsumer { /** - * Accept a set of input values. + * Performs this operation on the given arguments. * - * @param t an input object - * @param value an input value + * @param t the first input argument + * @param value the second input argument */ void accept(T t, int value); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/ObjLongConsumer.java --- a/jdk/src/share/classes/java/util/function/ObjLongConsumer.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/ObjLongConsumer.java Fri Aug 02 09:38:09 2013 +0100 @@ -25,12 +25,16 @@ package java.util.function; /** - * An operation which accepts an object reference and a long, and returns no - * result. This is the {@code (reference, long)} specialization of - * {@link BiConsumer}. Unlike most other functional interfaces, - * {@code ObjLongConsumer} is expected to operate via side-effects. + * Represents an operation that accepts an object-valued and a + * {@code long}-valued argument, and returns no result. This is the + * {@code (reference, long)} specialization of {@link BiConsumer}. + * Unlike most other functional interfaces, {@code ObjLongConsumer} is + * expected to operate via side-effects. * - * @param Type of reference argument to {@code accept()} + *

                            This is a functional interface + * whose functional method is {@link #accept(Object, long)}. + * + * @param the type of the object argument to the operation * * @see BiConsumer * @since 1.8 @@ -39,10 +43,10 @@ public interface ObjLongConsumer { /** - * Accept a set of input values. + * Performs this operation on the given arguments. * - * @param t an input object - * @param value an input value + * @param t the first input argument + * @param value the second input argument */ void accept(T t, long value); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/Predicate.java --- a/jdk/src/share/classes/java/util/function/Predicate.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/Predicate.java Fri Aug 02 09:38:09 2013 +0100 @@ -27,9 +27,12 @@ import java.util.Objects; /** - * Determines if the input object matches some criteria. + * Represents a predicate (boolean-valued function) of one argument. * - * @param the type of argument to {@code test} + *

                            This is a functional interface + * whose functional method is {@link #test(Object)}. + * + * @param the type of the input to the predicate * * @since 1.8 */ @@ -37,76 +40,80 @@ public interface Predicate { /** - * Returns {@code true} if the input object matches some criteria. + * Evaluates this predicate on the given argument. * - * @param t the input object - * @return {@code true} if the input object matches some criteria, otherwise - * {@code false} + * @param t the input argument + * @return {@code true} if the input argument matches the predicate, + * otherwise {@code false} */ boolean test(T t); /** - * Returns a predicate which evaluates to {@code true} only if this - * predicate and the provided predicate both evaluate to {@code true}. If - * this predicate returns {@code false} then the remaining predicate is not - * evaluated. + * Returns a composed predicate that represents a short-circuiting logical + * AND of this predicate and another. When evaluating the composed + * predicate, if this predicate is {@code false}, then the {@code other} + * predicate is not evaluated. * - *

                            Any exceptions thrown by either {@code test} method are relayed - * to the caller; if performing first operation throws an exception, the - * second operation will not be performed. + *

                            Any exceptions thrown during evaluation of either predicate are relayed + * to the caller; if evaluation of this predicate throws an exception, the + * {@code other} predicate will not be evaluated. * - * @param p a predicate which will be logically-ANDed with this predicate - * @return a new predicate which returns {@code true} only if both - * predicates return {@code true} - * @throws NullPointerException if p is null + * @param other a predicate that will be logically-ANDed with this + * predicate + * @return a composed predicate that represents the short-circuiting logical + * AND of this predicate and the {@code other} predicate + * @throws NullPointerException if other is null */ - default Predicate and(Predicate p) { - Objects.requireNonNull(p); - return (t) -> test(t) && p.test(t); + default Predicate and(Predicate other) { + Objects.requireNonNull(other); + return (t) -> test(t) && other.test(t); } /** - * Returns a predicate which negates the result of this predicate. + * Returns a predicate that represents the logical negation of this + * predicate. * - * @return a new predicate who's result is always the opposite of this - * predicate. + * @return a predicate that represents the logical negation of this + * predicate */ default Predicate negate() { return (t) -> !test(t); } /** - * Returns a predicate which evaluates to {@code true} if either this - * predicate or the provided predicate evaluates to {@code true}. If this - * predicate returns {@code true} then the remaining predicate is not - * evaluated. + * Returns a composed predicate that represents a short-circuiting logical + * OR of this predicate and another. When evaluating the composed + * predicate, if this predicate is {@code true}, then the {@code other} + * predicate is not evaluated. * - *

                            Any exceptions thrown by either {@code test} method are relayed - * to the caller; if performing first operation throws an exception, the - * second operation will not be performed. + *

                            Any exceptions thrown during evaluation of either predicate are relayed + * to the caller; if evaluation of this predicate throws an exception, the + * {@code other} predicate will not be evaluated. * - * @param p a predicate which will be logically-ORed with this predicate - * @return a new predicate which returns {@code true} if either predicate - * returns {@code true} - * @throws NullPointerException if p is null + * @param other a predicate that will be logically-ORed with this + * predicate + * @return a composed predicate that represents the short-circuiting logical + * OR of this predicate and the {@code other} predicate + * @throws NullPointerException if other is null */ - default Predicate or(Predicate p) { - Objects.requireNonNull(p); - return (t) -> test(t) || p.test(t); + default Predicate or(Predicate other) { + Objects.requireNonNull(other); + return (t) -> test(t) || other.test(t); } /** - * Returns a predicate who's result matches - * {@code Objects.equals(target, t)}. + * Returns a predicate that tests if two arguments are equal according + * to {@link Objects#equals(Object, Object)}. * - * @param the type of values evaluated by the predicate - * @param target the target value to be compared for equality - * @return a predicate who's result matches - * {@code Objects.equals(target, t)} + * @param the type of arguments to the predicate + * @param targetRef the object reference with which to compare for equality, + * which may be {@code null} + * @return a predicate that tests if two arguments are equal according + * to {@link Objects#equals(Object, Object)} */ - static Predicate isEqual(Object target) { - return (null == target) + static Predicate isEqual(Object targetRef) { + return (null == targetRef) ? Objects::isNull - : object -> target.equals(object); + : object -> targetRef.equals(object); } } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/Supplier.java --- a/jdk/src/share/classes/java/util/function/Supplier.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/Supplier.java Fri Aug 02 09:38:09 2013 +0100 @@ -25,10 +25,15 @@ package java.util.function; /** - * A supplier of objects. The result objects are either created during the - * invocation of {@link #get} or by some prior action. + * Represents a supplier of results. + * + *

                            There is no requirement that a new or distinct result be returned each + * time the supplier is invoked. * - * @param The type of objects returned by {@code get} + *

                            This is a functional interface + * whose functional method is {@link #get()}. + * + * @param the type of results supplied by this supplier * * @since 1.8 */ @@ -36,9 +41,9 @@ public interface Supplier { /** - * Returns an object. + * Gets a result. * - * @return an object + * @return a result */ T get(); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/ToDoubleBiFunction.java --- a/jdk/src/share/classes/java/util/function/ToDoubleBiFunction.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/ToDoubleBiFunction.java Fri Aug 02 09:38:09 2013 +0100 @@ -25,13 +25,15 @@ package java.util.function; /** - * Apply a function to the input arguments, yielding an appropriate result. - * This is the {@code double}-bearing specialization for {@link BiFunction}. + * Represents a function that accepts two arguments and produces a double-valued + * result. This is the {@code double}-producing primitive specialization for + * {@link BiFunction}. * - * @param the type of the first argument to the {@code applyAsDouble} - * operation. - * @param the type of the second argument to the {@code applyAsDouble} - * operation. + *

                            This is a functional interface + * whose functional method is {@link #applyAsDouble(Object, Object)}. + * + * @param the type of the first argument to the function + * @param the type of the second argument to the function * * @see BiFunction * @since 1.8 @@ -40,11 +42,11 @@ public interface ToDoubleBiFunction { /** - * Compute the result of applying the function to the input arguments + * Applies this function to the given arguments. * - * @param t an input object - * @param u an input object - * @return the function result value + * @param t the first function argument + * @param u the second function argument + * @return the function result */ double applyAsDouble(T t, U u); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/ToDoubleFunction.java --- a/jdk/src/share/classes/java/util/function/ToDoubleFunction.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/ToDoubleFunction.java Fri Aug 02 09:38:09 2013 +0100 @@ -25,10 +25,13 @@ package java.util.function; /** - * Apply a function to the input argument, yielding an appropriate result. - * This is the {@code double}-bearing specialization for {@link Function}. + * Represents a function that produces a double-valued result. This is the + * {@code double}-producing primitive specialization for {@link Function}. * - * @param the type of input objects to the function + *

                            This is a functional interface + * whose functional method is {@link #applyAsDouble(Object)}. + * + * @param the type of the input to the function * * @see Function * @since 1.8 @@ -37,10 +40,10 @@ public interface ToDoubleFunction { /** - * Compute the result of applying the function to the input argument + * Applies this function to the given argument. * - * @param t the input object - * @return the function result value + * @param value the function argument + * @return the function result */ - double applyAsDouble(T t); + double applyAsDouble(T value); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/ToIntBiFunction.java --- a/jdk/src/share/classes/java/util/function/ToIntBiFunction.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/ToIntBiFunction.java Fri Aug 02 09:38:09 2013 +0100 @@ -25,13 +25,15 @@ package java.util.function; /** - * Apply a function to the input arguments, yielding an appropriate result. - * This is the {@code int}-bearing specialization for {@link BiFunction}. + * Represents a function that accepts two arguments and produces an int-valued + * result. This is the {@code int}-producing primitive specialization for + * {@link BiFunction}. * - * @param the type of the first argument to the {@code applyAsInt} - * operation - * @param the type of the second argument to the {@code applyAsInt} - * operation + *

                            This is a functional interface + * whose functional method is {@link #applyAsInt(Object, Object)}. + * + * @param the type of the first argument to the function + * @param the type of the second argument to the function * * @see BiFunction * @since 1.8 @@ -40,11 +42,11 @@ public interface ToIntBiFunction { /** - * Compute the result of applying the function to the input arguments + * Applies this function to the given arguments. * - * @param t an input object - * @param u an input object - * @return the function result value + * @param t the first function argument + * @param u the second function argument + * @return the function result */ int applyAsInt(T t, U u); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/ToIntFunction.java --- a/jdk/src/share/classes/java/util/function/ToIntFunction.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/ToIntFunction.java Fri Aug 02 09:38:09 2013 +0100 @@ -25,10 +25,13 @@ package java.util.function; /** - * Apply a function to the input argument, yielding an appropriate result. - * This is the {@code int}-bearing specialization for {@link Function}. + * Represents a function that produces an int-valued result. This is the + * {@code int}-producing primitive specialization for {@link Function}. * - * @param the type of input objects to the function + *

                            This is a functional interface + * whose functional method is {@link #applyAsInt(Object)}. + * + * @param the type of the input to the function * * @see Function * @since 1.8 @@ -37,10 +40,10 @@ public interface ToIntFunction { /** - * Compute the result of applying the function to the input arguments + * Applies this function to the given argument. * - * @param t the input object - * @return the function result value + * @param value the function argument + * @return the function result */ - int applyAsInt(T t); + int applyAsInt(T value); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/ToLongBiFunction.java --- a/jdk/src/share/classes/java/util/function/ToLongBiFunction.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/ToLongBiFunction.java Fri Aug 02 09:38:09 2013 +0100 @@ -25,13 +25,15 @@ package java.util.function; /** - * Apply a function to the input arguments, yielding an appropriate result. - * This is the {@code long}-bearing specialization for {@link BiFunction}. + * Represents a function that accepts two arguments and produces a long-valued + * result. This is the {@code long}-producing primitive specialization for + * {@link BiFunction}. * - * @param the type of the first argument to the {@code applyAsLong} - * operation. - * @param the type of the second argument to the {@code applyAsLong} - * operation. + *

                            This is a functional interface + * whose functional method is {@link #applyAsLong(Object, Object)}. + * + * @param the type of the first argument to the function + * @param the type of the second argument to the function * * @see BiFunction * @since 1.8 @@ -40,11 +42,11 @@ public interface ToLongBiFunction { /** - * Compute the result of applying the function to the input arguments. + * Applies this function to the given arguments. * - * @param t an input object - * @param u an input object - * @return the function result value + * @param t the first function argument + * @param u the second function argument + * @return the function result */ long applyAsLong(T t, U u); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/ToLongFunction.java --- a/jdk/src/share/classes/java/util/function/ToLongFunction.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/ToLongFunction.java Fri Aug 02 09:38:09 2013 +0100 @@ -25,10 +25,13 @@ package java.util.function; /** - * Apply a function to the input argument, yielding an appropriate result. - * This is the {@code long}-bearing specialization for {@link Function}. + * Represents a function that produces a long-valued result. This is the + * {@code long}-producing primitive specialization for {@link Function}. * - * @param the type of input objects to the function + *

                            This is a functional interface + * whose functional method is {@link #applyAsLong(Object)}. + * + * @param the type of the input to the function * * @see Function * @since 1.8 @@ -37,10 +40,10 @@ public interface ToLongFunction { /** - * Compute the result of applying the function to the input arguments. + * Applies this function to the given argument. * - * @param t the input object - * @return the function result value + * @param value the function argument + * @return the function result */ - long applyAsLong(T t); + long applyAsLong(T value); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/UnaryOperator.java --- a/jdk/src/share/classes/java/util/function/UnaryOperator.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/UnaryOperator.java Fri Aug 02 09:38:09 2013 +0100 @@ -25,11 +25,14 @@ package java.util.function; /** - * An operation upon a single operand yielding a result. The operand and the - * result are of the same type. This is a specialization of {@code Function} for + * Represents an operation on a single operand that produces a result of the + * same type as its operand. This is a specialization of {@code Function} for * the case where the operand and result are of the same type. * - * @param the type of operand to {@code apply} and of the result + *

                            This is a functional interface + * whose functional method is {@link #apply(Object)}. + * + * @param the type of the operand and result of the operator * * @see Function * @since 1.8 @@ -38,10 +41,10 @@ public interface UnaryOperator extends Function { /** - * Returns a unary operator that provides its input value as the result. + * Returns a unary operator that always returns its input argument. * - * @param the type of the input and output objects to the function - * @return a unary operator that provides its input value as the result + * @param the type of the input and output of the operator + * @return a unary operator that always returns its input argument */ static UnaryOperator identity() { return t -> t; diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/function/package-info.java --- a/jdk/src/share/classes/java/util/function/package-info.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/function/package-info.java Fri Aug 02 09:38:09 2013 +0100 @@ -25,56 +25,82 @@ /** * Functional interfaces provide target types for lambda expressions - * and method references. Each functional interface has a single abstract method + * and method references. Each functional interface has a single abstract + * method, called the functional method for that functional interface, * to which the lambda expression's parameter and return types are matched or - * adapted. Functional interfaces can provide a target type in multiple contexts, - * such as assignment context, method invocation, or cast context: + * adapted. Functional interfaces can provide a target type in multiple + * contexts, such as assignment context, method invocation, or cast context: * - *

                            - *     Predicate<String> p = String::isEmpty;
                            + * 
                            {@code
                            + *     // Assignment context
                            + *     Predicate p = String::isEmpty;
                              *
                            + *     // Method invocation context
                              *     stream.filter(e -> e.getSize() > 10)...
                              *
                            + *     // Cast context
                              *     stream.map((ToIntFunction) e -> e.getSize())...
                            - * 
                            + * }
                            * - *

                            The interfaces in this package are functional interfaces used by the JDK, - * and are available to be used by user code as well. While they do not identify - * a complete set of function shapes to which lambda expressions might be adapted, - * they provide enough to cover common requirements. + *

                            The interfaces in this package are general purpose functional interfaces + * used by the JDK, and are available to be used by user code as well. While + * they do not identify a complete set of function shapes to which lambda + * expressions might be adapted, they provide enough to cover common + * requirements. Other functional interfaces provided for specific purposes, + * such as {@link java.io.FileFilter}, are defined in the packages where they + * are used. * - *

                            The interfaces in this package are annotated with @{link FunctionalInterface}. - * This annotation is not a requirement for the compiler to recognize an interface - * as a functional interface, but merely an aid to capture design intent and enlist the - * help of the compiler in identifying accidental violations of design intent. + *

                            The interfaces in this package are annotated with + * {@link java.lang.FunctionalInterface}. This annotation is not a requirement + * for the compiler to recognize an interface as a functional interface, but + * merely an aid to capture design intent and enlist the help of the compiler in + * identifying accidental violations of design intent. * - *

                            The functional interfaces in this package follow an extensible naming convention, - * as follows: + *

                            Functional interfaces often represent abstract concepts like functions, + * actions, or predicates. In documenting functional interfaces, or referring + * to variables typed as functional interfaces, it is common to refer directly + * to those abstract concepts, for example using "this function" instead of + * "the function represented by this object". + * + *

                            The functional interfaces in this package follow an extensible naming + * convention, as follows: * *

                              - *
                            • There are several basic function shapes, including {@link java.util.function.Function} ({@code T -> R}), - * {@link java.util.function.Consumer} ({@code T -> void}), - * {@link java.util.function.Predicate} ({@code T -> boolean}), - * and {@link java.util.function.Supplier} ({@code () -> T}). + *
                            • There are several basic function shapes, including + * {@link java.util.function.Function} (unary function from {@code T} to {@code R}), + * {@link java.util.function.Consumer} (unary function from {@code T} to {@code void}), + * {@link java.util.function.Predicate} (unary function from {@code T} to {@code boolean}), + * and {@link java.util.function.Supplier} (nilary function to {@code R}). *
                            • - *
                            • Function shapes have a natural arity based on how they are most commonly used. - * The basic shapes can be modified by an arity prefix to indicate a different arity, - * such as {@link java.util.function.BiFunction} ({@code (T, U) -> R}). + * + *
                            • Function shapes have a natural arity based on how they are most + * commonly used. The basic shapes can be modified by an arity prefix to + * indicate a different arity, such as + * {@link java.util.function.BiFunction} (binary function from {@code T} and + * {@code U} to {@code R}). *
                            • - *
                            • There are additional derived function shapes which extend the basic function - * shapes, including {@link java.util.function.UnaryOperator} (extends {@code Function}) and - * {@link java.util.function.BinaryOperator} (extends {@code BiFunction}). + * + *
                            • There are additional derived function shapes which extend the basic + * function shapes, including {@link java.util.function.UnaryOperator} + * (extends {@code Function}) and {@link java.util.function.BinaryOperator} + * (extends {@code BiFunction}). *
                            • - *
                            • Type parameters of functional interfaces can be specialized to primitives with - * additional type prefixes. To specialize the return type for a type that has both - * generic return type and generic arguments, we prefix {@code ToXxx}, as in - * {@link java.util.function.ToIntFunction}. Otherwise, type arguments are specialized left-to-right, - * as in {@link java.util.function.DoubleConsumer} or {@link java.util.function.ObjIntConsumer}. - * (The type prefix {@code Obj} is used to indicate that we don't want to specialize this parameter, - * but want to move on to the next parameter.) These schemes can be combined as in {@code IntToDoubleFunction}. + * + *
                            • Type parameters of functional interfaces can be specialized to + * primitives with additional type prefixes. To specialize the return type + * for a type that has both generic return type and generic arguments, we + * prefix {@code ToXxx}, as in {@link java.util.function.ToIntFunction}. + * Otherwise, type arguments are specialized left-to-right, as in + * {@link java.util.function.DoubleConsumer} + * or {@link java.util.function.ObjIntConsumer}. + * (The type prefix {@code Obj} is used to indicate that we don't want to + * specialize this parameter, but want to move on to the next parameter, + * as in {@link java.util.function.ObjIntConsumer}.) + * These schemes can be combined, as in {@code IntToDoubleFunction}. *
                            • - *
                            • If there are specialization prefixes for all arguments, the arity prefix may be left - * out (as in {@link java.util.function.ObjIntConsumer}). + * + *
                            • If there are specialization prefixes for all arguments, the arity + * prefix may be left out (as in {@link java.util.function.ObjIntConsumer}). *
                            • *
                            * diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/jar/Attributes.java --- a/jdk/src/share/classes/java/util/jar/Attributes.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/jar/Attributes.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -527,7 +527,7 @@ * Name object for Manifest-Version * manifest attribute. This attribute indicates the version number * of the manifest standard to which a JAR file's manifest conforms. - * @see + * @see * Manifest and Signature Specification */ public static final Name MANIFEST_VERSION = new Name("Manifest-Version"); @@ -535,7 +535,7 @@ /** * Name object for Signature-Version * manifest attribute used when signing JAR files. - * @see + * @see * Manifest and Signature Specification */ public static final Name SIGNATURE_VERSION = new Name("Signature-Version"); diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/jar/JarEntry.java --- a/jdk/src/share/classes/java/util/jar/JarEntry.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/jar/JarEntry.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -81,6 +81,7 @@ * * @return the Manifest Attributes for this * entry, or null if none + * @throws IOException if an I/O error has occurred */ public Attributes getAttributes() throws IOException { return attr; diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/jar/JarFile.java --- a/jdk/src/share/classes/java/util/jar/JarFile.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/jar/JarFile.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -168,6 +168,7 @@ * * @throws IllegalStateException * may be thrown if the jar file has been closed + * @throws IOException if an I/O error has occurred */ public Manifest getManifest() throws IOException { return getManifestFromReference(); diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/stream/StreamSupport.java --- a/jdk/src/share/classes/java/util/stream/StreamSupport.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/stream/StreamSupport.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -96,6 +96,7 @@ * Non-Interference for * more details. * + * @param the type of stream elements * @param supplier a {@code Supplier} of a {@code Spliterator} * @param characteristics Spliterator characteristics of the supplied * {@code Spliterator}. The characteristics must be equal to diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/java/util/stream/Streams.java --- a/jdk/src/share/classes/java/util/stream/Streams.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/java/util/stream/Streams.java Fri Aug 02 09:38:09 2013 +0100 @@ -681,11 +681,9 @@ this.aSpliterator = aSpliterator; this.bSpliterator = bSpliterator; beforeSplit = true; - // The spliterator is unsized before splitting if a and b are - // sized and the sum of the estimates overflows - unsized = aSpliterator.hasCharacteristics(SIZED) - && aSpliterator.hasCharacteristics(SIZED) - && aSpliterator.estimateSize() + bSpliterator.estimateSize() < 0; + // The spliterator is known to be unsized before splitting if the + // sum of the estimates overflows. + unsized = aSpliterator.estimateSize() + bSpliterator.estimateSize() < 0; } @Override diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/javax/swing/JFileChooser.java --- a/jdk/src/share/classes/javax/swing/JFileChooser.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/javax/swing/JFileChooser.java Fri Aug 02 09:38:09 2013 +0100 @@ -1149,9 +1149,10 @@ int index = filters.indexOf(f); if (index >= 0) { if(getFileFilter() == f) { - if (isAcceptAllFileFilterUsed()) { + FileFilter aaff = getAcceptAllFileFilter(); + if (isAcceptAllFileFilterUsed() && (aaff != f)) { // choose default filter if it is used - setFileFilter(getAcceptAllFileFilter()); + setFileFilter(aaff); } else if (index > 0) { // choose the first filter, because it is not removed diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/javax/swing/plaf/synth/SynthTreeUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthTreeUI.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTreeUI.java Fri Aug 02 09:38:09 2013 +0100 @@ -344,7 +344,8 @@ configureRenderer(cellContext); while (!done && paintingEnumerator.hasMoreElements()) { path = (TreePath)paintingEnumerator.nextElement(); - if (path != null) { + bounds = getPathBounds(tree, path); + if ((path != null) && (bounds != null)) { isLeaf = treeModel.isLeaf(path.getLastPathComponent()); if (isLeaf) { isExpanded = hasBeenExpanded = false; @@ -353,7 +354,6 @@ isExpanded = treeState.getExpandedState(path); hasBeenExpanded = tree.hasBeenExpanded(path); } - bounds = getPathBounds(tree, path); rowBounds.y = bounds.y; rowBounds.height = bounds.height; paintRow(renderer, dtcr, context, cellContext, g, @@ -383,7 +383,8 @@ paintingEnumerator = treeState.getVisiblePathsFrom(initialPath); while (!done && paintingEnumerator.hasMoreElements()) { path = (TreePath)paintingEnumerator.nextElement(); - if (path != null) { + bounds = getPathBounds(tree, path); + if ((path != null) && (bounds != null)) { isLeaf = treeModel.isLeaf(path.getLastPathComponent()); if (isLeaf) { isExpanded = hasBeenExpanded = false; @@ -392,7 +393,6 @@ isExpanded = treeState.getExpandedState(path); hasBeenExpanded = tree.hasBeenExpanded(path); } - bounds = getPathBounds(tree, path); // See if the vertical line to the parent has been drawn. parentPath = path.getParentPath(); if (parentPath != null) { diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMKeyValue.java --- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMKeyValue.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMKeyValue.java Fri Aug 02 09:38:09 2013 +0100 @@ -218,9 +218,11 @@ ("unable to create RSA KeyFactory: " + e.getMessage()); } } - Element modulusElem = DOMUtils.getFirstChildElement(kvtElem); + Element modulusElem = DOMUtils.getFirstChildElement(kvtElem, + "Modulus"); modulus = new DOMCryptoBinary(modulusElem.getFirstChild()); - Element exponentElem = DOMUtils.getNextSiblingElement(modulusElem); + Element exponentElem = DOMUtils.getNextSiblingElement(modulusElem, + "Exponent"); exponent = new DOMCryptoBinary(exponentElem.getFirstChild()); RSAPublicKeySpec spec = new RSAPublicKeySpec(modulus.getBigNum(), exponent.getBigNum()); @@ -289,13 +291,13 @@ // check for P and Q if (curElem.getLocalName().equals("P")) { p = new DOMCryptoBinary(curElem.getFirstChild()); - curElem = DOMUtils.getNextSiblingElement(curElem); + curElem = DOMUtils.getNextSiblingElement(curElem, "Q"); q = new DOMCryptoBinary(curElem.getFirstChild()); curElem = DOMUtils.getNextSiblingElement(curElem); } if (curElem.getLocalName().equals("G")) { g = new DOMCryptoBinary(curElem.getFirstChild()); - curElem = DOMUtils.getNextSiblingElement(curElem); + curElem = DOMUtils.getNextSiblingElement(curElem, "Y"); } y = new DOMCryptoBinary(curElem.getFirstChild()); curElem = DOMUtils.getNextSiblingElement(curElem); @@ -460,7 +462,7 @@ } else { throw new MarshalException("Invalid ECKeyValue"); } - curElem = DOMUtils.getNextSiblingElement(curElem); + curElem = DOMUtils.getNextSiblingElement(curElem, "PublicKey"); ECPoint ecPoint = null; try { Object[] args = new Object[] { Base64.decode(curElem), diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMManifest.java --- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMManifest.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMManifest.java Fri Aug 02 09:38:09 2013 +0100 @@ -101,20 +101,24 @@ boolean secVal = Utils.secureValidation(context); - Element refElem = DOMUtils.getFirstChildElement(manElem); + Element refElem = DOMUtils.getFirstChildElement(manElem, "Reference"); List refs = new ArrayList(); + refs.add(new DOMReference(refElem, context, provider)); - int refCount = 0; + refElem = DOMUtils.getNextSiblingElement(refElem); while (refElem != null) { + String localName = refElem.getLocalName(); + if (!localName.equals("Reference")) { + throw new MarshalException("Invalid element name: " + + localName + ", expected Reference"); + } refs.add(new DOMReference(refElem, context, provider)); - refElem = DOMUtils.getNextSiblingElement(refElem); - - refCount++; - if (secVal && (refCount > DOMSignedInfo.MAXIMUM_REFERENCE_COUNT)) { + if (secVal && (refs.size() > DOMSignedInfo.MAXIMUM_REFERENCE_COUNT)) { String error = "A maxiumum of " + DOMSignedInfo.MAXIMUM_REFERENCE_COUNT + " " + "references per Manifest are allowed with secure validation"; throw new MarshalException(error); } + refElem = DOMUtils.getNextSiblingElement(refElem); } this.references = Collections.unmodifiableList(refs); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMReference.java --- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMReference.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMReference.java Fri Aug 02 09:38:09 2013 +0100 @@ -204,23 +204,33 @@ Element nextSibling = DOMUtils.getFirstChildElement(refElem); List transforms = new ArrayList(5); if (nextSibling.getLocalName().equals("Transforms")) { - Element transformElem = DOMUtils.getFirstChildElement(nextSibling); - - int transformCount = 0; + Element transformElem = DOMUtils.getFirstChildElement(nextSibling, + "Transform"); + transforms.add(new DOMTransform(transformElem, context, provider)); + transformElem = DOMUtils.getNextSiblingElement(transformElem); while (transformElem != null) { + String localName = transformElem.getLocalName(); + if (!localName.equals("Transform")) { + throw new MarshalException( + "Invalid element name: " + localName + + ", expected Transform"); + } transforms.add (new DOMTransform(transformElem, context, provider)); - transformElem = DOMUtils.getNextSiblingElement(transformElem); - - transformCount++; - if (secVal && (transformCount > MAXIMUM_TRANSFORM_COUNT)) { + if (secVal && (transforms.size() > MAXIMUM_TRANSFORM_COUNT)) { String error = "A maxiumum of " + MAXIMUM_TRANSFORM_COUNT + " " + "transforms per Reference are allowed with secure validation"; throw new MarshalException(error); } + transformElem = DOMUtils.getNextSiblingElement(transformElem); } nextSibling = DOMUtils.getNextSiblingElement(nextSibling); } + if (!nextSibling.getLocalName().equals("DigestMethod")) { + throw new MarshalException("Invalid element name: " + + nextSibling.getLocalName() + + ", expected DigestMethod"); + } // unmarshal DigestMethod Element dmElem = nextSibling; @@ -234,13 +244,19 @@ } // unmarshal DigestValue + Element dvElem = DOMUtils.getNextSiblingElement(dmElem, "DigestValue"); try { - Element dvElem = DOMUtils.getNextSiblingElement(dmElem); this.digestValue = Base64.decode(dvElem); } catch (Base64DecodingException bde) { throw new MarshalException(bde); } + // check for extra elements + if (DOMUtils.getNextSiblingElement(dvElem) != null) { + throw new MarshalException( + "Unexpected element after DigestValue element"); + } + // unmarshal attributes this.uri = DOMUtils.getAttributeValue(refElem, "URI"); diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMRetrievalMethod.java --- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMRetrievalMethod.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMRetrievalMethod.java Fri Aug 02 09:38:09 2013 +0100 @@ -136,21 +136,30 @@ List transforms = new ArrayList(); Element transformsElem = DOMUtils.getFirstChildElement(rmElem); - int transformCount = 0; if (transformsElem != null) { + String localName = transformsElem.getLocalName(); + if (!localName.equals("Transforms")) { + throw new MarshalException("Invalid element name: " + + localName + ", expected Transforms"); + } Element transformElem = - DOMUtils.getFirstChildElement(transformsElem); + DOMUtils.getFirstChildElement(transformsElem, "Transform"); + transforms.add(new DOMTransform(transformElem, context, provider)); + transformElem = DOMUtils.getNextSiblingElement(transformElem); while (transformElem != null) { + String name = transformElem.getLocalName(); + if (!name.equals("Transform")) { + throw new MarshalException("Invalid element name: " + + name + ", expected Transform"); + } transforms.add (new DOMTransform(transformElem, context, provider)); - transformElem = DOMUtils.getNextSiblingElement(transformElem); - - transformCount++; - if (secVal && (transformCount > DOMReference.MAXIMUM_TRANSFORM_COUNT)) { + if (secVal && (transforms.size() > DOMReference.MAXIMUM_TRANSFORM_COUNT)) { String error = "A maxiumum of " + DOMReference.MAXIMUM_TRANSFORM_COUNT + " " + "transforms per Reference are allowed with secure validation"; throw new MarshalException(error); } + transformElem = DOMUtils.getNextSiblingElement(transformElem); } } if (transforms.isEmpty()) { diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMSignatureProperties.java --- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMSignatureProperties.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMSignatureProperties.java Fri Aug 02 09:38:09 2013 +0100 @@ -109,6 +109,11 @@ for (int i = 0; i < length; i++) { Node child = nodes.item(i); if (child.getNodeType() == Node.ELEMENT_NODE) { + String name = child.getLocalName(); + if (!name.equals("SignatureProperty")) { + throw new MarshalException("Invalid element name: " + name + + ", expected SignatureProperty"); + } properties.add(new DOMSignatureProperty((Element)child, context)); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMSignedInfo.java --- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMSignedInfo.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMSignedInfo.java Fri Aug 02 09:38:09 2013 +0100 @@ -150,11 +150,14 @@ id = DOMUtils.getAttributeValue(siElem, "Id"); // unmarshal CanonicalizationMethod - Element cmElem = DOMUtils.getFirstChildElement(siElem); - canonicalizationMethod = new DOMCanonicalizationMethod(cmElem, context, provider); + Element cmElem = DOMUtils.getFirstChildElement(siElem, + "CanonicalizationMethod"); + canonicalizationMethod = new DOMCanonicalizationMethod(cmElem, context, + provider); // unmarshal SignatureMethod - Element smElem = DOMUtils.getNextSiblingElement(cmElem); + Element smElem = DOMUtils.getNextSiblingElement(cmElem, + "SignatureMethod"); signatureMethod = DOMSignatureMethod.unmarshal(smElem); boolean secVal = Utils.secureValidation(context); @@ -169,19 +172,24 @@ // unmarshal References ArrayList refList = new ArrayList(5); - Element refElem = DOMUtils.getNextSiblingElement(smElem); + Element refElem = DOMUtils.getNextSiblingElement(smElem, "Reference"); + refList.add(new DOMReference(refElem, context, provider)); - int refCount = 0; + refElem = DOMUtils.getNextSiblingElement(refElem); while (refElem != null) { + String name = refElem.getLocalName(); + if (!name.equals("Reference")) { + throw new MarshalException("Invalid element name: " + + name + ", expected Reference"); + } refList.add(new DOMReference(refElem, context, provider)); - refElem = DOMUtils.getNextSiblingElement(refElem); - refCount++; - if (secVal && (refCount > MAXIMUM_REFERENCE_COUNT)) { + if (secVal && (refList.size() > MAXIMUM_REFERENCE_COUNT)) { String error = "A maxiumum of " + MAXIMUM_REFERENCE_COUNT + " " + "references per Manifest are allowed with secure validation"; throw new MarshalException(error); } + refElem = DOMUtils.getNextSiblingElement(refElem); } references = Collections.unmodifiableList(refList); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMUtils.java --- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMUtils.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMUtils.java Fri Aug 02 09:38:09 2013 +0100 @@ -132,6 +132,36 @@ } /** + * Returns the first child element of the specified node and checks that + * the local name is equal to {@code localName}. + * + * @param node the node + * @return the first child element of the specified node + * @throws NullPointerException if {@code node == null} + * @throws MarshalException if no such element or the local name is not + * equal to {@code localName} + */ + public static Element getFirstChildElement(Node node, String localName) + throws MarshalException + { + return verifyElement(getFirstChildElement(node), localName); + } + + private static Element verifyElement(Element elem, String localName) + throws MarshalException + { + if (elem == null) { + throw new MarshalException("Missing " + localName + " element"); + } + String name = elem.getLocalName(); + if (!name.equals(localName)) { + throw new MarshalException("Invalid element name: " + + name + ", expected " + localName); + } + return elem; + } + + /** * Returns the last child element of the specified node, or null if there * is no such element. * @@ -166,6 +196,22 @@ } /** + * Returns the next sibling element of the specified node and checks that + * the local name is equal to {@code localName}. + * + * @param node the node + * @return the next sibling element of the specified node + * @throws NullPointerException if {@code node == null} + * @throws MarshalException if no such element or the local name is not + * equal to {@code localName} + */ + public static Element getNextSiblingElement(Node node, String localName) + throws MarshalException + { + return verifyElement(getNextSiblingElement(node), localName); + } + + /** * Returns the attribute value for the attribute with the specified name. * Returns null if there is no such attribute, or * the empty string if the attribute value is empty. diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMX509IssuerSerial.java --- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMX509IssuerSerial.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMX509IssuerSerial.java Fri Aug 02 09:38:09 2013 +0100 @@ -80,9 +80,11 @@ * * @param isElem an X509IssuerSerial element */ - public DOMX509IssuerSerial(Element isElem) { - Element iNElem = DOMUtils.getFirstChildElement(isElem); - Element sNElem = DOMUtils.getNextSiblingElement(iNElem); + public DOMX509IssuerSerial(Element isElem) throws MarshalException { + Element iNElem = DOMUtils.getFirstChildElement(isElem, + "X509IssuerName"); + Element sNElem = DOMUtils.getNextSiblingElement(iNElem, + "X509SerialNumber"); issuerName = iNElem.getFirstChild().getNodeValue(); serialNumber = new BigInteger(sNElem.getFirstChild().getNodeValue()); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMXMLSignature.java --- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMXMLSignature.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMXMLSignature.java Fri Aug 02 09:38:09 2013 +0100 @@ -141,11 +141,13 @@ id = DOMUtils.getAttributeValue(localSigElem, "Id"); // unmarshal SignedInfo - Element siElem = DOMUtils.getFirstChildElement(localSigElem); + Element siElem = DOMUtils.getFirstChildElement(localSigElem, + "SignedInfo"); si = new DOMSignedInfo(siElem, context, provider); // unmarshal SignatureValue - Element sigValElem = DOMUtils.getNextSiblingElement(siElem); + Element sigValElem = DOMUtils.getNextSiblingElement(siElem, + "SignatureValue"); sv = new DOMSignatureValue(sigValElem, context); // unmarshal KeyInfo, if specified @@ -161,6 +163,11 @@ } else { List tempObjects = new ArrayList(); while (nextSibling != null) { + String name = nextSibling.getLocalName(); + if (!name.equals("Object")) { + throw new MarshalException("Invalid element name: " + name + + ", expected KeyInfo or Object"); + } tempObjects.add(new DOMXMLObject(nextSibling, context, provider)); nextSibling = DOMUtils.getNextSiblingElement(nextSibling); diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/sun/font/TrueTypeFont.java --- a/jdk/src/share/classes/sun/font/TrueTypeFont.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/sun/font/TrueTypeFont.java Fri Aug 02 09:38:09 2013 +0100 @@ -547,6 +547,17 @@ throw new FontFormatException("bad table, tag="+table.tag); } } + + if (getDirectoryEntry(headTag) == null) { + throw new FontFormatException("missing head table"); + } + if (getDirectoryEntry(maxpTag) == null) { + throw new FontFormatException("missing maxp table"); + } + if (getDirectoryEntry(hmtxTag) != null + && getDirectoryEntry(hheaTag) == null) { + throw new FontFormatException("missing hhea table"); + } initNames(); } catch (Exception e) { if (FontUtilities.isLogging()) { diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/sun/print/PSPrinterJob.java --- a/jdk/src/share/classes/sun/print/PSPrinterJob.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/sun/print/PSPrinterJob.java Fri Aug 02 09:38:09 2013 +0100 @@ -59,6 +59,8 @@ import javax.print.StreamPrintService; import javax.print.attribute.HashPrintRequestAttributeSet; import javax.print.attribute.PrintRequestAttributeSet; +import javax.print.attribute.PrintServiceAttributeSet; +import javax.print.attribute.standard.PrinterName; import javax.print.attribute.standard.Chromaticity; import javax.print.attribute.standard.Copies; import javax.print.attribute.standard.Destination; @@ -766,8 +768,9 @@ } } if (mDestType == RasterPrinterJob.PRINTER) { - if (getPrintService() != null) { - mDestination = getPrintService().getName(); + PrintService pServ = getPrintService(); + if (pServ != null) { + mDestination = pServ.getName(); } PrinterSpooler spooler = new PrinterSpooler(); java.security.AccessController.doPrivileged(spooler); diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/sun/security/pkcs/PKCS9Attribute.java --- a/jdk/src/share/classes/sun/security/pkcs/PKCS9Attribute.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/sun/security/pkcs/PKCS9Attribute.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -310,7 +310,8 @@ private static final Byte[][] PKCS9_VALUE_TAGS = { null, {new Byte(DerValue.tag_IA5String)}, // EMailAddress - {new Byte(DerValue.tag_IA5String)}, // UnstructuredName + {new Byte(DerValue.tag_IA5String), // UnstructuredName + new Byte(DerValue.tag_PrintableString)}, {new Byte(DerValue.tag_ObjectId)}, // ContentType {new Byte(DerValue.tag_OctetString)}, // MessageDigest {new Byte(DerValue.tag_UtcTime)}, // SigningTime diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/sun/security/provider/certpath/OCSP.java --- a/jdk/src/share/classes/sun/security/provider/certpath/OCSP.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/sun/security/provider/certpath/OCSP.java Fri Aug 02 09:38:09 2013 +0100 @@ -255,7 +255,9 @@ } response = Arrays.copyOf(response, total); } catch (IOException ioe) { - throw new NetworkFailureException(ioe); + throw new CertPathValidatorException( + "Unable to determine revocation status due to network error", + ioe, null, -1, BasicReason.UNDETERMINED_REVOCATION_STATUS); } finally { if (in != null) { try { @@ -355,17 +357,4 @@ */ Map getSingleExtensions(); } - - static class NetworkFailureException extends CertPathValidatorException { - private static final long serialVersionUID = 0l; - - NetworkFailureException(Throwable t) { - super(t); - } - - @Override - public CertPathValidatorException.Reason getReason() { - return BasicReason.UNDETERMINED_REVOCATION_STATUS; - } - } } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/sun/security/provider/certpath/OCSPResponse.java --- a/jdk/src/share/classes/sun/security/provider/certpath/OCSPResponse.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/sun/security/provider/certpath/OCSPResponse.java Fri Aug 02 09:38:09 2013 +0100 @@ -30,6 +30,7 @@ import java.security.cert.CertificateException; import java.security.cert.CertificateParsingException; import java.security.cert.CertPathValidatorException; +import java.security.cert.CertPathValidatorException.BasicReason; import java.security.cert.CRLReason; import java.security.cert.TrustAnchor; import java.security.cert.X509Certificate; @@ -121,8 +122,8 @@ public enum ResponseStatus { SUCCESSFUL, // Response has valid confirmations - MALFORMED_REQUEST, // Illegal confirmation request - INTERNAL_ERROR, // Internal error in issuer + MALFORMED_REQUEST, // Illegal request + INTERNAL_ERROR, // Internal error in responder TRY_LATER, // Try again later UNUSED, // is not used SIG_REQUIRED, // Must sign the request @@ -381,9 +382,18 @@ Date date, byte[] nonce) throws CertPathValidatorException { - if (responseStatus != ResponseStatus.SUCCESSFUL) { - throw new CertPathValidatorException - ("OCSP response error: " + responseStatus); + switch (responseStatus) { + case SUCCESSFUL: + break; + case UNAUTHORIZED: + case TRY_LATER: + case INTERNAL_ERROR: + throw new CertPathValidatorException( + "OCSP response error: " + responseStatus, null, null, -1, + BasicReason.UNDETERMINED_REVOCATION_STATUS); + default: + throw new CertPathValidatorException("OCSP response error: " + + responseStatus); } // Check that the response includes a response for all of the diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/sun/security/provider/certpath/PKIXCertPathValidator.java --- a/jdk/src/share/classes/sun/security/provider/certpath/PKIXCertPathValidator.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/sun/security/provider/certpath/PKIXCertPathValidator.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -193,10 +193,15 @@ List checkers = params.certPathCheckers(); for (PKIXCertPathChecker checker : checkers) { if (checker instanceof PKIXRevocationChecker) { + if (revCheckerAdded) { + throw new CertPathValidatorException( + "Only one PKIXRevocationChecker can be specified"); + } revCheckerAdded = true; // if it's our own, initialize it - if (checker instanceof RevocationChecker) + if (checker instanceof RevocationChecker) { ((RevocationChecker)checker).init(anchor, params); + } } } // only add a RevocationChecker if revocation is enabled and diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/sun/security/provider/certpath/ReverseState.java --- a/jdk/src/share/classes/sun/security/provider/certpath/ReverseState.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/sun/security/provider/certpath/ReverseState.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,6 +30,7 @@ import java.security.cert.CertificateException; import java.security.cert.CertPathValidatorException; import java.security.cert.PKIXCertPathChecker; +import java.security.cert.PKIXRevocationChecker; import java.security.cert.TrustAnchor; import java.security.cert.X509Certificate; import java.util.ArrayList; @@ -235,9 +236,16 @@ for (PKIXCertPathChecker checker : userCheckers) { if (checker instanceof AlgorithmChecker) { ((AlgorithmChecker)checker).trySetTrustAnchor(anchor); - } else if (checker instanceof RevocationChecker) { - ((RevocationChecker)checker).init(anchor, buildParams); - ((RevocationChecker)checker).init(false); + } else if (checker instanceof PKIXRevocationChecker) { + if (revCheckerAdded) { + throw new CertPathValidatorException( + "Only one PKIXRevocationChecker can be specified"); + } + // if it's our own, initialize it + if (checker instanceof RevocationChecker) { + ((RevocationChecker)checker).init(anchor, buildParams); + } + ((PKIXRevocationChecker)checker).init(false); revCheckerAdded = true; } } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/sun/security/provider/certpath/RevocationChecker.java --- a/jdk/src/share/classes/sun/security/provider/certpath/RevocationChecker.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/sun/security/provider/certpath/RevocationChecker.java Fri Aug 02 09:38:09 2013 +0100 @@ -38,14 +38,7 @@ import java.security.cert.CertPathValidatorException.BasicReason; import java.security.cert.Extension; import java.security.cert.*; -import java.util.Arrays; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import javax.security.auth.x500.X500Principal; import static sun.security.provider.certpath.OCSP.*; @@ -70,13 +63,16 @@ private Map ocspResponses; private List ocspExtensions; private boolean legacy; + private LinkedList softFailExceptions = + new LinkedList<>(); // state variables private X509Certificate issuerCert; private PublicKey prevPubKey; private boolean crlSignFlag; + private int certIndex; - private enum Mode { PREFER_OCSP, PREFER_CRLS, ONLY_CRLS }; + private enum Mode { PREFER_OCSP, PREFER_CRLS, ONLY_CRLS, ONLY_OCSP }; private Mode mode = Mode.PREFER_OCSP; private static class RevocationProperties { @@ -104,9 +100,9 @@ throws CertPathValidatorException { RevocationProperties rp = getRevocationProperties(); - URI uri = getOCSPResponder(); + URI uri = getOcspResponder(); responderURI = (uri == null) ? toURI(rp.ocspUrl) : uri; - X509Certificate cert = getOCSPResponderCert(); + X509Certificate cert = getOcspResponderCert(); responderCert = (cert == null) ? getResponderCert(rp, params.trustAnchors(), params.certStores()) @@ -117,31 +113,38 @@ case ONLY_END_ENTITY: case PREFER_CRLS: case SOFT_FAIL: + case NO_FALLBACK: break; default: throw new CertPathValidatorException( "Unrecognized revocation parameter option: " + option); } } + softFail = options.contains(Option.SOFT_FAIL); // set mode, only end entity flag if (legacy) { mode = (rp.ocspEnabled) ? Mode.PREFER_OCSP : Mode.ONLY_CRLS; onlyEE = rp.onlyEE; } else { - if (options.contains(Option.PREFER_CRLS)) { + if (options.contains(Option.NO_FALLBACK)) { + if (options.contains(Option.PREFER_CRLS)) { + mode = Mode.ONLY_CRLS; + } else { + mode = Mode.ONLY_OCSP; + } + } else if (options.contains(Option.PREFER_CRLS)) { mode = Mode.PREFER_CRLS; } onlyEE = options.contains(Option.ONLY_END_ENTITY); } - softFail = options.contains(Option.SOFT_FAIL); if (legacy) { crlDP = rp.crlDPEnabled; } else { crlDP = true; } - ocspResponses = getOCSPResponses(); - ocspExtensions = getOCSPExtensions(); + ocspResponses = getOcspResponses(); + ocspExtensions = getOcspExtensions(); this.anchor = anchor; this.params = params; @@ -297,14 +300,19 @@ if (forward) { throw new CertPathValidatorException("forward checking not supported"); + } + if (anchor != null) { + issuerCert = anchor.getTrustedCert(); + prevPubKey = (issuerCert != null) ? issuerCert.getPublicKey() + : anchor.getCAPublicKey(); + } + crlSignFlag = true; + if (params.certPath() != null) { + certIndex = params.certPath().getCertificates().size() - 1; } else { - if (anchor != null) { - issuerCert = anchor.getTrustedCert(); - prevPubKey = (issuerCert != null) ? issuerCert.getPublicKey() - : anchor.getCAPublicKey(); - } - crlSignFlag = true; + certIndex = -1; } + softFailExceptions.clear(); } @Override @@ -318,27 +326,34 @@ } @Override + public List getSoftFailExceptions() { + return Collections.unmodifiableList(softFailExceptions); + } + + @Override public void check(Certificate cert, Collection unresolvedCritExts) throws CertPathValidatorException { - X509Certificate xcert = (X509Certificate)cert; - if (onlyEE && xcert.getBasicConstraints() != -1) { - if (debug != null) { - debug.println("Skipping revocation check, not end entity cert"); - } - } else { - check(xcert, unresolvedCritExts, prevPubKey, crlSignFlag); - } - updateState(xcert); + check((X509Certificate)cert, unresolvedCritExts, + prevPubKey, crlSignFlag); } - void check(X509Certificate xcert, Collection unresolvedCritExts, - PublicKey pubKey, boolean crlSignFlag) + private void check(X509Certificate xcert, + Collection unresolvedCritExts, + PublicKey pubKey, boolean crlSignFlag) throws CertPathValidatorException { try { + if (onlyEE && xcert.getBasicConstraints() != -1) { + if (debug != null) { + debug.println("Skipping revocation check, not end " + + "entity cert"); + } + return; + } switch (mode) { case PREFER_OCSP: + case ONLY_OCSP: checkOCSP(xcert, unresolvedCritExts); break; case PREFER_CRLS: @@ -351,14 +366,17 @@ if (e.getReason() == BasicReason.REVOKED) { throw e; } - CertPathValidatorException cause = e; - if (softFail && e instanceof NetworkFailureException) { - if (mode == Mode.ONLY_CRLS) return; + boolean eSoftFail = isSoftFailException(e); + if (eSoftFail) { + if (mode == Mode.ONLY_OCSP || mode == Mode.ONLY_CRLS) { + return; + } + } else { + if (mode == Mode.ONLY_OCSP || mode == Mode.ONLY_CRLS) { + throw e; + } } - // Rethrow the exception if ONLY_CRLS - if (mode == Mode.ONLY_CRLS) { - throw e; - } + CertPathValidatorException cause = e; // Otherwise, failover if (debug != null) { debug.println("RevocationChecker.check() " + e.getMessage()); @@ -382,22 +400,35 @@ if (x.getReason() == BasicReason.REVOKED) { throw x; } - if (cause != null) { - if (softFail && cause instanceof NetworkFailureException) { - return; - } else { - cause.addSuppressed(x); + if (!isSoftFailException(x)) { + cause.addSuppressed(x); + throw cause; + } else { + // only pass if both exceptions were soft failures + if (!eSoftFail) { throw cause; } } - if (softFail && x instanceof NetworkFailureException) { - return; - } - throw x; } + } finally { + updateState(xcert); } } + private boolean isSoftFailException(CertPathValidatorException e) { + if (softFail && + e.getReason() == BasicReason.UNDETERMINED_REVOCATION_STATUS) + { + // recreate exception with correct index + CertPathValidatorException e2 = new CertPathValidatorException( + e.getMessage(), e.getCause(), params.certPath(), certIndex, + e.getReason()); + softFailExceptions.addFirst(e2); + return true; + } + return false; + } + private void updateState(X509Certificate cert) throws CertPathValidatorException { @@ -411,6 +442,9 @@ } prevPubKey = pubKey; crlSignFlag = certCanSignCrl(cert); + if (certIndex > 0) { + certIndex--; + } } // Maximum clock skew in milliseconds (15 minutes) allowed when checking @@ -446,8 +480,8 @@ " circular dependency"); } throw new CertPathValidatorException - ("Could not determine revocation status", null, null, -1, - BasicReason.UNDETERMINED_REVOCATION_STATUS); + ("Could not determine revocation status", null, null, -1, + BasicReason.UNDETERMINED_REVOCATION_STATUS); } Set possibleCRLs = new HashSet<>(); @@ -457,7 +491,7 @@ CertPathHelper.setDateAndTime(sel, params.date(), MAX_CLOCK_SKEW); // First, check user-specified CertStores - NetworkFailureException nfe = null; + CertPathValidatorException networkFailureException = null; for (CertStore store : certStores) { try { for (CRL crl : store.getCRLs(sel)) { @@ -468,10 +502,13 @@ debug.println("RevocationChecker.checkCRLs() " + "CertStoreException: " + e.getMessage()); } - if (softFail && nfe == null && + if (networkFailureException == null && CertStoreHelper.isCausedByNetworkIssue(store.getType(),e)) { // save this exception, we may need to throw it later - nfe = new NetworkFailureException(e); + networkFailureException = new CertPathValidatorException( + "Unable to determine revocation status due to " + + "network error", e, null, -1, + BasicReason.UNDETERMINED_REVOCATION_STATUS); } } } @@ -508,14 +545,17 @@ approvedCRLs.addAll(DistributionPointFetcher.getCRLs( sel, signFlag, prevKey, params.sigProvider(), certStores, - reasonsMask, anchors, params.date())); + reasonsMask, anchors, null)); } } catch (CertStoreException e) { - if (softFail && e instanceof CertStoreTypeException) { + if (e instanceof CertStoreTypeException) { CertStoreTypeException cste = (CertStoreTypeException)e; if (CertStoreHelper.isCausedByNetworkIssue(cste.getType(), e)) { - throw new NetworkFailureException(e); + throw new CertPathValidatorException( + "Unable to determine revocation status due to " + + "network error", e, null, -1, + BasicReason.UNDETERMINED_REVOCATION_STATUS); } } throw new CertPathValidatorException(e); @@ -531,26 +571,26 @@ stackedCerts); return; } catch (CertPathValidatorException cpve) { - if (nfe != null) { + if (networkFailureException != null) { // if a network issue previously prevented us from // retrieving a CRL from one of the user-specified - // CertStores and SOFT_FAIL is enabled, throw it now - // so it can be handled appropriately - throw nfe; + // CertStores, throw it now so it can be handled + // appropriately + throw networkFailureException; } throw cpve; } } else { - if (nfe != null) { + if (networkFailureException != null) { // if a network issue previously prevented us from // retrieving a CRL from one of the user-specified - // CertStores and SOFT_FAIL is enabled, throw it now - // so it can be handled appropriately - throw nfe; + // CertStores, throw it now so it can be handled + // appropriately + throw networkFailureException; } - throw new CertPathValidatorException - ("Could not determine revocation status", null, null, -1, - BasicReason.UNDETERMINED_REVOCATION_STATUS); + throw new CertPathValidatorException( + "Could not determine revocation status", null, null, -1, + BasicReason.UNDETERMINED_REVOCATION_STATUS); } } } @@ -595,14 +635,9 @@ unresCritExts.remove(ReasonCode_Id.toString()); unresCritExts.remove(CertificateIssuer_Id.toString()); if (!unresCritExts.isEmpty()) { - if (debug != null) { - debug.println("Unrecognized " - + "critical extension(s) in revoked CRL entry: " - + unresCritExts); - } - throw new CertPathValidatorException - ("Could not determine revocation status", null, null, - -1, BasicReason.UNDETERMINED_REVOCATION_STATUS); + throw new CertPathValidatorException( + "Unrecognized critical extension(s) in revoked " + + "CRL entry"); } } @@ -610,11 +645,14 @@ if (reasonCode == null) { reasonCode = CRLReason.UNSPECIFIED; } - Throwable t = new CertificateRevokedException - (entry.getRevocationDate(), reasonCode, - crl.getIssuerX500Principal(), entry.getExtensions()); - throw new CertPathValidatorException(t.getMessage(), t, - null, -1, BasicReason.REVOKED); + Date revocationDate = entry.getRevocationDate(); + if (revocationDate.before(params.date())) { + Throwable t = new CertificateRevokedException( + revocationDate, reasonCode, + crl.getIssuerX500Principal(), entry.getExtensions()); + throw new CertPathValidatorException( + t.getMessage(), t, null, -1, BasicReason.REVOKED); + } } } } @@ -630,9 +668,6 @@ throw new CertPathValidatorException(ce); } - URI responderURI = (this.responderURI != null) - ? this.responderURI : getOCSPServerURI(currCert); - X509Certificate respCert = (responderCert == null) ? issuerCert : responderCert; @@ -671,23 +706,38 @@ params.date(), nonce); } else { + URI responderURI = (this.responderURI != null) + ? this.responderURI + : OCSP.getResponderURI(currCert); + if (responderURI == null) { + throw new CertPathValidatorException( + "Certificate does not specify OCSP responder", null, + null, -1); + } + response = OCSP.check(Collections.singletonList(certId), - responderURI, respCert, params.date(), + responderURI, respCert, null, ocspExtensions); } } catch (IOException e) { - throw new CertPathValidatorException(e); + throw new CertPathValidatorException( + "Unable to determine revocation status due to network error", + e, null, -1, BasicReason.UNDETERMINED_REVOCATION_STATUS); } RevocationStatus rs = (RevocationStatus)response.getSingleResponse(certId); RevocationStatus.CertStatus certStatus = rs.getCertStatus(); if (certStatus == RevocationStatus.CertStatus.REVOKED) { - Throwable t = new CertificateRevokedException( - rs.getRevocationTime(), rs.getRevocationReason(), - respCert.getSubjectX500Principal(), rs.getSingleExtensions()); - throw new CertPathValidatorException(t.getMessage(), t, null, - -1, BasicReason.REVOKED); + Date revocationTime = rs.getRevocationTime(); + if (revocationTime.before(params.date())) { + Throwable t = new CertificateRevokedException( + revocationTime, rs.getRevocationReason(), + respCert.getSubjectX500Principal(), + rs.getSingleExtensions()); + throw new CertPathValidatorException(t.getMessage(), t, null, + -1, BasicReason.REVOKED); + } } else if (certStatus == RevocationStatus.CertStatus.UNKNOWN) { throw new CertPathValidatorException( "Certificate's revocation status is unknown", null, @@ -711,34 +761,6 @@ return hexNumber.toString(); } - private static URI getOCSPServerURI(X509CertImpl cert) - throws CertPathValidatorException - { - // Examine the certificate's AuthorityInfoAccess extension - AuthorityInfoAccessExtension aia = - cert.getAuthorityInfoAccessExtension(); - if (aia == null) { - throw new CertPathValidatorException( - "Must specify the location of an OCSP Responder"); - } - - List descriptions = aia.getAccessDescriptions(); - for (AccessDescription description : descriptions) { - if (description.getAccessMethod().equals((Object) - AccessDescription.Ad_OCSP_Id)) { - - GeneralName generalName = description.getAccessLocation(); - if (generalName.getType() == GeneralNameInterface.NAME_URI) { - URIName uri = (URIName)generalName.getName(); - return uri.getURI(); - } - } - } - - throw new CertPathValidatorException( - "Cannot find the location of the OCSP Responder"); - } - /** * Checks that a cert can be used to verify a CRL. * @@ -870,8 +892,8 @@ " circular dependency"); } throw new CertPathValidatorException - ("Could not determine revocation status", null, null, - -1, BasicReason.UNDETERMINED_REVOCATION_STATUS); + ("Could not determine revocation status", null, null, -1, + BasicReason.UNDETERMINED_REVOCATION_STATUS); } // Try to find another key that might be able to sign @@ -1067,6 +1089,15 @@ } } + @Override + public RevocationChecker clone() { + RevocationChecker copy = (RevocationChecker)super.clone(); + // we don't deep-copy the exceptions, but that is ok because they + // are never modified after they are instantiated + copy.softFailExceptions = new LinkedList<>(softFailExceptions); + return copy; + } + /* * This inner class extends the X509CertSelector to add an additional * check to make sure the subject public key isn't on a particular list. diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/sun/security/provider/certpath/SunCertPathBuilder.java --- a/jdk/src/share/classes/sun/security/provider/certpath/SunCertPathBuilder.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/sun/security/provider/certpath/SunCertPathBuilder.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -422,7 +422,6 @@ buildParams.anyPolicyInhibited(), buildParams.policyQualifiersRejected(), rootNode); - checkers.add(policyChecker); // add the algorithm checker @@ -455,11 +454,16 @@ List ckrs = buildParams.certPathCheckers(); for (PKIXCertPathChecker ckr : ckrs) { if (ckr instanceof PKIXRevocationChecker) { + if (revCheckerAdded) { + throw new CertPathValidatorException( + "Only one PKIXRevocationChecker can be specified"); + } revCheckerAdded = true; // if it's our own, initialize it - if (ckr instanceof RevocationChecker) + if (ckr instanceof RevocationChecker) { ((RevocationChecker)ckr).init(builder.trustAnchor, buildParams); + } } } // only add a RevocationChecker if revocation is enabled and diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/sun/security/tools/keytool/Main.java --- a/jdk/src/share/classes/sun/security/tools/keytool/Main.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/sun/security/tools/keytool/Main.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -2198,8 +2198,15 @@ printExtensions(rb.getString("Extension.Request."), exts, out); } } else { - out.println(attr.getAttributeId()); - out.println(attr.getAttributeValue()); + out.println("Attribute: " + attr.getAttributeId()); + PKCS9Attribute pkcs9Attr = + new PKCS9Attribute(attr.getAttributeId(), + attr.getAttributeValue()); + out.print(pkcs9Attr.getName() + ": "); + Object attrVal = attr.getAttributeValue(); + out.println(attrVal instanceof String[] ? + Arrays.toString((String[]) attrVal) : + attrVal); } } if (debug) { diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/sun/swing/JLightweightFrame.java --- a/jdk/src/share/classes/sun/swing/JLightweightFrame.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/sun/swing/JLightweightFrame.java Fri Aug 02 09:38:09 2013 +0100 @@ -29,12 +29,18 @@ import java.awt.Color; import java.awt.Component; import java.awt.Container; +import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; +import java.awt.event.ComponentListener; +import java.awt.event.ContainerEvent; +import java.awt.event.ContainerListener; import java.awt.image.BufferedImage; import java.awt.image.DataBufferInt; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; import java.security.AccessController; import javax.swing.JLayeredPane; @@ -80,6 +86,8 @@ private boolean copyBufferEnabled; private int[] copyBuffer; + private PropertyChangeListener layoutSizeListener; + /** * Constructs a new, initially invisible {@code JLightweightFrame} * instance. @@ -94,6 +102,23 @@ if (getGraphicsConfiguration().isTranslucencyCapable()) { setBackground(new Color(0, 0, 0, 0)); } + + layoutSizeListener = new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent e) { + Dimension d = (Dimension)e.getNewValue(); + + if ("preferredSize".equals(e.getPropertyName())) { + content.preferredSizeChanged(d.width, d.height); + + } else if ("maximumSize".equals(e.getPropertyName())) { + content.maximumSizeChanged(d.width, d.height); + + } else if ("minimumSize".equals(e.getPropertyName())) { + content.minimumSizeChanged(d.width, d.height); + } + } + }; } /** @@ -104,10 +129,23 @@ * * @param content the {@link LightweightContent} instance */ - public void setContent(LightweightContent content) { + public void setContent(final LightweightContent content) { + if (content == null) { + System.err.println("JLightweightFrame.setContent: content may not be null!"); + return; + } this.content = content; this.component = content.getComponent(); + Dimension d = this.component.getPreferredSize(); + content.preferredSizeChanged(d.width, d.height); + + d = this.component.getMaximumSize(); + content.maximumSizeChanged(d.width, d.height); + + d = this.component.getMinimumSize(); + content.minimumSizeChanged(d.width, d.height); + initInterior(); } @@ -202,6 +240,25 @@ contentPane.setLayout(new BorderLayout()); contentPane.add(component); setContentPane(contentPane); + + contentPane.addContainerListener(new ContainerListener() { + @Override + public void componentAdded(ContainerEvent e) { + Component c = JLightweightFrame.this.component; + if (e.getChild() == c) { + c.addPropertyChangeListener("preferredSize", layoutSizeListener); + c.addPropertyChangeListener("maximumSize", layoutSizeListener); + c.addPropertyChangeListener("minimumSize", layoutSizeListener); + } + } + @Override + public void componentRemoved(ContainerEvent e) { + Component c = JLightweightFrame.this.component; + if (e.getChild() == c) { + c.removePropertyChangeListener(layoutSizeListener); + } + } + }); } @SuppressWarnings("deprecation") diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/classes/sun/swing/LightweightContent.java --- a/jdk/src/share/classes/sun/swing/LightweightContent.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/classes/sun/swing/LightweightContent.java Fri Aug 02 09:38:09 2013 +0100 @@ -161,4 +161,22 @@ * application that the frame has ungrabbed focus. */ public void focusUngrabbed(); + + /** + * {@code JLightweightFrame} calls this method to notify the client + * application that the content preferred size has changed. + */ + public void preferredSizeChanged(int width, int height); + + /** + * {@code JLightweightFrame} calls this method to notify the client + * application that the content maximum size has changed. + */ + public void maximumSizeChanged(int width, int height); + + /** + * {@code JLightweightFrame} calls this method to notify the client + * application that the content minimum size has changed. + */ + public void minimumSizeChanged(int width, int height); } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/lib/hijrah-config-umalqura.properties --- a/jdk/src/share/lib/hijrah-config-umalqura.properties Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/lib/hijrah-config-umalqura.properties Fri Aug 02 09:38:09 2013 +0100 @@ -1,58 +1,369 @@ -# -# hijrah-config-umalqura.properties -# -# -# Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. -# -# This properties file defines a Hijrah calendar variant. -# -# Fields: -# -# ::= 'version' '=' -# ::= 'id' '=' -# ::= 'type' '=' -# ::= 'iso-start' '=' -# ::= '=' -# -# version ... (Required) -# -# id ... (Required) -# Identifies the Java Chronology -# -# type ... (Required) -# Identifies the type of calendar in the standard calendar ID scheme -# iso-start ... (Required) -# Specifies the corresponding ISO date to the first Hijrah day -# in the defined range of dates -# -# year ... (Required) -# Number of days for each month of a Hijrah year -# * Each line defines a year. The years must be in the chronological -# order and no gap is allowed. -# * Each line is in the form indicated above. is a Hijrah year and -# nn is the number of days for a month listed in the order of the months. -# * Each year must have 12 months. -# * Each month should be 29 or 30 days long. -# * There must be one or more space characters between the months. -# - -# indicates the version of this definition -version=1.8.0_1 - -# Java chronology ID -id=Hijrah-umalqura - -# Standard calendar type specification -type=islamic-umalqura - -# defines the corresponding ISO date to the earliest Hijrah date -iso-start=2010-12-07 - -# -# the data section; defines the dates with the number of days for each month -# -# Placeholder data until full Umm alQura data can be validated -1432=29 30 30 30 29 30 29 30 29 30 29 29 -1433=30 29 30 30 29 30 30 29 30 29 30 29 -1434=29 30 29 30 29 30 30 29 30 30 29 29 -1435=30 29 30 29 30 29 30 29 30 30 29 30 +# Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# +# This properties file defines a Hijrah calendar variant. +# +# Fields: +# +# ::= 'version' '=' +# ::= 'id' '=' +# ::= 'type' '=' +# ::= 'iso-start' '=' +# ::= '=' +# +# version ... (Required) +# +# id ... (Required) +# Identifies the Java Chronology +# +# type ... (Required) +# Identifies the type of calendar in the standard calendar ID scheme +# iso-start ... (Required) +# Specifies the corresponding ISO date to the first Hijrah day +# in the defined range of dates +# +# year ... (Required) +# Number of days for each month of a Hijrah year +# * Each line defines a year. The years must be in chronological +# order and no gap is allowed. +# * Each line is in the form indicated above. is a Hijrah year and +# nn is the number of days for a month listed in the order of the months. +# * Each year must have 12 months. +# * Each month should be 29 or 30 days long. +# * There must be one or more space characters between the months. +# + +# Version of this definition +version=1.8.0_1 + +# Java chronology ID +id=Hijrah-umalqura + +# Standard calendar type specification +type=islamic-umalqura + +# defines the corresponding ISO date to the earliest Hijrah date +iso-start=1882-11-12 + +# 1 2 3 4 5 6 7 8 9 10 11 12 +1300=30 29 30 29 30 29 30 29 30 29 30 29 +1301=30 30 29 30 29 30 29 30 29 30 29 29 +1302=30 30 30 29 30 30 29 29 30 29 29 30 +1303=29 30 30 29 30 30 29 30 29 30 29 29 +1304=29 30 30 29 30 30 30 29 30 29 30 29 +1305=29 29 30 30 29 30 30 29 30 30 29 29 +1306=30 29 30 29 30 29 30 29 30 30 29 30 +1307=29 30 29 30 29 30 29 30 29 30 29 30 +1308=29 30 30 29 30 29 30 29 30 29 29 30 +1309=29 30 30 30 30 29 29 30 29 29 30 29 +1310=30 29 30 30 30 29 30 29 30 29 29 30 +1311=29 30 29 30 30 30 29 30 29 30 29 29 +1312=30 29 30 29 30 30 29 30 30 29 30 29 +1313=29 30 29 30 29 30 29 30 30 30 29 29 +1314=30 30 29 30 29 29 30 29 30 30 29 30 +1315=29 30 30 29 30 29 29 30 29 30 29 30 +1316=29 30 30 30 29 30 29 29 30 29 30 29 +1317=30 29 30 30 29 30 29 30 29 30 29 29 +1318=30 29 30 30 29 30 30 29 30 29 30 29 +1319=29 30 29 30 30 29 30 29 30 30 29 30 +1320=29 30 29 29 30 29 30 29 30 30 30 29 +1321=30 29 30 29 29 30 29 29 30 30 30 30 +1322=29 30 29 30 29 29 29 30 29 30 30 30 +1323=29 30 30 29 30 29 29 29 30 29 30 30 +1324=29 30 30 29 30 29 30 29 29 30 29 30 +1325=30 29 30 29 30 30 29 30 29 30 29 30 +1326=29 29 30 29 30 30 29 30 29 30 30 29 +1327=30 29 29 30 29 30 29 30 30 29 30 30 +1328=29 30 29 29 30 29 29 30 30 30 29 30 +1329=30 29 30 29 29 30 29 29 30 30 29 30 +1330=30 30 29 30 29 29 30 29 29 30 30 29 +1331=30 30 29 30 30 29 29 30 29 30 29 30 +1332=29 30 29 30 30 29 30 29 30 30 29 29 +1333=30 29 29 30 30 29 30 30 29 30 30 29 +1334=29 29 30 29 30 29 30 30 30 29 30 29 +1335=30 29 30 29 29 30 29 30 30 29 30 30 +1336=29 30 29 30 29 29 30 29 30 29 30 30 +1337=30 29 30 29 30 29 29 30 29 30 29 30 +1338=29 30 30 29 30 30 29 29 30 29 30 29 +1339=30 29 30 29 30 30 30 29 30 29 29 30 +1340=29 29 30 29 30 30 30 30 29 30 29 29 +1341=30 29 29 30 29 30 30 30 29 30 30 29 +1342=29 29 30 29 30 29 30 30 29 30 30 29 +1343=30 29 29 30 29 30 29 30 29 30 30 29 +1344=30 29 30 29 30 30 29 29 30 29 30 29 +1345=30 29 30 30 30 29 30 29 29 30 29 29 +1346=30 29 30 30 30 30 29 30 29 29 30 29 +1347=29 30 29 30 30 30 29 30 30 29 29 30 +1348=29 29 30 29 30 30 29 30 30 30 29 29 +1349=30 29 29 30 29 30 30 29 30 30 29 30 +1350=29 30 29 30 29 30 29 29 30 30 29 30 +1351=30 29 30 29 30 29 30 29 29 30 29 30 +1352=30 29 30 30 29 30 29 30 29 29 30 29 +1353=30 29 30 30 30 29 30 29 29 30 29 30 +1354=29 30 29 30 30 29 30 30 29 30 29 29 +1355=30 29 29 30 30 29 30 30 29 30 30 29 +1356=29 30 29 30 29 30 29 30 29 30 30 30 +1357=29 29 30 29 30 29 29 30 29 30 30 30 +1358=29 30 29 30 29 30 29 29 30 29 30 30 +1359=29 30 30 29 30 29 30 29 29 29 30 30 +1360=29 30 30 30 29 30 29 30 29 29 30 29 +1361=30 29 30 30 29 30 30 29 29 30 29 30 +1362=29 30 29 30 29 30 30 29 30 29 30 29 +1363=30 29 30 29 30 29 30 29 30 29 30 30 +1364=29 30 29 30 29 29 30 29 30 29 30 30 +1365=30 30 29 29 30 29 29 30 29 30 29 30 +1366=30 30 29 30 29 30 29 29 30 29 30 29 +1367=30 30 29 30 30 29 30 29 29 30 29 30 +1368=29 30 29 30 30 30 29 29 30 29 30 29 +1369=30 29 30 29 30 30 29 30 29 30 30 29 +1370=30 29 29 30 29 30 29 30 29 30 30 30 +1371=29 30 29 29 30 29 30 29 30 29 30 30 +1372=30 29 29 30 29 30 29 29 30 29 30 30 +1373=30 29 30 29 30 29 30 29 29 30 29 30 +1374=30 29 30 30 29 30 29 30 29 29 30 29 +1375=30 29 30 30 29 30 30 29 30 29 30 29 +1376=29 30 29 30 29 30 30 30 29 30 29 30 +1377=29 29 30 29 29 30 30 30 29 30 30 29 +1378=30 29 29 29 30 29 30 30 29 30 30 30 +1379=29 30 29 29 29 30 29 30 30 29 30 30 +1380=29 30 29 30 29 30 29 30 29 30 29 30 +1381=29 30 29 30 30 29 30 29 30 29 29 30 +1382=29 30 29 30 30 29 30 30 29 30 29 29 +1383=30 29 29 30 30 30 29 30 30 29 30 29 +1384=29 30 29 29 30 30 29 30 30 30 29 30 +1385=29 29 30 29 29 30 30 29 30 30 30 29 +1386=30 29 29 30 29 29 30 30 29 30 30 29 +1387=30 29 30 29 30 29 30 29 30 29 30 29 +1388=30 30 29 30 29 30 29 30 29 30 29 29 +1389=30 30 29 30 30 29 30 30 29 29 30 29 +1390=29 30 29 30 30 30 29 30 29 30 29 30 +1391=29 29 30 29 30 30 29 30 30 29 30 29 +1392=30 29 29 30 29 30 29 30 30 29 30 30 +1393=29 30 29 29 30 29 30 29 30 29 30 30 +1394=30 29 30 29 29 30 29 30 29 30 29 30 +1395=30 29 30 30 29 30 29 29 30 29 29 30 +1396=30 29 30 30 29 30 30 29 29 30 29 29 +1397=30 29 30 30 29 30 30 30 29 29 29 30 +1398=29 30 29 30 30 29 30 30 29 30 29 29 +1399=30 29 30 29 30 29 30 30 29 30 29 30 +1400=30 29 30 29 29 30 29 30 29 30 29 30 +1401=30 30 29 30 29 29 30 29 29 30 29 30 +1402=30 30 30 29 30 29 29 30 29 29 30 29 +1403=30 30 30 29 30 30 29 29 30 29 29 30 +1404=29 30 30 29 30 30 29 30 29 30 29 29 +1405=30 29 30 29 30 30 30 29 30 29 29 30 +1406=30 29 29 30 29 30 30 29 30 29 30 30 +1407=29 30 29 29 30 29 30 29 30 29 30 30 +1408=30 29 30 29 30 29 29 30 29 29 30 30 +1409=30 30 29 30 29 30 29 29 30 29 29 30 +1410=30 30 29 30 30 29 30 29 29 30 29 29 +1411=30 30 29 30 30 29 30 30 29 29 30 29 +1412=30 29 30 29 30 29 30 30 30 29 29 30 +1413=29 30 29 29 30 29 30 30 30 29 30 29 +1414=30 29 30 29 29 30 29 30 30 29 30 30 +1415=29 30 29 30 29 29 30 29 30 29 30 30 +1416=30 29 30 29 30 29 29 30 29 30 29 30 +1417=30 29 30 30 29 29 30 29 30 29 30 29 +1418=30 29 30 30 29 30 29 30 29 30 29 30 +1419=29 30 29 30 29 30 29 30 30 30 29 29 +1420=29 30 29 29 30 29 30 30 30 30 29 30 +1421=29 29 30 29 29 29 30 30 30 30 29 30 +1422=30 29 29 30 29 29 29 30 30 30 29 30 +1423=30 29 30 29 30 29 29 30 29 30 29 30 +1424=30 29 30 30 29 30 29 29 30 29 30 29 +1425=30 29 30 30 29 30 29 30 30 29 30 29 +1426=29 30 29 30 29 30 30 29 30 30 29 30 +1427=29 29 30 29 30 29 30 30 29 30 30 29 +1428=30 29 29 30 29 29 30 30 30 29 30 30 +1429=29 30 29 29 30 29 29 30 30 29 30 30 +1430=29 30 30 29 29 30 29 30 29 30 29 30 +1431=29 30 30 29 30 29 30 29 30 29 29 30 +1432=29 30 30 30 29 30 29 30 29 30 29 29 +1433=30 29 30 30 29 30 30 29 30 29 30 29 +1434=29 30 29 30 29 30 30 29 30 30 29 29 +1435=30 29 30 29 30 29 30 29 30 30 29 30 +1436=29 30 29 30 29 30 29 30 29 30 29 30 +1437=30 29 30 30 29 29 30 29 30 29 29 30 +1438=30 29 30 30 30 29 29 30 29 29 30 29 +1439=30 29 30 30 30 29 30 29 30 29 29 30 +1440=29 30 29 30 30 30 29 30 29 30 29 29 +1441=30 29 30 29 30 30 29 30 30 29 30 29 +1442=29 30 29 30 29 30 29 30 30 29 30 29 +1443=30 29 30 29 30 29 30 29 30 29 30 30 +1444=29 30 29 30 30 29 29 30 29 30 29 30 +1445=29 30 30 30 29 30 29 29 30 29 29 30 +1446=29 30 30 30 29 30 30 29 29 30 29 29 +1447=30 29 30 30 30 29 30 29 30 29 30 29 +1448=29 30 29 30 30 29 30 30 29 30 29 30 +1449=29 29 30 29 30 29 30 30 29 30 30 29 +1450=30 29 30 29 29 30 29 30 29 30 30 29 +1451=30 30 30 29 29 30 29 29 30 30 29 30 +1452=30 29 30 30 29 29 30 29 29 30 29 30 +1453=30 29 30 30 29 30 29 30 29 29 30 29 +1454=30 29 30 30 29 30 30 29 30 29 30 29 +1455=29 30 29 30 30 29 30 29 30 30 29 30 +1456=29 29 30 29 30 29 30 29 30 30 30 29 +1457=30 29 29 30 29 29 30 29 30 30 30 30 +1458=29 30 29 29 30 29 29 30 29 30 30 30 +1459=29 30 30 29 29 30 29 29 30 29 30 30 +1460=29 30 30 29 30 29 30 29 29 30 29 30 +1461=29 30 30 29 30 29 30 29 30 30 29 29 +1462=30 29 30 29 30 30 29 30 29 30 30 29 +1463=29 30 29 30 29 30 29 30 30 30 29 30 +1464=29 30 29 29 30 29 29 30 30 30 29 30 +1465=30 29 30 29 29 30 29 29 30 30 29 30 +1466=30 30 29 30 29 29 29 30 29 30 30 29 +1467=30 30 29 30 30 29 29 30 29 30 29 30 +1468=29 30 29 30 30 29 30 29 30 29 30 29 +1469=29 30 29 30 30 29 30 30 29 30 29 30 +1470=29 29 30 29 30 30 29 30 30 29 30 29 +1471=30 29 29 30 29 30 29 30 30 29 30 30 +1472=29 30 29 29 30 29 30 29 30 30 29 30 +1473=29 30 29 30 30 29 29 30 29 30 29 30 +1474=29 30 30 29 30 30 29 29 30 29 30 29 +1475=29 30 30 29 30 30 30 29 29 30 29 29 +1476=30 29 30 29 30 30 30 29 30 29 30 29 +1477=29 30 29 29 30 30 30 30 29 30 29 30 +1478=29 29 30 29 30 29 30 30 29 30 30 29 +1479=30 29 29 30 29 30 29 30 29 30 30 29 +1480=30 29 30 29 30 29 30 29 30 29 30 29 +1481=30 29 30 30 29 30 29 30 29 30 29 29 +1482=30 29 30 30 30 30 29 30 29 29 30 29 +1483=29 30 29 30 30 30 29 30 30 29 29 30 +1484=29 29 30 29 30 30 30 29 30 29 30 29 +1485=30 29 29 30 29 30 30 29 30 30 29 30 +1486=29 30 29 29 30 29 30 29 30 30 29 30 +1487=30 29 30 29 30 29 29 30 29 30 29 30 +1488=30 29 30 30 29 30 29 29 30 29 30 29 +1489=30 29 30 30 30 29 30 29 29 30 29 30 +1490=29 30 29 30 30 29 30 30 29 29 30 29 +1491=30 29 29 30 30 29 30 30 29 30 29 30 +1492=29 30 29 29 30 30 29 30 29 30 30 29 +1493=30 29 30 29 30 29 29 30 29 30 30 30 +1494=29 30 29 30 29 30 29 29 29 30 30 30 +1495=29 30 30 29 30 29 29 30 29 29 30 30 +1496=29 30 30 30 29 30 29 29 30 29 29 30 +1497=30 29 30 30 29 30 29 30 29 30 29 30 +1498=29 30 29 30 29 30 30 29 30 29 30 29 +1499=30 29 30 29 29 30 30 29 30 29 30 30 +1500=29 30 29 30 29 29 30 29 30 29 30 30 +1501=30 29 30 29 30 29 29 29 30 29 30 30 +1502=30 30 29 30 29 30 29 29 29 30 30 29 +1503=30 30 29 30 30 29 30 29 29 29 30 30 +1504=29 30 29 30 30 30 29 29 30 29 30 29 +1505=30 29 30 29 30 30 29 30 29 30 30 29 +1506=29 30 29 29 30 30 29 30 30 29 30 30 +1507=29 29 30 29 29 30 30 29 30 29 30 30 +1508=30 29 29 30 29 30 29 29 30 29 30 30 +1509=30 29 30 29 30 29 30 29 29 30 29 30 +1510=30 29 30 30 29 30 29 30 29 29 30 29 +1511=30 29 30 30 29 30 30 29 30 29 29 30 +1512=29 30 29 30 29 30 30 30 29 30 29 30 +1513=29 29 29 30 29 30 30 30 29 30 30 29 +1514=30 29 29 29 30 29 30 30 29 30 30 30 +1515=29 29 30 29 29 30 29 30 30 29 30 30 +1516=29 30 29 30 29 29 30 29 30 29 30 30 +1517=29 30 29 30 29 30 30 29 29 30 29 30 +1518=29 30 29 30 30 29 30 30 29 30 29 29 +1519=30 29 29 30 30 30 29 30 30 29 30 29 +1520=29 30 29 29 30 30 30 29 30 30 29 30 +1521=29 29 29 30 29 30 30 29 30 30 29 30 +1522=30 29 29 29 30 29 30 30 29 30 30 29 +1523=30 29 30 29 30 29 30 29 29 30 30 29 +1524=30 30 29 30 29 30 29 30 29 29 30 29 +1525=30 30 29 30 30 29 30 29 30 29 29 30 +1526=29 30 29 30 30 30 29 30 29 30 29 29 +1527=30 29 30 29 30 30 29 30 30 29 30 29 +1528=30 29 29 30 29 30 29 30 30 29 30 30 +1529=29 30 29 29 30 29 30 29 30 29 30 30 +1530=29 30 30 29 29 30 29 30 29 29 30 30 +1531=29 30 30 30 29 29 30 29 30 29 29 30 +1532=29 30 30 30 29 30 30 29 29 29 30 29 +1533=30 29 30 30 30 29 30 29 30 29 29 30 +1534=29 30 29 30 30 29 30 30 29 29 30 29 +1535=30 29 30 29 30 29 30 30 29 30 29 30 +1536=29 30 29 30 29 30 29 30 29 30 29 30 +1537=30 29 30 30 29 29 30 29 29 30 29 30 +1538=30 30 29 30 30 29 29 30 29 29 30 29 +1539=30 30 30 29 30 30 29 29 30 29 29 30 +1540=29 30 30 29 30 30 29 30 29 29 30 29 +1541=30 29 30 29 30 30 30 29 30 29 29 30 +1542=29 30 29 30 29 30 30 29 30 29 30 30 +1543=29 30 29 29 30 29 30 29 30 29 30 30 +1544=30 29 30 29 29 30 29 30 29 30 29 30 +1545=30 30 29 30 29 29 30 29 30 29 29 30 +1546=30 30 29 30 29 30 29 30 29 30 29 29 +1547=30 30 29 30 30 29 30 29 30 29 30 29 +1548=30 29 29 30 30 29 30 30 29 30 29 30 +1549=29 30 29 29 30 29 30 30 30 29 30 29 +1550=30 29 30 29 29 29 30 30 30 29 30 30 +1551=29 30 29 29 30 29 29 30 30 29 30 30 +1552=30 29 30 29 29 30 29 29 30 30 29 30 +1553=30 29 30 29 30 29 30 29 30 29 30 29 +1554=30 29 30 29 30 30 29 30 29 30 29 30 +1555=29 29 30 29 30 30 29 30 30 29 30 29 +1556=30 29 29 30 29 30 29 30 30 30 29 30 +1557=29 30 29 29 29 30 29 30 30 30 30 29 +1558=30 29 30 29 29 29 30 29 30 30 30 29 +1559=30 30 29 29 30 29 29 30 30 29 30 29 +1560=30 30 29 30 29 30 29 30 29 30 29 30 +1561=29 30 30 29 30 29 30 30 29 29 30 29 +1562=29 30 30 29 30 29 30 30 30 29 29 30 +1563=29 30 29 29 30 29 30 30 30 29 30 29 +1564=30 29 30 29 29 30 29 30 30 30 29 30 +1565=29 30 29 30 29 29 30 29 30 30 29 30 +1566=30 29 30 29 30 29 29 30 29 30 29 30 +1567=30 29 30 30 29 30 29 30 29 29 30 29 +1568=30 29 30 30 30 29 30 29 30 29 29 29 +1569=30 29 30 30 30 29 30 30 29 30 29 29 +1570=29 30 29 30 30 29 30 30 30 29 29 30 +1571=29 29 30 29 30 30 29 30 30 29 30 29 +1572=30 29 29 30 29 30 29 30 30 29 30 29 +1573=30 29 30 30 29 30 29 29 30 29 30 29 +1574=30 30 29 30 30 29 30 29 29 30 29 29 +1575=30 30 30 29 30 30 29 30 29 29 29 30 +1576=29 30 30 29 30 30 30 29 30 29 29 29 +1577=30 29 30 30 29 30 30 29 30 29 30 29 +1578=29 30 29 30 29 30 30 29 30 30 29 30 +1579=29 30 29 30 29 29 30 30 29 30 29 30 +1580=29 30 30 29 30 29 29 30 29 30 29 30 +1581=30 30 29 30 29 30 29 29 30 29 30 29 +1582=30 30 29 30 30 29 30 29 30 29 29 29 +1583=30 30 29 30 30 30 29 30 29 30 29 29 +1584=29 30 30 29 30 30 29 30 30 29 30 29 +1585=29 30 29 30 29 30 29 30 30 29 30 30 +1586=29 29 30 29 30 29 29 30 30 30 29 30 +1587=29 30 30 29 29 29 30 29 30 29 30 30 +1588=30 29 30 30 29 29 29 30 29 30 29 30 +1589=30 29 30 30 29 30 29 29 30 29 30 29 +1590=30 29 30 30 30 29 29 30 29 30 29 30 +1591=29 30 29 30 30 29 30 29 30 29 30 29 +1592=30 29 30 29 30 29 30 29 30 30 30 29 +1593=30 29 29 30 29 29 30 29 30 30 30 29 +1594=30 30 29 29 30 29 29 29 30 30 30 30 +1595=29 30 29 30 29 29 30 29 29 30 30 30 +1596=29 30 30 29 30 29 29 30 29 30 29 30 +1597=29 30 30 29 30 29 30 29 30 29 30 29 +1598=30 29 30 29 30 30 29 30 29 30 30 29 +1599=29 30 29 30 29 30 29 30 30 30 29 30 +1600=29 29 30 29 30 29 29 30 30 30 29 30 diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/native/java/io/io_util.c --- a/jdk/src/share/native/java/io/io_util.c Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/native/java/io/io_util.c Fri Aug 02 09:38:09 2013 +0100 @@ -211,7 +211,11 @@ n = getLastErrorString(buf, sizeof(buf)); if (n > 0) { +#ifdef WIN32 + why = (*env)->NewStringUTF(env, buf); +#else why = JNU_NewStringPlatform(env, buf); +#endif } x = JNU_NewObjectByName(env, "java/io/FileNotFoundException", diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/native/java/net/net_util.c --- a/jdk/src/share/native/java/net/net_util.c Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/native/java/net/net_util.c Fri Aug 02 09:38:09 2013 +0100 @@ -75,7 +75,7 @@ static int initialized = 0; -void init(JNIEnv *env) { +static void initInetAddrs(JNIEnv *env) { if (!initialized) { Java_java_net_InetAddress_init(env, 0); Java_java_net_Inet4Address_init(env, 0); @@ -96,42 +96,43 @@ void setInetAddress_addr(JNIEnv *env, jobject iaObj, int address) { jobject holder; - init(env); + initInetAddrs(env); holder = (*env)->GetObjectField(env, iaObj, ia_holderID); (*env)->SetIntField(env, holder, iac_addressID, address); } void setInetAddress_family(JNIEnv *env, jobject iaObj, int family) { jobject holder; - init(env); + initInetAddrs(env); holder = (*env)->GetObjectField(env, iaObj, ia_holderID); (*env)->SetIntField(env, holder, iac_familyID, family); } void setInetAddress_hostName(JNIEnv *env, jobject iaObj, jobject host) { jobject holder; - init(env); + initInetAddrs(env); holder = (*env)->GetObjectField(env, iaObj, ia_holderID); (*env)->SetObjectField(env, holder, iac_hostNameID, host); } int getInetAddress_addr(JNIEnv *env, jobject iaObj) { jobject holder; - init(env); + initInetAddrs(env); holder = (*env)->GetObjectField(env, iaObj, ia_holderID); return (*env)->GetIntField(env, holder, iac_addressID); } int getInetAddress_family(JNIEnv *env, jobject iaObj) { jobject holder; - init(env); + + initInetAddrs(env); holder = (*env)->GetObjectField(env, iaObj, ia_holderID); return (*env)->GetIntField(env, holder, iac_familyID); } jobject getInetAddress_hostName(JNIEnv *env, jobject iaObj) { jobject holder; - init(env); + initInetAddrs(env); holder = (*env)->GetObjectField(env, iaObj, ia_holderID); return (*env)->GetObjectField(env, holder, iac_hostNameID); } @@ -139,7 +140,7 @@ JNIEXPORT jobject JNICALL NET_SockaddrToInetAddress(JNIEnv *env, struct sockaddr *him, int *port) { jobject iaObj; - init(env); + initInetAddrs(env); #ifdef AF_INET6 if (him->sa_family == AF_INET6) { jbyteArray ipaddress; diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/native/sun/awt/image/jpeg/imageioJPEG.c --- a/jdk/src/share/native/sun/awt/image/jpeg/imageioJPEG.c Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/native/sun/awt/image/jpeg/imageioJPEG.c Fri Aug 02 09:38:09 2013 +0100 @@ -106,7 +106,7 @@ /******************** StreamBuffer definition ************************/ typedef struct streamBufferStruct { - jobject stream; // ImageInputStream or ImageOutputStream + jweak ioRef; // weak reference to a provider of I/O routines jbyteArray hstreamBuffer; // Handle to a Java buffer for the stream JOCTET *buf; // Pinned buffer pointer */ size_t bufferOffset; // holds offset between unpin and the next pin @@ -125,6 +125,15 @@ */ #define STREAMBUF_SIZE 4096 +#define GET_IO_REF(io_name) \ + do { \ + if ((*env)->IsSameObject(env, sb->ioRef, NULL) || \ + ((io_name) = (*env)->NewLocalRef(env, sb->ioRef)) == NULL) \ + { \ + cinfo->err->error_exit((j_common_ptr) cinfo); \ + } \ + } while (0) \ + /* * Used to signal that no data need be restored from an unpin to a pin. * I.e. the buffer is empty. @@ -159,7 +168,7 @@ } - sb->stream = NULL; + sb->ioRef = NULL; sb->buf = NULL; @@ -191,9 +200,9 @@ * All other state is reset. */ static void resetStreamBuffer(JNIEnv *env, streamBufferPtr sb) { - if (sb->stream != NULL) { - (*env)->DeleteGlobalRef(env, sb->stream); - sb->stream = NULL; + if (sb->ioRef != NULL) { + (*env)->DeleteWeakGlobalRef(env, sb->ioRef); + sb->ioRef = NULL; } unpinStreamBuffer(env, sb, NULL); sb->bufferOffset = NO_DATA; @@ -571,7 +580,7 @@ static void imageio_set_stream(JNIEnv *env, j_common_ptr cinfo, imageIODataPtr data, - jobject stream){ + jobject io){ streamBufferPtr sb; sun_jpeg_error_ptr jerr; @@ -579,13 +588,13 @@ resetStreamBuffer(env, sb); // Removes any old stream - /* Now we need a new global reference for the stream */ - if (stream != NULL) { // Fix for 4411955 - sb->stream = (*env)->NewGlobalRef(env, stream); - if (sb->stream == NULL) { + /* Now we need a new weak global reference for the I/O provider */ + if (io != NULL) { // Fix for 4411955 + sb->ioRef = (*env)->NewWeakGlobalRef(env, io); + if (sb->ioRef == NULL) { JNU_ThrowByName(env, "java/lang/OutOfMemoryError", - "Setting Stream"); + "Setting I/O provider"); return; } } @@ -895,6 +904,7 @@ streamBufferPtr sb = &data->streamBuf; JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); int ret; + jobject input = NULL; /* This is where input suspends */ if (sb->suspendable) { @@ -920,9 +930,11 @@ * Now fill a complete buffer, or as much of one as the stream * will give us if we are near the end. */ + GET_IO_REF(input); + RELEASE_ARRAYS(env, data, src->next_input_byte); ret = (*env)->CallIntMethod(env, - sb->stream, + input, JPEGImageReader_readInputDataID, sb->hstreamBuffer, 0, sb->bufferLength); @@ -982,6 +994,7 @@ JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); jint ret; size_t offset, buflen; + jobject input = NULL; /* * The original (jpegdecoder.c) had code here that called @@ -1003,6 +1016,9 @@ if (src->next_input_byte > sb->buf) { memcpy(sb->buf, src->next_input_byte, offset); } + + GET_IO_REF(input); + RELEASE_ARRAYS(env, data, src->next_input_byte); buflen = sb->bufferLength - offset; if (buflen <= 0) { @@ -1012,7 +1028,7 @@ return; } - ret = (*env)->CallIntMethod(env, sb->stream, + ret = (*env)->CallIntMethod(env, input, JPEGImageReader_readInputDataID, sb->hstreamBuffer, offset, buflen); @@ -1075,6 +1091,7 @@ JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); jlong ret; jobject reader; + jobject input = NULL; if (num_bytes < 0) { return; @@ -1104,9 +1121,11 @@ return; } + GET_IO_REF(input); + RELEASE_ARRAYS(env, data, src->next_input_byte); ret = (*env)->CallLongMethod(env, - sb->stream, + input, JPEGImageReader_skipInputBytesID, (jlong) num_bytes); if ((*env)->ExceptionOccurred(env) @@ -2285,11 +2304,14 @@ imageIODataPtr data = (imageIODataPtr) cinfo->client_data; streamBufferPtr sb = &data->streamBuf; JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); + jobject output = NULL; + + GET_IO_REF(output); RELEASE_ARRAYS(env, data, (const JOCTET *)(dest->next_output_byte)); (*env)->CallVoidMethod(env, - sb->stream, + output, JPEGImageWriter_writeOutputDataID, sb->hstreamBuffer, 0, @@ -2322,11 +2344,16 @@ /* find out how much needs to be written */ /* this conversion from size_t to jint is safe, because the lenght of the buffer is limited by jint */ jint datacount = (jint)(sb->bufferLength - dest->free_in_buffer); + if (datacount != 0) { + jobject output = NULL; + + GET_IO_REF(output); + RELEASE_ARRAYS(env, data, (const JOCTET *)(dest->next_output_byte)); (*env)->CallVoidMethod(env, - sb->stream, + output, JPEGImageWriter_writeOutputDataID, sb->hstreamBuffer, 0, diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/native/sun/awt/medialib/awt_ImagingLib.c --- a/jdk/src/share/native/sun/awt/medialib/awt_ImagingLib.c Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/native/sun/awt/medialib/awt_ImagingLib.c Fri Aug 02 09:38:09 2013 +0100 @@ -2606,38 +2606,37 @@ #define ERR_BAD_IMAGE_LAYOUT (-2) -#define CHECK_DST_ARRAY(start_offset, elements_per_pixel) \ - do { \ - int offset = (start_offset); \ - int lastScanOffset; \ - \ - if (!SAFE_TO_MULT(rasterP->scanlineStride, \ - (rasterP->height - 1))) \ - { \ - return ERR_BAD_IMAGE_LAYOUT; \ - } \ - lastScanOffset = rasterP->scanlineStride * \ - (rasterP->height - 1); \ - \ - if (!SAFE_TO_ADD(offset, lastScanOffset)) { \ - return ERR_BAD_IMAGE_LAYOUT; \ - } \ - lastScanOffset += offset; \ - \ - if (!SAFE_TO_MULT((elements_per_pixel), rasterP->width)) { \ - return ERR_BAD_IMAGE_LAYOUT; \ - } \ - offset = (elements_per_pixel) * rasterP->width; \ - \ - if (!SAFE_TO_ADD(offset, lastScanOffset)) { \ - return ERR_BAD_IMAGE_LAYOUT; \ - } \ - lastScanOffset += offset; \ - \ - if (dataArrayLength < lastScanOffset) { \ - return ERR_BAD_IMAGE_LAYOUT; \ - } \ - } while(0); \ +#define CHECK_DST_ARRAY(start_offset, elements_per_scan, elements_per_pixel) \ + do { \ + int offset = (start_offset); \ + int lastScanOffset; \ + \ + if (!SAFE_TO_MULT((elements_per_scan), \ + (rasterP->height - 1))) \ + { \ + return ERR_BAD_IMAGE_LAYOUT; \ + } \ + lastScanOffset = (elements_per_scan) * (rasterP->height - 1); \ + \ + if (!SAFE_TO_ADD(offset, lastScanOffset)) { \ + return ERR_BAD_IMAGE_LAYOUT; \ + } \ + lastScanOffset += offset; \ + \ + if (!SAFE_TO_MULT((elements_per_pixel), rasterP->width)) { \ + return ERR_BAD_IMAGE_LAYOUT; \ + } \ + offset = (elements_per_pixel) * rasterP->width; \ + \ + if (!SAFE_TO_ADD(offset, lastScanOffset)) { \ + return ERR_BAD_IMAGE_LAYOUT; \ + } \ + lastScanOffset += offset; \ + \ + if (dataArrayLength < lastScanOffset) { \ + return ERR_BAD_IMAGE_LAYOUT; \ + } \ + } while(0); \ static int storeImageArray(JNIEnv *env, BufImageS_t *srcP, BufImageS_t *dstP, @@ -2665,39 +2664,33 @@ if (hintP->packing == BYTE_INTERLEAVED) { /* Write it back to the destination */ - CHECK_DST_ARRAY(hintP->channelOffset, hintP->numChans); + if (rasterP->dataType != BYTE_DATA_TYPE) { + /* We are working with a raster which was marked + as a byte interleaved due to performance reasons. + So, we have to convert the length of the data + array to bytes as well. + */ + if (!SAFE_TO_MULT(rasterP->dataSize, dataArrayLength)) { + return ERR_BAD_IMAGE_LAYOUT; + } + dataArrayLength *= rasterP->dataSize; + } + + CHECK_DST_ARRAY(hintP->dataOffset, hintP->sStride, hintP->numChans); cmDataP = (unsigned char *) mlib_ImageGetData(mlibImP); mStride = mlib_ImageGetStride(mlibImP); dataP = (unsigned char *)(*env)->GetPrimitiveArrayCritical(env, rasterP->jdata, NULL); if (dataP == NULL) return 0; - cDataP = dataP + hintP->channelOffset; + cDataP = dataP + hintP->dataOffset; for (y=0; y < rasterP->height; - y++, cmDataP += mStride, cDataP += rasterP->scanlineStride) + y++, cmDataP += mStride, cDataP += hintP->sStride) { memcpy(cDataP, cmDataP, rasterP->width*hintP->numChans); } (*env)->ReleasePrimitiveArrayCritical(env, rasterP->jdata, dataP, JNI_ABORT); } - else if (hintP->packing == SHORT_INTERLEAVED) { - /* Write it back to the destination */ - unsigned short *sdataP, *sDataP; - unsigned short *smDataP = (unsigned short *)mlib_ImageGetData(mlibImP); - CHECK_DST_ARRAY(hintP->channelOffset, hintP->numChans); - mStride = mlib_ImageGetStride(mlibImP); - sdataP = (unsigned short *)(*env)->GetPrimitiveArrayCritical(env, - rasterP->jdata, NULL); - if (sdataP == NULL) return -1; - sDataP = sdataP + hintP->channelOffset; - for (y=0; y < rasterP->height; - y++, smDataP += mStride, sDataP += rasterP->scanlineStride) - { - memcpy(sDataP, smDataP, rasterP->width*hintP->numChans); - } - (*env)->ReleasePrimitiveArrayCritical(env, rasterP->jdata, sdataP, - JNI_ABORT); - } else if (dstP->cmodel.cmType == DIRECT_CM_TYPE) { /* Just need to move bits */ if (mlibImP->type == MLIB_BYTE) { @@ -3499,7 +3492,7 @@ } dataArrayLength = (*env)->GetArrayLength(env, jOutDataP); - CHECK_DST_ARRAY(rasterP->chanOffsets[0], 1); + CHECK_DST_ARRAY(rasterP->chanOffsets[0], rasterP->scanlineStride, 1); outDataP = (*env)->GetPrimitiveArrayCritical(env, jOutDataP, 0); if (outDataP == NULL) { @@ -3575,7 +3568,7 @@ } dataArrayLength = (*env)->GetArrayLength(env, jOutDataP); - CHECK_DST_ARRAY(rasterP->chanOffsets[0], 1); + CHECK_DST_ARRAY(rasterP->chanOffsets[0], rasterP->scanlineStride, 1); outDataP = (*env)->GetPrimitiveArrayCritical(env, jOutDataP, 0); if (outDataP == NULL) { @@ -3651,7 +3644,7 @@ } dataArrayLength = (*env)->GetArrayLength(env, jOutDataP); - CHECK_DST_ARRAY(rasterP->chanOffsets[0], 1); + CHECK_DST_ARRAY(rasterP->chanOffsets[0], rasterP->scanlineStride, 1); outDataP = (*env)->GetPrimitiveArrayCritical(env, jOutDataP, 0); if (outDataP == NULL) { @@ -3730,7 +3723,7 @@ } dataArrayLength = (*env)->GetArrayLength(env, jOutDataP); - CHECK_DST_ARRAY(rasterP->chanOffsets[0], 1); + CHECK_DST_ARRAY(rasterP->chanOffsets[0], rasterP->scanlineStride, 1); outDataP = (*env)->GetPrimitiveArrayCritical(env, jOutDataP, 0); if (outDataP == NULL) { @@ -3827,7 +3820,7 @@ return -1; } dataArrayLength = (*env)->GetArrayLength(env, jOutDataP); - CHECK_DST_ARRAY(rasterP->chanOffsets[0], 1); + CHECK_DST_ARRAY(rasterP->chanOffsets[0], rasterP->scanlineStride, 1); outDataP = (*env)->GetPrimitiveArrayCritical(env, jOutDataP, 0); if (outDataP == NULL) { @@ -3925,7 +3918,7 @@ } dataArrayLength = (*env)->GetArrayLength(env, jOutDataP); - CHECK_DST_ARRAY(rasterP->chanOffsets[0], 1); + CHECK_DST_ARRAY(rasterP->chanOffsets[0], rasterP->scanlineStride, 1); outDataP = (*env)->GetPrimitiveArrayCritical(env, jOutDataP, 0); if (outDataP == NULL) { diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/share/native/sun/font/layout/CanonShaping.cpp --- a/jdk/src/share/native/sun/font/layout/CanonShaping.cpp Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/share/native/sun/font/layout/CanonShaping.cpp Fri Aug 02 09:38:09 2013 +0100 @@ -66,6 +66,16 @@ le_int32 *indices = LE_NEW_ARRAY(le_int32, charCount); le_int32 i; + if (combiningClasses == NULL || indices == NULL) { + if (combiningClasses != NULL) { + LE_DELETE_ARRAY(combiningClasses); + } + if (indices != NULL) { + LE_DELETE_ARRAY(indices); + } + return; + } + for (i = 0; i < charCount; i += 1) { combiningClasses[i] = classTable->getGlyphClass(classTable, (LEGlyphID) inChars[i], success); indices[i] = i; diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/solaris/classes/sun/print/IPPPrintService.java --- a/jdk/src/solaris/classes/sun/print/IPPPrintService.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/solaris/classes/sun/print/IPPPrintService.java Fri Aug 02 09:38:09 2013 +0100 @@ -1099,6 +1099,15 @@ if (category == PrinterName.class) { return (T)(new PrinterName(printer, null)); + } else if (category == PrinterInfo.class) { + PrinterInfo pInfo = new PrinterInfo(printer, null); + AttributeClass ac = (getAttMap != null) ? + (AttributeClass)getAttMap.get(pInfo.getName()) + : null; + if (ac != null) { + return (T)(new PrinterInfo(ac.getStringValue(), null)); + } + return (T)pInfo; } else if (category == QueuedJobCount.class) { QueuedJobCount qjc = new QueuedJobCount(0); AttributeClass ac = (getAttMap != null) ? @@ -1566,7 +1575,24 @@ } } + String getDest() { + return printer; + } + public String getName() { + /* + * Mac is using printer-info IPP attribute for its human-readable printer + * name and is also the identifier used in NSPrintInfo:setPrinter. + */ + if (UnixPrintServiceLookup.isMac()) { + PrintServiceAttributeSet psaSet = this.getAttributes(); + if (psaSet != null) { + PrinterInfo pName = (PrinterInfo)psaSet.get(PrinterInfo.class); + if (pName != null) { + return pName.toString(); + } + } + } return printer; } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/solaris/classes/sun/print/UnixPrintJob.java --- a/jdk/src/solaris/classes/sun/print/UnixPrintJob.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/solaris/classes/sun/print/UnixPrintJob.java Fri Aug 02 09:38:09 2013 +0100 @@ -65,6 +65,7 @@ import javax.print.attribute.PrintJobAttributeSet; import javax.print.attribute.PrintRequestAttribute; import javax.print.attribute.PrintRequestAttributeSet; +import javax.print.attribute.PrintServiceAttributeSet; import javax.print.attribute.standard.Copies; import javax.print.attribute.standard.Destination; import javax.print.attribute.standard.DocumentName; @@ -76,6 +77,7 @@ import javax.print.attribute.standard.MediaSize; import javax.print.attribute.standard.MediaSizeName; import javax.print.attribute.standard.OrientationRequested; +import javax.print.attribute.standard.PrinterName; import javax.print.attribute.standard.RequestingUserName; import javax.print.attribute.standard.NumberUp; import javax.print.attribute.standard.Sides; @@ -120,6 +122,9 @@ UnixPrintJob(PrintService service) { this.service = service; mDestination = service.getName(); + if (UnixPrintServiceLookup.isMac()) { + mDestination = ((IPPPrintService)service).getDest(); + } mDestType = UnixPrintJob.DESTPRINTER; } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/solaris/native/sun/awt/awt_GraphicsEnv.c --- a/jdk/src/solaris/native/sun/awt/awt_GraphicsEnv.c Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/solaris/native/sun/awt/awt_GraphicsEnv.c Fri Aug 02 09:38:09 2013 +0100 @@ -926,6 +926,11 @@ *shmExt = canUseShmExt = CANT_USE_MITSHM; *shmPixmaps = canUseShmExtPixmaps = CANT_USE_MITSHM; + if (awt_display == (Display *)NULL) { + AWT_NOFLUSH_UNLOCK(); + return; + } + /** * XShmQueryExtension returns False in remote server case. * Unfortunately it also returns True in ssh case, so diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/solaris/native/sun/java2d/x11/XRBackendNative.c --- a/jdk/src/solaris/native/sun/java2d/x11/XRBackendNative.c Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/solaris/native/sun/java2d/x11/XRBackendNative.c Fri Aug 02 09:38:09 2013 +0100 @@ -112,6 +112,25 @@ #define PKGINFO_LINE_LEN_MAX 256 #define PKGINFO_LINE_CNT_MAX 50 +/* + * X protocol uses (u_int16)length to specify the length in 4 bytes quantities + * of the whole request. Both XRenderFillRectangles() and XFillRectangles() + * have provisions to fragment into several requests if the number of rectangles + * plus the current x request does not fit into 65535*4 bytes. While + * XRenderCreateLinearGradient() and XRenderCreateRadialGradient() have + * provisions to gracefully degrade if the resulting request would exceed + * 65535*4 bytes. + * + * Below, we define a cap of 65535*4 bytes for the maximum X request payload + * allowed for Non-(XRenderFillRectangles() or XFillRectangles()) API calls, + * just to be conservative. This is offset by the size of our maximum x*Req + * type in this compilation unit, which is xRenderCreateRadiaGradientReq. + * + * Note that sizeof(xRenderCreateRadiaGradientReq) = 36 + */ +#define MAX_PAYLOAD (262140u - 36u) +#define MAXUINT (0xffffffffu) + static jboolean IsXRenderAvailable(jboolean verbose) { void *xrenderlib; @@ -267,13 +286,19 @@ char *maskData; XImage* defaultImg; jfieldID maskImgID; - jlong fmt8 = - ptr_to_jlong(XRenderFindStandardFormat(awt_display, PictStandardA8)); - jlong fmt32 = - ptr_to_jlong(XRenderFindStandardFormat(awt_display, PictStandardARGB32)); + jlong fmt8; + jlong fmt32; + jfieldID a8ID = (*env)->GetStaticFieldID(env, cls, "FMTPTR_A8", "J"); jfieldID argb32ID = (*env)->GetStaticFieldID(env, cls, "FMTPTR_ARGB32", "J"); + if (awt_display == (Display *)NULL) { + return; + } + + fmt8 = ptr_to_jlong(XRenderFindStandardFormat(awt_display, PictStandardA8)); + fmt32 = ptr_to_jlong(XRenderFindStandardFormat(awt_display, PictStandardARGB32)); + (*env)->SetStaticLongField(env, cls, a8ID, fmt8); (*env)->SetStaticLongField(env, cls, argb32ID, fmt32); @@ -404,6 +429,10 @@ if (rectCnt <= 256) { xRects = &sRects[0]; } else { + if (MAXUINT / sizeof(XRectangle) < (unsigned)rectCnt) { + /* rectCnt too big, integer overflow */ + return; + } xRects = (XRectangle *) malloc(sizeof(XRectangle) * rectCnt); if (xRects == NULL) { return; @@ -460,6 +489,12 @@ XFixed *stops; XLinearGradient grad; + if (MAX_PAYLOAD / (sizeof(XRenderColor) + sizeof(XFixed)) + < (unsigned)numStops) { + /* numStops too big, payload overflow */ + return -1; + } + if ((pixels = (jshort *) (*env)->GetPrimitiveArrayCritical(env, pixelsArray, NULL)) == NULL) { return -1; @@ -480,6 +515,18 @@ colors = (XRenderColor *) malloc(numStops * sizeof(XRenderColor)); stops = (XFixed *) malloc(numStops * sizeof(XFixed)); + if (colors == NULL || stops == NULL) { + if (colors != NULL) { + free(colors); + } + if (stops != NULL) { + free(stops); + } + (*env)->ReleasePrimitiveArrayCritical(env, pixelsArray, pixels, JNI_ABORT); + (*env)->ReleasePrimitiveArrayCritical(env, fractionsArray, fractions, JNI_ABORT); + return -1; + } + for (i=0; i < numStops; i++) { stops[i] = XDoubleToFixed(fractions[i]); colors[i].alpha = pixels[i*4 + 0]; @@ -527,6 +574,11 @@ XFixed *stops; XRadialGradient grad; + if (MAX_PAYLOAD / (sizeof(XRenderColor) + sizeof(XFixed)) + < (unsigned)numStops) { + /* numStops too big, payload overflow */ + return -1; + } if ((pixels = (jshort *)(*env)->GetPrimitiveArrayCritical(env, pixelsArray, NULL)) == NULL) { @@ -550,6 +602,18 @@ colors = (XRenderColor *) malloc(numStops * sizeof(XRenderColor)); stops = (XFixed *) malloc(numStops * sizeof(XFixed)); + if (colors == NULL || stops == NULL) { + if (colors != NULL) { + free(colors); + } + if (stops != NULL) { + free(stops); + } + (*env)->ReleasePrimitiveArrayCritical(env, pixelsArray, pixels, JNI_ABORT); + (*env)->ReleasePrimitiveArrayCritical(env, fractionsArray, fractions, JNI_ABORT); + return -1; + } + for (i=0; i < numStops; i++) { stops[i] = XDoubleToFixed(fractions[i]); colors[i].alpha = pixels[i*4 + 0]; @@ -708,6 +772,12 @@ unsigned char *pixelData; int i; + if (MAX_PAYLOAD / (sizeof(XGlyphInfo) + sizeof(Glyph)) + < (unsigned)glyphCnt) { + /* glyphCnt too big, payload overflow */ + return; + } + XGlyphInfo *xginfo = (XGlyphInfo *) malloc(sizeof(XGlyphInfo) * glyphCnt); Glyph *gid = (Glyph *) malloc(sizeof(Glyph) * glyphCnt); @@ -770,6 +840,11 @@ Java_sun_java2d_xr_XRBackendNative_XRFreeGlyphsNative (JNIEnv *env, jclass cls, jint glyphSet, jintArray gidArray, jint glyphCnt) { + if (MAX_PAYLOAD / sizeof(Glyph) < (unsigned)glyphCnt) { + /* glyphCnt too big, payload overflow */ + return; + } + /* The glyph ids are 32 bit but may be stored in a 64 bit long on * a 64 bit architecture. So optimise the 32 bit case to avoid * extra stack or heap allocations by directly referencing the @@ -840,6 +915,15 @@ unsigned int sids[256]; int charCnt = 0; + if ((MAX_PAYLOAD / sizeof(XGlyphElt32) < (unsigned)eltCnt) + || (MAX_PAYLOAD / sizeof(unsigned int) < (unsigned)glyphCnt) + || ((MAX_PAYLOAD - sizeof(XGlyphElt32)*(unsigned)eltCnt) / + sizeof(unsigned int) < (unsigned)glyphCnt)) + { + /* (eltCnt, glyphCnt) too big, payload overflow */ + return; + } + if (eltCnt <= 24) { xelts = &selts[0]; }else { @@ -938,6 +1022,11 @@ if (rectCnt <= 256) { xRects = &sRects[0]; } else { + if (MAXUINT / sizeof(XRectangle) < (unsigned)rectCnt) { + /* rectCnt too big, integer overflow */ + return; + } + xRects = (XRectangle *) malloc(sizeof(XRectangle) * rectCnt); if (xRects == NULL) { return; diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/windows/classes/sun/print/Win32PrintService.java --- a/jdk/src/windows/classes/sun/print/Win32PrintService.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/windows/classes/sun/print/Win32PrintService.java Fri Aug 02 09:38:09 2013 +0100 @@ -445,7 +445,7 @@ initMedia(); - if ((mediaSizeNames == null) && (mediaSizeNames.length == 0)) { + if ((mediaSizeNames == null) || (mediaSizeNames.length == 0)) { return null; } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/windows/native/java/io/io_util_md.c --- a/jdk/src/windows/native/java/io/io_util_md.c Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/windows/native/java/io/io_util_md.c Fri Aug 02 09:38:09 2013 +0100 @@ -29,6 +29,7 @@ #include "io_util.h" #include "io_util_md.h" #include +#include #include #include @@ -40,6 +41,7 @@ #include #include + static DWORD MAX_INPUT_EVENTS = 2000; /* If this returns NULL then an exception is pending */ @@ -569,42 +571,75 @@ } size_t -getLastErrorString(char *buf, size_t len) +getLastErrorString(char *utf8_jvmErrorMsg, size_t cbErrorMsg) { - DWORD errval; - if (len > 0) { - if ((errval = GetLastError()) != 0) { - // DOS error - size_t n = (size_t)FormatMessage( - FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, - errval, - 0, - buf, - (DWORD)len, - NULL); - if (n > 3) { - // Drop final '.', CR, LF - if (buf[n - 1] == '\n') n--; - if (buf[n - 1] == '\r') n--; - if (buf[n - 1] == '.') n--; - buf[n] = '\0'; + size_t n = 0; + if (cbErrorMsg > 0) { + BOOLEAN noError = FALSE; + WCHAR *utf16_osErrorMsg = (WCHAR *)malloc(cbErrorMsg*sizeof(WCHAR)); + if (utf16_osErrorMsg == NULL) { + // OOM accident + strncpy(utf8_jvmErrorMsg, "Out of memory", cbErrorMsg); + // truncate if too long + utf8_jvmErrorMsg[cbErrorMsg - 1] = '\0'; + n = strlen(utf8_jvmErrorMsg); + } else { + DWORD errval = GetLastError(); + if (errval != 0) { + // WIN32 error + n = (size_t)FormatMessageW( + FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + errval, + 0, + utf16_osErrorMsg, + (DWORD)cbErrorMsg, + NULL); + if (n > 3) { + // Drop final '.', CR, LF + if (utf16_osErrorMsg[n - 1] == L'\n') --n; + if (utf16_osErrorMsg[n - 1] == L'\r') --n; + if (utf16_osErrorMsg[n - 1] == L'.') --n; + utf16_osErrorMsg[n] = L'\0'; + } + } else if (errno != 0) { + // C runtime error that has no corresponding WIN32 error code + const WCHAR *rtError = _wcserror(errno); + if (rtError != NULL) { + wcsncpy(utf16_osErrorMsg, rtError, cbErrorMsg); + // truncate if too long + utf16_osErrorMsg[cbErrorMsg - 1] = L'\0'; + n = wcslen(utf16_osErrorMsg); + } + } else + noError = TRUE; //OS has no error to report + + if (!noError) { + if (n > 0) { + n = WideCharToMultiByte( + CP_UTF8, + 0, + utf16_osErrorMsg, + n, + utf8_jvmErrorMsg, + cbErrorMsg, + NULL, + NULL); + + // no way to die + if (n > 0) + utf8_jvmErrorMsg[min(cbErrorMsg - 1, n)] = '\0'; + } + + if (n <= 0) { + strncpy(utf8_jvmErrorMsg, "Secondary error while OS message extraction", cbErrorMsg); + // truncate if too long + utf8_jvmErrorMsg[cbErrorMsg - 1] = '\0'; + n = strlen(utf8_jvmErrorMsg); + } } - return n; - } - - if (errno != 0) { - // C runtime error that has no corresponding DOS error code - const char *err = strerror(errno); - size_t n = strlen(err); - if (n >= len) - n = len - 1; - - strncpy(buf, err, n); - buf[n] = '\0'; - return n; + free(utf16_osErrorMsg); } } - - return 0; + return n; } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/src/windows/native/java/lang/ProcessImpl_md.c --- a/jdk/src/windows/native/java/lang/ProcessImpl_md.c Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/src/windows/native/java/lang/ProcessImpl_md.c Fri Aug 02 09:38:09 2013 +0100 @@ -40,20 +40,70 @@ */ #define PIPE_SIZE (4096+24) +/* We have THREE locales in action: + * 1. Thread default locale - dictates UNICODE-to-8bit conversion + * 2. System locale that defines the message localization + * 3. The file name locale + * Each locale could be an extended locale, that means that text cannot be + * mapped to 8bit sequence without multibyte encoding. + * VM is ready for that, if text is UTF-8. + * Here we make the work right from the beginning. + */ +size_t os_error_message(int errnum, WCHAR* utf16_OSErrorMsg, size_t maxMsgLength) { + size_t n = (size_t)FormatMessageW( + FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + (DWORD)errnum, + 0, + utf16_OSErrorMsg, + (DWORD)maxMsgLength, + NULL); + if (n > 3) { + // Drop final '.', CR, LF + if (utf16_OSErrorMsg[n - 1] == L'\n') --n; + if (utf16_OSErrorMsg[n - 1] == L'\r') --n; + if (utf16_OSErrorMsg[n - 1] == L'.') --n; + utf16_OSErrorMsg[n] = L'\0'; + } + return n; +} + +#define MESSAGE_LENGTH (256 + 100) +#define ARRAY_SIZE(x) (sizeof(x)/sizeof(*x)) + static void -win32Error(JNIEnv *env, const char *functionName) +win32Error(JNIEnv *env, const WCHAR *functionName) { - static const char * const format = "%s error=%d, %s"; - static const char * const fallbackFormat = "%s failed, error=%d"; - char buf[256]; - char errmsg[sizeof(buf) + 100]; - const int errnum = GetLastError(); - const int n = JVM_GetLastErrorString(buf, sizeof(buf)); - if (n > 0) - sprintf(errmsg, format, functionName, errnum, buf); - else - sprintf(errmsg, fallbackFormat, functionName, errnum); - JNU_ThrowIOException(env, errmsg); + WCHAR utf16_OSErrorMsg[MESSAGE_LENGTH - 100]; + WCHAR utf16_javaMessage[MESSAGE_LENGTH]; + /*Good suggestion about 2-bytes-per-symbol in localized error reports*/ + char utf8_javaMessage[MESSAGE_LENGTH*2]; + const int errnum = (int)GetLastError(); + int n = os_error_message(errnum, utf16_OSErrorMsg, ARRAY_SIZE(utf16_OSErrorMsg)); + n = (n > 0) + ? swprintf(utf16_javaMessage, MESSAGE_LENGTH, L"%s error=%d, %s", functionName, errnum, utf16_OSErrorMsg) + : swprintf(utf16_javaMessage, MESSAGE_LENGTH, L"%s failed, error=%d", functionName, errnum); + + if (n > 0) /*terminate '\0' is not a part of conversion procedure*/ + n = WideCharToMultiByte( + CP_UTF8, + 0, + utf16_javaMessage, + n, /*by creation n <= MESSAGE_LENGTH*/ + utf8_javaMessage, + MESSAGE_LENGTH*2, + NULL, + NULL); + + /*no way to die*/ + { + const char *errorMessage = "Secondary error while OS message extraction"; + if (n > 0) { + utf8_javaMessage[min(MESSAGE_LENGTH*2 - 1, n)] = '\0'; + errorMessage = utf8_javaMessage; + } + JNU_ThrowIOException(env, errorMessage); + } } static void @@ -116,7 +166,7 @@ handles[0] = (jlong) -1; } else { if (! CreatePipe(&inRead, &inWrite, &sa, PIPE_SIZE)) { - win32Error(env, "CreatePipe"); + win32Error(env, L"CreatePipe"); goto Catch; } si.hStdInput = inRead; @@ -132,7 +182,7 @@ handles[1] = (jlong) -1; } else { if (! CreatePipe(&outRead, &outWrite, &sa, PIPE_SIZE)) { - win32Error(env, "CreatePipe"); + win32Error(env, L"CreatePipe"); goto Catch; } si.hStdOutput = outWrite; @@ -151,7 +201,7 @@ handles[2] = (jlong) -1; } else { if (! CreatePipe(&errRead, &errWrite, &sa, PIPE_SIZE)) { - win32Error(env, "CreatePipe"); + win32Error(env, L"CreatePipe"); goto Catch; } si.hStdError = errWrite; @@ -174,7 +224,7 @@ &si, /* (in) startup information */ &pi); /* (out) process information */ if (!ret) { - win32Error(env, "CreateProcess"); + win32Error(env, L"CreateProcess"); goto Catch; } @@ -210,7 +260,7 @@ { DWORD exit_code; if (GetExitCodeProcess((HANDLE) handle, &exit_code) == 0) - win32Error(env, "GetExitCodeProcess"); + win32Error(env, L"GetExitCodeProcess"); return exit_code; } @@ -231,7 +281,7 @@ FALSE, /* Wait for ANY event */ INFINITE) /* Wait forever */ == WAIT_FAILED) - win32Error(env, "WaitForMultipleObjects"); + win32Error(env, L"WaitForMultipleObjects"); } JNIEXPORT void JNICALL @@ -250,7 +300,7 @@ dwTimeout); /* Wait for dwTimeout */ if (result == WAIT_FAILED) - win32Error(env, "WaitForMultipleObjects"); + win32Error(env, L"WaitForMultipleObjects"); } JNIEXPORT void JNICALL @@ -263,7 +313,7 @@ Java_java_lang_ProcessImpl_isProcessAlive(JNIEnv *env, jclass ignored, jlong handle) { DWORD dwExitStatus; - GetExitCodeProcess(handle, &dwExitStatus); + GetExitCodeProcess((HANDLE) handle, &dwExitStatus); return dwExitStatus == STILL_ACTIVE; } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/test/Makefile --- a/jdk/test/Makefile Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/test/Makefile Fri Aug 02 09:38:09 2013 +0100 @@ -362,23 +362,6 @@ TESTDIRS = demo endif -# Agentvm settings (default is false) -ifndef USE_JTREG_AGENTVM - USE_JTREG_AGENTVM=false -endif -# With agentvm, you cannot use -javaoptions? -ifeq ($(USE_JTREG_AGENTVM),true) - JTREG_AGENTVM_OPTION = -agentvm - EXTRA_JTREG_OPTIONS += $(JTREG_AGENTVM_OPTION) $(JAVA_ARGS) $(JAVA_ARGS:%=-vmoption:%) - JTREG_TEST_OPTIONS = $(JAVA_VM_ARGS:%=-vmoption:%) -else - JTREG_TEST_OPTIONS = $(JAVA_ARGS:%=-javaoptions:%) $(JAVA_VM_ARGS:%=-vmoption:%) -endif - -ifdef CONCURRENCY - EXTRA_JTREG_OPTIONS += -concurrency:$(CONCURRENCY) -endif - # Some tests annoy me and fail frequently PROBLEM_LIST=ProblemList.txt PROBLEM_LISTS=$(PROBLEM_LIST) $(wildcard closed/$(PROBLEM_LIST)) @@ -414,13 +397,9 @@ $(foreach i,$1,$(wildcard ${i})) $(foreach i,$1,$(wildcard closed/${i})) endef # Running batches of tests with or without agentvm -define RunAgentvmBatch -$(ECHO) "Running tests in agentvm mode: $?" -$(MAKE) TEST_DEPENDENCIES="$?" TESTDIRS="$?" USE_JTREG_AGENTVM=true UNIQUE_DIR=$@ jtreg_tests -endef -define RunOthervmBatch -$(ECHO) "Running tests in othervm mode: $?" -$(MAKE) TEST_DEPENDENCIES="$?" TESTDIRS="$?" USE_JTREG_AGENTVM=false UNIQUE_DIR=$@ jtreg_tests +define RunBatch +$(ECHO) "Running tests: $?" +$(MAKE) TEST_DEPENDENCIES="$?" TESTDIRS="$?" UNIQUE_DIR=$@ jtreg_tests endef define SummaryInfo $(ECHO) "########################################################" @@ -435,76 +414,60 @@ JDK_DEFAULT_TARGETS = JDK_ALL_TARGETS = -# Stable othervm testruns (minus items from PROBLEM_LIST) -# Using agentvm has problems, and doesn't help performance as much as others. JDK_ALL_TARGETS += jdk_awt jdk_awt: $(call TestDirs, com/sun/awt java/awt sun/awt \ javax/imageio javax/print sun/pisces) - $(call RunOthervmBatch) + $(call RunBatch) -# Stable othervm testruns (minus items from PROBLEM_LIST) JDK_ALL_TARGETS += jdk_beans1 JDK_DEFAULT_TARGETS += jdk_beans1 jdk_beans1: $(call TestDirs, \ java/beans/beancontext java/beans/PropertyChangeSupport \ java/beans/Introspector java/beans/Performance \ java/beans/VetoableChangeSupport java/beans/Statement) - $(call RunOthervmBatch) + $(call RunBatch) -# Stable othervm testruns (minus items from PROBLEM_LIST) -# Using agentvm has serious problems with these tests JDK_ALL_TARGETS += jdk_beans2 jdk_beans2: $(call TestDirs, \ java/beans/Beans java/beans/EventHandler java/beans/XMLDecoder \ java/beans/PropertyEditor) - $(call RunOthervmBatch) + $(call RunBatch) -# Stable othervm testruns (minus items from PROBLEM_LIST) -# Using agentvm has serious problems with these tests JDK_ALL_TARGETS += jdk_beans3 jdk_beans3: $(call TestDirs, java/beans/XMLEncoder) - $(call RunOthervmBatch) + $(call RunBatch) # All beans tests jdk_beans: jdk_beans1 jdk_beans2 jdk_beans3 @$(SummaryInfo) -# Stable agentvm testruns (minus items from PROBLEM_LIST) JDK_ALL_TARGETS += jdk_io JDK_DEFAULT_TARGETS += jdk_io jdk_io: $(call TestDirs, java/io) - $(call RunAgentvmBatch) + $(call RunBatch) -# Stable agentvm testruns (minus items from PROBLEM_LIST) JDK_ALL_TARGETS += jdk_lang JDK_DEFAULT_TARGETS += jdk_lang jdk_lang: $(call TestDirs, java/lang sun/invoke sun/misc sun/reflect vm) - $(call RunAgentvmBatch) + $(call RunBatch) -# Stable othervm testruns (minus items from PROBLEM_LIST) -# Using agentvm has serious problems with these tests JDK_ALL_TARGETS += jdk_jmx jdk_jmx: $(call TestDirs, javax/management com/sun/jmx) - $(call RunOthervmBatch) + $(call RunBatch) -# Stable othervm testruns (minus items from PROBLEM_LIST) -# Using agentvm has serious problems with these tests JDK_ALL_TARGETS += jdk_management jdk_management: $(call TestDirs, com/sun/management sun/management) - $(call RunOthervmBatch) + $(call RunBatch) -# Stable agentvm testruns (minus items from PROBLEM_LIST) JDK_ALL_TARGETS += jdk_math JDK_DEFAULT_TARGETS += jdk_math jdk_math: $(call TestDirs, java/math) - $(call RunAgentvmBatch) + $(call RunBatch) -# Stable agentvm testruns (TestNG) JDK_DEFAULT_TARGETS += jdk_time jdk_time: $(call TestDirs, java/time) - $(call RunAgentvmBatch) + $(call RunBatch) -# Stable agentvm testruns (minus items from PROBLEM_LIST) JDK_ALL_TARGETS += jdk_other JDK_DEFAULT_TARGETS += jdk_other jdk_other: $(call TestDirs, \ @@ -522,97 +485,79 @@ com/sun/corba \ com/sun/tracing \ sun/usagetracker) - $(call RunAgentvmBatch) + $(call RunBatch) -# Stable agentvm testruns (minus items from PROBLEM_LIST) JDK_ALL_TARGETS += jdk_net JDK_DEFAULT_TARGETS += jdk_net jdk_net: $(call TestDirs, com/sun/net java/net sun/net com/oracle/net) - $(call RunAgentvmBatch) + $(call RunBatch) -# Stable agentvm testruns (minus items from PROBLEM_LIST) jdk_nio: $(call TestDirs, java/nio sun/nio com/oracle/nio) $(call SharedLibraryPermissions,java/nio/channels) - $(call RunAgentvmBatch) + $(call RunBatch) -# Stable agentvm testruns (minus items from PROBLEM_LIST) jdk_sctp: $(call TestDirs, com/sun/nio/sctp) - $(call RunAgentvmBatch) + $(call RunBatch) -# Stable othervm testruns (minus items from PROBLEM_LIST) -# Using agentvm has serious problems with these tests JDK_ALL_TARGETS += jdk_rmi jdk_rmi: $(call TestDirs, java/rmi sun/rmi javax/rmi/ssl) - $(call RunOthervmBatch) + $(call RunBatch) -# Stable agentvm testruns (minus items from PROBLEM_LIST) JDK_ALL_TARGETS += jdk_security1 JDK_DEFAULT_TARGETS += jdk_security1 jdk_security1: $(call TestDirs, java/security) - $(call RunAgentvmBatch) + $(call RunBatch) -# Stable agentvm testruns (minus items from PROBLEM_LIST) JDK_ALL_TARGETS += jdk_security2 jdk_security2: $(call TestDirs, javax/crypto javax/xml/crypto com/sun/crypto) - $(call RunAgentvmBatch) + $(call RunBatch) -# Stable agentvm testruns (minus items from PROBLEM_LIST) JDK_ALL_TARGETS += jdk_security3 jdk_security3: $(call TestDirs, com/sun/security lib/security javax/security \ sun/security com/sun/org/apache/xml/internal/security \ com/oracle/security) $(call SharedLibraryPermissions,sun/security) - $(call RunAgentvmBatch) + $(call RunBatch) # All security tests jdk_security: jdk_security1 jdk_security2 jdk_security3 @$(SummaryInfo) -# Stable agentvm testruns (minus items from PROBLEM_LIST) JDK_ALL_TARGETS += jdk_sound jdk_sound: $(call TestDirs, javax/sound) - $(call RunAgentvmBatch) + $(call RunBatch) -# Stable othervm testruns (minus items from PROBLEM_LIST) -# Using agentvm has problems, and doesn't help performance as much as others. JDK_ALL_TARGETS += jdk_swing jdk_swing: $(call TestDirs, javax/swing sun/java2d \ demo/jfc com/sun/java/swing) - $(call RunOthervmBatch) + $(call RunBatch) -# Stable agentvm testruns (minus items from PROBLEM_LIST) JDK_ALL_TARGETS += jdk_text JDK_DEFAULT_TARGETS += jdk_text jdk_text: $(call TestDirs, java/text sun/text) - $(call RunAgentvmBatch) + $(call RunBatch) -# Stable agentvm testruns (minus items from PROBLEM_LIST) JDK_ALL_TARGETS += jdk_jdi jdk_jdi: $(call TestDirs, com/sun/jdi) - $(call RunAgentvmBatch) + $(call RunBatch) -# Stable othervm testruns (minus items from PROBLEM_LIST) -# Using agentvm has serious problems with these tests JDK_ALL_TARGETS += jdk_tools jdk_tools: $(call TestDirs, com/sun/tools sun/jvmstat sun/tools tools) $(call SharedLibraryPermissions,tools/launcher) - $(call RunAgentvmBatch) + $(call RunBatch) -# Stable othervm testruns (minus items from PROBLEM_LIST) -# Using agentvm has serious problems with these tests ifdef OPENJDK jdk_jfr: else JDK_ALL_TARGETS += jdk_jfr jdk_jfr: $(call TestDirs, com/oracle/jfr) - $(call RunOthervmBatch) + $(call RunBatch) endif -# Stable agentvm testruns (minus items from PROBLEM_LIST) JDK_ALL_TARGETS += jdk_util JDK_DEFAULT_TARGETS += jdk_util jdk_util: $(call TestDirs, java/util sun/util) - $(call RunAgentvmBatch) + $(call RunBatch) # ------------------------------------------------------------------ @@ -638,10 +583,14 @@ # ------------------------------------------------------------------ +ifdef CONCURRENCY + EXTRA_JTREG_OPTIONS += -concurrency:$(CONCURRENCY) +endif + # Default JTREG to run (win32 script works for everybody) JTREG = $(JT_HOME)/win32/bin/jtreg -# Add any extra options (agentvm etc.) -JTREG_BASIC_OPTIONS += $(EXTRA_JTREG_OPTIONS) +# run in agentvm mode +JTREG_BASIC_OPTIONS += -agentvm # Only run automatic tests JTREG_BASIC_OPTIONS += -a # Always turn on assertions @@ -660,6 +609,13 @@ # Set the max memory for jtreg control vm JTREG_MEMORY_OPTION = -J-Xmx512m JTREG_BASIC_OPTIONS += $(JTREG_MEMORY_OPTION) +# Add any extra options +JTREG_BASIC_OPTIONS += $(EXTRA_JTREG_OPTIONS) +# Set other vm and test options +JTREG_TEST_OPTIONS = $(JAVA_ARGS:%=-javaoptions:%) $(JAVA_VM_ARGS:%=-vmoption:%) +# Set the GC options for test vms +#JTREG_GC_OPTION = -vmoption:-XX:+UseSerialGC +#JTREG_TEST_OPTIONS += $(JTREG_GC_OPTION) # Set the max memory for jtreg target test vms JTREG_TESTVM_MEMORY_OPTION = -vmoption:-Xmx512m JTREG_TEST_OPTIONS += $(JTREG_TESTVM_MEMORY_OPTION) diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/test/ProblemList.txt --- a/jdk/test/ProblemList.txt Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/test/ProblemList.txt Fri Aug 02 09:38:09 2013 +0100 @@ -131,12 +131,14 @@ # 7196801 java/lang/management/MemoryMXBean/LowMemoryTest2.sh generic-all -# 8008200 -java/lang/Class/asSubclass/BasicUnit.java generic-all - # 8015780 java/lang/reflect/Method/GenericStringTest.java generic-all +# 8019845 due to memleak not related to the tested fix +java/lang/instrument/RedefineBigClass.sh linux-x64 +java/lang/instrument/RetransformBigClass.sh linux-x64 + + ############################################################################ # jdk_management @@ -165,6 +167,9 @@ # 7027502 demo/jvmti/hprof/MonitorTest.java generic-all +# 8021186 +jdk/lambda/vm/DefaultMethodsTest.java generic-all + ############################################################################ # jdk_net @@ -250,15 +255,12 @@ # jdk_security +# 7157786 +sun/security/pkcs11/ec/TestKeyFactory.java generic-all + # 7164518: no PortUnreachableException on Mac sun/security/krb5/auto/Unreachable.java macosx-all -# 7193793 -sun/security/pkcs11/ec/TestECDH.java linux-all - -# 7198198: the test also fails on SuSE Linux -sun/security/pkcs11/ec/ReadCertificates.java linux-all - # 7147060 com/sun/org/apache/xml/internal/security/transforms/ClassLoaderTest.java generic-all @@ -268,9 +270,6 @@ sun/security/pkcs11/ec/ReadPKCS12.java solaris-all sun/security/pkcs11/sslecc/ClientJSSEServerJSSE.java solaris-all -# 8005247 -sun/security/pkcs11/ec/TestECDSA.java solaris-all - # 8009438 sun/security/pkcs11/Secmod/AddPrivateKey.java linux-all sun/security/pkcs11/Secmod/TrustAnchors.java linux-all @@ -297,9 +296,6 @@ # 7194428 sun/security/mscapi/ShortRSAKey1024.sh windows-all -# 7144048, performance issue -sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLEngineImpl/SSLEngineDeadlock.java generic-all - ############################################################################ # jdk_sound @@ -371,6 +367,9 @@ # Filed 6772009 java/util/concurrent/locks/ReentrantLock/CancelledLockLoops.java generic-all +# 8020435 +java/util/concurrent/CompletableFuture/Basic.java generic-all + # 7041639, Solaris DSA keypair generation bug java/util/TimeZone/TimeZoneDatePermissionCheck.sh solaris-all diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/test/com/sun/management/DiagnosticCommandMBean/DcmdMBeanDoubleInvocationTest.java --- a/jdk/test/com/sun/management/DiagnosticCommandMBean/DcmdMBeanDoubleInvocationTest.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/test/com/sun/management/DiagnosticCommandMBean/DcmdMBeanDoubleInvocationTest.java Fri Aug 02 09:38:09 2013 +0100 @@ -25,25 +25,15 @@ * @test * @bug 7150256 * @summary Basic Test for the DiagnosticCommandMBean - * @author Frederic Parain + * @author Frederic Parain, Shanliang JIANG * - * @run main/othervm -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=8125 DcmdMBeanDoubleInvocationTest + * @run main/othervm DcmdMBeanDoubleInvocationTest */ -import java.io.IOException; import java.lang.management.ManagementFactory; -import java.util.logging.Level; -import java.util.logging.Logger; -import javax.management.Descriptor; -import javax.management.InstanceNotFoundException; -import javax.management.IntrospectionException; -import javax.management.MBeanInfo; -import javax.management.MBeanOperationInfo; import javax.management.MBeanServer; -import javax.management.MalformedObjectNameException; import javax.management.ObjectName; -import javax.management.ReflectionException; import javax.management.*; import javax.management.remote.*; @@ -52,39 +42,42 @@ private static String HOTSPOT_DIAGNOSTIC_MXBEAN_NAME = "com.sun.management:type=DiagnosticCommand"; - public static void main(String[] args) { - MBeanServerConnection mbs = null; - try { - JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:8125/jmxrmi"); - JMXConnector connector = JMXConnectorFactory.connect(url); - mbs = connector.getMBeanServerConnection(); - } catch(Throwable t) { - t.printStackTrace(); - } - ObjectName name; + public static void main(String[] args) throws Exception { + System.out.println("--->JRCMD MBean Test: invocation on \"help VM.version\" ..."); + + ObjectName name = new ObjectName(HOTSPOT_DIAGNOSTIC_MXBEAN_NAME); + String[] helpArgs = {"-all", "\n", "VM.version"}; + Object[] dcmdArgs = {helpArgs}; + String[] signature = {String[].class.getName()}; + + MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); + JMXServiceURL url = new JMXServiceURL("rmi", null, 0); + JMXConnectorServer cs = null; + JMXConnector cc = null; try { - name = new ObjectName(HOTSPOT_DIAGNOSTIC_MXBEAN_NAME); - MBeanInfo info = mbs.getMBeanInfo(name); - String[] helpArgs = {"-all", "\n", "VM.version"}; - Object[] dcmdArgs = {helpArgs}; - String[] signature = {String[].class.getName()}; - String result = (String) mbs.invoke(name, "help", dcmdArgs, signature); + cs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs); + cs.start(); + JMXServiceURL addr = cs.getAddress(); + cc = JMXConnectorFactory.connect(addr); + MBeanServerConnection mbsc = cc.getMBeanServerConnection(); + + String result = (String) mbsc.invoke(name, "help", dcmdArgs, signature); System.out.println(result); - } catch (RuntimeMBeanException ex) { + + throw new Error("Test failed: Double commands have not been detected"); + } catch (RuntimeMBeanException ex) { if (ex.getCause() instanceof IllegalArgumentException) { - System.out.println("Test passed"); - return; + System.out.println("JTest passed: Double commands have been detected"); } else { ex.printStackTrace(); - throw new RuntimeException("TEST FAILED"); + throw new Error("TEST FAILED: got unknown exception "+ex); } - } catch (InstanceNotFoundException | IntrospectionException - | ReflectionException | MalformedObjectNameException - | MBeanException|IOException ex) { - ex.printStackTrace(); - throw new RuntimeException("TEST FAILED"); + } finally { + try { + cc.close(); + cs.stop(); + } catch (Exception e) { + } } - System.out.println("Double commands have not been detected"); - throw new RuntimeException("TEST FAILED"); } } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/test/com/sun/management/DiagnosticCommandMBean/DcmdMBeanInvocationTest.java --- a/jdk/test/com/sun/management/DiagnosticCommandMBean/DcmdMBeanInvocationTest.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/test/com/sun/management/DiagnosticCommandMBean/DcmdMBeanInvocationTest.java Fri Aug 02 09:38:09 2013 +0100 @@ -25,25 +25,15 @@ * @test * @bug 7150256 * @summary Basic Test for the DiagnosticCommandMBean - * @author Frederic Parain + * @author Frederic Parain, Shanliang JIANG * - * @run main/othervm -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=8129 DcmdMBeanInvocationTest + * @run main/othervm DcmdMBeanInvocationTest */ -import java.io.IOException; import java.lang.management.ManagementFactory; -import java.util.logging.Level; -import java.util.logging.Logger; -import javax.management.Descriptor; -import javax.management.InstanceNotFoundException; -import javax.management.IntrospectionException; -import javax.management.MBeanInfo; -import javax.management.MBeanOperationInfo; import javax.management.MBeanServer; -import javax.management.MalformedObjectNameException; import javax.management.ObjectName; -import javax.management.ReflectionException; import javax.management.*; import javax.management.remote.*; @@ -52,30 +42,35 @@ private static String HOTSPOT_DIAGNOSTIC_MXBEAN_NAME = "com.sun.management:type=DiagnosticCommand"; - public static void main(String[] args) { - MBeanServerConnection mbs = null; - try { - JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:8129/jmxrmi"); - JMXConnector connector = JMXConnectorFactory.connect(url); - mbs = connector.getMBeanServerConnection(); - } catch(Throwable t) { - t.printStackTrace(); - } - ObjectName name; + public static void main(String[] args) throws Exception { + System.out.println("--->JRCMD MBean Test: invocation on \"help -all\" ..."); + + ObjectName name = new ObjectName(HOTSPOT_DIAGNOSTIC_MXBEAN_NAME); + String[] helpArgs = {"-all"}; + Object[] dcmdArgs = {helpArgs}; + String[] signature = {String[].class.getName()}; + + MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); + JMXServiceURL url = new JMXServiceURL("rmi", null, 0); + JMXConnectorServer cs = null; + JMXConnector cc = null; try { - name = new ObjectName(HOTSPOT_DIAGNOSTIC_MXBEAN_NAME); - MBeanInfo info = mbs.getMBeanInfo(name); - String[] helpArgs = {"-all"}; - Object[] dcmdArgs = {helpArgs}; - String[] signature = {String[].class.getName()}; - String result = (String) mbs.invoke(name, "help", dcmdArgs, signature); + cs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs); + cs.start(); + JMXServiceURL addr = cs.getAddress(); + cc = JMXConnectorFactory.connect(addr); + MBeanServerConnection mbsc = cc.getMBeanServerConnection(); + + String result = (String) mbsc.invoke(name, "help", dcmdArgs, signature); System.out.println(result); - } catch (InstanceNotFoundException | IntrospectionException - | ReflectionException | MalformedObjectNameException - | MBeanException|IOException ex) { - ex.printStackTrace(); - throw new RuntimeException("TEST FAILED"); + } finally { + try { + cc.close(); + cs.stop(); + } catch (Exception e) { + } } + System.out.println("Test passed"); } } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/test/com/sun/management/DiagnosticCommandMBean/DcmdMBeanTest.java --- a/jdk/test/com/sun/management/DiagnosticCommandMBean/DcmdMBeanTest.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/test/com/sun/management/DiagnosticCommandMBean/DcmdMBeanTest.java Fri Aug 02 09:38:09 2013 +0100 @@ -25,25 +25,18 @@ * @test * @bug 7150256 * @summary Basic Test for the DiagnosticCommandMBean - * @author Frederic Parain + * @author Frederic Parain, Shanliang JIANG * - * @run main/othervm -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=8127 DcmdMBeanTest + * @run main/othervm DcmdMBeanTest */ -import java.io.IOException; import java.lang.management.ManagementFactory; -import java.util.logging.Level; -import java.util.logging.Logger; import javax.management.Descriptor; -import javax.management.InstanceNotFoundException; -import javax.management.IntrospectionException; import javax.management.MBeanInfo; import javax.management.MBeanOperationInfo; import javax.management.MBeanServer; -import javax.management.MalformedObjectNameException; import javax.management.ObjectName; -import javax.management.ReflectionException; import javax.management.*; import javax.management.remote.*; @@ -52,34 +45,42 @@ private static String HOTSPOT_DIAGNOSTIC_MXBEAN_NAME = "com.sun.management:type=DiagnosticCommand"; - public static void main(String[] args) { - MBeanServerConnection mbs = null; + public static void main(String[] args) throws Exception { + System.out.println("--->JRCMD MBean Test: invocation on \"operation info\"..."); + + MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); + JMXServiceURL url = new JMXServiceURL("rmi", null, 0); + JMXConnectorServer cs = null; + JMXConnector cc = null; try { - JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:8127/jmxrmi"); - JMXConnector connector = JMXConnectorFactory.connect(url); - mbs = connector.getMBeanServerConnection(); - } catch(Throwable t) { - t.printStackTrace(); - } - ObjectName name; - try { - name = new ObjectName(HOTSPOT_DIAGNOSTIC_MXBEAN_NAME); - MBeanInfo info = mbs.getMBeanInfo(name); + cs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs); + cs.start(); + JMXServiceURL addr = cs.getAddress(); + cc = JMXConnectorFactory.connect(addr); + MBeanServerConnection mbsc = cc.getMBeanServerConnection(); + ObjectName name = new ObjectName(HOTSPOT_DIAGNOSTIC_MXBEAN_NAME); + MBeanInfo info = mbsc.getMBeanInfo(name); + // the test should check that the MBean doesn't have any // Attribute, notification or constructor. Current version only // check operations - System.out.println("Class Name:"+info.getClassName()); - System.out.println("Description:"+info.getDescription()); + System.out.println("Class Name:" + info.getClassName()); + System.out.println("Description:" + info.getDescription()); MBeanOperationInfo[] opInfo = info.getOperations(); System.out.println("Operations:"); - for(int i=0; i MEM_LEAK_THRESHOLD) { + System.err.println("FAIL: Virtual memory usage increased by " + vMemDelta + "Kb " + + "(greater than " + MEM_LEAK_THRESHOLD + "Kb)"); + System.exit(1); + } + System.err.println("PASS: Virtual memory usage increased by " + vMemDelta + "Kb " + + "(not greater than " + MEM_LEAK_THRESHOLD + "Kb)"); + } System.exit(0); } + + /** + * Return size of virtual memory allocated to the process in Kb. + * Linux specific. On other platforms and in case of any errors return 0. + */ + private static long getVMemSize() { + + // Refer to the Linux proc(5) man page for details about /proc/self/stat file + // + // In short, this file contains status information about the current process + // written in one line. The fields are separated with spaces. + // The 23rd field is defined as 'vsize %lu Virtual memory size in bytes' + + try (FileReader fileReader = new FileReader("/proc/self/stat"); + BufferedReader bufferedReader = new BufferedReader(fileReader)) { + String line = bufferedReader.readLine(); + return Long.parseLong(line.split(" ")[22]) / 1024; + } catch (Exception ex) {} + return 0; + } } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/test/java/lang/instrument/RetransformBigClass.sh --- a/jdk/test/java/lang/instrument/RetransformBigClass.sh Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/test/java/lang/instrument/RetransformBigClass.sh Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ # -# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2011, 2013 Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -22,7 +22,7 @@ # # @test -# @bug 7122253 +# @bug 7122253 8016838 # @summary Retransform a big class. # @author Daniel D. Daugherty # diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/test/java/lang/instrument/RetransformBigClassApp.java --- a/jdk/test/java/lang/instrument/RetransformBigClassApp.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/test/java/lang/instrument/RetransformBigClassApp.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2013 Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,12 +21,21 @@ * questions. */ +import java.io.*; + public class RetransformBigClassApp { + /** + * Memory leak is assumed, if application consumes more than specified amount of memory during its execution. + * The number is given in Kb. + */ + private static final long MEM_LEAK_THRESHOLD = 32 * 1024; // 32Mb + public static void main(String[] args) throws Exception { System.out.println("Creating instance of " + RetransformBigClassAgent.clz); RetransformBigClassAgent.clz.newInstance(); + long vMemBefore = getVMemSize(); int count = 0; while (!RetransformBigClassAgent.doneRetransforming) { System.out.println("App loop count: " + ++count); @@ -37,6 +46,39 @@ } System.out.println("App looped " + count + " times."); + long vMemAfter = getVMemSize(); + if (vMemBefore == 0 || vMemAfter == 0) { + System.err.println("WARNING: Cannot perform memory leak detection on this OS"); + } else { + long vMemDelta = vMemAfter - vMemBefore; + if (vMemDelta > MEM_LEAK_THRESHOLD) { + System.err.println("FAIL: Virtual memory usage increased by " + vMemDelta + "Kb " + + "(greater than " + MEM_LEAK_THRESHOLD + "Kb)"); + System.exit(1); + } + System.err.println("PASS: Virtual memory usage increased by " + vMemDelta + "Kb " + + "(not greater than " + MEM_LEAK_THRESHOLD + "Kb)"); + } System.exit(0); } + + /** + * Return size of virtual memory allocated to the process in Kb. + * Linux specific. On other platforms and in case of any errors return 0. + */ + private static long getVMemSize() { + + // Refer to the Linux proc(5) man page for details about /proc/self/stat file + // + // In short, this file contains status information about the current process + // written in one line. The fields are separated with spaces. + // The 23rd field is defined as 'vsize %lu Virtual memory size in bytes' + + try (FileReader fileReader = new FileReader("/proc/self/stat"); + BufferedReader bufferedReader = new BufferedReader(fileReader)) { + String line = bufferedReader.readLine(); + return Long.parseLong(line.split(" ")[22]) / 1024; + } catch (Exception ex) {} + return 0; + } } diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/test/java/lang/management/ThreadMXBean/ResetPeakThreadCount.java --- a/jdk/test/java/lang/management/ThreadMXBean/ResetPeakThreadCount.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/test/java/lang/management/ThreadMXBean/ResetPeakThreadCount.java Fri Aug 02 09:38:09 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,10 +23,11 @@ /* * @test - * @bug 4892507 + * @bug 4892507 8020875 8021335 * @summary Basic Test for the following reset methods: * - ThreadMXBean.resetPeakThreadCount() * @author Mandy Chung + * @author Jaroslav Bachorik * * @build ResetPeakThreadCount * @build ThreadDump @@ -53,15 +54,17 @@ private static final int TERMINATE_2 = 8; + private static final int TERMINATE_3 = 2; + private static final int ALL_THREADS = DAEMON_THREADS_1 + DAEMON_THREADS_2 + DAEMON_THREADS_3; // barrier for threads communication - private static Barrier barrier = new Barrier(DAEMON_THREADS_1); + private static final Barrier barrier = new Barrier(DAEMON_THREADS_1); - private static Thread allThreads[] = new Thread[ALL_THREADS]; - private static volatile boolean live[] = new boolean[ALL_THREADS]; + private static final Thread allThreads[] = new Thread[ALL_THREADS]; + private static final boolean live[] = new boolean[ALL_THREADS]; private static final ThreadMXBean mbean = ManagementFactory.getThreadMXBean(); - private static boolean testFailed = false; + private static volatile boolean testFailed = false; public static void main(String[] argv) throws Exception { // This test does not expect any threads to be created @@ -69,7 +72,10 @@ // The checkThreadCount() method is to produce more // diagnostic information in case any unexpected test failure occur. long previous = mbean.getThreadCount(); - long current; + long current = previous; + + // reset the peak to start from a scratch + resetPeak(current); // start DAEMON_THREADS_1 number of threads current = startThreads(0, DAEMON_THREADS_1, EXPECTED_PEAK_DELTA_1); @@ -106,6 +112,14 @@ current = terminateThreads(TERMINATE_1, TERMINATE_2); checkThreadCount(previous, current, TERMINATE_2 * -1); + previous = current; + + resetPeak(current); + + // terminate TERMINATE_3 number of threads and reset peak + current = terminateThreads(TERMINATE_1 + TERMINATE_2, TERMINATE_3); + + checkThreadCount(previous, current, TERMINATE_3 * -1); resetPeak(current); if (testFailed) @@ -114,7 +128,7 @@ System.out.println("Test passed"); } - private static long startThreads(int from, int count, int delta) { + private static long startThreads(int from, int count, int delta) throws InterruptedException { // get current peak thread count long peak1 = mbean.getPeakThreadCount(); long current = mbean.getThreadCount(); @@ -122,11 +136,13 @@ // Start threads and wait to be sure they all are alive System.out.println("Starting " + count + " threads...."); barrier.set(count); - for (int i = from; i < (from + count); i++) { - live[i] = true; - allThreads[i] = new MyThread(i); - allThreads[i].setDaemon(true); - allThreads[i].start(); + synchronized(live) { + for (int i = from; i < (from + count); i++) { + live[i] = true; + allThreads[i] = new MyThread(i); + allThreads[i].setDaemon(true); + allThreads[i].start(); + } } // wait until all threads have started. barrier.await(); @@ -144,29 +160,25 @@ } // wait until the current thread count gets incremented while (mbean.getThreadCount() < (current + count)) { - try { - Thread.sleep(100); - } catch (InterruptedException e) { - e.printStackTrace(); - System.out.println("Unexpected exception."); - testFailed = true; - } + Thread.sleep(100); } current = mbean.getThreadCount(); System.out.println(" Live thread count before returns " + current); return current; } - private static long terminateThreads(int from, int count) { + private static long terminateThreads(int from, int count) throws InterruptedException { // get current peak thread count long peak1 = mbean.getPeakThreadCount(); - long current = mbean.getThreadCount(); // Stop daemon threads and wait to be sure they all are dead System.out.println("Terminating " + count + " threads...."); barrier.set(count); - for (int i = from; i < (from+count); i++) { - live[i] = false; + synchronized(live) { + for (int i = from; i < (from+count); i++) { + live[i] = false; + } + live.notifyAll(); } // wait until daemon threads terminated. barrier.await(); @@ -179,18 +191,17 @@ " Expected to be = previous peak = " + peak1); } - // wait until the current thread count gets decremented - while (mbean.getThreadCount() > (current - count)) { - try { - Thread.sleep(100); - } catch (InterruptedException e) { - e.printStackTrace(); - System.out.println("Unexpected exception."); - testFailed = true; - } + for (int i = from; i < (from+count); i++) { + allThreads[i].join(); } - current = mbean.getThreadCount(); + // there is a race in the counter update logic somewhere causing + // the thread counters go ff + // we need to give the terminated threads some extra time to really die + // JDK-8021335 + Thread.sleep(500); + + long current = mbean.getThreadCount(); System.out.println(" Live thread count before returns " + current); return current; } @@ -223,11 +234,11 @@ private static void checkThreadCount(long previous, long current, int expectedDelta) { if (current != previous + expectedDelta) { - System.out.println("***** Unexpected thread count:" + + ThreadDump.threadDump(); + throw new RuntimeException("***** Unexpected thread count:" + " previous = " + previous + " current = " + current + " delta = " + expectedDelta + "*****"); - ThreadDump.threadDump(); } } @@ -242,13 +253,15 @@ public void run() { // signal started barrier.signal(); - while (live[id]) { - try { - sleep(100); - } catch (InterruptedException e) { - System.out.println("Unexpected exception is thrown."); - e.printStackTrace(System.out); - testFailed = true; + synchronized(live) { + while (live[id]) { + try { + live.wait(100); + } catch (InterruptedException e) { + System.out.println("Unexpected exception is thrown."); + e.printStackTrace(System.out); + testFailed = true; + } } } // signal about to exit diff -r 8ac8b6677ba7 -r bdf5c313d76f jdk/test/java/math/BigInteger/BigIntegerTest.java --- a/jdk/test/java/math/BigInteger/BigIntegerTest.java Thu Jul 25 17:32:23 2013 +0100 +++ b/jdk/test/java/math/BigInteger/BigIntegerTest.java Fri Aug 02 09:38:09 2013 +0100 @@ -43,8 +43,8 @@ * this test is a strong assurance that the BigInteger operations * are working correctly. * - * Three arguments may be specified which give the number of - * decimal digits you desire in the three batches of test numbers. + * Four arguments may be specified which give the number of + * decimal digits you desire in the four batches of test numbers. * * The tests are performed on arrays of random numbers which are * generated by a Random class as well as special cases which @@ -63,11 +63,14 @@ // // SCHOENHAGE_BASE_CONVERSION_THRESHOLD = 8 ints = 256 bits // + // BURNIKEL_ZIEGLER_THRESHOLD = 50 ints = 1600 bits + // static final int BITS_KARATSUBA = 1600; static final int BITS_TOOM_COOK = 2400; static final int BITS_KARATSUBA_SQUARE = 2880; static final int BITS_TOOM_COOK_SQUARE = 4480; static final int BITS_SCHOENHAGE_BASE = 256; + static final int BITS_BURNIKEL_ZIEGLER = 1600; static final int ORDER_SMALL = 60; static final int ORDER_MEDIUM = 100; @@ -80,14 +83,15 @@ // #bits for testing Toom-Cook squaring static final int ORDER_TOOM_COOK_SQUARE = 4600; + static final int SIZE = 1000; // numbers per batch + static Random rnd = new Random(); - static int size = 1000; // numbers per batch static boolean failure = false; public static void pow(int order) { int failCount1 = 0; - for (int i=0; i abs(v)} and {@code a > b && b > 0}, then if + * {@code w/z = q1*z + r1} and {@code u/v = q2*v + r2}, then + * {@code q1 = q2*pow(2,a-b)} and {@code r1 = r2*pow(2,b)}. The test + * ensures that {@code v} is just under the B-Z threshold and that {@code w} + * and {@code z} are both over the threshold. This implies that {@code u/v} + * uses the standard division algorithm and {@code w/z} uses the B-Z + * algorithm. The results of the two algorithms are then compared using the + * observation described in the foregoing and if they are not equal a + * failure is logged. + */ + public static void divideLarge() { + int failCount = 0; + + BigInteger base = BigInteger.ONE.shiftLeft(BITS_BURNIKEL_ZIEGLER - 33); + for (int i=0; i exts = new ArrayList<>(); for (String oid : cert.getNonCriticalExtensionOIDs()) { @@ -79,8 +70,8 @@ exts.add(new ExtensionImpl(oid, cert.getExtensionValue(oid), false)); } - prc.setOCSPExtensions(exts); - requireEquals(exts, prc.getOCSPExtensions(), "getOCSPExtensions()"); + prc.setOcspExtensions(exts); + requireEquals(exts, prc.getOcspExtensions(), "getOcspExtensions()"); Set