jdk/src/share/classes/java/time/format/Parsed.java
author sherman
Wed, 15 May 2013 07:48:57 -0700
changeset 17474 8c100beabcc0
parent 16852 60207b2b4b42
child 19030 32f129cb6351
permissions -rw-r--r--
8013730: JSR 310 DateTime API Updates III Summary: Integration of JSR310 Date/Time API update III Reviewed-by: naoto Contributed-by: scolebourne@joda.org, roger.riggs@oracle.com, masayoshi.okutsu@oracle.com, patrick.zhang@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
     1
/*
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
     2
 * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
     4
 *
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    10
 *
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    15
 * accompanied this code).
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    16
 *
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    20
 *
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    23
 * questions.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    24
 */
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    25
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    26
/*
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    27
 * This file is available under and governed by the GNU General Public
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    28
 * License version 2 only, as published by the Free Software Foundation.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    29
 * However, the following notice accompanied the original version of this
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    30
 * file:
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    31
 *
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    32
 * Copyright (c) 2008-2013, Stephen Colebourne & Michael Nascimento Santos
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    33
 *
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    34
 * All rights reserved.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    35
 *
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    36
 * Redistribution and use in source and binary forms, with or without
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    37
 * modification, are permitted provided that the following conditions are met:
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    38
 *
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    39
 *  * Redistributions of source code must retain the above copyright notice,
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    40
 *    this list of conditions and the following disclaimer.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    41
 *
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    42
 *  * Redistributions in binary form must reproduce the above copyright notice,
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    43
 *    this list of conditions and the following disclaimer in the documentation
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    44
 *    and/or other materials provided with the distribution.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    45
 *
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    46
 *  * Neither the name of JSR-310 nor the names of its contributors
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    47
 *    may be used to endorse or promote products derived from this software
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    48
 *    without specific prior written permission.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    49
 *
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    50
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    51
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    52
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    53
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    54
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    55
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    56
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    57
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    58
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    59
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    60
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    61
 */
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    62
package java.time.format;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    63
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    64
import static java.time.temporal.ChronoField.AMPM_OF_DAY;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    65
import static java.time.temporal.ChronoField.CLOCK_HOUR_OF_AMPM;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    66
import static java.time.temporal.ChronoField.CLOCK_HOUR_OF_DAY;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    67
import static java.time.temporal.ChronoField.HOUR_OF_AMPM;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    68
import static java.time.temporal.ChronoField.HOUR_OF_DAY;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    69
import static java.time.temporal.ChronoField.MICRO_OF_DAY;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    70
import static java.time.temporal.ChronoField.MICRO_OF_SECOND;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    71
import static java.time.temporal.ChronoField.MILLI_OF_DAY;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    72
import static java.time.temporal.ChronoField.MILLI_OF_SECOND;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    73
import static java.time.temporal.ChronoField.MINUTE_OF_DAY;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    74
import static java.time.temporal.ChronoField.MINUTE_OF_HOUR;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    75
import static java.time.temporal.ChronoField.NANO_OF_DAY;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    76
import static java.time.temporal.ChronoField.NANO_OF_SECOND;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    77
import static java.time.temporal.ChronoField.SECOND_OF_DAY;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    78
import static java.time.temporal.ChronoField.SECOND_OF_MINUTE;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    79
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    80
import java.time.DateTimeException;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    81
import java.time.LocalDate;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    82
import java.time.LocalTime;
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
    83
import java.time.Period;
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    84
import java.time.ZoneId;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    85
import java.time.chrono.ChronoLocalDate;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    86
import java.time.chrono.Chronology;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    87
import java.time.temporal.ChronoField;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    88
import java.time.temporal.TemporalAccessor;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    89
import java.time.temporal.TemporalField;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    90
import java.time.temporal.TemporalQuery;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    91
import java.time.temporal.UnsupportedTemporalTypeException;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    92
import java.util.HashMap;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    93
import java.util.Iterator;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    94
import java.util.Map;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    95
import java.util.Map.Entry;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    96
import java.util.Objects;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    97
import java.util.Set;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    98
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
    99
/**
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   100
 * A store of parsed data.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   101
 * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   102
 * This class is used during parsing to collect the data. Part of the parsing process
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   103
 * involves handling optional blocks and multiple copies of the data get created to
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   104
 * support the necessary backtracking.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   105
 * <p>
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   106
 * Once parsing is completed, this class can be used as the resultant {@code TemporalAccessor}.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   107
 * In most cases, it is only exposed once the fields have been resolved.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   108
 *
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   109
 * @implSpec
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   110
 * This class is a mutable context intended for use from a single thread.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   111
 * Usage of the class is thread-safe within standard parsing as a new instance of this class
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   112
 * is automatically created for each parse and parsing is single-threaded
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   113
 *
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   114
 * @since 1.8
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   115
 */
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   116
final class Parsed implements TemporalAccessor {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   117
    // some fields are accessed using package scope from DateTimeParseContext
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   118
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   119
    /**
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   120
     * The parsed fields.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   121
     */
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   122
    final Map<TemporalField, Long> fieldValues = new HashMap<>();
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   123
    /**
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   124
     * The parsed zone.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   125
     */
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   126
    ZoneId zone;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   127
    /**
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   128
     * The parsed chronology.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   129
     */
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   130
    Chronology chrono;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   131
    /**
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   132
     * Whether a leap-second is parsed.
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   133
     */
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   134
    boolean leapSecond;
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   135
    /**
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   136
     * The effective chronology.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   137
     */
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   138
    Chronology effectiveChrono;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   139
    /**
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   140
     * The resolver style to use.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   141
     */
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   142
    private ResolverStyle resolverStyle;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   143
    /**
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   144
     * The resolved date.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   145
     */
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   146
    private ChronoLocalDate<?> date;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   147
    /**
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   148
     * The resolved time.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   149
     */
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   150
    private LocalTime time;
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   151
    /**
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   152
     * The excess period from time-only parsing.
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   153
     */
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   154
    Period excessDays = Period.ZERO;
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   155
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   156
    /**
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   157
     * Creates an instance.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   158
     */
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   159
    Parsed() {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   160
    }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   161
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   162
    /**
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   163
     * Creates a copy.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   164
     */
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   165
    Parsed copy() {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   166
        // only copy fields used in parsing stage
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   167
        Parsed cloned = new Parsed();
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   168
        cloned.fieldValues.putAll(this.fieldValues);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   169
        cloned.zone = this.zone;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   170
        cloned.chrono = this.chrono;
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   171
        cloned.leapSecond = this.leapSecond;
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   172
        return cloned;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   173
    }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   174
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   175
    //-----------------------------------------------------------------------
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   176
    @Override
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   177
    public boolean isSupported(TemporalField field) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   178
        if (fieldValues.containsKey(field) ||
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   179
                (date != null && date.isSupported(field)) ||
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   180
                (time != null && time.isSupported(field))) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   181
            return true;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   182
        }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   183
        return field != null && (field instanceof ChronoField == false) && field.isSupportedBy(this);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   184
    }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   185
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   186
    @Override
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   187
    public long getLong(TemporalField field) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   188
        Objects.requireNonNull(field, "field");
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   189
        Long value = fieldValues.get(field);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   190
        if (value != null) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   191
            return value;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   192
        }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   193
        if (date != null && date.isSupported(field)) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   194
            return date.getLong(field);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   195
        }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   196
        if (time != null && time.isSupported(field)) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   197
            return time.getLong(field);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   198
        }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   199
        if (field instanceof ChronoField) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   200
            throw new UnsupportedTemporalTypeException("Unsupported field: " + field.getName());
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   201
        }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   202
        return field.getFrom(this);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   203
    }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   204
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   205
    @SuppressWarnings("unchecked")
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   206
    @Override
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   207
    public <R> R query(TemporalQuery<R> query) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   208
        if (query == TemporalQuery.zoneId()) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   209
            return (R) zone;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   210
        } else if (query == TemporalQuery.chronology()) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   211
            return (R) chrono;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   212
        } else if (query == TemporalQuery.localDate()) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   213
            return (R) (date != null ? LocalDate.from(date) : null);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   214
        } else if (query == TemporalQuery.localTime()) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   215
            return (R) time;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   216
        } else if (query == TemporalQuery.zone() || query == TemporalQuery.offset()) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   217
            return query.queryFrom(this);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   218
        } else if (query == TemporalQuery.precision()) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   219
            return null;  // not a complete date/time
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   220
        }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   221
        // inline TemporalAccessor.super.query(query) as an optimization
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   222
        // non-JDK classes are not permitted to make this optimization
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   223
        return query.queryFrom(this);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   224
    }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   225
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   226
    //-----------------------------------------------------------------------
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   227
    /**
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   228
     * Resolves the fields in this context.
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   229
     *
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   230
     * @param resolverStyle  the resolver style, not null
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   231
     * @param resolverFields  the fields to use for resolving, null for all fields
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   232
     * @return this, for method chaining
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   233
     * @throws DateTimeException if resolving one field results in a value for
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   234
     *  another field that is in conflict
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   235
     */
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   236
    TemporalAccessor resolve(ResolverStyle resolverStyle, Set<TemporalField> resolverFields) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   237
        if (resolverFields != null) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   238
            fieldValues.keySet().retainAll(resolverFields);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   239
        }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   240
        this.resolverStyle = resolverStyle;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   241
        chrono = effectiveChrono;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   242
        resolveFields();
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   243
        resolveTimeLenient();
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   244
        crossCheck();
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   245
        resolvePeriod();
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   246
        return this;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   247
    }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   248
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   249
    //-----------------------------------------------------------------------
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   250
    private void resolveFields() {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   251
        // resolve ChronoField
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   252
        resolveDateFields();
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   253
        resolveTimeFields();
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   254
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   255
        // if any other fields, handle them
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   256
        // any lenient date resolution should return epoch-day
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   257
        if (fieldValues.size() > 0) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   258
            boolean changed = false;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   259
            outer:
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   260
            while (true) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   261
                for (Map.Entry<TemporalField, Long> entry : fieldValues.entrySet()) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   262
                    TemporalField targetField = entry.getKey();
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   263
                    Map<TemporalField, Long> changes = targetField.resolve(this, entry.getValue(), resolverStyle);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   264
                    if (changes != null) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   265
                        changed = true;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   266
                        resolveFieldsMakeChanges(targetField, changes);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   267
                        fieldValues.remove(targetField);  // helps avoid infinite loops
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   268
                        continue outer;  // have to restart to avoid concurrent modification
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   269
                    }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   270
                }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   271
                break;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   272
            }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   273
            // if something changed then have to redo ChronoField resolve
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   274
            if (changed) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   275
                resolveDateFields();
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   276
                resolveTimeFields();
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   277
            }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   278
        }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   279
    }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   280
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   281
    private void resolveFieldsMakeChanges(TemporalField targetField, Map<TemporalField, Long> changes) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   282
        for (Map.Entry<TemporalField, Long> change : changes.entrySet()) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   283
            TemporalField changeField = change.getKey();
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   284
            Long changeValue = change.getValue();
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   285
            Objects.requireNonNull(changeField, "changeField");
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   286
            if (changeValue != null) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   287
                updateCheckConflict(targetField, changeField, changeValue);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   288
            } else {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   289
                fieldValues.remove(changeField);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   290
            }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   291
        }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   292
    }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   293
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   294
    private void updateCheckConflict(TemporalField targetField, TemporalField changeField, Long changeValue) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   295
        Long old = fieldValues.put(changeField, changeValue);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   296
        if (old != null && old.longValue() != changeValue.longValue()) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   297
            throw new DateTimeException("Conflict found: " + changeField + " " + old +
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   298
                    " differs from " + changeField + " " + changeValue +
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   299
                    " while resolving  " + targetField);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   300
        }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   301
    }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   302
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   303
    //-----------------------------------------------------------------------
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   304
    private void resolveDateFields() {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   305
        updateCheckConflict(chrono.resolveDate(fieldValues, resolverStyle));
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   306
    }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   307
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   308
    private void updateCheckConflict(ChronoLocalDate<?> cld) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   309
        if (date != null) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   310
            if (cld != null && date.equals(cld) == false) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   311
                throw new DateTimeException("Conflict found: Fields resolved to two different dates: " + date + " " + cld);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   312
            }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   313
        } else {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   314
            date = cld;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   315
        }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   316
    }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   317
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   318
    //-----------------------------------------------------------------------
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   319
    private void resolveTimeFields() {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   320
        // simplify fields
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   321
        if (fieldValues.containsKey(CLOCK_HOUR_OF_DAY)) {
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   322
            // lenient allows anything, smart allows 0-24, strict allows 1-24
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   323
            long ch = fieldValues.remove(CLOCK_HOUR_OF_DAY);
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   324
            if (resolverStyle == ResolverStyle.STRICT || (resolverStyle == ResolverStyle.SMART && ch != 0)) {
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   325
                CLOCK_HOUR_OF_DAY.checkValidValue(ch);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   326
            }
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   327
            updateCheckConflict(CLOCK_HOUR_OF_DAY, HOUR_OF_DAY, ch == 24 ? 0 : ch);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   328
        }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   329
        if (fieldValues.containsKey(CLOCK_HOUR_OF_AMPM)) {
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   330
            // lenient allows anything, smart allows 0-12, strict allows 1-12
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   331
            long ch = fieldValues.remove(CLOCK_HOUR_OF_AMPM);
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   332
            if (resolverStyle == ResolverStyle.STRICT || (resolverStyle == ResolverStyle.SMART && ch != 0)) {
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   333
                CLOCK_HOUR_OF_AMPM.checkValidValue(ch);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   334
            }
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   335
            updateCheckConflict(CLOCK_HOUR_OF_AMPM, HOUR_OF_AMPM, ch == 12 ? 0 : ch);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   336
        }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   337
        if (fieldValues.containsKey(AMPM_OF_DAY) && fieldValues.containsKey(HOUR_OF_AMPM)) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   338
            long ap = fieldValues.remove(AMPM_OF_DAY);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   339
            long hap = fieldValues.remove(HOUR_OF_AMPM);
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   340
            if (resolverStyle == ResolverStyle.LENIENT) {
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   341
                updateCheckConflict(AMPM_OF_DAY, HOUR_OF_DAY, Math.addExact(Math.multiplyExact(ap, 12), hap));
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   342
            } else {  // STRICT or SMART
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   343
                AMPM_OF_DAY.checkValidValue(ap);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   344
                HOUR_OF_AMPM.checkValidValue(ap);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   345
                updateCheckConflict(AMPM_OF_DAY, HOUR_OF_DAY, ap * 12 + hap);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   346
            }
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   347
        }
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   348
        if (fieldValues.containsKey(NANO_OF_DAY)) {
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   349
            long nod = fieldValues.remove(NANO_OF_DAY);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   350
            if (resolverStyle != ResolverStyle.LENIENT) {
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   351
                NANO_OF_DAY.checkValidValue(nod);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   352
            }
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   353
            updateCheckConflict(NANO_OF_DAY, HOUR_OF_DAY, nod / 3600_000_000_000L);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   354
            updateCheckConflict(NANO_OF_DAY, MINUTE_OF_HOUR, (nod / 60_000_000_000L) % 60);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   355
            updateCheckConflict(NANO_OF_DAY, SECOND_OF_MINUTE, (nod / 1_000_000_000L) % 60);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   356
            updateCheckConflict(NANO_OF_DAY, NANO_OF_SECOND, nod % 1_000_000_000L);
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   357
        }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   358
        if (fieldValues.containsKey(MICRO_OF_DAY)) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   359
            long cod = fieldValues.remove(MICRO_OF_DAY);
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   360
            if (resolverStyle != ResolverStyle.LENIENT) {
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   361
                MICRO_OF_DAY.checkValidValue(cod);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   362
            }
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   363
            updateCheckConflict(MICRO_OF_DAY, SECOND_OF_DAY, cod / 1_000_000L);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   364
            updateCheckConflict(MICRO_OF_DAY, MICRO_OF_SECOND, cod % 1_000_000L);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   365
        }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   366
        if (fieldValues.containsKey(MILLI_OF_DAY)) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   367
            long lod = fieldValues.remove(MILLI_OF_DAY);
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   368
            if (resolverStyle != ResolverStyle.LENIENT) {
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   369
                MILLI_OF_DAY.checkValidValue(lod);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   370
            }
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   371
            updateCheckConflict(MILLI_OF_DAY, SECOND_OF_DAY, lod / 1_000);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   372
            updateCheckConflict(MILLI_OF_DAY, MILLI_OF_SECOND, lod % 1_000);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   373
        }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   374
        if (fieldValues.containsKey(SECOND_OF_DAY)) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   375
            long sod = fieldValues.remove(SECOND_OF_DAY);
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   376
            if (resolverStyle != ResolverStyle.LENIENT) {
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   377
                SECOND_OF_DAY.checkValidValue(sod);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   378
            }
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   379
            updateCheckConflict(SECOND_OF_DAY, HOUR_OF_DAY, sod / 3600);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   380
            updateCheckConflict(SECOND_OF_DAY, MINUTE_OF_HOUR, (sod / 60) % 60);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   381
            updateCheckConflict(SECOND_OF_DAY, SECOND_OF_MINUTE, sod % 60);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   382
        }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   383
        if (fieldValues.containsKey(MINUTE_OF_DAY)) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   384
            long mod = fieldValues.remove(MINUTE_OF_DAY);
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   385
            if (resolverStyle != ResolverStyle.LENIENT) {
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   386
                MINUTE_OF_DAY.checkValidValue(mod);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   387
            }
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   388
            updateCheckConflict(MINUTE_OF_DAY, HOUR_OF_DAY, mod / 60);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   389
            updateCheckConflict(MINUTE_OF_DAY, MINUTE_OF_HOUR, mod % 60);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   390
        }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   391
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   392
        // combine partial second fields strictly, leaving lenient expansion to later
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   393
        if (fieldValues.containsKey(NANO_OF_SECOND)) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   394
            long nos = fieldValues.get(NANO_OF_SECOND);
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   395
            if (resolverStyle != ResolverStyle.LENIENT) {
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   396
                NANO_OF_SECOND.checkValidValue(nos);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   397
            }
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   398
            if (fieldValues.containsKey(MICRO_OF_SECOND)) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   399
                long cos = fieldValues.remove(MICRO_OF_SECOND);
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   400
                if (resolverStyle != ResolverStyle.LENIENT) {
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   401
                    MICRO_OF_SECOND.checkValidValue(cos);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   402
                }
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   403
                nos = cos * 1000 + (nos % 1000);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   404
                updateCheckConflict(MICRO_OF_SECOND, NANO_OF_SECOND, nos);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   405
            }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   406
            if (fieldValues.containsKey(MILLI_OF_SECOND)) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   407
                long los = fieldValues.remove(MILLI_OF_SECOND);
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   408
                if (resolverStyle != ResolverStyle.LENIENT) {
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   409
                    MILLI_OF_SECOND.checkValidValue(los);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   410
                }
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   411
                updateCheckConflict(MILLI_OF_SECOND, NANO_OF_SECOND, los * 1_000_000L + (nos % 1_000_000L));
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   412
            }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   413
        }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   414
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   415
        // convert to time if all four fields available (optimization)
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   416
        if (fieldValues.containsKey(HOUR_OF_DAY) && fieldValues.containsKey(MINUTE_OF_HOUR) &&
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   417
                fieldValues.containsKey(SECOND_OF_MINUTE) && fieldValues.containsKey(NANO_OF_SECOND)) {
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   418
            long hod = fieldValues.remove(HOUR_OF_DAY);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   419
            long moh = fieldValues.remove(MINUTE_OF_HOUR);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   420
            long som = fieldValues.remove(SECOND_OF_MINUTE);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   421
            long nos = fieldValues.remove(NANO_OF_SECOND);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   422
            resolveTime(hod, moh, som, nos);
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   423
        }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   424
    }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   425
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   426
    private void resolveTimeLenient() {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   427
        // leniently create a time from incomplete information
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   428
        // done after everything else as it creates information from nothing
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   429
        // which would break updateCheckConflict(field)
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   430
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   431
        if (time == null) {
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   432
            // NANO_OF_SECOND merged with MILLI/MICRO above
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   433
            if (fieldValues.containsKey(MILLI_OF_SECOND)) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   434
                long los = fieldValues.remove(MILLI_OF_SECOND);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   435
                if (fieldValues.containsKey(MICRO_OF_SECOND)) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   436
                    // merge milli-of-second and micro-of-second for better error message
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   437
                    long cos = los * 1_000 + (fieldValues.get(MICRO_OF_SECOND) % 1_000);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   438
                    updateCheckConflict(MILLI_OF_SECOND, MICRO_OF_SECOND, cos);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   439
                    fieldValues.remove(MICRO_OF_SECOND);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   440
                    fieldValues.put(NANO_OF_SECOND, cos * 1_000L);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   441
                } else {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   442
                    // convert milli-of-second to nano-of-second
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   443
                    fieldValues.put(NANO_OF_SECOND, los * 1_000_000L);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   444
                }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   445
            } else if (fieldValues.containsKey(MICRO_OF_SECOND)) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   446
                // convert micro-of-second to nano-of-second
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   447
                long cos = fieldValues.remove(MICRO_OF_SECOND);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   448
                fieldValues.put(NANO_OF_SECOND, cos * 1_000L);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   449
            }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   450
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   451
            // merge hour/minute/second/nano leniently
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   452
            Long hod = fieldValues.get(HOUR_OF_DAY);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   453
            if (hod != null) {
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   454
                Long moh = fieldValues.get(MINUTE_OF_HOUR);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   455
                Long som = fieldValues.get(SECOND_OF_MINUTE);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   456
                Long nos = fieldValues.get(NANO_OF_SECOND);
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   457
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   458
                // check for invalid combinations that cannot be defaulted
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   459
                if ((moh == null && (som != null || nos != null)) ||
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   460
                        (moh != null && som == null && nos != null)) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   461
                    return;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   462
                }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   463
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   464
                // default as necessary and build time
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   465
                long mohVal = (moh != null ? moh : 0);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   466
                long somVal = (som != null ? som : 0);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   467
                long nosVal = (nos != null ? nos : 0);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   468
                resolveTime(hod, mohVal, somVal, nosVal);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   469
                fieldValues.remove(HOUR_OF_DAY);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   470
                fieldValues.remove(MINUTE_OF_HOUR);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   471
                fieldValues.remove(SECOND_OF_MINUTE);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   472
                fieldValues.remove(NANO_OF_SECOND);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   473
            }
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   474
        }
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   475
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   476
        // validate remaining
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   477
        if (resolverStyle != ResolverStyle.LENIENT && fieldValues.size() > 0) {
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   478
            for (Entry<TemporalField, Long> entry : fieldValues.entrySet()) {
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   479
                TemporalField field = entry.getKey();
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   480
                if (field instanceof ChronoField && field.isTimeBased()) {
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   481
                    ((ChronoField) field).checkValidValue(entry.getValue());
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   482
                }
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   483
            }
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   484
        }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   485
    }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   486
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   487
    private void resolveTime(long hod, long moh, long som, long nos) {
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   488
        if (resolverStyle == ResolverStyle.LENIENT) {
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   489
            long totalNanos = Math.multiplyExact(hod, 3600_000_000_000L);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   490
            totalNanos = Math.addExact(totalNanos, Math.multiplyExact(moh, 60_000_000_000L));
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   491
            totalNanos = Math.addExact(totalNanos, Math.multiplyExact(som, 1_000_000_000L));
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   492
            totalNanos = Math.addExact(totalNanos, nos);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   493
            int excessDays = (int) Math.floorDiv(totalNanos, 86400_000_000_000L);  // safe int cast
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   494
            long nod = Math.floorMod(totalNanos, 86400_000_000_000L);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   495
            updateCheckConflict(LocalTime.ofNanoOfDay(nod), Period.ofDays(excessDays));
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   496
        } else {  // STRICT or SMART
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   497
            int mohVal = MINUTE_OF_HOUR.checkValidIntValue(moh);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   498
            int nosVal = NANO_OF_SECOND.checkValidIntValue(nos);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   499
            // handle 24:00 end of day
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   500
            if (resolverStyle == ResolverStyle.SMART && hod == 24 && mohVal == 0 && som == 0 && nosVal == 0) {
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   501
                updateCheckConflict(LocalTime.MIDNIGHT, Period.ofDays(1));
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   502
            } else {
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   503
                int hodVal = HOUR_OF_DAY.checkValidIntValue(hod);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   504
                int somVal = SECOND_OF_MINUTE.checkValidIntValue(som);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   505
                updateCheckConflict(LocalTime.of(hodVal, mohVal, somVal, nosVal), Period.ZERO);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   506
            }
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   507
        }
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   508
    }
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   509
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   510
    private void resolvePeriod() {
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   511
        // add whole days if we have both date and time
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   512
        if (date != null && time != null && excessDays.isZero() == false) {
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   513
            date = date.plus(excessDays);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   514
            excessDays = Period.ZERO;
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   515
        }
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   516
    }
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   517
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   518
    private void updateCheckConflict(LocalTime timeToSet, Period periodToSet) {
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   519
        if (time != null) {
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   520
            if (time.equals(timeToSet) == false) {
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   521
                throw new DateTimeException("Conflict found: Fields resolved to different times: " + time + " " + timeToSet);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   522
            }
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   523
            if (excessDays.isZero() == false && periodToSet.isZero() == false && excessDays.equals(periodToSet) == false) {
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   524
                throw new DateTimeException("Conflict found: Fields resolved to different excess periods: " + excessDays + " " + periodToSet);
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   525
            } else {
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   526
                excessDays = periodToSet;
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   527
            }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   528
        } else {
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   529
            time = timeToSet;
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   530
            excessDays = periodToSet;
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   531
        }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   532
    }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   533
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   534
    //-----------------------------------------------------------------------
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   535
    private void crossCheck() {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   536
        // only cross-check date, time and date-time
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   537
        // avoid object creation if possible
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   538
        if (date != null) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   539
            crossCheck(date);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   540
        }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   541
        if (time != null) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   542
            crossCheck(time);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   543
            if (date != null && fieldValues.size() > 0) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   544
                crossCheck(date.atTime(time));
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   545
            }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   546
        }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   547
    }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   548
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   549
    private void crossCheck(TemporalAccessor target) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   550
        for (Iterator<Entry<TemporalField, Long>> it = fieldValues.entrySet().iterator(); it.hasNext(); ) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   551
            Entry<TemporalField, Long> entry = it.next();
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   552
            TemporalField field = entry.getKey();
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   553
            long val1;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   554
            try {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   555
                val1 = target.getLong(field);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   556
            } catch (RuntimeException ex) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   557
                continue;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   558
            }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   559
            long val2 = entry.getValue();
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   560
            if (val1 != val2) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   561
                throw new DateTimeException("Conflict found: Field " + field + " " + val1 +
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   562
                        " differs from " + field + " " + val2 + " derived from " + target);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   563
            }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   564
            it.remove();
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   565
        }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   566
    }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   567
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   568
    //-----------------------------------------------------------------------
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   569
    @Override
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   570
    public String toString() {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   571
        String str = fieldValues.toString() + "," + chrono + "," + zone;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   572
        if (date != null || time != null) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   573
            str += " resolved to " + date + "," + time;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   574
        }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   575
        return str;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   576
    }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   577
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents:
diff changeset
   578
}