1320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson/*
2320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * Licensed to the Apache Software Foundation (ASF) under one or more
3320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * contributor license agreements.  See the NOTICE file distributed with
4320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * this work for additional information regarding copyright ownership.
5320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * The ASF licenses this file to You under the Apache License, Version 2.0
6320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * (the "License"); you may not use this file except in compliance with
7320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * the License.  You may obtain a copy of the License at
8320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson *
9320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson *     http://www.apache.org/licenses/LICENSE-2.0
10320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson *
11320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * Unless required by applicable law or agreed to in writing, software
12320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
13320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * See the License for the specific language governing permissions and
15320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * limitations under the License.
16320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson */
17320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
18320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson//$Id: DatatypeFactory.java 884950 2009-11-27 18:46:18Z mrglavas $
19320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
20320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilsonpackage javax.xml.datatype;
21320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
22320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilsonimport java.math.BigDecimal;
237365de1056414750d0a7d1fdd26025fd247f0d04Jesse Wilsonimport java.math.BigInteger;
24320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilsonimport java.util.GregorianCalendar;
25320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
26320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson/**
27320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * <p>Factory that creates new <code>javax.xml.datatype</code> <code>Object</code>s that map XML to/from Java <code>Object</code>s.</p>
28f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
29320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * <p id="DatatypeFactory.newInstance">{@link #newInstance()} is used to create a new <code>DatatypeFactory</code>.
30320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * The following implementation resolution mechanisms are used in the following order:</p>
31320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * <ol>
32320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson *    <li>
33320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson *      If the system property specified by {@link #DATATYPEFACTORY_PROPERTY}, "<code>javax.xml.datatype.DatatypeFactory</code>",
34320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson *      exists, a class with the name of the property's value is instantiated.
35320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson *      Any Exception thrown during the instantiation process is wrapped as a {@link DatatypeConfigurationException}.
36320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson *    </li>
37320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson *    <li>
38320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson *      If the file ${JAVA_HOME}/lib/jaxp.properties exists, it is loaded in a {@link java.util.Properties} <code>Object</code>.
39320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson *      The <code>Properties</code> <code>Object </code> is then queried for the property as documented in the prior step
40320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson *      and processed as documented in the prior step.
41320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson *    </li>
42320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson *    <li>
43320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson *      The services resolution mechanism is used, e.g. <code>META-INF/services/java.xml.datatype.DatatypeFactory</code>.
44320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson *      Any Exception thrown during the instantiation process is wrapped as a {@link DatatypeConfigurationException}.
45320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson *    </li>
46320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson *    <li>
47320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson *      The final mechanism is to attempt to instantiate the <code>Class</code> specified by
48320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson *      {@link #DATATYPEFACTORY_IMPLEMENTATION_CLASS}, "<code>javax.xml.datatype.DatatypeFactoryImpl</code>".
49320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson *      Any Exception thrown during the instantiation process is wrapped as a {@link DatatypeConfigurationException}.
50320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson *    </li>
51f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * </ol>
52f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
534300005e7333feb0f21d8b991d5e639e2da68500Elliott Hughes * <p>Note that you must supply your own implementation (such as Xerces); Android does not ship with a default implementation.
544300005e7333feb0f21d8b991d5e639e2da68500Elliott Hughes *
55320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * @author <a href="mailto:Joseph.Fialli@Sun.COM">Joseph Fialli</a>
56320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * @author <a href="mailto:Jeff.Suttor@Sun.com">Jeff Suttor</a>
57320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * @version $Revision: 884950 $, $Date: 2009-11-27 10:46:18 -0800 (Fri, 27 Nov 2009) $
58320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * @since 1.5
59320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson */
60320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilsonpublic abstract class DatatypeFactory {
61320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
62320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
63320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Default property name as defined in JSR 206: Java(TM) API for XML Processing (JAXP) 1.3.</p>
64f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
65320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Default value is <code>javax.xml.datatype.DatatypeFactory</code>.</p>
66320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
67320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public static final String DATATYPEFACTORY_PROPERTY = "javax.xml.datatype.DatatypeFactory";
68320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
69320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
70320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Default implementation class name as defined in JSR 206: Java(TM) API for XML Processing (JAXP) 1.3.</p>
71f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
72320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Default value is <code>org.apache.xerces.jaxp.datatype.DatatypeFactoryImpl</code>.</p>
73320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
747d7379be39626cccaa84a66a82cdde8cb178bc96Elliott Hughes    // This uses "new String" to avoid being inlined as a constant.
757d7379be39626cccaa84a66a82cdde8cb178bc96Elliott Hughes    public static final String DATATYPEFACTORY_IMPLEMENTATION_CLASS = new String("org.apache.xerces.jaxp.datatype.DatatypeFactoryImpl");
76320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
77320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
78320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Protected constructor to prevent instantiation outside of package.</p>
79f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
80320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Use {@link #newInstance()} to create a <code>DatatypeFactory</code>.</p>
81320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
82320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    protected DatatypeFactory() {}
83320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
84320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
85320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Obtain a new instance of a <code>DatatypeFactory</code>.</p>
86f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
87320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>The implementation resolution mechanisms are <a href="#DatatypeFactory.newInstance">defined</a> in this
88320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <code>Class</code>'s documentation.</p>
894300005e7333feb0f21d8b991d5e639e2da68500Elliott Hughes     * <p>Note that you must supply your own implementation (such as Xerces); Android does not ship with a default implementation.
90f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
91320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @return New instance of a <code>DocumentBuilderFactory</code>
92320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *
93320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @throws DatatypeConfigurationException If the implementation is not
94320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   available or cannot be instantiated.
95320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
96320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public static DatatypeFactory newInstance()
97320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        throws DatatypeConfigurationException {
98320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        try {
99320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            return (DatatypeFactory) FactoryFinder.find(
100320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                    /* The default property name according to the JAXP spec */
101320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                    DATATYPEFACTORY_PROPERTY,
102320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                    /* The fallback implementation class name */
103320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                    DATATYPEFACTORY_IMPLEMENTATION_CLASS);
104f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        }
105320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        catch (FactoryFinder.ConfigurationError e) {
106320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            throw new DatatypeConfigurationException(e.getMessage(), e.getException());
107320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        }
108320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    }
109320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
11055b2d1c3f492f6140ad6dd18a4bec4ec2643d664Jesse Wilson    /**
11155b2d1c3f492f6140ad6dd18a4bec4ec2643d664Jesse Wilson     * Returns an instance of the named implementation of {@code DatatypeFactory}.
11255b2d1c3f492f6140ad6dd18a4bec4ec2643d664Jesse Wilson     *
11355b2d1c3f492f6140ad6dd18a4bec4ec2643d664Jesse Wilson     * @throws DatatypeConfigurationException if {@code factoryClassName} is not available or cannot
11455b2d1c3f492f6140ad6dd18a4bec4ec2643d664Jesse Wilson     *     be instantiated.
11555b2d1c3f492f6140ad6dd18a4bec4ec2643d664Jesse Wilson     * @since 1.6
11655b2d1c3f492f6140ad6dd18a4bec4ec2643d664Jesse Wilson     */
11755b2d1c3f492f6140ad6dd18a4bec4ec2643d664Jesse Wilson    public static DatatypeFactory newInstance(String factoryClassName, ClassLoader classLoader)
11855b2d1c3f492f6140ad6dd18a4bec4ec2643d664Jesse Wilson            throws DatatypeConfigurationException {
11955b2d1c3f492f6140ad6dd18a4bec4ec2643d664Jesse Wilson        if (factoryClassName == null) {
12055b2d1c3f492f6140ad6dd18a4bec4ec2643d664Jesse Wilson            throw new DatatypeConfigurationException("factoryClassName == null");
12155b2d1c3f492f6140ad6dd18a4bec4ec2643d664Jesse Wilson        }
12255b2d1c3f492f6140ad6dd18a4bec4ec2643d664Jesse Wilson        if (classLoader == null) {
12355b2d1c3f492f6140ad6dd18a4bec4ec2643d664Jesse Wilson            classLoader = Thread.currentThread().getContextClassLoader();
12455b2d1c3f492f6140ad6dd18a4bec4ec2643d664Jesse Wilson        }
12555b2d1c3f492f6140ad6dd18a4bec4ec2643d664Jesse Wilson        try {
12655b2d1c3f492f6140ad6dd18a4bec4ec2643d664Jesse Wilson            Class<?> type = classLoader != null
12755b2d1c3f492f6140ad6dd18a4bec4ec2643d664Jesse Wilson                    ? classLoader.loadClass(factoryClassName)
12855b2d1c3f492f6140ad6dd18a4bec4ec2643d664Jesse Wilson                    : Class.forName(factoryClassName);
12955b2d1c3f492f6140ad6dd18a4bec4ec2643d664Jesse Wilson            return (DatatypeFactory) type.newInstance();
13055b2d1c3f492f6140ad6dd18a4bec4ec2643d664Jesse Wilson        } catch (ClassNotFoundException e) {
13155b2d1c3f492f6140ad6dd18a4bec4ec2643d664Jesse Wilson            throw new DatatypeConfigurationException(e);
13255b2d1c3f492f6140ad6dd18a4bec4ec2643d664Jesse Wilson        } catch (InstantiationException e) {
13355b2d1c3f492f6140ad6dd18a4bec4ec2643d664Jesse Wilson            throw new DatatypeConfigurationException(e);
13455b2d1c3f492f6140ad6dd18a4bec4ec2643d664Jesse Wilson        } catch (IllegalAccessException e) {
13555b2d1c3f492f6140ad6dd18a4bec4ec2643d664Jesse Wilson            throw new DatatypeConfigurationException(e);
13655b2d1c3f492f6140ad6dd18a4bec4ec2643d664Jesse Wilson        }
13755b2d1c3f492f6140ad6dd18a4bec4ec2643d664Jesse Wilson    }
138320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
139320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
140320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Obtain a new instance of a <code>Duration</code>
141320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * specifying the <code>Duration</code> as its string representation, "PnYnMnDTnHnMnS",
142320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * as defined in XML Schema 1.0 section 3.2.6.1.</p>
143f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
144320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>XML Schema Part 2: Datatypes, 3.2.6 duration, defines <code>duration</code> as:</p>
145320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <blockquote>
146320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * duration represents a duration of time.
147320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * The value space of duration is a six-dimensional space where the coordinates designate the
148320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * Gregorian year, month, day, hour, minute, and second components defined in Section 5.5.3.2 of [ISO 8601], respectively.
149320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * These components are ordered in their significance by their order of appearance i.e. as
150f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * year, month, day, hour, minute, and second.
151320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * </blockquote>
152320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>All six values are set and available from the created {@link Duration}</p>
153f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
154320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>The XML Schema specification states that values can be of an arbitrary size.
155320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * Implementations may chose not to or be incapable of supporting arbitrarily large and/or small values.
156320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * An {@link UnsupportedOperationException} will be thrown with a message indicating implementation limits
157320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * if implementation capacities are exceeded.</p>
158f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
159320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param lexicalRepresentation <code>String</code> representation of a <code>Duration</code>.
160f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
161320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @return New <code>Duration</code> created from parsing the <code>lexicalRepresentation</code>.
162f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
163320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @throws IllegalArgumentException If <code>lexicalRepresentation</code> is not a valid representation of a <code>Duration</code>.
164320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @throws UnsupportedOperationException If implementation cannot support requested values.
165320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @throws NullPointerException if <code>lexicalRepresentation</code> is <code>null</code>.
166320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
167320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public abstract Duration newDuration(final String lexicalRepresentation);
168320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
169320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
170320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Obtain a new instance of a <code>Duration</code>
171320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * specifying the <code>Duration</code> as milliseconds.</p>
172f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
173320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>XML Schema Part 2: Datatypes, 3.2.6 duration, defines <code>duration</code> as:</p>
174320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <blockquote>
175320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * duration represents a duration of time.
176320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * The value space of duration is a six-dimensional space where the coordinates designate the
177320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * Gregorian year, month, day, hour, minute, and second components defined in Section 5.5.3.2 of [ISO 8601], respectively.
178320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * These components are ordered in their significance by their order of appearance i.e. as
179f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * year, month, day, hour, minute, and second.
180320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * </blockquote>
181320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>All six values are set by computing their values from the specified milliseconds
182320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * and are available using the <code>get</code> methods of  the created {@link Duration}.
183320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * The values conform to and are defined by:</p>
184320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <ul>
185320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   <li>ISO 8601:2000(E) Section 5.5.3.2 Alternative format</li>
186320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   <li><a href="http://www.w3.org/TR/xmlschema-2/#isoformats">
187320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *     W3C XML Schema 1.0 Part 2, Appendix D, ISO 8601 Date and Time Formats</a>
188320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   </li>
189320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   <li>{@link XMLGregorianCalendar}  Date/Time Datatype Field Mapping Between XML Schema 1.0 and Java Representation</li>
190320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * </ul>
191f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
192320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>The default start instance is defined by {@link GregorianCalendar}'s use of the start of the epoch: i.e.,
193320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * {@link java.util.Calendar#YEAR} = 1970,
194320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * {@link java.util.Calendar#MONTH} = {@link java.util.Calendar#JANUARY},
195320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * {@link java.util.Calendar#DATE} = 1, etc.
196320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * This is important as there are variations in the Gregorian Calendar,
197320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * e.g. leap years have different days in the month = {@link java.util.Calendar#FEBRUARY}
198f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * so the result of {@link Duration#getMonths()} and {@link Duration#getDays()} can be influenced.</p>
199f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
200320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param durationInMilliSeconds Duration in milliseconds to create.
201f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
202320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @return New <code>Duration</code> representing <code>durationInMilliSeconds</code>.
203320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
204320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public abstract Duration newDuration(final long durationInMilliSeconds);
205320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
206320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
207320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Obtain a new instance of a <code>Duration</code>
208320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * specifying the <code>Duration</code> as isPositive, years, months, days, hours, minutes, seconds.</p>
209f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
210320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>The XML Schema specification states that values can be of an arbitrary size.
211320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * Implementations may chose not to or be incapable of supporting arbitrarily large and/or small values.
212320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * An {@link UnsupportedOperationException} will be thrown with a message indicating implementation limits
213320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * if implementation capacities are exceeded.</p>
214f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
215320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>A <code>null</code> value indicates that field is not set.</p>
216f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
217320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param isPositive Set to <code>false</code> to create a negative duration. When the length
218320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   of the duration is zero, this parameter will be ignored.
219320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param years of this <code>Duration</code>
220320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param months of this <code>Duration</code>
221320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param days of this <code>Duration</code>
222320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param hours of this <code>Duration</code>
223320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param minutes of this <code>Duration</code>
224320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param seconds of this <code>Duration</code>
225f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
226320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @return New <code>Duration</code> created from the specified values.
227f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
228320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @throws IllegalArgumentException If values are not a valid representation of a <code>Duration</code>.
229320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @throws UnsupportedOperationException If implementation cannot support requested values.
230320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
231320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public abstract Duration newDuration(
232320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final boolean isPositive,
233320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final BigInteger years,
234320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final BigInteger months,
235320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final BigInteger days,
236320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final BigInteger hours,
237320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final BigInteger minutes,
238320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final BigDecimal seconds);
239320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
240320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
241320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Obtain a new instance of a <code>Duration</code>
242320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * specifying the <code>Duration</code> as isPositive, years, months, days, hours, minutes, seconds.</p>
243f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
244320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>A {@link DatatypeConstants#FIELD_UNDEFINED} value indicates that field is not set.</p>
245f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
246320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param isPositive Set to <code>false</code> to create a negative duration. When the length
247320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   of the duration is zero, this parameter will be ignored.
248320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param years of this <code>Duration</code>
249320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param months of this <code>Duration</code>
250320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param days of this <code>Duration</code>
251320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param hours of this <code>Duration</code>
252320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param minutes of this <code>Duration</code>
253320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param seconds of this <code>Duration</code>
254f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
255320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @return New <code>Duration</code> created from the specified values.
256f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
257320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @throws IllegalArgumentException If values are not a valid representation of a <code>Duration</code>.
258f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
259320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @see #newDuration(
260320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   boolean isPositive,
261320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   BigInteger years,
262320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   BigInteger months,
263320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   BigInteger days,
264320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   BigInteger hours,
265320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   BigInteger minutes,
266320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   BigDecimal seconds)
267320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
268320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public Duration newDuration(
269320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final boolean isPositive,
270320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int years,
271320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int months,
272320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int days,
273320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int hours,
274320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int minutes,
275320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int seconds) {
276320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
277320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        // years may not be set
278320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        BigInteger realYears = (years != DatatypeConstants.FIELD_UNDEFINED) ? BigInteger.valueOf((long) years) : null;
279320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
280320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        // months may not be set
281320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        BigInteger realMonths = (months != DatatypeConstants.FIELD_UNDEFINED) ? BigInteger.valueOf((long) months) : null;
282320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
283320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        // days may not be set
284320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        BigInteger realDays = (days != DatatypeConstants.FIELD_UNDEFINED) ? BigInteger.valueOf((long) days) : null;
285320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
286320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        // hours may not be set
287320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        BigInteger realHours = (hours != DatatypeConstants.FIELD_UNDEFINED) ? BigInteger.valueOf((long) hours) : null;
288320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
289320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        // minutes may not be set
290320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        BigInteger realMinutes = (minutes != DatatypeConstants.FIELD_UNDEFINED) ? BigInteger.valueOf((long) minutes) : null;
291320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
292320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        // seconds may not be set
293320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        BigDecimal realSeconds = (seconds != DatatypeConstants.FIELD_UNDEFINED) ? BigDecimal.valueOf((long) seconds) : null;
294320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
295320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        return newDuration(
296320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                isPositive,
297320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                realYears,
298320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                realMonths,
299320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                realDays,
300320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                realHours,
301320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                realMinutes,
302320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                realSeconds
303320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        );
304320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    }
305320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
306320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
307320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Create a <code>Duration</code> of type <code>xdt:dayTimeDuration</code> by parsing its <code>String</code> representation,
308320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * "<em>PnDTnHnMnS</em>", <a href="http://www.w3.org/TR/xpath-datamodel#dt-dayTimeDuration">
309320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   XQuery 1.0 and XPath 2.0 Data Model, xdt:dayTimeDuration</a>.</p>
310f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
311320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>The datatype <code>xdt:dayTimeDuration</code> is a subtype of <code>xs:duration</code>
312320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * whose lexical representation contains only day, hour, minute, and second components.
313320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * This datatype resides in the namespace <code>http://www.w3.org/2003/11/xpath-datatypes</code>.</p>
314f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
315320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>All four values are set and available from the created {@link Duration}</p>
316f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
317320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>The XML Schema specification states that values can be of an arbitrary size.
318320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * Implementations may chose not to or be incapable of supporting arbitrarily large and/or small values.
319320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * An {@link UnsupportedOperationException} will be thrown with a message indicating implementation limits
320320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * if implementation capacities are exceeded.</p>
321f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
322320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param lexicalRepresentation Lexical representation of a duration.
323f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
324320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @return New <code>Duration</code> created using the specified <code>lexicalRepresentation</code>.
325f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
326320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @throws IllegalArgumentException If the given string does not conform to the aforementioned specification.
327320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @throws UnsupportedOperationException If implementation cannot support requested values.
328320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @throws NullPointerException If <code>lexicalRepresentation</code> is <code>null</code>.
329320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
330320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public Duration newDurationDayTime(final String lexicalRepresentation) {
331320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        if (lexicalRepresentation == null) {
33286acc043d3334651ee26c65467d78d6cefedd397Kenny Root            throw new NullPointerException("lexicalRepresentation == null");
333320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        }
334320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        // The lexical representation must match the pattern [^YM]*(T.*)?
335320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        int pos = lexicalRepresentation.indexOf('T');
336320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        int length = (pos >= 0) ? pos : lexicalRepresentation.length();
337320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        for (int i = 0; i < length; ++i) {
338320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            char c = lexicalRepresentation.charAt(i);
339320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            if (c == 'Y' || c == 'M') {
340320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                throw new IllegalArgumentException("Invalid dayTimeDuration value: " + lexicalRepresentation);
341320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            }
342320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        }
343320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        return newDuration(lexicalRepresentation);
344320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    }
345320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
346320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
347320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Create a <code>Duration</code> of type <code>xdt:dayTimeDuration</code> using the specified milliseconds as defined in
348320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <a href="http://www.w3.org/TR/xpath-datamodel#dt-dayTimeDuration">
349320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   XQuery 1.0 and XPath 2.0 Data Model, xdt:dayTimeDuration</a>.</p>
350f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
351320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>The datatype <code>xdt:dayTimeDuration</code> is a subtype of <code>xs:duration</code>
352320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * whose lexical representation contains only day, hour, minute, and second components.
353320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * This datatype resides in the namespace <code>http://www.w3.org/2003/11/xpath-datatypes</code>.</p>
354f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
355320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>All four values are set by computing their values from the specified milliseconds
356320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * and are available using the <code>get</code> methods of  the created {@link Duration}.
357320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * The values conform to and are defined by:</p>
358320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <ul>
359320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   <li>ISO 8601:2000(E) Section 5.5.3.2 Alternative format</li>
360320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   <li><a href="http://www.w3.org/TR/xmlschema-2/#isoformats">
361320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *     W3C XML Schema 1.0 Part 2, Appendix D, ISO 8601 Date and Time Formats</a>
362320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   </li>
363320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   <li>{@link XMLGregorianCalendar}  Date/Time Datatype Field Mapping Between XML Schema 1.0 and Java Representation</li>
364320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * </ul>
365f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
366320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>The default start instance is defined by {@link GregorianCalendar}'s use of the start of the epoch: i.e.,
367320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * {@link java.util.Calendar#YEAR} = 1970,
368320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * {@link java.util.Calendar#MONTH} = {@link java.util.Calendar#JANUARY},
369320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * {@link java.util.Calendar#DATE} = 1, etc.
370320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * This is important as there are variations in the Gregorian Calendar,
371320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * e.g. leap years have different days in the month = {@link java.util.Calendar#FEBRUARY}
372320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * so the result of {@link Duration#getDays()} can be influenced.</p>
373f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
374320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Any remaining milliseconds after determining the day, hour, minute and second are discarded.</p>
375f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
376320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param durationInMilliseconds Milliseconds of <code>Duration</code> to create.
377f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
378320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @return New <code>Duration</code> created with the specified <code>durationInMilliseconds</code>.
379f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
380320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @see <a href="http://www.w3.org/TR/xpath-datamodel#dt-dayTimeDuration">
381320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   XQuery 1.0 and XPath 2.0 Data Model, xdt:dayTimeDuration</a>
382320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
383320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public Duration newDurationDayTime(final long durationInMilliseconds) {
384320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        long _durationInMilliseconds = durationInMilliseconds;
385320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        if (_durationInMilliseconds == 0) {
386f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            return newDuration(true, DatatypeConstants.FIELD_UNDEFINED,
387320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                    DatatypeConstants.FIELD_UNDEFINED, 0, 0, 0, 0);
388320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        }
389320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        boolean tooLong = false;
390320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        final boolean isPositive;
391320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        if (_durationInMilliseconds < 0) {
392320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            isPositive = false;
393320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            if (_durationInMilliseconds == Long.MIN_VALUE) {
394320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                _durationInMilliseconds++;
395320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                tooLong = true;
396320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            }
397320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            _durationInMilliseconds *= -1;
398320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        }
399320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        else {
400320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            isPositive = true;
401320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        }
402f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
403320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        long val = _durationInMilliseconds;
404320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        int milliseconds = (int) (val % 60000L); // 60000 milliseconds per minute
405320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        if (tooLong) {
406320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            ++milliseconds;
407320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        }
408320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        if (milliseconds % 1000 == 0) {
409320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            int seconds = milliseconds / 1000;
410320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            val = val / 60000L;
411320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            int minutes = (int) (val % 60L); // 60 minutes per hour
412320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            val = val / 60L;
413320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            int hours = (int) (val % 24L); // 24 hours per day
414320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            long days = val / 24L;
415320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            if (days <= ((long) Integer.MAX_VALUE)) {
416320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                return newDuration(isPositive, DatatypeConstants.FIELD_UNDEFINED,
417320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                        DatatypeConstants.FIELD_UNDEFINED, (int) days, hours, minutes, seconds);
418320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            }
419320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            else {
420320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                return newDuration(isPositive, null, null,
421f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes                        BigInteger.valueOf(days), BigInteger.valueOf(hours),
422320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                        BigInteger.valueOf(minutes), BigDecimal.valueOf(milliseconds, 3));
423f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            }
424320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        }
425f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
426320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        BigDecimal seconds = BigDecimal.valueOf(milliseconds, 3);
427320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        val = val / 60000L;
428320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        BigInteger minutes = BigInteger.valueOf(val % 60L); // 60 minutes per hour
429320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        val = val / 60L;
430320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        BigInteger hours = BigInteger.valueOf(val % 24L); // 24 hours per day
431320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        val = val / 24L;
432320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        BigInteger days = BigInteger.valueOf(val);
433320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        return newDuration(isPositive, null, null, days, hours, minutes, seconds);
434320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    }
435320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
436320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
437320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Create a <code>Duration</code> of type <code>xdt:dayTimeDuration</code> using the specified
438320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <code>day</code>, <code>hour</code>, <code>minute</code> and <code>second</code> as defined in
439320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <a href="http://www.w3.org/TR/xpath-datamodel#dt-dayTimeDuration">
440320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   XQuery 1.0 and XPath 2.0 Data Model, xdt:dayTimeDuration</a>.</p>
441f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
442320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>The datatype <code>xdt:dayTimeDuration</code> is a subtype of <code>xs:duration</code>
443320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * whose lexical representation contains only day, hour, minute, and second components.
444320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * This datatype resides in the namespace <code>http://www.w3.org/2003/11/xpath-datatypes</code>.</p>
445f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
446320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>The XML Schema specification states that values can be of an arbitrary size.
447320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * Implementations may chose not to or be incapable of supporting arbitrarily large and/or small values.
448320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * An {@link UnsupportedOperationException} will be thrown with a message indicating implementation limits
449320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * if implementation capacities are exceeded.</p>
450f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
451320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>A <code>null</code> value indicates that field is not set.</p>
452f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
453320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param isPositive Set to <code>false</code> to create a negative duration. When the length
454320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   of the duration is zero, this parameter will be ignored.
455320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param day Day of <code>Duration</code>.
456320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param hour Hour of <code>Duration</code>.
457320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param minute Minute of <code>Duration</code>.
458320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param second Second of <code>Duration</code>.
459f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
460320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @return New <code>Duration</code> created with the specified <code>day</code>, <code>hour</code>, <code>minute</code>
461320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * and <code>second</code>.
462f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
463f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * @throws IllegalArgumentException If any values would create an invalid <code>Duration</code>.
464320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @throws UnsupportedOperationException If implementation cannot support requested values.
465f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     */
466320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public Duration newDurationDayTime(
467320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final boolean isPositive,
468320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final BigInteger day,
469320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final BigInteger hour,
470320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final BigInteger minute,
471320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final BigInteger second) {
472320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
473320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        return newDuration(
474320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                isPositive,
475320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                null,  // years
476320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                null, // months
477320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                day,
478320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                hour,
479320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                minute,
480320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                (second != null)? new BigDecimal(second):null
481320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        );
482320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    }
483320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
484320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
485320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Create a <code>Duration</code> of type <code>xdt:dayTimeDuration</code> using the specified
486320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <code>day</code>, <code>hour</code>, <code>minute</code> and <code>second</code> as defined in
487320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <a href="http://www.w3.org/TR/xpath-datamodel#dt-dayTimeDuration">
488320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   XQuery 1.0 and XPath 2.0 Data Model, xdt:dayTimeDuration</a>.</p>
489f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
490320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>The datatype <code>xdt:dayTimeDuration</code> is a subtype of <code>xs:duration</code>
491320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * whose lexical representation contains only day, hour, minute, and second components.
492320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * This datatype resides in the namespace <code>http://www.w3.org/2003/11/xpath-datatypes</code>.</p>
493f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
494320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>A {@link DatatypeConstants#FIELD_UNDEFINED} value indicates that field is not set.</p>
495f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
496320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param isPositive Set to <code>false</code> to create a negative duration. When the length
497320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   of the duration is zero, this parameter will be ignored.
498320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param day Day of <code>Duration</code>.
499320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param hour Hour of <code>Duration</code>.
500320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param minute Minute of <code>Duration</code>.
501320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param second Second of <code>Duration</code>.
502f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
503320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @return New <code>Duration</code> created with the specified <code>day</code>, <code>hour</code>, <code>minute</code>
504320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * and <code>second</code>.
505f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
506f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * @throws IllegalArgumentException If any values would create an invalid <code>Duration</code>.
507f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     */
508320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public Duration newDurationDayTime(
509320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final boolean isPositive,
510320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int day,
511320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int hour,
512320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int minute,
513320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int second) {
514f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        return newDuration(isPositive,
515320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                DatatypeConstants.FIELD_UNDEFINED, DatatypeConstants.FIELD_UNDEFINED,
516320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                day, hour, minute, second);
517320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    }
518320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
519320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
520320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Create a <code>Duration</code> of type <code>xdt:yearMonthDuration</code> by parsing its <code>String</code> representation,
521320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * "<em>PnYnM</em>", <a href="http://www.w3.org/TR/xpath-datamodel#dt-yearMonthDuration">
522320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   XQuery 1.0 and XPath 2.0 Data Model, xdt:yearMonthDuration</a>.</p>
523f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
524320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>The datatype <code>xdt:yearMonthDuration</code> is a subtype of <code>xs:duration</code>
525320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * whose lexical representation contains only year and month components.
526320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * This datatype resides in the namespace {@link javax.xml.XMLConstants#W3C_XPATH_DATATYPE_NS_URI}.</p>
527f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
528320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Both values are set and available from the created {@link Duration}</p>
529f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
530320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>The XML Schema specification states that values can be of an arbitrary size.
531320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * Implementations may chose not to or be incapable of supporting arbitrarily large and/or small values.
532320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * An {@link UnsupportedOperationException} will be thrown with a message indicating implementation limits
533320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * if implementation capacities are exceeded.</p>
534f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
535320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param lexicalRepresentation Lexical representation of a duration.
536f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
537320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @return New <code>Duration</code> created using the specified <code>lexicalRepresentation</code>.
538f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
539320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @throws IllegalArgumentException If the <code>lexicalRepresentation</code> does not conform to the specification.
540320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @throws UnsupportedOperationException If implementation cannot support requested values.
541320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @throws NullPointerException If <code>lexicalRepresentation</code> is <code>null</code>.
542320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
543320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public Duration newDurationYearMonth(final String lexicalRepresentation) {
544320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        if (lexicalRepresentation == null) {
54586acc043d3334651ee26c65467d78d6cefedd397Kenny Root            throw new NullPointerException("lexicalRepresentation == null");
546320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        }
547320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        // The lexical representation must match the pattern [^DT]*.
548320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        int length = lexicalRepresentation.length();
549320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        for (int i = 0; i < length; ++i) {
550320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            char c = lexicalRepresentation.charAt(i);
551320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            if (c == 'D' || c == 'T') {
552320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                throw new IllegalArgumentException("Invalid yearMonthDuration value: " + lexicalRepresentation);
553320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            }
554320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        }
555320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        return newDuration(lexicalRepresentation);
556320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    }
557320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
558320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
559320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Create a <code>Duration</code> of type <code>xdt:yearMonthDuration</code> using the specified milliseconds as defined in
560320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <a href="http://www.w3.org/TR/xpath-datamodel#dt-yearMonthDuration">
561320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   XQuery 1.0 and XPath 2.0 Data Model, xdt:yearMonthDuration</a>.</p>
562f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
563320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>The datatype <code>xdt:yearMonthDuration</code> is a subtype of <code>xs:duration</code>
564320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * whose lexical representation contains only year and month components.
565320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * This datatype resides in the namespace {@link javax.xml.XMLConstants#W3C_XPATH_DATATYPE_NS_URI}.</p>
566f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
567320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Both values are set by computing their values from the specified milliseconds
568320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * and are available using the <code>get</code> methods of  the created {@link Duration}.
569320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * The values conform to and are defined by:</p>
570320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <ul>
571320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   <li>ISO 8601:2000(E) Section 5.5.3.2 Alternative format</li>
572320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   <li><a href="http://www.w3.org/TR/xmlschema-2/#isoformats">
573320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *     W3C XML Schema 1.0 Part 2, Appendix D, ISO 8601 Date and Time Formats</a>
574320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   </li>
575320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   <li>{@link XMLGregorianCalendar}  Date/Time Datatype Field Mapping Between XML Schema 1.0 and Java Representation</li>
576320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * </ul>
577f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
578320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>The default start instance is defined by {@link GregorianCalendar}'s use of the start of the epoch: i.e.,
579320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * {@link java.util.Calendar#YEAR} = 1970,
580320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * {@link java.util.Calendar#MONTH} = {@link java.util.Calendar#JANUARY},
581320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * {@link java.util.Calendar#DATE} = 1, etc.
582320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * This is important as there are variations in the Gregorian Calendar,
583320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * e.g. leap years have different days in the month = {@link java.util.Calendar#FEBRUARY}
584320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * so the result of {@link Duration#getMonths()} can be influenced.</p>
585f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
586320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Any remaining milliseconds after determining the year and month are discarded.</p>
587f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
588320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param durationInMilliseconds Milliseconds of <code>Duration</code> to create.
589f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
590320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @return New <code>Duration</code> created using the specified <code>durationInMilliseconds</code>.
591320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
592320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public Duration newDurationYearMonth(final long durationInMilliseconds) {
593320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
594320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        return newDuration(durationInMilliseconds);
595320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    }
596320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
597320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
598320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Create a <code>Duration</code> of type <code>xdt:yearMonthDuration</code> using the specified
599320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <code>year</code> and <code>month</code> as defined in
600320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <a href="http://www.w3.org/TR/xpath-datamodel#dt-yearMonthyDuration">
601320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   XQuery 1.0 and XPath 2.0 Data Model, xdt:yearMonthDuration</a>.</p>
602f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
603320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>The XML Schema specification states that values can be of an arbitrary size.
604320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * Implementations may chose not to or be incapable of supporting arbitrarily large and/or small values.
605320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * An {@link UnsupportedOperationException} will be thrown with a message indicating implementation limits
606320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * if implementation capacities are exceeded.</p>
607f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
608320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>A <code>null</code> value indicates that field is not set.</p>
609f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
610320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param isPositive Set to <code>false</code> to create a negative duration. When the length
611320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   of the duration is zero, this parameter will be ignored.
612320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param year Year of <code>Duration</code>.
613320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param month Month of <code>Duration</code>.
614f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
615320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @return New <code>Duration</code> created using the specified <code>year</code> and <code>month</code>.
616f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
617f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * @throws IllegalArgumentException If any values would create an invalid <code>Duration</code>.
618320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @throws UnsupportedOperationException If implementation cannot support requested values.
619f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     */
620320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public Duration newDurationYearMonth(
621320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final boolean isPositive,
622320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final BigInteger year,
623320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final BigInteger month) {
624320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
625320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        return newDuration(
626320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                isPositive,
627320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                year,
628320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                month,
629320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                null, // days
630320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                null, // hours
631320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                null, // minutes
632320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                null  // seconds
633320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        );
634320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    }
635320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
636320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
637320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Create a <code>Duration</code> of type <code>xdt:yearMonthDuration</code> using the specified
638320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <code>year</code> and <code>month</code> as defined in
639320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <a href="http://www.w3.org/TR/xpath-datamodel#dt-yearMonthyDuration">
640320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   XQuery 1.0 and XPath 2.0 Data Model, xdt:yearMonthDuration</a>.</p>
641f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
642320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>A {@link DatatypeConstants#FIELD_UNDEFINED} value indicates that field is not set.</p>
643f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
644320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param isPositive Set to <code>false</code> to create a negative duration. When the length
645320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   of the duration is zero, this parameter will be ignored.
646320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param year Year of <code>Duration</code>.
647320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param month Month of <code>Duration</code>.
648f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
649320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @return New <code>Duration</code> created using the specified <code>year</code> and <code>month</code>.
650f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
651f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * @throws IllegalArgumentException If any values would create an invalid <code>Duration</code>.
652f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     */
653320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public Duration newDurationYearMonth(
654320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final boolean isPositive,
655320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int year,
656320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int month) {
657f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        return newDuration(isPositive, year, month,
658320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                DatatypeConstants.FIELD_UNDEFINED, DatatypeConstants.FIELD_UNDEFINED,
659320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                DatatypeConstants.FIELD_UNDEFINED, DatatypeConstants.FIELD_UNDEFINED);
660320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    }
661320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
662320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
663320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Create a new instance of an <code>XMLGregorianCalendar</code>.</p>
664f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
665320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>All date/time datatype fields set to {@link DatatypeConstants#FIELD_UNDEFINED} or null.</p>
666f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
667320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @return New <code>XMLGregorianCalendar</code> with all date/time datatype fields set to
668320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   {@link DatatypeConstants#FIELD_UNDEFINED} or null.
669320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
670320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public abstract XMLGregorianCalendar newXMLGregorianCalendar();
671320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
672320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
673320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Create a new XMLGregorianCalendar by parsing the String as a lexical representation.</p>
674f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
675f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * <p>Parsing the lexical string representation is defined in
676320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <a href="http://www.w3.org/TR/xmlschema-2/#dateTime-order">XML Schema 1.0 Part 2, Section 3.2.[7-14].1,
677320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <em>Lexical Representation</em>.</a></p>
678f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
679320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>The string representation may not have any leading and trailing whitespaces.</p>
680f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
681320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>The parsing is done field by field so that
682320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * the following holds for any lexically correct String x:</p>
683320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <pre>
684320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * newXMLGregorianCalendar(x).toXMLFormat().equals(x)
685320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * </pre>
686320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Except for the noted lexical/canonical representation mismatches
687320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * listed in <a href="http://www.w3.org/2001/05/xmlschema-errata#e2-45">
688320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * XML Schema 1.0 errata, Section 3.2.7.2</a>.</p>
689f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
690320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param lexicalRepresentation Lexical representation of one the eight XML Schema date/time datatypes.
691f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
692320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @return <code>XMLGregorianCalendar</code> created from the <code>lexicalRepresentation</code>.
693f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
694320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @throws IllegalArgumentException If the <code>lexicalRepresentation</code> is not a valid <code>XMLGregorianCalendar</code>.
695320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @throws NullPointerException If <code>lexicalRepresentation</code> is <code>null</code>.
696320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
697320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public abstract XMLGregorianCalendar newXMLGregorianCalendar(final String lexicalRepresentation);
698320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
699320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
700f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * <p>Create an <code>XMLGregorianCalendar</code> from a {@link GregorianCalendar}.</p>
701320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *
702320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <table border="2" rules="all" cellpadding="2">
703320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   <thead>
704320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *     <tr>
705320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *       <th align="center" colspan="2">
706320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *          Field by Field Conversion from
707f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *          {@link GregorianCalendar} to an {@link XMLGregorianCalendar}
708320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *       </th>
709320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *     </tr>
710320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *     <tr>
711320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *        <th><code>java.util.GregorianCalendar</code> field</th>
712320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *        <th><code>javax.xml.datatype.XMLGregorianCalendar</code> field</th>
713320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *     </tr>
714320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   </thead>
715320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   <tbody>
716320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *     <tr>
717320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *       <td><code>ERA == GregorianCalendar.BC ? -YEAR : YEAR</code></td>
718320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *       <td>{@link XMLGregorianCalendar#setYear(int year)}</td>
719320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *     </tr>
720320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *     <tr>
721320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *       <td><code>MONTH + 1</code></td>
722320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *       <td>{@link XMLGregorianCalendar#setMonth(int month)}</td>
723320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *     </tr>
724320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *     <tr>
725320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *       <td><code>DAY_OF_MONTH</code></td>
726320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *       <td>{@link XMLGregorianCalendar#setDay(int day)}</td>
727320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *     </tr>
728320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *     <tr>
729320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *       <td><code>HOUR_OF_DAY, MINUTE, SECOND, MILLISECOND</code></td>
730320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *       <td>{@link XMLGregorianCalendar#setTime(int hour, int minute, int second, BigDecimal fractional)}</td>
731320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *     </tr>
732320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *     <tr>
733320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *       <td>
734320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *         <code>(ZONE_OFFSET + DST_OFFSET) / (60*1000)</code><br/>
735320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *         <em>(in minutes)</em>
736320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *       </td>
737320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *       <td>{@link XMLGregorianCalendar#setTimezone(int offset)}<sup><em>*</em></sup>
738320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *       </td>
739320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *     </tr>
740320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   </tbody>
741320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * </table>
742f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * <p><em>*</em>conversion loss of information. It is not possible to represent
743f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * a <code>java.util.GregorianCalendar</code> daylight savings timezone id in the
744320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * XML Schema 1.0 date/time datatype representation.</p>
745f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
746320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>To compute the return value's <code>TimeZone</code> field,
747320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <ul>
748320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <li>when <code>this.getTimezone() != FIELD_UNDEFINED</code>,
749f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * create a <code>java.util.TimeZone</code> with a custom timezone id
750320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * using the <code>this.getTimezone()</code>.</li>
751f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * <li>else use the <code>GregorianCalendar</code> default timezone value
752f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * for the host is defined as specified by
753f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * <code>java.util.TimeZone.getDefault()</code>.</li></p>
754320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *
755320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param cal <code>java.util.GregorianCalendar</code> used to create <code>XMLGregorianCalendar</code>
756f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
757320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @return <code>XMLGregorianCalendar</code> created from <code>java.util.GregorianCalendar</code>
758f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
759320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @throws NullPointerException If <code>cal</code> is <code>null</code>.
760320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
761320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public abstract XMLGregorianCalendar newXMLGregorianCalendar(final GregorianCalendar cal);
762320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
763320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
764f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * <p>Constructor allowing for complete value spaces allowed by
765f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * W3C XML Schema 1.0 recommendation for xsd:dateTime and related
766320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * builtin datatypes. Note that <code>year</code> parameter supports
767f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * arbitrarily large numbers and fractionalSecond has infinite
768320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * precision.</p>
769f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
770320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>A <code>null</code> value indicates that field is not set.</p>
771f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
772320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param year of <code>XMLGregorianCalendar</code> to be created.
773320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param month of <code>XMLGregorianCalendar</code> to be created.
774320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param day of <code>XMLGregorianCalendar</code> to be created.
775320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param hour of <code>XMLGregorianCalendar</code> to be created.
776320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param minute of <code>XMLGregorianCalendar</code> to be created.
777320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param second of <code>XMLGregorianCalendar</code> to be created.
778320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param fractionalSecond of <code>XMLGregorianCalendar</code> to be created.
779320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param timezone of <code>XMLGregorianCalendar</code> to be created.
780f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
781320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @return <code>XMLGregorianCalendar</code> created from specified values.
782f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
783320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @throws IllegalArgumentException If any individual parameter's value is outside the maximum value constraint for the field
784320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   as determined by the Date/Time Data Mapping table in {@link XMLGregorianCalendar}
785320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   or if the composite values constitute an invalid <code>XMLGregorianCalendar</code> instance
786320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   as determined by {@link XMLGregorianCalendar#isValid()}.
787320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
788320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public abstract XMLGregorianCalendar newXMLGregorianCalendar(
789320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final BigInteger year,
790320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int month,
791320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int day,
792320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int hour,
793320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int minute,
794320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int second,
795320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final BigDecimal fractionalSecond,
796320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int timezone);
797320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
798320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
799320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Constructor of value spaces that a
800320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <code>java.util.GregorianCalendar</code> instance would need to convert to an
801320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <code>XMLGregorianCalendar</code> instance.</p>
802f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
803f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * <p><code>XMLGregorianCalendar eon</code> and
804320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <code>fractionalSecond</code> are set to <code>null</code></p>
805320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *
806320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>A {@link DatatypeConstants#FIELD_UNDEFINED} value indicates that field is not set.</p>
807f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
808320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param year of <code>XMLGregorianCalendar</code> to be created.
809320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param month of <code>XMLGregorianCalendar</code> to be created.
810320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param day of <code>XMLGregorianCalendar</code> to be created.
811320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param hour of <code>XMLGregorianCalendar</code> to be created.
812320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param minute of <code>XMLGregorianCalendar</code> to be created.
813320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param second of <code>XMLGregorianCalendar</code> to be created.
814320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param millisecond of <code>XMLGregorianCalendar</code> to be created.
815320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param timezone of <code>XMLGregorianCalendar</code> to be created.
816f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
817320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @return <code>XMLGregorianCalendar</code> created from specified values.
818f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
819320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @throws IllegalArgumentException If any individual parameter's value is outside the maximum value constraint for the field
820320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   as determined by the Date/Time Data Mapping table in {@link XMLGregorianCalendar}
821320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   or if the composite values constitute an invalid <code>XMLGregorianCalendar</code> instance
822320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   as determined by {@link XMLGregorianCalendar#isValid()}.
823320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
824320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public XMLGregorianCalendar newXMLGregorianCalendar(
825320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int year,
826320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int month,
827320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int day,
828320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int hour,
829320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int minute,
830320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int second,
831320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int millisecond,
832320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int timezone) {
833320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
834320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        // year may be undefined
835320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        BigInteger realYear = (year != DatatypeConstants.FIELD_UNDEFINED) ? BigInteger.valueOf((long) year) : null;
836320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
837320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        // millisecond may be undefined
838320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        // millisecond must be >= 0 millisecond <= 1000
839320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        BigDecimal realMillisecond = null; // undefined value
840320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        if (millisecond != DatatypeConstants.FIELD_UNDEFINED) {
841320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            if (millisecond < 0 || millisecond > 1000) {
842320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                throw new IllegalArgumentException(
843320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                        "javax.xml.datatype.DatatypeFactory#newXMLGregorianCalendar("
844320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                        + "int year, int month, int day, int hour, int minute, int second, int millisecond, int timezone)"
845320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                        + "with invalid millisecond: " + millisecond
846320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                );
847320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            }
848320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            realMillisecond = BigDecimal.valueOf((long) millisecond, 3);
849320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        }
850320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
851320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        return newXMLGregorianCalendar(
852320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                realYear,
853320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                month,
854320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                day,
855320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                hour,
856320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                minute,
857320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                second,
858320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                realMillisecond,
859320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                timezone
860320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        );
861320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    }
862320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
863320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
864320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Create a Java representation of XML Schema builtin datatype <code>date</code> or <code>g*</code>.</p>
865f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
866f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * <p>For example, an instance of <code>gYear</code> can be created invoking this factory
867f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * with <code>month</code> and <code>day</code> parameters set to
868320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * {@link DatatypeConstants#FIELD_UNDEFINED}.</p>
869f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
870320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>A {@link DatatypeConstants#FIELD_UNDEFINED} value indicates that field is not set.</p>
871f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
872320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param year of <code>XMLGregorianCalendar</code> to be created.
873320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param month of <code>XMLGregorianCalendar</code> to be created.
874320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param day of <code>XMLGregorianCalendar</code> to be created.
875320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param timezone offset in minutes. {@link DatatypeConstants#FIELD_UNDEFINED} indicates optional field is not set.
876f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
877320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @return <code>XMLGregorianCalendar</code> created from parameter values.
878f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
879320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @see DatatypeConstants#FIELD_UNDEFINED
880320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *
881320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @throws IllegalArgumentException If any individual parameter's value is outside the maximum value constraint for the field
882320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   as determined by the Date/Time Data Mapping table in {@link XMLGregorianCalendar}
883320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   or if the composite values constitute an invalid <code>XMLGregorianCalendar</code> instance
884320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   as determined by {@link XMLGregorianCalendar#isValid()}.
885320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
886320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public XMLGregorianCalendar newXMLGregorianCalendarDate(
887320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int year,
888320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int month,
889320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int day,
890320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int timezone) {
891320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
892320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        return newXMLGregorianCalendar(
893320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                year,
894320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                month,
895320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                day,
896320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                DatatypeConstants.FIELD_UNDEFINED, // hour
897320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                DatatypeConstants.FIELD_UNDEFINED, // minute
898320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                DatatypeConstants.FIELD_UNDEFINED, // second
899320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                DatatypeConstants.FIELD_UNDEFINED, // millisecond
900320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                timezone);
901320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    }
902320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
903320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
904320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Create a Java instance of XML Schema builtin datatype <code>time</code>.</p>
905f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
906320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>A {@link DatatypeConstants#FIELD_UNDEFINED} value indicates that field is not set.</p>
907f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
908320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param hours number of hours
909320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param minutes number of minutes
910320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param seconds number of seconds
911320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param timezone offset in minutes. {@link DatatypeConstants#FIELD_UNDEFINED} indicates optional field is not set.
912f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
913320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @return <code>XMLGregorianCalendar</code> created from parameter values.
914f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
915320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @throws IllegalArgumentException If any individual parameter's value is outside the maximum value constraint for the field
916320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   as determined by the Date/Time Data Mapping table in {@link XMLGregorianCalendar}
917320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   or if the composite values constitute an invalid <code>XMLGregorianCalendar</code> instance
918320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   as determined by {@link XMLGregorianCalendar#isValid()}.
919f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
920320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @see DatatypeConstants#FIELD_UNDEFINED
921320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
922320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public XMLGregorianCalendar newXMLGregorianCalendarTime(
923320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int hours,
924320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int minutes,
925320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int seconds,
926320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int timezone) {
927320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
928320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        return newXMLGregorianCalendar(
929320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                DatatypeConstants.FIELD_UNDEFINED, // Year
930320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                DatatypeConstants.FIELD_UNDEFINED, // Month
931320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                DatatypeConstants.FIELD_UNDEFINED, // Day
932320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                hours,
933320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                minutes,
934320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                seconds,
935320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                DatatypeConstants.FIELD_UNDEFINED, //Millisecond
936320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                timezone);
937320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    }
938320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
939320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
940320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Create a Java instance of XML Schema builtin datatype time.</p>
941f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
942320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>A <code>null</code> value indicates that field is not set.</p>
943320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>A {@link DatatypeConstants#FIELD_UNDEFINED} value indicates that field is not set.</p>
944f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
945320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param hours number of hours
946320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param minutes number of minutes
947320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param seconds number of seconds
948320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param fractionalSecond value of <code>null</code> indicates that this optional field is not set.
949320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param timezone offset in minutes. {@link DatatypeConstants#FIELD_UNDEFINED} indicates optional field is not set.
950f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
951320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @return <code>XMLGregorianCalendar</code> created from parameter values.
952f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
953320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @see DatatypeConstants#FIELD_UNDEFINED
954320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *
955320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @throws IllegalArgumentException If any individual parameter's value is outside the maximum value constraint for the field
956320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   as determined by the Date/Time Data Mapping table in {@link XMLGregorianCalendar}
957320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   or if the composite values constitute an invalid <code>XMLGregorianCalendar</code> instance
958320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   as determined by {@link XMLGregorianCalendar#isValid()}.
959320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
960320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public XMLGregorianCalendar newXMLGregorianCalendarTime(
961320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int hours,
962320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int minutes,
963320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int seconds,
964320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final BigDecimal fractionalSecond,
965320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int timezone) {
966320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
967320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        return newXMLGregorianCalendar(
968320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                null, // year
969320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                DatatypeConstants.FIELD_UNDEFINED, // month
970320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                DatatypeConstants.FIELD_UNDEFINED, // day
971320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                hours,
972320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                minutes,
973320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                seconds,
974320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                fractionalSecond,
975320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                timezone);
976320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    }
977320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
978320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
979320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Create a Java instance of XML Schema builtin datatype time.</p>
980f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
981320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>A {@link DatatypeConstants#FIELD_UNDEFINED} value indicates that field is not set.</p>
982f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
983320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param hours number of hours
984320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param minutes number of minutes
985320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param seconds number of seconds
986320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param milliseconds number of milliseconds
987320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param timezone offset in minutes. {@link DatatypeConstants#FIELD_UNDEFINED} indicates optional field is not set.
988f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
989320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @return <code>XMLGregorianCalendar</code> created from parameter values.
990f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
991320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @see DatatypeConstants#FIELD_UNDEFINED
992320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *
993320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @throws IllegalArgumentException If any individual parameter's value is outside the maximum value constraint for the field
994320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   as determined by the Date/Time Data Mapping table in {@link XMLGregorianCalendar}
995320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   or if the composite values constitute an invalid <code>XMLGregorianCalendar</code> instance
996320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   as determined by {@link XMLGregorianCalendar#isValid()}.
997320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
998320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public XMLGregorianCalendar newXMLGregorianCalendarTime(
999320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int hours,
1000320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int minutes,
1001320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int seconds,
1002320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int milliseconds,
1003320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            final int timezone) {
1004320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
1005320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        // millisecond may be undefined
1006320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        // millisecond must be >= 0 millisecond <= 1000
1007320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        BigDecimal realMilliseconds = null; // undefined value
1008320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        if (milliseconds != DatatypeConstants.FIELD_UNDEFINED) {
1009320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            if (milliseconds < 0 || milliseconds > 1000) {
1010320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                throw new IllegalArgumentException(
1011320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                        "javax.xml.datatype.DatatypeFactory#newXMLGregorianCalendarTime("
1012320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                        + "int hours, int minutes, int seconds, int milliseconds, int timezone)"
1013320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                        + "with invalid milliseconds: " + milliseconds
1014320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                );
1015320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            }
1016320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            realMilliseconds = BigDecimal.valueOf((long) milliseconds, 3);
1017320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        }
1018320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
1019320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        return newXMLGregorianCalendarTime(
1020320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                hours,
1021320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                minutes,
1022320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                seconds,
1023320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                realMilliseconds,
1024320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                timezone
1025320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        );
1026320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    }
1027320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson}
1028