]> source.dussan.org Git - poi.git/commitdiff
Patch from René Scheibe from bug #57512 - Fix potential NPE in DateUtil for invalid...
authorNick Burch <nick@apache.org>
Sun, 31 May 2015 21:18:11 +0000 (21:18 +0000)
committerNick Burch <nick@apache.org>
Sun, 31 May 2015 21:18:11 +0000 (21:18 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1682796 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/ss/usermodel/DateUtil.java
src/testcases/org/apache/poi/ss/usermodel/TestDateUtil.java [new file with mode: 0644]

index 31dbce424d7eeb11a0bf446647b469cabe2151bf..ca1d7d46599ee988c72b52c23db661a7c6dc503d 100644 (file)
@@ -146,7 +146,7 @@ public class DateUtil {
      *  @return Java representation of the date, or null if date is not a valid Excel date
      */
     public static Date getJavaDate(double date, TimeZone tz) {
-       return getJavaDate(date, false, tz);
+       return getJavaDate(date, false, tz, false);
     }
     /**
      *  Given an Excel date with using 1900 date windowing, and
@@ -166,9 +166,9 @@ public class DateUtil {
      *  @see java.util.TimeZone
      */
     public static Date getJavaDate(double date) {
-        return getJavaDate(date, (TimeZone)null);
+        return getJavaDate(date, false, null, false);
     }
-    
+
     /**
      *  Given an Excel date with either 1900 or 1904 date windowing,
      *  converts it to a java.util.Date.
@@ -185,7 +185,7 @@ public class DateUtil {
      *  @return Java representation of the date, or null if date is not a valid Excel date
      */
     public static Date getJavaDate(double date, boolean use1904windowing, TimeZone tz) {
-        return getJavaCalendar(date, use1904windowing, tz, false).getTime();
+        return getJavaDate(date, use1904windowing, tz, false);
     }
     
     /**
@@ -205,7 +205,8 @@ public class DateUtil {
      *  @return Java representation of the date, or null if date is not a valid Excel date
      */
     public static Date getJavaDate(double date, boolean use1904windowing, TimeZone tz, boolean roundSeconds) {
-        return getJavaCalendar(date, use1904windowing, tz, roundSeconds).getTime();
+        Calendar calendar = getJavaCalendar(date, use1904windowing, tz, roundSeconds);
+        return calendar == null ? null : calendar.getTime();
     }
     
     /**
@@ -228,10 +229,9 @@ public class DateUtil {
      *  @see java.util.TimeZone
      */
     public static Date getJavaDate(double date, boolean use1904windowing) {
-        return getJavaCalendar(date, use1904windowing, null, false).getTime();
+        return getJavaDate(date, use1904windowing, null, false);
     }
 
-
     public static void setCalendar(Calendar calendar, int wholeDays,
             int millisecondsInDay, boolean use1904windowing, boolean roundSeconds) {
         int startYear = 1900;
diff --git a/src/testcases/org/apache/poi/ss/usermodel/TestDateUtil.java b/src/testcases/org/apache/poi/ss/usermodel/TestDateUtil.java
new file mode 100644 (file)
index 0000000..870cd9c
--- /dev/null
@@ -0,0 +1,92 @@
+/* ====================================================================
+   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.poi.ss.usermodel;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.TimeZone;
+
+import org.junit.Test;
+
+public class TestDateUtil {
+
+    @Test
+    public void getJavaDate_InvalidValue() {
+        double dateValue = -1;
+        TimeZone tz = TimeZone.getDefault();
+        boolean use1904windowing = false;
+        boolean roundSeconds = false;
+
+        assertEquals(null, DateUtil.getJavaDate(dateValue));
+        assertEquals(null, DateUtil.getJavaDate(dateValue, tz));
+        assertEquals(null, DateUtil.getJavaDate(dateValue, use1904windowing));
+        assertEquals(null, DateUtil.getJavaDate(dateValue, use1904windowing, tz));
+        assertEquals(null, DateUtil.getJavaDate(dateValue, use1904windowing, tz, roundSeconds));
+    }
+
+    @Test
+    public void getJavaDate_ValidValue() {
+        double dateValue = 0;
+        TimeZone tz = TimeZone.getDefault();
+        boolean use1904windowing = false;
+        boolean roundSeconds = false;
+
+        Calendar calendar = Calendar.getInstance(tz);
+        calendar.set(1900, 0, 0, 0, 0, 0);
+        calendar.set(Calendar.MILLISECOND, 0);
+        Date date = calendar.getTime();
+
+        assertEquals(date, DateUtil.getJavaDate(dateValue));
+        assertEquals(date, DateUtil.getJavaDate(dateValue, tz));
+        assertEquals(date, DateUtil.getJavaDate(dateValue, use1904windowing));
+        assertEquals(date, DateUtil.getJavaDate(dateValue, use1904windowing, tz));
+        assertEquals(date, DateUtil.getJavaDate(dateValue, use1904windowing, tz, roundSeconds));
+    }
+
+    @Test
+    public void getJavaCalendar_InvalidValue() {
+        double dateValue = -1;
+        TimeZone tz = TimeZone.getDefault();
+        boolean use1904windowing = false;
+        boolean roundSeconds = false;
+
+        assertEquals(null, DateUtil.getJavaCalendar(dateValue));
+        assertEquals(null, DateUtil.getJavaCalendar(dateValue, use1904windowing));
+        assertEquals(null, DateUtil.getJavaCalendar(dateValue, use1904windowing, tz));
+        assertEquals(null, DateUtil.getJavaCalendar(dateValue, use1904windowing, tz, roundSeconds));
+    }
+
+    @Test
+    public void getJavaCalendar_ValidValue() {
+        double dateValue = 0;
+        TimeZone tz = TimeZone.getDefault();
+        boolean use1904windowing = false;
+        boolean roundSeconds = false;
+
+        Calendar calendar = Calendar.getInstance(tz);
+        calendar.set(1900, 0, 0, 0, 0, 0);
+        calendar.set(Calendar.MILLISECOND, 0);
+
+        assertEquals(calendar, DateUtil.getJavaCalendar(dateValue));
+        assertEquals(calendar, DateUtil.getJavaCalendar(dateValue, use1904windowing));
+        assertEquals(calendar, DateUtil.getJavaCalendar(dateValue, use1904windowing, tz));
+        assertEquals(calendar, DateUtil.getJavaCalendar(dateValue, use1904windowing, tz, roundSeconds));
+    }
+}