# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

This is the developlment branch for Jira issue FREEMARKER-35, java.time support.

The most likely working way of contribing is just finding bugs in what we have, and provide tests for
them! There can be a lot of edge cases (or use cases) that we missed, as date/time is a complicated topic.

For those who are willing to invest a lot of enregy, and are experienced developers, see the TODO list!
But please discuss it on the dev list before invest your time into anything there.


CHANGE LOG
----------

I.e., what already works:

- New template model type: TemplateTemporalModel, to wrap all the java.time.temporal.Temporal subtypes
  (hence not Duration, and Period).
- DefaultObjectWrapper (and BeansWrapper): Added temporalSupport. By default true from IcI 2.3.33.
- The date_format, time_format, and datetime_format settings "just works" for TemplateTemporalModel.
  We mimic the behavior of the traditional pre-java.time formatters for Temporal-s; both formatting, and parsing.
- New settings: year_format, year_month_format, custom_temporal_formats
- Improved global caching for TemplateNumberFormat-s, TemplateDateFormat-s as well.

TODO
----

These are notes about what's left from this FREEMARKER-35. Some entries has possibly become obsolete over time,
and we just didn't get to them again since then to realize that. Also, some entries are just ideas, or rough
plans, so this is not a strict spefication.

- Add BI-s:
  - ?instant, ?localDate, ?localTime, ?localDateTime, ?offsetTime, ?offsetDateTime, ?zonedDateTime.
    - Converts both from j.u.Date, and from String. 
    - Use MissingTimeZoneParserPolicy.ASSUME_CURRENT_TIME_ZONE, so that format->parse->format gives initial value back.
    - ?offsetTime should fail if it had to convert to the current time zone.
  - ?unambiguousOffsetDateTime, ?unambiguousZonedDateTime: Use MissingTimeZoneParserPolicy.FAIL.
    Note: We don't need ?unambiguousOffsetTime, as ?offsetTime is already like that.
  - ?offsetOrLocalDateTime, ?zonedOrLocalDateTime, ?offsetOrLocalTime: Use MissingTimeZoneParserPolicy.FALL_BACK_TO_LOCAL_TEMPORAL
- Existing date/time BI-s, must work for j.t.Temporals as well:
  - Casting:
    - ?datetime, ?date, ?time should work if LHO is TemplateTemporalModel, and convert to the appropriate Temporal.
      This is consistent with the new ?isDatetime, etc.
      But, there's the assymetry that when converting from String, these will always create TDM instead of TTM.
    - ${someDateTimeTemporal?datetime} worked before if the datetimeFormat was "iso", because someDateTimeTemporal was coerced to plain text via Object.toString(), and then parsed by ?datetime.
      But for a TTM we should work with the Temporal value instead.
  - ?is${Type}: ?isDatetime etc. should be true for TTM with appropriate Temporal type. (Beware with is_date VS is_date_only.)
    - Add isLocalDateTime, etc.
    - Add ?isJava{Util,Time}Based{Date,Datetime,Time,Temporal}
  - Anything else? Won't be BC to do after release if we miss something!
- isTimeZoneBound(): Can it return false for local temporals?
- Tests for parsing epoch millies
- ISO/XS parsing:
  - Add missing parsing tests
  - XS -1 vs ISO year 0? Though it should only matter with Instance, and there we already have the Juilan issue.
  - ISO-like format parameters (like "iso u"). Note that "u" should influences what GUESS_TIME_ZONE_IF_MISSING does.
    - nz: non-locals must be converted to the current time zone
    - fz, fu: Assume the locale is in the current or UTC time zone. Document warning for where!
  - Second can be 60 at leap seconds
- Do DateTimeFormatter.ofLocalizedXxx also need DateTimeFormatter tweaks (decimal symbols, etc.)?
- Check if we have test for "" pattern; must be same as "medium"
- Implement extended syntax (always enabled):
  - Start with "v<1|2>:" Because "v" is illegal in standard patterns, it's BC.
  - "...;for<Type>=<pattern>": Because "f" is illegal in standard patterns, it's BC.
  - Error if: ";" WS* Identifier, and Identifier contains any letter not defined by the standard formatters as of today.
  - v2 should ban Y, unless ";enableWeekYear" is present
- Custom formats for Date-s and Temporal-s are now overlapping on the format setting level; test behavior
- ?c should show toString format. We also need to do that with traditional dates.
- Add AliasTemporalDateFormatFactory, similar to AliasTemplateDateFormatFactory
- Test: Pure BeansWrapper TemporalModel
- Test: Method calls, and overloaded method calls
- Should ?api be suppoted by default Temporal wrapping? Then, maybe we need a DefaultTemporalAdapter instead of SimpleTemporal.
- Comparisions (and ?sort)
- Add temporal?with_time_zone(string). Refer to it in error messgages where the zone filed is missed.
- Support this on date and temporal format settings: "<somepattern>; time_zone=<zoneID>|.time_zone"
  If we have no time for it, still have to reserve ; for this purpose!
  Note: Needs ICI for old date formats. Needs to support ';' and 'Joe''s house'. Will likely add others formatter paramters later, like "locale".
- Check these:
  - Parsing:
    - Use smart mode (not lenient mode)!
    - Don't forget to set parsing to case insensitive.
  - xs and iso parameters must start with space or '_'
  - No TODO [FREEMARKER-35] was left
  - DateTimeFormatter from v2 pattern uses:
              builder
                  .parseCaseInsensitive() // Must be before pattern(s) appended!
                  .appendPattern(pattern)
                  .toFormat(locale)
                  .withDecimalStyle(DecimalStyle.of(locale))
                  .withChronology(Chronology.ofLocale(locale));
  - Why is the "à" before the time part missing for string.full?
    <#-- Java 8 JDK-8085887 workaround test (it was, but we are running on Java 16): -->
    <@assertEquals expected="5 avril 2003 à 06:07:08" actual=localDateTime?string.long />
    <@assertEquals expected="samedi 5 avril 2003 06:07:08" actual=localDateTime?string.full />
- _TemporalUtils: Setting related utils should be moved to the published class where we also already expose published API to return the valid setting names.
- Manual (i.e., documentation):
  - Update based on the "Change log" above
  - Add table of Java 8 format style examples
