Commit 78264359 authored by Noel Alonso's avatar Noel Alonso
Browse files

Añade de/serializer para fechas + tests

parent 19bbb299
Loading
Loading
Loading
Loading
+40 −0
Original line number Diff line number Diff line
package es.redmic.brokerlib.deserializer;

import java.io.IOException;

import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;

import es.redmic.exception.databinding.DateTimeDeserializerException;

public class CustomDateTimeDeserializer extends JsonDeserializer<DateTime> {

	final String pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZZ";

	@Override
	public DateTime deserialize(JsonParser jp, DeserializationContext ctxt) {

		DateTimeFormatter patternFormat = DateTimeFormat.forPattern(pattern);
		String dateTime;

		try {
			dateTime = jp.getText();
		} catch (IOException e) {
			throw new DateTimeDeserializerException(pattern, null, e);
		}

		try {
			return patternFormat.parseDateTime(dateTime).toDateTime(DateTimeZone.UTC);
		} catch (Exception e) {

			throw new DateTimeDeserializerException(pattern, dateTime, e);
		}

	}
}
 No newline at end of file
+27 −0
Original line number Diff line number Diff line
package es.redmic.brokerlib.serializer;

import java.io.IOException;

import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import es.redmic.exception.databinding.DateTimeSerializerException;

public class CustomDateTimeSerializer extends JsonSerializer<DateTime> {

	@Override
	public void serialize(DateTime value, JsonGenerator gen, SerializerProvider arg2) {

		String format = "yyyy-MM-dd'T'HH:mm:ss.SSSZZ";

		try {
			gen.writeString(value.withZone(DateTimeZone.UTC).toString(format));
		} catch (IOException e) {
			throw new DateTimeSerializerException(format, value.toString(), e);
		}
	}
}
+73 −0
Original line number Diff line number Diff line
package es.redmic.brokerlib.deserializer;

import static org.junit.Assert.assertEquals;

import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.junit.BeforeClass;
import org.junit.Test;

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;

import es.redmic.exception.databinding.DateTimeDeserializerException;

public class CustomDateTimeDeserializerTest {

	ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.WRAP_EXCEPTIONS, false);

	static DateTime daylightSavingTimeSummerExpected;
	static String daylightSavingTimeSummerSource;

	static DateTime daylightSavingTimeWinterExpected;
	static String daylightSavingTimeWinterSource;

	@BeforeClass
	public static void setUp() {

		daylightSavingTimeSummerExpected = new DateTime(2017, 3, 26, 0, 0, 0, 0, DateTimeZone.UTC);
		daylightSavingTimeSummerSource = "2017-03-26T01:00:00.000+01:00";

		daylightSavingTimeWinterExpected = new DateTime(2017, 10, 29, 1, 0, 0, 0, DateTimeZone.UTC);
		daylightSavingTimeWinterSource = "2017-10-29T01:00:00.000+00:00";
	}

	@Test
	public void checkDaylightSavingTimeSummerDeserializer_IsCorrect_IfFormatIsCorrect() throws Exception {

		DateTime item = deserialize(daylightSavingTimeSummerSource);
		assertEquals(item, daylightSavingTimeSummerExpected);
	}

	@Test
	public void checkDaylightSavingTimeWinterDeserializer_IsCorrect_IfFormatIsCorrect() throws Exception {

		DateTime item = deserialize(daylightSavingTimeWinterSource);
		assertEquals(item, daylightSavingTimeWinterExpected);
	}

	@Test(expected = DateTimeDeserializerException.class)
	public void checkDaylightSavingTimeWinterDeserializer_ThrowException_IfFormatIsWrong() throws Exception {

		deserialize("26-03-2017T01:00:00.000+01:00");
	}

	private DateTime deserialize(String dateTime) throws Exception {

		TestObject testObject = mapper.readValue("{\"date\":" + mapper.writeValueAsString(dateTime) + "}",
				TestObject.class);

		return testObject.getDate();
	}

	private static class TestObject {

		@JsonDeserialize(using = CustomDateTimeDeserializer.class)
		private final DateTime date = null;

		public DateTime getDate() {
			return date;
		}
	}
}
 No newline at end of file
+60 −0
Original line number Diff line number Diff line
package es.redmic.brokerlib.serializer;

import static org.junit.Assert.assertTrue;

import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.junit.BeforeClass;
import org.junit.Test;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.datatype.joda.JodaModule;

public class CustomDateTimeSerializerTest {

	static ObjectMapper mapper = new ObjectMapper();

	static String dateTimeExpected;
	static DateTime dateTimeSource;

	@BeforeClass
	public static void setUp() {

		mapper.registerModule(new JodaModule());
		mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

		dateTimeExpected = "\"2015-03-17T01:00:00.000+00:00\"";
		dateTimeSource = new DateTime(2015, 3, 17, 1, 0, 0, 0, DateTimeZone.UTC);
	}

	@Test
	public void checkDateTimeSerializer_IsCorrect_IfIsEqualToExpected() throws Exception {

		assertTrue(serialize(dateTimeSource).contains(dateTimeExpected));
	}

	private String serialize(DateTime dateTime) throws Exception {

		TestObject testObject = new TestObject();
		testObject.setDate(dateTime);

		return mapper.writeValueAsString(testObject);
	}

	private class TestObject {

		private DateTime date;

		public void setDate(DateTime date) {
			this.date = date;
		}

		@JsonSerialize(using = CustomDateTimeSerializer.class)
		public DateTime getDate() {
			return date;
		}
	}

}
 No newline at end of file