Repository: wicket
Updated Branches:
  refs/heads/WICKET-6105-java.time adeae9cea -> aff679fe3


DateTimeField is modified to work with LocalDateTime, ZonedDateTimeField is 
created, code clean-up


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/aff679fe
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/aff679fe
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/aff679fe

Branch: refs/heads/WICKET-6105-java.time
Commit: aff679fe3c37054202ffc3501ed760abacf53a63
Parents: adeae9c
Author: Maxim Solodovnik <[email protected]>
Authored: Mon Oct 2 17:13:29 2017 +0700
Committer: Maxim Solodovnik <[email protected]>
Committed: Mon Oct 2 17:13:29 2017 +0700

----------------------------------------------------------------------
 wicket-datetime/pom.xml                         |  64 ----
 .../src/main/resources/META-INF/NOTICE          |  11 -
 wicket-datetime/src/test/java/log4j.properties  |  18 --
 .../util/license/ApacheLicenceHeaderTest.java   |  60 ----
 .../util/markup/xhtml/WellFormedXmlTest.java    |  34 ---
 .../form/datetime/AbstractDateTimeField.html    |  23 ++
 .../form/datetime/AbstractDateTimeField.java    | 244 ++++++++++++++++
 .../markup/html/form/datetime/DateLabel.java    | 289 -------------------
 .../html/form/datetime/DateTimeField.html       |  23 --
 .../html/form/datetime/DateTimeField.java       | 199 ++-----------
 .../html/form/datetime/ZonedDateTimeField.java  | 154 ++++++++++
 11 files changed, 443 insertions(+), 676 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/aff679fe/wicket-datetime/pom.xml
----------------------------------------------------------------------
diff --git a/wicket-datetime/pom.xml b/wicket-datetime/pom.xml
deleted file mode 100644
index 4a17324..0000000
--- a/wicket-datetime/pom.xml
+++ /dev/null
@@ -1,64 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   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.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/maven-v4_0_0.xsd";>
-       <modelVersion>4.0.0</modelVersion>
-       <parent>
-               <groupId>org.apache.wicket</groupId>
-               <artifactId>wicket-parent</artifactId>
-               <version>8.0.0-SNAPSHOT</version>
-               <relativePath>../pom.xml</relativePath>
-       </parent>
-       <artifactId>wicket-datetime</artifactId>
-       <packaging>bundle</packaging>
-       <name>Wicket Date/Time</name>
-       <description>Date/Time components and utilities for Wicket</description>
-       <dependencies>
-               <dependency>
-                       <groupId>org.apache.wicket</groupId>
-                       <artifactId>wicket-core</artifactId>
-               </dependency>
-               <dependency>
-                       <groupId>org.apache.wicket</groupId>
-                       <artifactId>wicket-extensions</artifactId>
-               </dependency>
-       </dependencies>
-       <build>
-               <plugins>
-                       <plugin>
-                               <groupId>org.apache.felix</groupId>
-                               <artifactId>maven-bundle-plugin</artifactId>
-                               <executions>
-                                       <execution>
-                                               <id>bundle-manifest</id>
-                                               <phase>process-classes</phase>
-                                               <goals>
-                                                       <goal>manifest</goal>
-                                               </goals>
-                                               <configuration>
-                                                       <instructions>
-                                                               <Export-Package>
-                                                                       
!org.apache.wicket.extensions.yui.yahoo-dom-event,* 
-                                                               
</Export-Package>
-                                                       </instructions>
-                                               </configuration>
-                                       </execution>
-                               </executions>
-                       </plugin>
-               </plugins>
-       </build>
-</project>

http://git-wip-us.apache.org/repos/asf/wicket/blob/aff679fe/wicket-datetime/src/main/resources/META-INF/NOTICE
----------------------------------------------------------------------
diff --git a/wicket-datetime/src/main/resources/META-INF/NOTICE 
b/wicket-datetime/src/main/resources/META-INF/NOTICE
deleted file mode 100644
index 48b098e..0000000
--- a/wicket-datetime/src/main/resources/META-INF/NOTICE
+++ /dev/null
@@ -1,11 +0,0 @@
-   Apache Wicket Date Time
-   Copyright 2006-2016 Apache Software Foundation
-
-   This product includes software developed at
-   The Apache Software Foundation (http://www.apache.org/).
-   
-   Contains code of the Yahoo User Interface library (version: 2.8.2r1),
-   released under the BSD License:
-   http://developer.yahoo.net/yui/license.txt
-   Copyright (c) 2010, Yahoo! Inc.
-   
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/wicket/blob/aff679fe/wicket-datetime/src/test/java/log4j.properties
----------------------------------------------------------------------
diff --git a/wicket-datetime/src/test/java/log4j.properties 
b/wicket-datetime/src/test/java/log4j.properties
deleted file mode 100644
index e3bc2c7..0000000
--- a/wicket-datetime/src/test/java/log4j.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-log4j.debug=false
-
-log4j.rootLogger=INFO,Stdout
-
-# please keep this setting FATAL to avoid questions from users
-# why there are stacktraces in the test output. You can turn it
-# down if you need to when testing, but don't check it in. (eelco)
-
-# changing back to ERROR. Looks like in some cases the log4j.properties
-# in wicket gets picked which results in not printing the exceptions
-# and that can be a bit dangerous (matej)
-log4j.logger.org.apache.wicket=ERROR
-#log4j.logger.org.apache.wicket.resource=FATAL
-#log4j.logger.org.apache.wicket.Localizer=FATAL
-
-log4j.appender.Stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.Stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.Stdout.layout.conversionPattern=%-5p - %-26.26c{1} - %m\n

http://git-wip-us.apache.org/repos/asf/wicket/blob/aff679fe/wicket-datetime/src/test/java/org/apache/wicket/util/license/ApacheLicenceHeaderTest.java
----------------------------------------------------------------------
diff --git 
a/wicket-datetime/src/test/java/org/apache/wicket/util/license/ApacheLicenceHeaderTest.java
 
b/wicket-datetime/src/test/java/org/apache/wicket/util/license/ApacheLicenceHeaderTest.java
deleted file mode 100644
index 23887a3..0000000
--- 
a/wicket-datetime/src/test/java/org/apache/wicket/util/license/ApacheLicenceHeaderTest.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * 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.wicket.util.license;
-
-/**
- * Test that the license headers are in place in this project. The tests are 
run from
- * {@link ApacheLicenseHeaderTestCase}, but you can add project specific tests 
here if needed.
- * 
- * @author Frank Bille Jensen (frankbille)
- */
-public class ApacheLicenceHeaderTest extends ApacheLicenseHeaderTestCase
-{
-       /**
-        * Construct.
-        */
-       public ApacheLicenceHeaderTest()
-       {
-               // addHeaders = true;
-
-               /*
-                * See NOTICE.txt
-                */
-               htmlIgnore.add("src/main/java/org/apache/wicket/util/diff");
-
-               /*
-                * YUI lib. See NOTICE
-                */
-               
cssIgnore.add("src/main/java/org/apache/wicket/extensions/yui/calendar/assets/skins/sam/calendar.css");
-               
cssIgnore.add("src/main/java/org/apache/wicket/extensions/yui/calendar/assets/skins/sam/calendar.css");
-
-               /*
-                * YUI lib. See NOTICE
-                */
-               
javaScriptIgnore.add("src/main/java/org/apache/wicket/extensions/yui/yuiloader/yuiloader.js");
-               
javaScriptIgnore.add("src/main/java/org/apache/wicket/extensions/yui/yuiloader/yuiloader-min.js");
-               
javaScriptIgnore.add("src/main/java/org/apache/wicket/extensions/yui/yahoo/yahoo.js");
-               
javaScriptIgnore.add("src/main/java/org/apache/wicket/extensions/yui/yahoo/yahoo-min.js");
-               
javaScriptIgnore.add("src/main/java/org/apache/wicket/extensions/yui/yahoodomevent/yahoo-dom-event.js");
-               
javaScriptIgnore.add("src/main/java/org/apache/wicket/extensions/yui/event/event.js");
-               
javaScriptIgnore.add("src/main/java/org/apache/wicket/extensions/yui/event/event-min.js");
-               
javaScriptIgnore.add("src/main/java/org/apache/wicket/extensions/yui/dom/dom.js");
-               
javaScriptIgnore.add("src/main/java/org/apache/wicket/extensions/yui/dom/dom-min.js");
-               
javaScriptIgnore.add("src/main/java/org/apache/wicket/extensions/yui/calendar/calendar.js");
-               
javaScriptIgnore.add("src/main/java/org/apache/wicket/extensions/yui/calendar/calendar-min.js");
-       }
-}

http://git-wip-us.apache.org/repos/asf/wicket/blob/aff679fe/wicket-datetime/src/test/java/org/apache/wicket/util/markup/xhtml/WellFormedXmlTest.java
----------------------------------------------------------------------
diff --git 
a/wicket-datetime/src/test/java/org/apache/wicket/util/markup/xhtml/WellFormedXmlTest.java
 
b/wicket-datetime/src/test/java/org/apache/wicket/util/markup/xhtml/WellFormedXmlTest.java
deleted file mode 100644
index a8e7628..0000000
--- 
a/wicket-datetime/src/test/java/org/apache/wicket/util/markup/xhtml/WellFormedXmlTest.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * 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.wicket.util.markup.xhtml;
-
-import org.junit.Test;
-
-/**
- * Checks that the html markup files are well formed xml-s.
- * 
- * @author akiraly
- */
-public class WellFormedXmlTest extends WellFormedXmlTestCase
-{
-       @Test
-       @Override
-       public void markupFiles()
-       {
-               super.markupFiles();
-       }
-}

http://git-wip-us.apache.org/repos/asf/wicket/blob/aff679fe/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/AbstractDateTimeField.html
----------------------------------------------------------------------
diff --git 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/AbstractDateTimeField.html
 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/AbstractDateTimeField.html
new file mode 100644
index 0000000..d92f2ce
--- /dev/null
+++ 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/AbstractDateTimeField.html
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+   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.
+-->
+<wicket:panel xmlns:wicket="http://wicket.apache.org";>
+  <span style="white-space: nowrap;">
+    <input type="text" wicket:id="date" size="12" />
+    <span wicket:id="time" />
+  </span>
+</wicket:panel>

http://git-wip-us.apache.org/repos/asf/wicket/blob/aff679fe/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/AbstractDateTimeField.java
----------------------------------------------------------------------
diff --git 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/AbstractDateTimeField.java
 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/AbstractDateTimeField.java
new file mode 100644
index 0000000..5ec27a6
--- /dev/null
+++ 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/AbstractDateTimeField.java
@@ -0,0 +1,244 @@
+/*
+ * 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.wicket.extensions.markup.html.form.datetime;
+
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.time.temporal.Temporal;
+import java.util.Date;
+import java.util.Locale;
+
+import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
+import org.apache.wicket.markup.html.form.FormComponentPanel;
+import org.apache.wicket.model.IModel;
+
+/**
+ * Works on a {@link java.time.ZonedDateTime} object. Displays a date field 
and a DatePicker, a field
+ * for hours and a field for minutes, and an AM/PM field. The format (12h/24h) 
of the hours field
+ * depends on the time format of this {@link AbstractDateTimeField}'s {@link 
Locale}, as does the visibility
+ * of the AM/PM field (see {@link AbstractDateTimeField#use12HourFormat}).
+ * <p>
+ * <strong>Ajaxifying the DateTimeField</strong>: If you want to update a 
DateTimeField with an
+ * {@link AjaxFormComponentUpdatingBehavior}, you have to attach it to the 
contained
+ * {@link DateField} by overriding {@link #newDateTextField(String, IModel)} 
and calling
+ * {@link #processInput()}:
+ * 
+ * <pre>{@code
+ *  DateTimeField dateTimeField = new DateTimeField(...) {
+ *    protected DateTextField newDateTextField(String id, PropertyModel<Date> 
dateFieldModel)
+ *    {
+ *      DateTextField dateField = super.newDateTextField(id, dateFieldModel);  
   
+ *      dateField.add(new AjaxFormComponentUpdatingBehavior("change") {
+ *        protected void onUpdate(AjaxRequestTarget target) {
+ *          processInput(); // let DateTimeField process input too
+ *
+ *          ...
+ *        }
+ *      });
+ *      return recorder;
+ *    }
+ *  }
+ * }</pre>
+ * 
+ * @author eelcohillenius
+ * @see DateField for a variant with just the date field and date picker
+ */
+abstract class AbstractDateTimeField<T extends Temporal> extends 
FormComponentPanel<T>
+{
+       private static final long serialVersionUID = 1L;
+
+       // Component-IDs
+       protected static final String DATE = "date";
+       protected static final String TIME = "time";
+
+       // The date TextField and it's associated model object
+       // Note that any time information in date will be ignored
+       private DateField dateField;
+       private TimeField timeField;
+
+       /**
+        * Construct.
+        * 
+        * @param id
+        */
+       public AbstractDateTimeField(final String id)
+       {
+               this(id, null);
+       }
+
+       /**
+        * Construct.
+        * 
+        * @param id
+        * @param model
+        */
+       public AbstractDateTimeField(final String id, final IModel<T> model)
+       {
+               super(id, model);
+
+               // Create and add the date TextField
+               add(dateField = newDateField(DATE, new DateModel()));
+               add(timeField = newTimeField(TIME, new TimeModel()));
+       }
+
+       /**
+        * 
+        * @return The date TextField
+        */
+       protected final DateField getDateField()
+       {
+               return dateField;
+       }
+
+       /**
+        * 
+        * @return The date TextField
+        */
+       protected final TimeField getTimeField()
+       {
+               return timeField;
+       }
+
+       @Override
+       public String getInput()
+       {
+               // since we override convertInput, we can let this method 
return a value
+               // that is just suitable for error reporting
+               return String.format("%s, %s", dateField.getInput(), 
timeField.getInput());
+       }
+
+       /**
+        * Sets the converted input, which is an instance of {@link Date}, 
possibly null. It combines
+        * the inputs of the nested date, hours, minutes and am/pm fields and 
constructs a date from it.
+        * <p>
+        * Note that overriding this method is a better option than overriding 
{@link #updateModel()}
+        * like the first versions of this class did. The reason for that is 
that this method can be
+        * used by form validators without having to depend on the actual model 
being updated, and this
+        * method is called by the default implementation of {@link 
#updateModel()} anyway (so we don't
+        * have to override that anymore).
+        */
+       @Override
+       public void convertInput()
+       {
+               try
+               {
+                       // Get the converted input values
+                       LocalDate localDate = dateField.getConvertedInput();
+
+                       if (localDate == null)
+                       {
+                               return;
+                       }
+
+                       // Use the input to create a date object with proper 
timezone
+                       LocalTime localTime = timeField.getConvertedInput();
+
+                       // The date will be in the server's timezone
+                       setConvertedInput(performConvert(localDate, localTime));
+               }
+               catch (RuntimeException e)
+               {
+                       AbstractDateTimeField.this.error(e.getMessage());
+                       invalid();
+               }
+       }
+
+       abstract T performConvert(LocalDate date, LocalTime time);
+
+       abstract void prepareObject();
+
+       /**
+        * create a new {@link DateField} instance to be added to this panel.
+        * 
+        * @param id
+        *            the component id
+        * @param dateFieldModel
+        *            model that should be used by the {@link DateField}
+        * @return a new date text field instance
+        */
+       protected DateField newDateField(String id, IModel<LocalDate> 
dateFieldModel)
+       {
+               return DateField.forShortStyle(id, dateFieldModel);
+       }
+
+       /**
+        * create a new {@link TimeField} instance to be added to this panel.
+        * 
+        * @param id
+        *            the component id
+        * @param timeFieldModel
+        *            model that should be used by the {@link TimeField}
+        * @return a new time text field instance
+        */
+       protected TimeField newTimeField(String id, IModel<LocalTime> 
timeFieldModel)
+       {
+               return TimeField.forShortStyle(id, timeFieldModel);
+       }
+
+       /**
+        * @see org.apache.wicket.Component#onBeforeRender()
+        */
+       @Override
+       protected void onBeforeRender()
+       {
+               dateField.setRequired(isRequired());
+               timeField.setRequired(isRequired());
+
+               prepareObject();
+
+               super.onBeforeRender();
+       }
+
+       abstract LocalDate getLocalDate();
+       abstract void setLocalDate(LocalDate date);
+       abstract LocalTime getLocalTime();
+       abstract void setLocalTime(LocalTime time);
+
+       protected class DateModel implements IModel<LocalDate>
+       {
+               private static final long serialVersionUID = 1L;
+
+               @Override
+               public LocalDate getObject()
+               {
+                       return getLocalDate();
+               }
+
+               @Override
+               public void setObject(LocalDate date)
+               {
+                       setLocalDate(date);
+               }
+       }
+
+       protected class TimeModel implements IModel<LocalTime>
+       {
+               private static final long serialVersionUID = 1L;
+
+               @Override
+               public LocalTime getObject()
+               {
+                       return getLocalTime();
+               }
+
+               @Override
+               public void setObject(LocalTime time)
+               {
+                       setLocalTime(time);
+               }
+       }
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/aff679fe/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateLabel.java
----------------------------------------------------------------------
diff --git 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateLabel.java
 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateLabel.java
deleted file mode 100644
index 1f8531a..0000000
--- 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateLabel.java
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
- * 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.wicket.extensions.markup.html.form.datetime;
-
-import java.time.LocalDate;
-import java.time.format.FormatStyle;
-import java.util.Date;
-
-import org.apache.wicket.IGenericComponent;
-import org.apache.wicket.markup.ComponentTag;
-import org.apache.wicket.markup.MarkupStream;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.util.convert.IConverter;
-import org.apache.wicket.util.lang.Args;
-
-
-/**
- * A label that is mapped to a {@link java.time.LocalDate} object and that uses
- * {@link java.time.format.DateTimeFormatter} to format values.
- * <p>
- * You can provide a date pattern in two of the constructors. When not 
provided,
- * {@link java.time.format.FormatStyle#SHORT} will be used.
- * </p>
- * <p>
- * A special option is applyTimeZoneDifference which is an option that says 
whether to correct for
- * the difference between the client's time zone and server's time zone. This 
is true by default.
- * </p>
- * 
- * @see java.time.LocalDate
- * @see java.time.format.DateTimeFormatter
- */
-public class DateLabel extends Label implements IGenericComponent<LocalDate, 
DateLabel>
-{
-       private static final long serialVersionUID = 1L;
-
-       /**
-        * Creates a new DateLabel defaulting to using a short date pattern
-        * 
-        * @param id
-        *            The id of the text field
-        * @param model
-        *            The model
-        * @param datePattern
-        *            The pattern to use. Must be not null. See
-        *            {@link java.time.format.DateTimeFormatter} for available 
patterns.
-        * @return new instance
-        * 
-        * @see org.apache.wicket.markup.html.form.TextField
-        */
-       public static DateLabel forDatePattern(String id, IModel<LocalDate> 
model, String datePattern)
-       {
-               return new DateLabel(id, model, new 
PatternZonedDateTimeConverter(datePattern, true));
-       }
-
-       /**
-        * Creates a new DateLabel defaulting to using a short date pattern
-        * 
-        * @param id
-        *            The id of the text field
-        * @param datePattern
-        *            The pattern to use. Must be not null. See
-        *            {@link java.time.format.DateTimeFormatter} for available 
patterns.
-        * @return new instance
-        * 
-        * @see org.apache.wicket.markup.html.form.TextField
-        */
-       public static DateLabel forDatePattern(String id, String datePattern)
-       {
-               return forDatePattern(id, null, datePattern);
-       }
-
-       /**
-        * Creates a new DateLabel defaulting to using a short date pattern
-        * 
-        * @param id
-        *            The id of the text field
-        * @param model
-        *            The model
-        * @param dateStyle
-        *            style to use in case no pattern is provided.
-        * @return new instance
-        * 
-        * @see org.apache.wicket.markup.html.form.TextField
-        */
-       public static DateLabel forDateStyle(String id, IModel<LocalDate> 
model, FormatStyle dateStyle)
-       {
-               return new DateLabel(id, model, new 
StyleZonedDateTimeConverter(dateStyle, null, true));
-       }
-
-       /**
-        * Creates a new DateLabel defaulting to using a short date pattern
-        * 
-        * @param id
-        *            The id of the text field
-        * @param dateStyle
-        *            style to use in case no pattern is provided.
-        * @return new instance
-        * 
-        * @see org.apache.wicket.markup.html.form.TextField
-        */
-       public static DateLabel forDateStyle(String id, FormatStyle dateStyle)
-       {
-               return forDateStyle(id, null, dateStyle);
-       }
-
-       /**
-        * Creates a new DateLabel defaulting to using a short date pattern
-        * 
-        * @param id
-        *            The id of the text field
-        * @return new instance
-        * 
-        * @see org.apache.wicket.markup.html.form.TextField
-        */
-       public static DateLabel forShortStyle(String id)
-       {
-               return forShortStyle(id, null);
-       }
-
-       /**
-        * Creates a new DateLabel defaulting to using a short date pattern
-        * 
-        * @param id
-        *            The id of the text field
-        * @param model
-        *            The model
-        * @return new instance
-        * 
-        * @see org.apache.wicket.markup.html.form.TextField
-        */
-       public static DateLabel forShortStyle(String id, IModel<LocalDate> 
model)
-       {
-               return new DateLabel(id, model, new 
StyleZonedDateTimeConverter(true));
-       }
-
-       /**
-        * Creates a new DateLabel using the provided converter.
-        * 
-        * @param id
-        *            The id of the text field
-        * @param converter
-        *            the date converter
-        * @return new instance
-        * 
-        * @see org.apache.wicket.markup.html.form.TextField
-        */
-       public static DateLabel withConverter(String id, ZonedDateTimeConverter 
converter)
-       {
-               return withConverter(id, null, converter);
-       }
-
-       /**
-        * Creates a new DateLabel using the provided converter.
-        * 
-        * @param id
-        *            The id of the text field
-        * @param model
-        *            The model
-        * @param converter
-        *            the date converter
-        * @return new instance
-        * 
-        * @see org.apache.wicket.markup.html.form.TextField
-        */
-       public static DateLabel withConverter(String id, IModel<LocalDate> 
model, ZonedDateTimeConverter converter)
-       {
-               return new DateLabel(id, model, converter);
-       }
-
-       /** optionally prepend to label. */
-       private String after;
-
-       /** optionally append to label. */
-       private String before;
-
-       /**
-        * The converter for the Label
-        */
-       private final ZonedDateTimeConverter converter;
-
-       /**
-        * Construct with a converter.
-        * 
-        * @param id
-        *            The component id
-        * @param converter
-        *            The converter to use
-        */
-       public DateLabel(String id, ZonedDateTimeConverter converter)
-       {
-               this(id, null, converter);
-       }
-
-       /**
-        * Construct with a converter.
-        * 
-        * @param id
-        *            The component id
-        * @param model
-        *            The model
-        * @param converter
-        *            The converter to use
-        */
-       public DateLabel(String id, IModel<LocalDate> model, 
ZonedDateTimeConverter converter)
-       {
-               super(id, model);
-               this.converter = Args.notNull(converter, "converter");
-       }
-
-       /**
-        * @return after append to label or null
-        */
-       public String getAfter()
-       {
-               return after;
-       }
-
-       /**
-        * @return before prepend to label or null
-        */
-       public String getBefore()
-       {
-               return before;
-       }
-
-       /**
-        * Returns the specialized converter.
-        */
-       @Override
-       protected IConverter<?> createConverter(Class<?> type)
-       {
-               if (Date.class.isAssignableFrom(type))
-               {
-                       return converter;
-               }
-               return null;
-       }
-
-       /**
-        * @param after
-        *            append to label
-        */
-       public void setAfter(String after)
-       {
-               this.after = after;
-       }
-
-       /**
-        * @param before
-        *            prepend to label
-        */
-       public void setBefore(String before)
-       {
-               this.before = before;
-       }
-
-       /**
-        * {@inheritDoc}
-        */
-       @Override
-       public void onComponentTagBody(MarkupStream markupStream, ComponentTag 
openTag)
-       {
-               String s = getDefaultModelObjectAsString();
-               if (before != null)
-               {
-                       s = before + s;
-               }
-               if (after != null)
-               {
-                       s = s + after;
-               }
-               replaceComponentTagBody(markupStream, openTag, s);
-       }
-}

http://git-wip-us.apache.org/repos/asf/wicket/blob/aff679fe/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateTimeField.html
----------------------------------------------------------------------
diff --git 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateTimeField.html
 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateTimeField.html
deleted file mode 100644
index d92f2ce..0000000
--- 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateTimeField.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
-   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.
--->
-<wicket:panel xmlns:wicket="http://wicket.apache.org";>
-  <span style="white-space: nowrap;">
-    <input type="text" wicket:id="date" size="12" />
-    <span wicket:id="time" />
-  </span>
-</wicket:panel>

http://git-wip-us.apache.org/repos/asf/wicket/blob/aff679fe/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateTimeField.java
----------------------------------------------------------------------
diff --git 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateTimeField.java
 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateTimeField.java
index 0c6531d..8ff825a 100644
--- 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateTimeField.java
+++ 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateTimeField.java
@@ -17,23 +17,16 @@
 package org.apache.wicket.extensions.markup.html.form.datetime;
 
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.time.LocalTime;
-import java.time.ZoneId;
-import java.time.ZonedDateTime;
 import java.time.temporal.ChronoField;
-import java.util.Date;
 import java.util.Locale;
-import java.util.TimeZone;
 
-import org.apache.wicket.Session;
 import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
-import org.apache.wicket.core.request.ClientInfo;
-import org.apache.wicket.markup.html.form.FormComponentPanel;
 import org.apache.wicket.model.IModel;
-import org.apache.wicket.protocol.http.request.WebClientInfo;
 
 /**
- * Works on a {@link java.time.ZonedDateTime} object. Displays a date field 
and a DatePicker, a field
+ * Works on a {@link java.time.LocalDateTimeTime} object. Displays a date 
field and a DatePicker, a field
  * for hours and a field for minutes, and an AM/PM field. The format (12h/24h) 
of the hours field
  * depends on the time format of this {@link DateTimeField}'s {@link Locale}, 
as does the visibility
  * of the AM/PM field (see {@link DateTimeField#use12HourFormat}).
@@ -63,19 +56,11 @@ import 
org.apache.wicket.protocol.http.request.WebClientInfo;
  * @author eelcohillenius
  * @see DateField for a variant with just the date field and date picker
  */
-public class DateTimeField extends FormComponentPanel<ZonedDateTime>
+public class DateTimeField extends AbstractDateTimeField<LocalDateTime>
 {
        private static final long serialVersionUID = 1L;
 
-       // Component-IDs
-       protected static final String DATE = "date";
-       protected static final String TIME = "time";
-
-       // The date TextField and it's associated model object
-       // Note that any time information in date will be ignored
-       private DateField dateField;
-       private TimeField timeField;
-       private ZonedDateTime dateTime = ZonedDateTime.now();
+       private LocalDateTime dateTime = LocalDateTime.now();
 
        /**
         * Construct.
@@ -93,186 +78,46 @@ public class DateTimeField extends 
FormComponentPanel<ZonedDateTime>
         * @param id
         * @param model
         */
-       public DateTimeField(final String id, final IModel<ZonedDateTime> model)
+       public DateTimeField(final String id, final IModel<LocalDateTime> model)
        {
                super(id, model);
 
                // Sets the type that will be used when updating the model for 
this component.
-               setType(ZonedDateTime.class);
-
-               // Create and add the date TextField
-               add(dateField = newDateField(DATE, new DateModel()));
-               add(timeField = newTimeField(TIME, new TimeModel()));
+               setType(LocalDateTime.class);
        }
 
-       /**
-        * 
-        * @return The date TextField
-        */
-       protected final DateField getDateField()
-       {
-               return dateField;
-       }
-
-       /**
-        * 
-        * @return The date TextField
-        */
-       protected final TimeField getTimeField()
-       {
-               return timeField;
+       LocalDateTime performConvert(LocalDate date, LocalTime time) {
+               return LocalDateTime.of(date, time);
        }
 
        @Override
-       public String getInput()
-       {
-               // since we override convertInput, we can let this method 
return a value
-               // that is just suitable for error reporting
-               return String.format("%s, %s", dateField.getInput(), 
timeField.getInput());
-       }
-
-       /**
-        * Gets the client's time zone.
-        * 
-        * @return The client's time zone or null
-        */
-       protected ZoneId getClientTimeZone()
-       {
-               ClientInfo info = Session.get().getClientInfo();
-               if (info instanceof WebClientInfo)
-               {
-                       TimeZone timeZone = ((WebClientInfo) 
info).getProperties().getTimeZone();
-                       return timeZone != null ? timeZone.toZoneId() : null;
-               }
-               return null;
-       }
-
-       /**
-        * Sets the converted input, which is an instance of {@link Date}, 
possibly null. It combines
-        * the inputs of the nested date, hours, minutes and am/pm fields and 
constructs a date from it.
-        * <p>
-        * Note that overriding this method is a better option than overriding 
{@link #updateModel()}
-        * like the first versions of this class did. The reason for that is 
that this method can be
-        * used by form validators without having to depend on the actual model 
being updated, and this
-        * method is called by the default implementation of {@link 
#updateModel()} anyway (so we don't
-        * have to override that anymore).
-        */
-       @Override
-       public void convertInput()
-       {
-               try
-               {
-                       // Get the converted input values
-                       LocalDate localDate = dateField.getConvertedInput();
-
-                       if (localDate == null)
-                       {
-                               return;
-                       }
-
-                       // Use the input to create a date object with proper 
timezone
-                       LocalTime localTime = timeField.getConvertedInput();
-                       ZonedDateTime date = ZonedDateTime.of(localDate, 
localTime, getClientTimeZone());
-
-                       // The date will be in the server's timezone
-                       setConvertedInput(date);
-               }
-               catch (RuntimeException e)
+       void prepareObject() {
+               if (getModelObject() == null)
                {
-                       DateTimeField.this.error(e.getMessage());
-                       invalid();
+                       dateTime = null;
                }
        }
 
-       /**
-        * create a new {@link DateField} instance to be added to this panel.
-        * 
-        * @param id
-        *            the component id
-        * @param dateFieldModel
-        *            model that should be used by the {@link DateField}
-        * @return a new date text field instance
-        */
-       protected DateField newDateField(String id, IModel<LocalDate> 
dateFieldModel)
+       LocalDate getLocalDate()
        {
-               return DateField.forShortStyle(id, dateFieldModel);
+               return dateTime.toLocalDate();
        }
 
-       /**
-        * create a new {@link TimeField} instance to be added to this panel.
-        * 
-        * @param id
-        *            the component id
-        * @param timeFieldModel
-        *            model that should be used by the {@link TimeField}
-        * @return a new time text field instance
-        */
-       protected TimeField newTimeField(String id, IModel<LocalTime> 
timeFieldModel)
+       void setLocalDate(LocalDate date)
        {
-               return TimeField.forShortStyle(id, timeFieldModel);
+               dateTime = dateTime.with(ChronoField.YEAR, date.getYear())
+                               .with(ChronoField.MONTH_OF_YEAR, 
date.getMonthValue())
+                               .with(ChronoField.DAY_OF_YEAR, 
date.getDayOfMonth());
        }
 
-       /**
-        * @see org.apache.wicket.Component#onBeforeRender()
-        */
-       @Override
-       protected void onBeforeRender()
+       LocalTime getLocalTime()
        {
-               dateField.setRequired(isRequired());
-               timeField.setRequired(isRequired());
-
-               ZonedDateTime modelObject = getModelObject();
-               if (modelObject == null)
-               {
-                       dateTime = null;
-               }
-               else
-               {
-                       // convert date to the client's time zone if we have 
that info
-                       ZoneId zone = getClientTimeZone();
-                       if (zone != null)
-                       {
-                               modelObject = 
modelObject.withZoneSameInstant(zone);
-                       }
-               }
-
-               super.onBeforeRender();
-       }
-
-       protected class DateModel implements IModel<LocalDate>
-       {
-               private static final long serialVersionUID = 1L;
-
-               @Override
-               public LocalDate getObject()
-               {
-                       return dateTime.toLocalDate();
-               }
-
-               @Override
-               public void setObject(LocalDate date)
-               {
-                       dateTime = dateTime.with(ChronoField.YEAR, 
date.getYear());
-                       dateTime = dateTime.with(ChronoField.MONTH_OF_YEAR, 
date.getMonthValue());
-                       dateTime = dateTime.with(ChronoField.DAY_OF_YEAR, 
date.getDayOfMonth());
-               }
+               return dateTime.toLocalTime();
        }
 
-       protected class TimeModel implements IModel<LocalTime>
+       void setLocalTime(LocalTime time)
        {
-               private static final long serialVersionUID = 1L;
-
-               @Override
-               public LocalTime getObject()
-               {
-                       return dateTime.toLocalTime();
-               }
-
-               @Override
-               public void setObject(LocalTime time)
-               {
-                       dateTime = dateTime.with(ChronoField.HOUR_OF_DAY, 
time.getHour());
-                       dateTime = dateTime.with(ChronoField.MINUTE_OF_HOUR, 
time.getMinute());
-               }
+               dateTime = dateTime.with(ChronoField.HOUR_OF_DAY, 
time.getHour())
+                               .with(ChronoField.MINUTE_OF_HOUR, 
time.getMinute());
        }
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/aff679fe/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/ZonedDateTimeField.java
----------------------------------------------------------------------
diff --git 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/ZonedDateTimeField.java
 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/ZonedDateTimeField.java
new file mode 100644
index 0000000..a6814f8
--- /dev/null
+++ 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/ZonedDateTimeField.java
@@ -0,0 +1,154 @@
+/*
+ * 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.wicket.extensions.markup.html.form.datetime;
+
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.time.temporal.ChronoField;
+import java.util.Locale;
+import java.util.TimeZone;
+
+import org.apache.wicket.Session;
+import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
+import org.apache.wicket.core.request.ClientInfo;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.protocol.http.request.WebClientInfo;
+
+/**
+ * Works on a {@link java.time.ZonedDateTimeTime} object. Displays a date 
field and a DatePicker, a field
+ * for hours and a field for minutes, and an AM/PM field. The format (12h/24h) 
of the hours field
+ * depends on the time format of this {@link ZonedDateTimeField}'s {@link 
Locale}, as does the visibility
+ * of the AM/PM field (see {@link ZonedDateTimeField#use12HourFormat}).
+ * <p>
+ * <strong>Ajaxifying the DateTimeField</strong>: If you want to update a 
DateTimeField with an
+ * {@link AjaxFormComponentUpdatingBehavior}, you have to attach it to the 
contained
+ * {@link DateField} by overriding {@link #newDateTextField(String, IModel)} 
and calling
+ * {@link #processInput()}:
+ * 
+ * <pre>{@code
+ *  DateTimeField dateTimeField = new DateTimeField(...) {
+ *    protected DateTextField newDateTextField(String id, PropertyModel<Date> 
dateFieldModel)
+ *    {
+ *      DateTextField dateField = super.newDateTextField(id, dateFieldModel);  
   
+ *      dateField.add(new AjaxFormComponentUpdatingBehavior("change") {
+ *        protected void onUpdate(AjaxRequestTarget target) {
+ *          processInput(); // let DateTimeField process input too
+ *
+ *          ...
+ *        }
+ *      });
+ *      return recorder;
+ *    }
+ *  }
+ * }</pre>
+ * 
+ * @author eelcohillenius
+ * @see DateField for a variant with just the date field and date picker
+ */
+public class ZonedDateTimeField extends AbstractDateTimeField<ZonedDateTime>
+{
+       private static final long serialVersionUID = 1L;
+
+       private ZonedDateTime dateTime = ZonedDateTime.now();
+
+       /**
+        * Construct.
+        * 
+        * @param id
+        */
+       public ZonedDateTimeField(final String id)
+       {
+               this(id, null);
+       }
+
+       /**
+        * Construct.
+        * 
+        * @param id
+        * @param model
+        */
+       public ZonedDateTimeField(final String id, final IModel<ZonedDateTime> 
model)
+       {
+               super(id, model);
+
+               // Sets the type that will be used when updating the model for 
this component.
+               setType(ZonedDateTime.class);
+       }
+
+       /**
+        * Gets the client's time zone.
+        * 
+        * @return The client's time zone or null
+        */
+       protected ZoneId getClientTimeZone()
+       {
+               ClientInfo info = Session.get().getClientInfo();
+               if (info instanceof WebClientInfo)
+               {
+                       TimeZone timeZone = ((WebClientInfo) 
info).getProperties().getTimeZone();
+                       return timeZone != null ? timeZone.toZoneId() : null;
+               }
+               return null;
+       }
+
+       ZonedDateTime performConvert(LocalDate date, LocalTime time) {
+               return ZonedDateTime.of(date, time, getClientTimeZone());
+       }
+
+       @Override
+       void prepareObject() {
+               ZonedDateTime modelObject = getModelObject();
+               if (modelObject == null)
+               {
+                       dateTime = null;
+               }
+               else
+               {
+                       // convert date to the client's time zone if we have 
that info
+                       ZoneId zone = getClientTimeZone();
+                       if (zone != null)
+                       {
+                               modelObject = 
modelObject.withZoneSameInstant(zone);
+                       }
+               }
+       }
+
+       LocalDate getLocalDate()
+       {
+               return dateTime.toLocalDate();
+       }
+
+       void setLocalDate(LocalDate date)
+       {
+               dateTime = dateTime.with(ChronoField.YEAR, date.getYear())
+                               .with(ChronoField.MONTH_OF_YEAR, 
date.getMonthValue())
+                               .with(ChronoField.DAY_OF_YEAR, 
date.getDayOfMonth());
+       }
+
+       LocalTime getLocalTime()
+       {
+               return dateTime.toLocalTime();
+       }
+
+       void setLocalTime(LocalTime time)
+       {
+               dateTime = dateTime.with(ChronoField.HOUR_OF_DAY, 
time.getHour())
+                               .with(ChronoField.MINUTE_OF_HOUR, 
time.getMinute());
+       }
+}

Reply via email to