public static void provideJSR310TypeCoercions()

in commons/src/main/java/org/apache/tapestry5/commons/internal/BasicTypeCoercions.java [350:475]


    public static void provideJSR310TypeCoercions(
            MappedConfiguration<CoercionTuple.Key, CoercionTuple> configuration)
    {
        {
            add(configuration, Year.class, Integer.class, Year::getValue);
            add(configuration, Integer.class, Year.class, Year::of);
        }

        {
            add(configuration, Month.class, Integer.class, Month::getValue);
            add(configuration, Integer.class, Month.class, Month::of);

            add(configuration, String.class, Month.class, StringToEnumCoercion.create(Month.class));
        }

        {
            add(configuration, String.class, YearMonth.class, YearMonth::parse);

            add(configuration, YearMonth.class, Year.class, input -> Year.of(input.getYear()));
            add(configuration, YearMonth.class, Month.class, YearMonth::getMonth);
        }

        {
            add(configuration, String.class, MonthDay.class, MonthDay::parse);

            add(configuration, MonthDay.class, Month.class, MonthDay::getMonth);
        }

        {
            add(configuration, DayOfWeek.class, Integer.class, DayOfWeek::getValue);
            add(configuration, Integer.class, DayOfWeek.class, DayOfWeek::of);

            add(configuration, String.class, DayOfWeek.class,
                    StringToEnumCoercion.create(DayOfWeek.class));
        }

        {
            add(configuration, LocalDate.class, Instant.class, input -> {
                return input.atStartOfDay(ZoneId.systemDefault()).toInstant();
            });
            add(configuration, Instant.class, LocalDate.class, input -> {
                return input.atZone(ZoneId.systemDefault()).toLocalDate();
            });

            add(configuration, String.class, LocalDate.class, LocalDate::parse);

            add(configuration, LocalDate.class, YearMonth.class, input -> {
                return YearMonth.of(input.getYear(), input.getMonth());
            });

            add(configuration, LocalDate.class, MonthDay.class, input -> {
                return MonthDay.of(input.getMonth(), input.getDayOfMonth());
            });
        }

        {
            add(configuration, LocalTime.class, Long.class, LocalTime::toNanoOfDay);
            add(configuration, Long.class, LocalTime.class, LocalTime::ofNanoOfDay);

            add(configuration, String.class, LocalTime.class, LocalTime::parse);
        }

        {
            add(configuration, String.class, LocalDateTime.class, LocalDateTime::parse);

            add(configuration, LocalDateTime.class, Instant.class, input -> {
                return input.atZone(ZoneId.systemDefault()).toInstant();
            });
            add(configuration, Instant.class, LocalDateTime.class, input -> {
                return LocalDateTime.ofInstant(input, ZoneId.systemDefault());
            });

            add(configuration, LocalDateTime.class, LocalDate.class, LocalDateTime::toLocalDate);
        }

        {
            add(configuration, String.class, OffsetDateTime.class, OffsetDateTime::parse);

            add(configuration, OffsetDateTime.class, Instant.class, OffsetDateTime::toInstant);

            add(configuration, OffsetDateTime.class, OffsetTime.class,
                    OffsetDateTime::toOffsetTime);
        }

        {
            add(configuration, String.class, ZoneId.class, ZoneId::of);
        }

        {
            add(configuration, String.class, ZoneOffset.class, ZoneOffset::of);
        }

        {
            add(configuration, String.class, ZonedDateTime.class, ZonedDateTime::parse);

            add(configuration, ZonedDateTime.class, Instant.class, ZonedDateTime::toInstant);

            add(configuration, ZonedDateTime.class, ZoneId.class, ZonedDateTime::getZone);
        }

        {
            add(configuration, Instant.class, Long.class, Instant::toEpochMilli);
            add(configuration, Long.class, Instant.class, Instant::ofEpochMilli);

            add(configuration, Instant.class, Date.class, Date::from);
            add(configuration, Date.class, Instant.class, Date::toInstant);
        }

        {
            add(configuration, Duration.class, Long.class, Duration::toNanos);
            add(configuration, Long.class, Duration.class, Duration::ofNanos);
            add(configuration, Duration.class, TimeInterval.class, input -> {
                // Duration.toMillis() is Java 9+, so we need to do it ourselves
                long millisFromSeconds = input.getSeconds() * 1_000L;
                long millisFromNanos = input.getNano() / 1_000_000L;
                return new TimeInterval(millisFromSeconds + millisFromNanos);
            });
            add(configuration, TimeInterval.class, Duration.class, input -> {
                return Duration.ofMillis(input.milliseconds());
            });
        }

        {
            add(configuration, String.class, Period.class, Period::parse);
        }
    }