aboutsummaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
authorLeif Åstrand <legioth@gmail.com>2017-01-05 18:22:50 +0200
committerPekka Hyvönen <pekka@vaadin.com>2017-01-05 18:22:50 +0200
commit34687c34de6199bfa897ff0b9b2d7e32afb28dfa (patch)
treec7019aed74337aaeaa5cee67378ce363bed502b0 /server
parent4130f1d87d6ab387a363a4e44e8746eddc049d13 (diff)
downloadvaadin-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.java80
-rw-r--r--server/src/test/java/com/vaadin/tests/data/converter/LocalDateToDateConverterTest.java100
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();
+ }
+
+}