/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2008 jOpenDocument, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU
* General Public License Version 3 only ("GPL").
* You may not use this file except in compliance with the License.
* You can obtain a copy of the License at http://www.gnu.org/licenses/gpl-3.0.html
* See the License for the specific language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*
*/
package org.jopendocument.util;
import java.text.FieldPosition;
import java.text.Format;
import java.text.ParsePosition;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
/**
* Format a {@link Date} according to <a href="http://www.w3.org/TR/xmlschema-2/#dateTime">W3C XML
* Schema 1.0 Part 2, Section 3.2.7-14</a>.
*
* @author Sylvain CUAZ
* @see XMLGregorianCalendar
*/
public class XMLDateFormat extends Format {
private final static DatatypeFactory factory;
static {
try {
factory = DatatypeFactory.newInstance();
} catch (DatatypeConfigurationException e) {
// shouldn't happen since an implementation is provided with the jre
throw new IllegalStateException(e);
}
}
@Override
public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) {
final GregorianCalendar cal;
if (obj instanceof GregorianCalendar)
cal = (GregorianCalendar) obj;
else {
cal = new GregorianCalendar();
cal.setTime((Date) obj);
}
return toAppendTo.append(factory.newXMLGregorianCalendar(cal).toXMLFormat());
}
@Override
public Date parseObject(String source, ParsePosition pos) {
try {
final XMLGregorianCalendar res = factory.newXMLGregorianCalendar(source.substring(pos.getIndex()));
pos.setIndex(source.length());
return res.toGregorianCalendar().getTime();
} catch (Exception e) {
e.printStackTrace();
pos.setErrorIndex(pos.getIndex());
return null;
}
}
}