From: Nick Burch Date: Sun, 31 May 2015 21:18:11 +0000 (+0000) Subject: Patch from René Scheibe from bug #57512 - Fix potential NPE in DateUtil for invalid... X-Git-Tag: REL_3_13_BETA1~103 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=e538572beaf8a8159aee5d8d3d58669952b7eaf6;p=poi.git Patch from René Scheibe from bug #57512 - Fix potential NPE in DateUtil for invalid dates git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1682796 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/java/org/apache/poi/ss/usermodel/DateUtil.java b/src/java/org/apache/poi/ss/usermodel/DateUtil.java index 31dbce424d..ca1d7d4659 100644 --- a/src/java/org/apache/poi/ss/usermodel/DateUtil.java +++ b/src/java/org/apache/poi/ss/usermodel/DateUtil.java @@ -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 index 0000000000..870cd9cb35 --- /dev/null +++ b/src/testcases/org/apache/poi/ss/usermodel/TestDateUtil.java @@ -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)); + } +}