]> source.dussan.org Git - poi.git/commitdiff
forbidden apis fixes - a few DateFormat clean ups ...
authorAndreas Beeker <kiwiwings@apache.org>
Wed, 9 Sep 2015 00:41:03 +0000 (00:41 +0000)
committerAndreas Beeker <kiwiwings@apache.org>
Wed, 9 Sep 2015 00:41:03 +0000 (00:41 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1701888 13f79535-47bb-0310-9956-ffa450edef68

13 files changed:
src/java/org/apache/poi/hssf/usermodel/DVConstraint.java
src/java/org/apache/poi/hssf/usermodel/HSSFCell.java
src/java/org/apache/poi/hssf/usermodel/HSSFDataFormatter.java
src/java/org/apache/poi/ss/format/CellDateFormatter.java
src/java/org/apache/poi/ss/usermodel/DataFormatter.java
src/ooxml/java/org/apache/poi/poifs/crypt/dsig/facets/OOXMLSignatureFacet.java
src/ooxml/java/org/apache/poi/xssf/extractor/XSSFExportToXml.java
src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFCell.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java
src/scratchpad/testcases/org/apache/poi/hmef/TestAttachments.java
src/scratchpad/testcases/org/apache/poi/hmef/attribute/TestMAPIAttributes.java
src/scratchpad/testcases/org/apache/poi/hmef/attribute/TestTNEFAttributes.java
src/testcases/org/apache/poi/hssf/usermodel/TestHSSFDataFormatter.java

index 41f90fbfcc4640c4f2a494a96817b1b200914d5e..ce8cbf1b127764478aa4c9534193b97d9551a4f2 100644 (file)
@@ -20,7 +20,6 @@ package org.apache.poi.hssf.usermodel;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.Date;
-import java.util.Locale;
 import java.util.regex.Pattern;
 
 import org.apache.poi.hssf.model.HSSFFormulaParser;
@@ -32,6 +31,7 @@ import org.apache.poi.ss.formula.ptg.NumberPtg;
 import org.apache.poi.ss.formula.ptg.Ptg;
 import org.apache.poi.ss.formula.ptg.StringPtg;
 import org.apache.poi.ss.usermodel.DataValidationConstraint;
+import org.apache.poi.util.LocaleUtil;
 
 /**
  * Data Validation Constraint
@@ -180,7 +180,11 @@ public class DVConstraint implements DataValidationConstraint {
                        throw new IllegalArgumentException("expr1 must be supplied");
                }
                OperatorType.validateSecondArg(comparisonOperator, expr2);
-               SimpleDateFormat df = dateFormat == null ? null : new SimpleDateFormat(dateFormat, Locale.ROOT);
+               SimpleDateFormat df = null;
+               if (dateFormat != null) {
+                   df = new SimpleDateFormat(dateFormat, LocaleUtil.getUserLocale());
+                   df.setTimeZone(LocaleUtil.getUserTimeZone());
+               }
                
                // formula1 and value1 are mutually exclusive
                String formula1 = getFormulaFromTextExpression(expr1);
@@ -392,7 +396,8 @@ public class DVConstraint implements DataValidationConstraint {
                return new FormulaPair(formula1, formula2);
        }
 
-       private Ptg[] createListFormula(HSSFSheet sheet) {
+    @SuppressWarnings("resource")
+    private Ptg[] createListFormula(HSSFSheet sheet) {
 
                if (_explicitListValues == null) {
             HSSFWorkbook wb = sheet.getWorkbook();
@@ -417,6 +422,7 @@ public class DVConstraint implements DataValidationConstraint {
         * @return The parsed token array representing the formula or value specified. 
         * Empty array if both formula and value are <code>null</code>
         */
+    @SuppressWarnings("resource")
        private static Ptg[] convertDoubleFormula(String formula, Double value, HSSFSheet sheet) {
                if (formula == null) {
                        if (value == null) {
index 8fbdd1276663e8aa58f0e828014935d2093e7039..33a5ce6aafdb6c5df0afaf9ddf638fb149e8ad9d 100644 (file)
@@ -17,7 +17,6 @@
 
 package org.apache.poi.hssf.usermodel;
 
-import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.Calendar;
 import java.util.Date;
@@ -53,8 +52,6 @@ import org.apache.poi.ss.util.CellRangeAddress;
 import org.apache.poi.ss.util.CellReference;
 import org.apache.poi.ss.util.NumberToTextConverter;
 import org.apache.poi.util.LocaleUtil;
-import org.apache.poi.util.POILogFactory;
-import org.apache.poi.util.POILogger;
 
 /**
  * High level representation of a cell in a row of a spreadsheet.
@@ -69,8 +66,6 @@ import org.apache.poi.util.POILogger;
  * <p>
  */
 public class HSSFCell implements Cell {
-    private static POILogger log = POILogFactory.getLogger(HSSFCell.class);
-
     private static final String FILE_FORMAT_NAME  = "BIFF8";
     /**
      * The maximum  number of columns in BIFF8
@@ -990,7 +985,8 @@ public class HSSFCell implements Cell {
             case CELL_TYPE_NUMERIC:
                 //TODO apply the dataformat for this cell
                 if (HSSFDateUtil.isCellDateFormatted(this)) {
-                    DateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy", LocaleUtil.getUserLocale());
+                    SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy", LocaleUtil.getUserLocale());
+                    sdf.setTimeZone(LocaleUtil.getUserTimeZone());
                     return sdf.format(getDateCellValue());
                 }
                                return  String.valueOf(getNumericCellValue());
index 13abd91e6dfe93a7d33581fd353363a0fde0eb8d..ef3eb93154bcecb9f12dda29853f8b82a958bcfd 100644 (file)
@@ -19,7 +19,6 @@ package org.apache.poi.hssf.usermodel;
 
 import java.text.DecimalFormat;
 import java.text.Format;
-import java.text.SimpleDateFormat;
 import java.util.Locale;
 
 import org.apache.poi.ss.usermodel.DataFormatter;
@@ -33,7 +32,7 @@ import org.apache.poi.util.LocaleUtil;
  * codes, etc.
  * <p>
  * Internally, formats will be implemented using subclasses of {@link Format}
- * such as {@link DecimalFormat} and {@link SimpleDateFormat}. Therefore the
+ * such as {@link DecimalFormat} and {@link java.text.SimpleDateFormat}. Therefore the
  * formats used by this class must obey the same pattern rules as these Format
  * subclasses. This means that only legal number pattern characters ("0", "#",
  * ".", "," etc.) may appear in number formats. Other characters can be
index 4027d02765dbd36e9ea195cb71008a9326510c57..11c567c4c93564b8a654965480513e9c2a162351 100644 (file)
@@ -38,17 +38,11 @@ public class CellDateFormatter extends CellFormatter {
     private final DateFormat dateFmt;
     private String sFmt;
 
-    private final long EXCEL_EPOCH_TIME;
-    private final Date EXCEL_EPOCH_DATE;
+    private final Calendar EXCEL_EPOCH_CAL =
+        LocaleUtil.getLocaleCalendar(1904, 0, 1);
 
     private static /* final */ CellDateFormatter SIMPLE_DATE = null;
 
-    {
-        Calendar c = LocaleUtil.getLocaleCalendar(1904, 0, 1, 0, 0, 0);
-        EXCEL_EPOCH_DATE = c.getTime();
-        EXCEL_EPOCH_TIME = c.getTimeInMillis();
-    }
-
     private class DatePartHandler implements CellFormatPart.PartHandler {
         private int mStart = -1;
         private int mLen;
@@ -153,6 +147,7 @@ public class CellDateFormatter extends CellFormatter {
         // See https://issues.apache.org/bugzilla/show_bug.cgi?id=53369
         String ptrn = descBuf.toString().replaceAll("((y)(?!y))(?<!yy)", "yy");
         dateFmt = new SimpleDateFormat(ptrn, LocaleUtil.getUserLocale());
+        dateFmt.setTimeZone(LocaleUtil.getUserTimeZone());
     }
 
     /** {@inheritDoc} */
@@ -161,15 +156,18 @@ public class CellDateFormatter extends CellFormatter {
             value = 0.0;
         if (value instanceof Number) {
             Number num = (Number) value;
-            double v = num.doubleValue();
-            if (v == 0.0)
-                value = EXCEL_EPOCH_DATE;
-            else
-                value = new Date((long) (EXCEL_EPOCH_TIME + v));
+            long v = num.longValue();
+            if (v == 0L) {
+                value = EXCEL_EPOCH_CAL.getTime();
+            } else {
+                Calendar c = (Calendar)EXCEL_EPOCH_CAL.clone();
+                c.add(Calendar.SECOND, (int)(v / 1000));
+                c.add(Calendar.MILLISECOND, (int)(v % 1000));
+                value = c.getTime();
+            }
         }
 
-        AttributedCharacterIterator it = dateFmt.formatToCharacterIterator(
-                value);
+        AttributedCharacterIterator it = dateFmt.formatToCharacterIterator(value);
         boolean doneAm = false;
         boolean doneMillis = false;
 
@@ -219,7 +217,7 @@ public class CellDateFormatter extends CellFormatter {
      */
     public void simpleValue(StringBuffer toAppendTo, Object value) {
         synchronized (CellDateFormatter.class) {
-            if (SIMPLE_DATE == null || !SIMPLE_DATE.EXCEL_EPOCH_DATE.equals(EXCEL_EPOCH_DATE)) {
+            if (SIMPLE_DATE == null || !SIMPLE_DATE.EXCEL_EPOCH_CAL.equals(EXCEL_EPOCH_CAL)) {
                 SIMPLE_DATE = new CellDateFormatter("mm/d/y");
             }
         }
index cecfd10720a9616782dc23b6a24bc34b91e0b747..b5bf2a8079b83750a18ac724146d99defc7edf7a 100644 (file)
@@ -28,7 +28,6 @@ import java.text.DecimalFormatSymbols;
 import java.text.FieldPosition;
 import java.text.Format;
 import java.text.ParsePosition;
-import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
@@ -53,7 +52,7 @@ import org.apache.poi.util.LocaleUtil;
  * codes, etc.
  * <p>
  * Internally, formats will be implemented using subclasses of {@link Format}
- * such as {@link DecimalFormat} and {@link SimpleDateFormat}. Therefore the
+ * such as {@link DecimalFormat} and {@link java.text.SimpleDateFormat}. Therefore the
  * formats used by this class must obey the same pattern rules as these Format
  * subclasses. This means that only legal number pattern characters ("0", "#",
  * ".", "," etc.) may appear in number formats. Other characters can be
index ab3aa070e7d7e89ab2ebf5a77c4b73bf03896729..8ba8bf2395324d1025603da92aa1eb5ffcf1bed3 100644 (file)
@@ -58,6 +58,7 @@ import org.apache.poi.openxml4j.opc.PackagingURIHelper;
 import org.apache.poi.openxml4j.opc.TargetMode;\r
 import org.apache.poi.poifs.crypt.dsig.services.RelationshipTransformService;\r
 import org.apache.poi.poifs.crypt.dsig.services.RelationshipTransformService.RelationshipTransformParameterSpec;\r
+import org.apache.poi.util.LocaleUtil;\r
 import org.apache.poi.util.POILogFactory;\r
 import org.apache.poi.util.POILogger;\r
 import org.openxmlformats.schemas.xpackage.x2006.digitalSignature.CTSignatureTime;\r
@@ -198,7 +199,7 @@ public class OOXMLSignatureFacet extends SignatureFacet {
          * SignatureTime\r
          */\r
         DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.ROOT);\r
-        fmt.setTimeZone(TimeZone.getTimeZone("UTC"));\r
+        fmt.setTimeZone(LocaleUtil.TIMEZONE_UTC);\r
         String nowStr = fmt.format(signatureConfig.getExecutionTime());\r
         LOG.log(POILogger.DEBUG, "now: " + nowStr);\r
 \r
index b5536020031574de5c5380cc43252053596fd404..f6ad11f1eb1ad6245cdf90b1d5e4c016ae99bad2 100644 (file)
@@ -45,6 +45,7 @@ import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.DateUtil;
 import org.apache.poi.util.DocumentHelper;
+import org.apache.poi.util.LocaleUtil;
 import org.apache.poi.xssf.usermodel.XSSFCell;
 import org.apache.poi.xssf.usermodel.XSSFMap;
 import org.apache.poi.xssf.usermodel.XSSFRow;
@@ -316,6 +317,7 @@ public class XSSFExportToXml implements Comparator<String>{
 
     private String getFormattedDate(XSSFCell cell) {
         DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.ROOT);
+        sdf.setTimeZone(LocaleUtil.getUserTimeZone());
         return sdf.format(cell.getDateCellValue());
     }
 
index e88667f47e5572d45613769b565477f90ce4304e..3e6dbc5432605875e4b417ee520cdb51b4f0fd9b 100644 (file)
@@ -523,6 +523,7 @@ public class SXSSFCell implements Cell {
      * <code>workbook.getCellStyleAt(0)</code>
      * @see org.apache.poi.ss.usermodel.Workbook#getCellStyleAt(short)
      */
+    @SuppressWarnings("resource")
     public CellStyle getCellStyle()
     {
         if(_style == null){
@@ -655,6 +656,7 @@ public class SXSSFCell implements Cell {
             case CELL_TYPE_NUMERIC:
                 if (DateUtil.isCellDateFormatted(this)) {
                     DateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy", LocaleUtil.getUserLocale());
+                    sdf.setTimeZone(LocaleUtil.getUserTimeZone());
                     return sdf.format(getDateCellValue());
                 }
                 return getNumericCellValue() + "";
index 0e2c9c549538940f6c2a6a6ce3337e51bbb1341b..06dec8da55bdf27ee924c92143e296afa35492cc 100644 (file)
@@ -21,7 +21,6 @@ import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.Calendar;
 import java.util.Date;
-import java.util.Locale;
 
 import org.apache.poi.ss.SpreadsheetVersion;
 import org.apache.poi.ss.formula.FormulaParser;
@@ -42,6 +41,7 @@ import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.util.CellRangeAddress;
 import org.apache.poi.ss.util.CellReference;
 import org.apache.poi.util.Internal;
+import org.apache.poi.util.LocaleUtil;
 import org.apache.poi.xssf.model.SharedStringsTable;
 import org.apache.poi.xssf.model.StylesTable;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCell;
@@ -452,6 +452,7 @@ public final class XSSFCell implements Cell {
         cellFormula.setRef(range.formatAsString());
     }
 
+    @SuppressWarnings("resource")
     private void setFormula(String formula, int formulaType) {
         XSSFWorkbook wb = _row.getSheet().getWorkbook();
         if (formula == null) {
@@ -841,7 +842,8 @@ public final class XSSFCell implements Cell {
                 return getCellFormula();
             case CELL_TYPE_NUMERIC:
                 if (DateUtil.isCellDateFormatted(this)) {
-                    DateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy", Locale.ROOT);
+                    DateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy", LocaleUtil.getUserLocale());
+                    sdf.setTimeZone(LocaleUtil.getUserTimeZone());
                     return sdf.format(getDateCellValue());
                 }
                 return Double.toString(getNumericCellValue());
index 18ccde4df1b7a5af81c41b449243a79bc43c1da9..18f59725bbb20e053185e3387e6a9b46e8a55beb 100644 (file)
@@ -20,7 +20,8 @@ package org.apache.poi.hmef;
 import java.text.DateFormat;
 import java.util.List;
 import java.util.Locale;
-import java.util.TimeZone;
+
+import org.apache.poi.util.LocaleUtil;
 
 public final class TestAttachments extends HMEFTest {
    private HMEFMessage quick;
@@ -85,7 +86,7 @@ public final class TestAttachments extends HMEFTest {
       DateFormat fmt = DateFormat.getDateTimeInstance(
             DateFormat.MEDIUM, DateFormat.MEDIUM, Locale.UK
       );
-      fmt.setTimeZone(TimeZone.getTimeZone("UTC"));
+      fmt.setTimeZone(LocaleUtil.TIMEZONE_UTC);
       
       // They should all have the same date on them
       assertEquals("28-Apr-2010 12:40:56", fmt.format( attachments.get(0).getModifiedDate()));
index c3707a8118386fbb225894703ed4db125db8f9be..2178e6a760c0c72d5ee9fc6dd718f5f845e2c9bc 100644 (file)
@@ -21,14 +21,14 @@ import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 import java.text.DateFormat;
 import java.util.Locale;
-import java.util.TimeZone;
-
-import junit.framework.TestCase;
 
 import org.apache.poi.POIDataSamples;
 import org.apache.poi.hmef.HMEFMessage;
 import org.apache.poi.hsmf.datatypes.MAPIProperty;
 import org.apache.poi.util.LittleEndian;
+import org.apache.poi.util.LocaleUtil;
+
+import junit.framework.TestCase;
 
 public final class TestMAPIAttributes extends TestCase {
    private static final POIDataSamples _samples = POIDataSamples.getHMEFInstance();
@@ -161,7 +161,7 @@ public final class TestMAPIAttributes extends TestCase {
       DateFormat fmt = DateFormat.getDateTimeInstance(
             DateFormat.MEDIUM, DateFormat.MEDIUM, Locale.UK
       );
-      fmt.setTimeZone(TimeZone.getTimeZone("UTC"));
+      fmt.setTimeZone(LocaleUtil.TIMEZONE_UTC);
       assertEquals("15-Dec-2010 14:46:31", fmt.format(date.getDate()));
       
       // RTF
index fcea77f02f7d3685b23fc48d42177b4a4fe910dc..cd13b94b39ec91869633189f2466d3d0aca059c9 100644 (file)
@@ -20,15 +20,15 @@ package org.apache.poi.hmef.attribute;
 import java.io.ByteArrayInputStream;
 import java.text.DateFormat;
 import java.util.Locale;
-import java.util.TimeZone;
-
-import junit.framework.TestCase;
 
 import org.apache.poi.POIDataSamples;
 import org.apache.poi.hmef.Attachment;
 import org.apache.poi.hmef.HMEFMessage;
 import org.apache.poi.hsmf.datatypes.MAPIProperty;
 import org.apache.poi.util.LittleEndian;
+import org.apache.poi.util.LocaleUtil;
+
+import junit.framework.TestCase;
 
 public final class TestTNEFAttributes extends TestCase {
    private static final POIDataSamples _samples = POIDataSamples.getHMEFInstance();
@@ -162,7 +162,7 @@ public final class TestTNEFAttributes extends TestCase {
       DateFormat fmt = DateFormat.getDateTimeInstance(
             DateFormat.MEDIUM, DateFormat.MEDIUM, Locale.UK
       );
-      fmt.setTimeZone(TimeZone.getTimeZone("UTC"));
+      fmt.setTimeZone(LocaleUtil.TIMEZONE_UTC);
       assertEquals("28-Apr-2010 12:40:56", fmt.format(date.getDate()));
        }
        
index 4abffc5ce3ff4abdbfd3da71ba8fd441f6893366..3b2588f075d0ea6095a188877950bbd919e3501a 100644 (file)
@@ -241,6 +241,7 @@ public final class TestHSSFDataFormatter {
                        String monthPtrn = fmt.indexOf("mmmm") != -1 ? "MMMM" : "MMM";
                        // this line is intended to compute how "July" would look like in the current locale
                        SimpleDateFormat sdf = new SimpleDateFormat(monthPtrn, LocaleUtil.getUserLocale());
+                       sdf.setTimeZone(LocaleUtil.getUserTimeZone());
                        Calendar calDef = LocaleUtil.getLocaleCalendar(2010, 6, 15, 0, 0, 0);
                        String jul = sdf.format(calDef.getTime());
                        // special case for MMMMM = 1st letter of month name