forbidden apis fixes - a few DateFormat clean ups ...

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1701888 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Andreas Beeker 2015-09-09 00:41:03 +00:00
parent 50107cae16
commit aea434a135
13 changed files with 49 additions and 42 deletions

View File

@ -20,7 +20,6 @@ package org.apache.poi.hssf.usermodel;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import java.util.Locale;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import org.apache.poi.hssf.model.HSSFFormulaParser; 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.Ptg;
import org.apache.poi.ss.formula.ptg.StringPtg; import org.apache.poi.ss.formula.ptg.StringPtg;
import org.apache.poi.ss.usermodel.DataValidationConstraint; import org.apache.poi.ss.usermodel.DataValidationConstraint;
import org.apache.poi.util.LocaleUtil;
/** /**
* Data Validation Constraint * Data Validation Constraint
@ -180,7 +180,11 @@ public class DVConstraint implements DataValidationConstraint {
throw new IllegalArgumentException("expr1 must be supplied"); throw new IllegalArgumentException("expr1 must be supplied");
} }
OperatorType.validateSecondArg(comparisonOperator, expr2); 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 // formula1 and value1 are mutually exclusive
String formula1 = getFormulaFromTextExpression(expr1); String formula1 = getFormulaFromTextExpression(expr1);
@ -392,6 +396,7 @@ public class DVConstraint implements DataValidationConstraint {
return new FormulaPair(formula1, formula2); return new FormulaPair(formula1, formula2);
} }
@SuppressWarnings("resource")
private Ptg[] createListFormula(HSSFSheet sheet) { private Ptg[] createListFormula(HSSFSheet sheet) {
if (_explicitListValues == null) { if (_explicitListValues == null) {
@ -417,6 +422,7 @@ public class DVConstraint implements DataValidationConstraint {
* @return The parsed token array representing the formula or value specified. * @return The parsed token array representing the formula or value specified.
* Empty array if both formula and value are <code>null</code> * Empty array if both formula and value are <code>null</code>
*/ */
@SuppressWarnings("resource")
private static Ptg[] convertDoubleFormula(String formula, Double value, HSSFSheet sheet) { private static Ptg[] convertDoubleFormula(String formula, Double value, HSSFSheet sheet) {
if (formula == null) { if (formula == null) {
if (value == null) { if (value == null) {

View File

@ -17,7 +17,6 @@
package org.apache.poi.hssf.usermodel; package org.apache.poi.hssf.usermodel;
import java.text.DateFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Calendar; import java.util.Calendar;
import java.util.Date; 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.CellReference;
import org.apache.poi.ss.util.NumberToTextConverter; import org.apache.poi.ss.util.NumberToTextConverter;
import org.apache.poi.util.LocaleUtil; 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. * High level representation of a cell in a row of a spreadsheet.
@ -69,8 +66,6 @@ import org.apache.poi.util.POILogger;
* <p> * <p>
*/ */
public class HSSFCell implements Cell { public class HSSFCell implements Cell {
private static POILogger log = POILogFactory.getLogger(HSSFCell.class);
private static final String FILE_FORMAT_NAME = "BIFF8"; private static final String FILE_FORMAT_NAME = "BIFF8";
/** /**
* The maximum number of columns in BIFF8 * The maximum number of columns in BIFF8
@ -990,7 +985,8 @@ public class HSSFCell implements Cell {
case CELL_TYPE_NUMERIC: case CELL_TYPE_NUMERIC:
//TODO apply the dataformat for this cell //TODO apply the dataformat for this cell
if (HSSFDateUtil.isCellDateFormatted(this)) { 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 sdf.format(getDateCellValue());
} }
return String.valueOf(getNumericCellValue()); return String.valueOf(getNumericCellValue());

View File

@ -19,7 +19,6 @@ package org.apache.poi.hssf.usermodel;
import java.text.DecimalFormat; import java.text.DecimalFormat;
import java.text.Format; import java.text.Format;
import java.text.SimpleDateFormat;
import java.util.Locale; import java.util.Locale;
import org.apache.poi.ss.usermodel.DataFormatter; import org.apache.poi.ss.usermodel.DataFormatter;
@ -33,7 +32,7 @@ import org.apache.poi.util.LocaleUtil;
* codes, etc. * codes, etc.
* <p> * <p>
* Internally, formats will be implemented using subclasses of {@link Format} * 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 * formats used by this class must obey the same pattern rules as these Format
* subclasses. This means that only legal number pattern characters ("0", "#", * subclasses. This means that only legal number pattern characters ("0", "#",
* ".", "," etc.) may appear in number formats. Other characters can be * ".", "," etc.) may appear in number formats. Other characters can be

View File

@ -38,17 +38,11 @@ public class CellDateFormatter extends CellFormatter {
private final DateFormat dateFmt; private final DateFormat dateFmt;
private String sFmt; private String sFmt;
private final long EXCEL_EPOCH_TIME; private final Calendar EXCEL_EPOCH_CAL =
private final Date EXCEL_EPOCH_DATE; LocaleUtil.getLocaleCalendar(1904, 0, 1);
private static /* final */ CellDateFormatter SIMPLE_DATE = null; 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 class DatePartHandler implements CellFormatPart.PartHandler {
private int mStart = -1; private int mStart = -1;
private int mLen; private int mLen;
@ -153,6 +147,7 @@ public class CellDateFormatter extends CellFormatter {
// See https://issues.apache.org/bugzilla/show_bug.cgi?id=53369 // See https://issues.apache.org/bugzilla/show_bug.cgi?id=53369
String ptrn = descBuf.toString().replaceAll("((y)(?!y))(?<!yy)", "yy"); String ptrn = descBuf.toString().replaceAll("((y)(?!y))(?<!yy)", "yy");
dateFmt = new SimpleDateFormat(ptrn, LocaleUtil.getUserLocale()); dateFmt = new SimpleDateFormat(ptrn, LocaleUtil.getUserLocale());
dateFmt.setTimeZone(LocaleUtil.getUserTimeZone());
} }
/** {@inheritDoc} */ /** {@inheritDoc} */
@ -161,15 +156,18 @@ public class CellDateFormatter extends CellFormatter {
value = 0.0; value = 0.0;
if (value instanceof Number) { if (value instanceof Number) {
Number num = (Number) value; Number num = (Number) value;
double v = num.doubleValue(); long v = num.longValue();
if (v == 0.0) if (v == 0L) {
value = EXCEL_EPOCH_DATE; value = EXCEL_EPOCH_CAL.getTime();
else } else {
value = new Date((long) (EXCEL_EPOCH_TIME + v)); 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( AttributedCharacterIterator it = dateFmt.formatToCharacterIterator(value);
value);
boolean doneAm = false; boolean doneAm = false;
boolean doneMillis = false; boolean doneMillis = false;
@ -219,7 +217,7 @@ public class CellDateFormatter extends CellFormatter {
*/ */
public void simpleValue(StringBuffer toAppendTo, Object value) { public void simpleValue(StringBuffer toAppendTo, Object value) {
synchronized (CellDateFormatter.class) { 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"); SIMPLE_DATE = new CellDateFormatter("mm/d/y");
} }
} }

View File

@ -28,7 +28,6 @@ import java.text.DecimalFormatSymbols;
import java.text.FieldPosition; import java.text.FieldPosition;
import java.text.Format; import java.text.Format;
import java.text.ParsePosition; import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
@ -53,7 +52,7 @@ import org.apache.poi.util.LocaleUtil;
* codes, etc. * codes, etc.
* <p> * <p>
* Internally, formats will be implemented using subclasses of {@link Format} * 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 * formats used by this class must obey the same pattern rules as these Format
* subclasses. This means that only legal number pattern characters ("0", "#", * subclasses. This means that only legal number pattern characters ("0", "#",
* ".", "," etc.) may appear in number formats. Other characters can be * ".", "," etc.) may appear in number formats. Other characters can be

View File

@ -58,6 +58,7 @@ import org.apache.poi.openxml4j.opc.PackagingURIHelper;
import org.apache.poi.openxml4j.opc.TargetMode; import org.apache.poi.openxml4j.opc.TargetMode;
import org.apache.poi.poifs.crypt.dsig.services.RelationshipTransformService; import org.apache.poi.poifs.crypt.dsig.services.RelationshipTransformService;
import org.apache.poi.poifs.crypt.dsig.services.RelationshipTransformService.RelationshipTransformParameterSpec; import org.apache.poi.poifs.crypt.dsig.services.RelationshipTransformService.RelationshipTransformParameterSpec;
import org.apache.poi.util.LocaleUtil;
import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogFactory;
import org.apache.poi.util.POILogger; import org.apache.poi.util.POILogger;
import org.openxmlformats.schemas.xpackage.x2006.digitalSignature.CTSignatureTime; import org.openxmlformats.schemas.xpackage.x2006.digitalSignature.CTSignatureTime;
@ -198,7 +199,7 @@ public class OOXMLSignatureFacet extends SignatureFacet {
* SignatureTime * SignatureTime
*/ */
DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.ROOT); DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.ROOT);
fmt.setTimeZone(TimeZone.getTimeZone("UTC")); fmt.setTimeZone(LocaleUtil.TIMEZONE_UTC);
String nowStr = fmt.format(signatureConfig.getExecutionTime()); String nowStr = fmt.format(signatureConfig.getExecutionTime());
LOG.log(POILogger.DEBUG, "now: " + nowStr); LOG.log(POILogger.DEBUG, "now: " + nowStr);

View 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.Cell;
import org.apache.poi.ss.usermodel.DateUtil; import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.util.DocumentHelper; 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.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFMap; import org.apache.poi.xssf.usermodel.XSSFMap;
import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFRow;
@ -316,6 +317,7 @@ public class XSSFExportToXml implements Comparator<String>{
private String getFormattedDate(XSSFCell cell) { private String getFormattedDate(XSSFCell cell) {
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.ROOT); DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.ROOT);
sdf.setTimeZone(LocaleUtil.getUserTimeZone());
return sdf.format(cell.getDateCellValue()); return sdf.format(cell.getDateCellValue());
} }

View File

@ -523,6 +523,7 @@ public class SXSSFCell implements Cell {
* <code>workbook.getCellStyleAt(0)</code> * <code>workbook.getCellStyleAt(0)</code>
* @see org.apache.poi.ss.usermodel.Workbook#getCellStyleAt(short) * @see org.apache.poi.ss.usermodel.Workbook#getCellStyleAt(short)
*/ */
@SuppressWarnings("resource")
public CellStyle getCellStyle() public CellStyle getCellStyle()
{ {
if(_style == null){ if(_style == null){
@ -655,6 +656,7 @@ public class SXSSFCell implements Cell {
case CELL_TYPE_NUMERIC: case CELL_TYPE_NUMERIC:
if (DateUtil.isCellDateFormatted(this)) { if (DateUtil.isCellDateFormatted(this)) {
DateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy", LocaleUtil.getUserLocale()); DateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy", LocaleUtil.getUserLocale());
sdf.setTimeZone(LocaleUtil.getUserTimeZone());
return sdf.format(getDateCellValue()); return sdf.format(getDateCellValue());
} }
return getNumericCellValue() + ""; return getNumericCellValue() + "";

View File

@ -21,7 +21,6 @@ import java.text.DateFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Calendar; import java.util.Calendar;
import java.util.Date; import java.util.Date;
import java.util.Locale;
import org.apache.poi.ss.SpreadsheetVersion; import org.apache.poi.ss.SpreadsheetVersion;
import org.apache.poi.ss.formula.FormulaParser; 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.CellRangeAddress;
import org.apache.poi.ss.util.CellReference; import org.apache.poi.ss.util.CellReference;
import org.apache.poi.util.Internal; 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.SharedStringsTable;
import org.apache.poi.xssf.model.StylesTable; import org.apache.poi.xssf.model.StylesTable;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCell; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCell;
@ -452,6 +452,7 @@ public final class XSSFCell implements Cell {
cellFormula.setRef(range.formatAsString()); cellFormula.setRef(range.formatAsString());
} }
@SuppressWarnings("resource")
private void setFormula(String formula, int formulaType) { private void setFormula(String formula, int formulaType) {
XSSFWorkbook wb = _row.getSheet().getWorkbook(); XSSFWorkbook wb = _row.getSheet().getWorkbook();
if (formula == null) { if (formula == null) {
@ -841,7 +842,8 @@ public final class XSSFCell implements Cell {
return getCellFormula(); return getCellFormula();
case CELL_TYPE_NUMERIC: case CELL_TYPE_NUMERIC:
if (DateUtil.isCellDateFormatted(this)) { 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 sdf.format(getDateCellValue());
} }
return Double.toString(getNumericCellValue()); return Double.toString(getNumericCellValue());

View File

@ -20,7 +20,8 @@ package org.apache.poi.hmef;
import java.text.DateFormat; import java.text.DateFormat;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.TimeZone;
import org.apache.poi.util.LocaleUtil;
public final class TestAttachments extends HMEFTest { public final class TestAttachments extends HMEFTest {
private HMEFMessage quick; private HMEFMessage quick;
@ -85,7 +86,7 @@ public final class TestAttachments extends HMEFTest {
DateFormat fmt = DateFormat.getDateTimeInstance( DateFormat fmt = DateFormat.getDateTimeInstance(
DateFormat.MEDIUM, DateFormat.MEDIUM, Locale.UK 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 // They should all have the same date on them
assertEquals("28-Apr-2010 12:40:56", fmt.format( attachments.get(0).getModifiedDate())); assertEquals("28-Apr-2010 12:40:56", fmt.format( attachments.get(0).getModifiedDate()));

View File

@ -21,14 +21,14 @@ import java.io.ByteArrayInputStream;
import java.io.InputStream; import java.io.InputStream;
import java.text.DateFormat; import java.text.DateFormat;
import java.util.Locale; import java.util.Locale;
import java.util.TimeZone;
import junit.framework.TestCase;
import org.apache.poi.POIDataSamples; import org.apache.poi.POIDataSamples;
import org.apache.poi.hmef.HMEFMessage; import org.apache.poi.hmef.HMEFMessage;
import org.apache.poi.hsmf.datatypes.MAPIProperty; import org.apache.poi.hsmf.datatypes.MAPIProperty;
import org.apache.poi.util.LittleEndian; import org.apache.poi.util.LittleEndian;
import org.apache.poi.util.LocaleUtil;
import junit.framework.TestCase;
public final class TestMAPIAttributes extends TestCase { public final class TestMAPIAttributes extends TestCase {
private static final POIDataSamples _samples = POIDataSamples.getHMEFInstance(); private static final POIDataSamples _samples = POIDataSamples.getHMEFInstance();
@ -161,7 +161,7 @@ public final class TestMAPIAttributes extends TestCase {
DateFormat fmt = DateFormat.getDateTimeInstance( DateFormat fmt = DateFormat.getDateTimeInstance(
DateFormat.MEDIUM, DateFormat.MEDIUM, Locale.UK 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())); assertEquals("15-Dec-2010 14:46:31", fmt.format(date.getDate()));
// RTF // RTF

View File

@ -20,15 +20,15 @@ package org.apache.poi.hmef.attribute;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.text.DateFormat; import java.text.DateFormat;
import java.util.Locale; import java.util.Locale;
import java.util.TimeZone;
import junit.framework.TestCase;
import org.apache.poi.POIDataSamples; import org.apache.poi.POIDataSamples;
import org.apache.poi.hmef.Attachment; import org.apache.poi.hmef.Attachment;
import org.apache.poi.hmef.HMEFMessage; import org.apache.poi.hmef.HMEFMessage;
import org.apache.poi.hsmf.datatypes.MAPIProperty; import org.apache.poi.hsmf.datatypes.MAPIProperty;
import org.apache.poi.util.LittleEndian; import org.apache.poi.util.LittleEndian;
import org.apache.poi.util.LocaleUtil;
import junit.framework.TestCase;
public final class TestTNEFAttributes extends TestCase { public final class TestTNEFAttributes extends TestCase {
private static final POIDataSamples _samples = POIDataSamples.getHMEFInstance(); private static final POIDataSamples _samples = POIDataSamples.getHMEFInstance();
@ -162,7 +162,7 @@ public final class TestTNEFAttributes extends TestCase {
DateFormat fmt = DateFormat.getDateTimeInstance( DateFormat fmt = DateFormat.getDateTimeInstance(
DateFormat.MEDIUM, DateFormat.MEDIUM, Locale.UK 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())); assertEquals("28-Apr-2010 12:40:56", fmt.format(date.getDate()));
} }

View File

@ -241,6 +241,7 @@ public final class TestHSSFDataFormatter {
String monthPtrn = fmt.indexOf("mmmm") != -1 ? "MMMM" : "MMM"; String monthPtrn = fmt.indexOf("mmmm") != -1 ? "MMMM" : "MMM";
// this line is intended to compute how "July" would look like in the current locale // this line is intended to compute how "July" would look like in the current locale
SimpleDateFormat sdf = new SimpleDateFormat(monthPtrn, LocaleUtil.getUserLocale()); SimpleDateFormat sdf = new SimpleDateFormat(monthPtrn, LocaleUtil.getUserLocale());
sdf.setTimeZone(LocaleUtil.getUserTimeZone());
Calendar calDef = LocaleUtil.getLocaleCalendar(2010, 6, 15, 0, 0, 0); Calendar calDef = LocaleUtil.getLocaleCalendar(2010, 6, 15, 0, 0, 0);
String jul = sdf.format(calDef.getTime()); String jul = sdf.format(calDef.getTime());
// special case for MMMMM = 1st letter of month name // special case for MMMMM = 1st letter of month name