blob: c3bc76265994c49cd629877629b3fc93718f25df [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.sis.internal.jaxb.gml;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
import java.util.GregorianCalendar;
import javax.xml.datatype.DatatypeConstants;
import javax.xml.datatype.XMLGregorianCalendar;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import org.apache.sis.internal.jaxb.Context;
import org.apache.sis.internal.xml.XmlUtilities;
/**
* JAXB adapter wrapping the date value (as milliseconds elapsed since January 1st, 1970) in a
* {@link XMLGregorianCalendar} for the {@code xs:dateTime} type with the timezone forced to UTC.
* The milliseconds are omitted if not different than zero.
*
* @author Martin Desruisseaux (Geomatys)
* @version 0.4
*
* @see DateAdapter
* @see org.apache.sis.internal.jaxb.gco.GO_DateTime
*
* @since 0.4
* @module
*/
public final class UniversalTimeAdapter extends XmlAdapter<XMLGregorianCalendar, Date> {
/**
* The timezone of the date to marshal with this adapter.
*/
private static final TimeZone UTC = TimeZone.getTimeZone(org.apache.sis.internal.util.StandardDateFormat.UTC);
/**
* Empty constructor for JAXB only.
*/
public UniversalTimeAdapter() {
}
/**
* Converts a date read from a XML stream to the object which will contain
* the value. JAXB calls automatically this method at unmarshalling time.
*
* @param value the XML date, or {@code null}.
* @return the {@code java.util} date, or {@code null}.
*/
@Override
public Date unmarshal(final XMLGregorianCalendar value) {
return (value != null) ? XmlUtilities.toDate(Context.current(), value) : null;
}
/**
* Converts the date to the object to be marshalled in a XML file or stream.
* JAXB calls automatically this method at marshalling time.
*
* @param value the {@code java.util} date value, or {@code null}.
* @return the XML date, or {@code null}.
*/
@Override
public XMLGregorianCalendar marshal(final Date value) {
if (value != null) {
final GregorianCalendar calendar = new GregorianCalendar(UTC, Locale.ROOT);
calendar.setTime(value);
try {
final XMLGregorianCalendar gc = XmlUtilities.getDatatypeFactory().newXMLGregorianCalendar(calendar);
if (gc.getMillisecond() == 0) {
gc.setMillisecond(DatatypeConstants.FIELD_UNDEFINED);
}
return gc;
} catch (DatatypeConfigurationException e) {
Context.warningOccured(Context.current(), XmlAdapter.class, "marshal", e, true);
}
}
return null;
}
}