/*
 * Copyright (c) 2007-2010, Stephen Colebourne & Michael Nascimento Santos
 *
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *  * Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 *
 *  * Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 *
 *  * Neither the name of JSR-310 nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

Utils
- MathUtils can't be public, can't put in java.math as we require JDK5 support

Duration

Instant
- toString/parse

Time scales
- Obtain rules from TZDB rather than a file?

Date/Time classes
- factories from Calendrical...
- DayOfWeek.firstDayOfWeekFor
- DateResolver rework - takes int or MonthOfDay or calendricals
- factories taking double for seconds (LocalTime...)
- OffsetDateTime.toEpochSecs() could be private
? ZoneResolver code moved to ZDT
? InstantProvider implementations toEpochMillis()
? remove getChronology()
? getMonthOfYear() -> getMonth(), etc
? with(rule, value)
? MAX_DATE/MIN_DATE etc
? Calendrical rule for date/time as a period (for between calculations)

Rules
- ensure can merge MonthDay and Year
- test min/max year for week-based-year
- remove Chronology and share
- date time field rule serialization
? parse()
? merge -> normalize
? deriveInt for fields
? ISO era

Date/Time formatting
- merger - general processing
- merger - days overflow
- merge ISO weekyear
- parse 24:00 - maybe a special end-of-day class?
- format patterns - yyyy-MM-dd, check details and letters with CLDR
- formats LONG/MEDIUM/SHORT from better data source
- SPI for date-time text
- strict/lenient parse
? upper/lower case
- only ASCII numbers
- Arabic numbers have negative sign after number
- parseInto(Calendrical)
- default calendrical to pre-define era for example
- check compatible with RFC "Wed, 02 Apr 2008" and j.u.Date "Wed Apr 02 time zone 2008"
- isPrintDataAvailable() causes get of field value twice, can we drop method
? substitute text (replacing built in text for Months/DOW etc)

Time zones
- Promote TimeDefinition to top-level type
- don't use Local Mean Time (or anything before 1900?)
- SPI for zone names
# some zones have transitions where only the name changes - America/Resolute
# "resolvers need to use correct rules" what does this mean?
- parse/format names
- test against TZDB binary data
? get region ids by offset (JDK method)
? Drop Etc (signs reversed), Older country based IDs
# (EST, MST, HST changed in 2005r - no longer observe DST - http://java.sun.com/developer/technicalArticles/Intl/alertFurtherInfo.html)
# (MET no longer Asia/Tehran, now Middle Europe)
# http://java.sun.com/javase/tzupdater_README.html
# http://java.sun.com/javase/timezones/tzdata_versions.html
# http://java.sun.com/javase/timezones/DST_faq.html
# http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5055567 and related
# JDK TimeZone.setDefault sets an inherited thread local
# Platform specific ids - http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6534626
# Change zone info dynamically - http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4701860
# Exception on bad zone - http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4412864

Periods
- Between factories
- rename classes?
- Formatting/parsing (defer?)
- PeriodFields.of(3.25, Hours) -> [3 Hours, 15 Minutes]
- Period.toString is not output of state

Matchers/Adjusters
- DateTimeAdjuster
- weekend?
- more general next/previous
? recurrences

Calendars
- HistoricChronology
- EthiopicChronology
- more calendar systems
- Coptic year definition
- plus/minus long vs int

General
- rework Clock - remove instant()
- TimeSource get to nearest second etc. with caching?
- cache todays date
- localized day of week number
- first day of week
- get month/weekday text
- get rule by name
- get chrono by name
- serialization formats
- evaluate hash codes
- check overflows
- Use ArithmeticException everywhere
- factories/methods taking double

Possible items
- Rename DateProvider to LocalDateProvider?
- roll()
- round() - truncateToSeconds() feels weird
- iteration
- era in the hash codes
- ModJulDays rule - BigDecimal
- IntValue interface, implemented by Number/Integer
- public factory for LocalDate.fromDayOfYear(year, doy)
- Optimise LocalDateTime plus/minus times by having a local plus(int,int,int,long,sign,LocalDate) method
- intervals (defer completely?)
- HalfDays period unit for AM/PM (more accurate than 12 hours)
- InvalidDateException - better exception name?
- simplify Clock to Calendrical, merging

Document
- requirement: non JDK extensible
- null approach - nulls rejected except in isXxx() and in framework-level code
- type-safe where sensible
- many-headed problem
-- Zone - Local/Offset/Zoned
-- Precision - Y/YM/YMD/HM/HMS/HMSN/DateTime/...
-- Calendar - ISO/Julian/Coptic/...
-- FieldTypes - Y/M/D/H/M/S...
-- Periods - Y/M/D/H/M/S...
- Joda issues
-- Instant vs Partial
-- Partial with time zone
-- Not easily extensible
-- Chronology is complex
-- Date holding chronology is complex
-- Exposed long millis
- Parsing with wrong pattern letter case (month vs minute, doy vs dom) is caught

Use cases
- Day of Olympiad (roughly four year period)

===============================================================================
Not doing
- Use nanoOfDay rule in LocalTime factory - NO, as doesn't work
- toString(pattern)/parse(str, pattern) - NO, due to ease of formatter usage
- Add getAmPm() to time classes - NO, due to low use case
- Remove TimeSource replace by InstantProvider - NO, due to UTC/TAI
 