blob: 6189896cde9564dfd25ddc998afc8c6b2db1d0c5 [file] [log] [blame]
/********************************************************************************
* Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
*
* See the NOTICE file(s) distributed with this work for additional
* information regarding copyright ownership.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
********************************************************************************/
package org.eclipse.mdm.businessobjects.utils;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonTokenId;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.deser.std.UntypedObjectDeserializer;
/**
* JSON Deserializer for ISO 8601 compliant dates with format
*
* <pre>
* yyyy-MM-dd'T'HH:mm:ss'Z'
* </pre>
*
* @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
*
*/
class ISODateDeseralizer extends UntypedObjectDeserializer {
private static final long serialVersionUID = 1L;
transient DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'");
/**
* Deserialize JSON and try to parse every String as an ISO8601 date
*/
@Override
public Object deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
// try to parse every string as a date
// TODO anehmer on 2018-04-30: this approach could lead to a performance leak as
// every incoming string is tried to be converted into a date though the
// appraoch is very generic
if (jp.getCurrentTokenId() == JsonTokenId.ID_STRING) {
try {
return LocalDateTime.parse(jp.getText(), dateFormatter);
} catch (Exception e) {
return super.deserialize(jp, ctxt);
}
} else {
return super.deserialize(jp, ctxt);
}
}
}