diff options
author | Leif Åstrand <legioth@gmail.com> | 2017-01-05 18:22:50 +0200 |
---|---|---|
committer | Pekka Hyvönen <pekka@vaadin.com> | 2017-01-05 18:22:50 +0200 |
commit | 34687c34de6199bfa897ff0b9b2d7e32afb28dfa (patch) | |
tree | c7019aed74337aaeaa5cee67378ce363bed502b0 /server | |
parent | 4130f1d87d6ab387a363a4e44e8746eddc049d13 (diff) | |
download | vaadin-framework-34687c34de6199bfa897ff0b9b2d7e32afb28dfa.tar.gz vaadin-framework-34687c34de6199bfa897ff0b9b2d7e32afb28dfa.zip |
Add LocalDateToDateConverter (#8147)
* Add LocalDateToDateConverter
Diffstat (limited to 'server')
-rw-r--r-- | server/src/main/java/com/vaadin/data/converter/LocalDateToDateConverter.java | 80 | ||||
-rw-r--r-- | server/src/test/java/com/vaadin/tests/data/converter/LocalDateToDateConverterTest.java | 100 |
2 files changed, 180 insertions, 0 deletions
diff --git a/server/src/main/java/com/vaadin/data/converter/LocalDateToDateConverter.java b/server/src/main/java/com/vaadin/data/converter/LocalDateToDateConverter.java new file mode 100644 index 0000000000..f649091039 --- /dev/null +++ b/server/src/main/java/com/vaadin/data/converter/LocalDateToDateConverter.java @@ -0,0 +1,80 @@ +/* + * Copyright 2000-2016 Vaadin Ltd. + * + * Licensed 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 com.vaadin.data.converter; + +import java.time.Instant; +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.Date; +import java.util.Objects; + +import com.vaadin.data.Converter; +import com.vaadin.data.Result; +import com.vaadin.data.ValueContext; +import com.vaadin.ui.DateField; +import com.vaadin.ui.InlineDateField; + +/** + * A converter that converts between <code>LocalDate</code> and + * <code>Date</code>. This is used when a {@link DateField} or + * {@link InlineDateField} is bound to a {@link Date} property. + * + * @author Vaadin Ltd + */ +public class LocalDateToDateConverter implements Converter<LocalDate, Date> { + + private ZoneId zoneId; + + /** + * Creates a new converter using the given time zone. + * + * @param zoneId + * the time zone id to use, not <code>null</code> + */ + public LocalDateToDateConverter(ZoneId zoneId) { + this.zoneId = Objects.requireNonNull(zoneId, "Zone id cannot be null"); + } + + /** + * Creates a new converter using the system's default time zone. + * + * @see ZoneId#systemDefault() + */ + public LocalDateToDateConverter() { + this(ZoneId.systemDefault()); + } + + @Override + public Result<Date> convertToModel(LocalDate localDate, + ValueContext context) { + if (localDate == null) { + return Result.ok(null); + } + + return Result.ok(Date.from(localDate.atStartOfDay(zoneId).toInstant())); + } + + @Override + public LocalDate convertToPresentation(Date date, ValueContext context) { + if (date == null) { + return null; + } + + return Instant.ofEpochMilli(date.getTime()).atZone(zoneId) + .toLocalDate(); + } + +} diff --git a/server/src/test/java/com/vaadin/tests/data/converter/LocalDateToDateConverterTest.java b/server/src/test/java/com/vaadin/tests/data/converter/LocalDateToDateConverterTest.java new file mode 100644 index 0000000000..9517ad783b --- /dev/null +++ b/server/src/test/java/com/vaadin/tests/data/converter/LocalDateToDateConverterTest.java @@ -0,0 +1,100 @@ +/* + * Copyright 2000-2016 Vaadin Ltd. + * + * Licensed 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 com.vaadin.tests.data.converter; + +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.Calendar; +import java.util.Date; +import java.util.TimeZone; + +import org.junit.Assert; +import org.junit.Test; + +import com.vaadin.data.Binder; +import com.vaadin.data.ValidationException; +import com.vaadin.data.ValueContext; +import com.vaadin.data.converter.LocalDateToDateConverter; +import com.vaadin.ui.DateField; + +public class LocalDateToDateConverterTest extends AbstractConverterTest { + + private static final String TIME_ZONE = "UTC"; + + private static final LocalDate LOCAL_DATE = LocalDate.of(2017, 1, 1); + private static final Date DATE = createDate(); + + @Override + protected LocalDateToDateConverter getConverter() { + return new LocalDateToDateConverter(ZoneId.of(TIME_ZONE)); + } + + @Test + public void testToModel() { + assertValue(DATE, + getConverter().convertToModel(LOCAL_DATE, new ValueContext())); + } + + @Test + public void testToModelFromSqlDate() { + // Check that SQL dates also work (e.g. java.sql.Date.toInstant throws) + assertValue(new java.sql.Date(DATE.getTime()), + getConverter().convertToModel(LOCAL_DATE, new ValueContext())); + } + + @Test + public void testToPresentation() { + Assert.assertEquals(LOCAL_DATE, + getConverter().convertToPresentation(DATE, new ValueContext())); + } + + @Test + public void useWithBinder() throws ValidationException { + Binder<BeanWithDate> binder = new Binder<>(); + DateField dateField = new DateField(); + + binder.forField(dateField).withConverter(getConverter()) + .bind(BeanWithDate::getDate, BeanWithDate::setDate); + + dateField.setValue(LOCAL_DATE); + + BeanWithDate bean = new BeanWithDate(); + binder.writeBean(bean); + + Assert.assertEquals(DATE, bean.getDate()); + } + + public static class BeanWithDate { + private Date date; + + public void setDate(Date date) { + this.date = date; + } + + public Date getDate() { + return date; + } + } + + private static Date createDate() { + Calendar calendar = Calendar + .getInstance(TimeZone.getTimeZone(TIME_ZONE)); + calendar.clear(); + calendar.set(2017, Calendar.JANUARY, 1); + return calendar.getTime(); + } + +} |