/** * Copyright (C) 2011-2015 The XDocReport Team <xdocreport@googlegroups.com> * * All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package fr.opensagres.xdocreport.core.utils; import java.util.Date; import java.util.GregorianCalendar; import javax.xml.datatype.DatatypeConfigurationException; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.XMLGregorianCalendar; public class DatatypeUtils { /** JAXP DatatypeFactory */ private static DatatypeFactory datatypeFactory; /** * Gets a static instance of a JAXP DatatypeFactory. * * @return the factory or null if the factory could not be created */ private static DatatypeFactory getDataTypeFactory() { if ( datatypeFactory == null ) { try { datatypeFactory = DatatypeFactory.newInstance(); } catch ( DatatypeConfigurationException e ) { e.printStackTrace(); } } return datatypeFactory; } /** * <p> * Return the lexical representation of the given Date The format is specified in <a * href="http://www.w3.org/TR/xmlschema-2/#dateTime-order">XML Schema 1.0 Part 2, Section 3.2.[7-14].1, <i>Lexical * Representation</i>".</a> * </p> * <p> * Specific target lexical representation format is determined by {@link #getXMLSchemaType()}. * </p> * * @return XML, as <code>String</code>, representation of this <code>XMLGregorianCalendar</code> * @throws IllegalStateException if the combination of set fields does not match one of the eight defined XML Schema * builtin date/time datatypes. */ public static String formatAsXSDateTime( Date date ) { GregorianCalendar gCalendar = new GregorianCalendar(); gCalendar.setTime( date ); XMLGregorianCalendar xmlCalendar = getDataTypeFactory().newXMLGregorianCalendar( gCalendar ); return xmlCalendar.toXMLFormat(); } /** * <p> * Create a new Date by parsing the String as a lexical representation. * </p> * <p> * Parsing the lexical string representation is defined in <a * href="http://www.w3.org/TR/xmlschema-2/#dateTime-order">XML Schema 1.0 Part 2, Section 3.2.[7-14].1, * <em>Lexical Representation</em>.</a> * </p> * <p> * The string representation may not have any leading and trailing whitespaces. * </p> * <p> * The parsing is done field by field so that the following holds for any lexically correct String x: * </p> * * <pre> * newXMLGregorianCalendar( x ).toXMLFormat().equals( x ) * </pre> * <p> * Except for the noted lexical/canonical representation mismatches listed in <a * href="http://www.w3.org/2001/05/xmlschema-errata#e2-45"> XML Schema 1.0 errata, Section 3.2.7.2</a>. * </p> * * @param lexicalRepresentation Lexical representation of one the eight XML Schema date/time datatypes. * @return <code>XMLGregorianCalendar</code> created from the <code>lexicalRepresentation</code>. * @throws IllegalArgumentException If the <code>lexicalRepresentation</code> is not a valid * <code>XMLGregorianCalendar</code>. * @throws NullPointerException If <code>lexicalRepresentation</code> is <code>null</code>. */ public static Date parseXSDateTime( String lexicalRepresentation ) { XMLGregorianCalendar xmlCalendar = getDataTypeFactory().newXMLGregorianCalendar( lexicalRepresentation ); return xmlCalendar.toGregorianCalendar().getTime(); } }