Merge pull request #1365 from hapifhir/do-20230726-android-remove-timestamp

Remove usage of java.sql.TimeStamp
This commit is contained in:
Grahame Grieve 2023-07-27 22:00:04 +10:00 committed by GitHub
commit efa52981d5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 220 additions and 168 deletions

View File

@ -43,18 +43,14 @@ import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Properties;
import java.util.Set;
import java.time.ZonedDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.*;
/**
@ -74,34 +70,34 @@ public final class IniFile
/** Variable to denote the successful load operation. */
@SuppressWarnings("unused")
private boolean mblnLoaded = false;
private boolean fileSuccessfullyLoaded = false;
/** Variable to hold the ini file name and full path */
private String mstrFile;
private String filepath;
/** Variable to hold the sections in an ini file. */
private LinkedHashMap<String, INISection> mhmapSections;
private LinkedHashMap<String, INISection> iniSections;
/** Variable to hold environment variables **/
private Properties mpropEnv;
/**
* Create a IniFile object from the file named in the parameter.
* @param pstrPathAndName The full path and name of the ini file to be used.
* @param pathname The full path and name of the ini file to be used.
*/
public IniFile(String pstrPathAndName)
public IniFile(String pathname)
{
this.mpropEnv = getEnvVars();
this.mhmapSections = new LinkedHashMap<String, INISection>();
this.mstrFile = pstrPathAndName;
this.iniSections = new LinkedHashMap<String, INISection>();
this.filepath = pathname;
// Load the specified INI file.
if (checkFile(pstrPathAndName)) loadFile();
if (checkFile(pathname)) loadFile();
}
public IniFile(InputStream stream) {
this.mpropEnv = getEnvVars();
this.mhmapSections = new LinkedHashMap<String, INISection>();
this.mstrFile = null;
this.iniSections = new LinkedHashMap<String, INISection>();
this.filepath = null;
// Load the specified INI file.
loadStream(stream);
}
@ -115,7 +111,7 @@ public final class IniFile
*/
public String getFileName()
{
return this.mstrFile;
return this.filepath;
}
/**
@ -130,7 +126,7 @@ public final class IniFile
INIProperty objProp = null;
INISection objSec = null;
objSec = (INISection) this.mhmapSections.get(pstrSection);
objSec = (INISection) this.iniSections.get(pstrSection);
if (objSec != null)
{
objProp = objSec.getProperty(pstrProp);
@ -166,7 +162,7 @@ public final class IniFile
INIProperty objProp = null;
INISection objSec = null;
objSec = (INISection) this.mhmapSections.get(pstrSection);
objSec = (INISection) this.iniSections.get(pstrSection);
if (objSec != null)
{
objProp = objSec.getProperty(pstrProp);
@ -198,7 +194,7 @@ public final class IniFile
INIProperty objProp = null;
INISection objSec = null;
objSec = (INISection) this.mhmapSections.get(pstrSection);
objSec = (INISection) this.iniSections.get(pstrSection);
if (objSec != null)
{
objProp = objSec.getProperty(pstrProp);
@ -235,7 +231,7 @@ public final class IniFile
INIProperty objProp = null;
INISection objSec = null;
objSec = (INISection) this.mhmapSections.get(pstrSection);
objSec = (INISection) this.iniSections.get(pstrSection);
if (objSec != null)
{
objProp = objSec.getProperty(pstrProp);
@ -272,7 +268,7 @@ public final class IniFile
INIProperty objProp = null;
INISection objSec = null;
objSec = (INISection) this.mhmapSections.get(pstrSection);
objSec = (INISection) this.iniSections.get(pstrSection);
if (objSec != null)
{
objProp = objSec.getProperty(pstrProp);
@ -310,7 +306,7 @@ public final class IniFile
INIProperty objProp = null;
INISection objSec = null;
objSec = (INISection) this.mhmapSections.get(pstrSection);
objSec = (INISection) this.iniSections.get(pstrSection);
if (objSec != null)
{
objProp = objSec.getProperty(pstrProp);
@ -340,46 +336,30 @@ public final class IniFile
/**
* Returns the specified date property from the specified section.
* @param pstrSection the INI section name.
* @param pstrProp the property to be retrieved.
* @param iniSectionName the INI section name.
* @param propertyKey the property to be retrieved.
* @return the date property value.
*/
public Date getTimestampProperty(String pstrSection, String pstrProp)
{
Timestamp tsRet = null;
Date dtTmp = null;
String strVal = null;
DateFormat dtFmt = null;
INIProperty objProp = null;
INISection objSec = null;
public Date getTimestampProperty(String iniSectionName, String propertyKey) {
objSec = (INISection) this.mhmapSections.get(pstrSection);
if (objSec != null)
{
objProp = objSec.getProperty(pstrProp);
try
{
if (objProp != null) strVal = objProp.getPropValue();
if (strVal != null)
{
dtFmt = new SimpleDateFormat(this.mstrDateFmt);
dtTmp = dtFmt.parse(strVal);
tsRet = new Timestamp(dtTmp.getTime());
}
}
catch (ParseException PExIgnore)
{
}
catch (IllegalArgumentException IAEx)
{
}
finally
{
if (objProp != null) objProp = null;
}
objSec = null;
Date dateToReturn = null;
INISection iniSection = this.iniSections.get(iniSectionName);
if (iniSection != null) {
INIProperty objProp = iniSection.getProperty(propertyKey);
try {
String propertyStringValue = null;
if (objProp != null) propertyStringValue = objProp.getPropValue();
if (propertyStringValue != null) {
DateTimeFormatter dtFmt = DateTimeFormatter.ofPattern(this.mstrTimeStampFmt).withZone(ZoneId.systemDefault());
ZonedDateTime zonedDateTime = ZonedDateTime.parse(propertyStringValue, dtFmt);
dateToReturn = Date.from(zonedDateTime.toInstant());
}
} catch (IllegalArgumentException IAEx) {
}
return tsRet;
}
return dateToReturn;
}
/*------------------------------------------------------------------------------
@ -394,11 +374,11 @@ public final class IniFile
{
INISection objSec = null;
objSec = (INISection) this.mhmapSections.get(pstrSection);
objSec = (INISection) this.iniSections.get(pstrSection);
if (objSec == null)
{
objSec = new INISection(pstrSection);
this.mhmapSections.put(pstrSection, objSec);
this.iniSections.put(pstrSection, objSec);
}
objSec.setSecComments(delRemChars(pstrComments));
objSec = null;
@ -415,11 +395,11 @@ public final class IniFile
{
INISection objSec = null;
objSec = (INISection) this.mhmapSections.get(pstrSection);
objSec = (INISection) this.iniSections.get(pstrSection);
if (objSec == null)
{
objSec = new INISection(pstrSection);
this.mhmapSections.put(pstrSection, objSec);
this.iniSections.put(pstrSection, objSec);
}
objSec.setProperty(pstrProp, pstrVal, pstrComments);
}
@ -435,11 +415,11 @@ public final class IniFile
{
INISection objSec = null;
objSec = (INISection) this.mhmapSections.get(pstrSection);
objSec = (INISection) this.iniSections.get(pstrSection);
if (objSec == null)
{
objSec = new INISection(pstrSection);
this.mhmapSections.put(pstrSection, objSec);
this.iniSections.put(pstrSection, objSec);
}
if (pblnVal)
objSec.setProperty(pstrProp, "TRUE", pstrComments);
@ -458,11 +438,11 @@ public final class IniFile
{
INISection objSec = null;
objSec = (INISection) this.mhmapSections.get(pstrSection);
objSec = (INISection) this.iniSections.get(pstrSection);
if (objSec == null)
{
objSec = new INISection(pstrSection);
this.mhmapSections.put(pstrSection, objSec);
this.iniSections.put(pstrSection, objSec);
}
objSec.setProperty(pstrProp, Integer.toString(pintVal), pstrComments);
}
@ -478,11 +458,11 @@ public final class IniFile
{
INISection objSec = null;
objSec = (INISection) this.mhmapSections.get(pstrSection);
objSec = (INISection) this.iniSections.get(pstrSection);
if (objSec == null)
{
objSec = new INISection(pstrSection);
this.mhmapSections.put(pstrSection, objSec);
this.iniSections.put(pstrSection, objSec);
}
objSec.setProperty(pstrProp, Long.toString(plngVal), pstrComments);
}
@ -498,11 +478,11 @@ public final class IniFile
{
INISection objSec = null;
objSec = (INISection) this.mhmapSections.get(pstrSection);
objSec = (INISection) this.iniSections.get(pstrSection);
if (objSec == null)
{
objSec = new INISection(pstrSection);
this.mhmapSections.put(pstrSection, objSec);
this.iniSections.put(pstrSection, objSec);
}
objSec.setProperty(pstrProp, Double.toString(pdblVal), pstrComments);
}
@ -518,11 +498,11 @@ public final class IniFile
{
INISection objSec = null;
objSec = (INISection) this.mhmapSections.get(pstrSection);
objSec = (INISection) this.iniSections.get(pstrSection);
if (objSec == null)
{
objSec = new INISection(pstrSection);
this.mhmapSections.put(pstrSection, objSec);
this.iniSections.put(pstrSection, objSec);
}
objSec.setProperty(pstrProp, utilDateToStr(pdtVal, this.mstrDateFmt),
pstrComments);
@ -530,27 +510,27 @@ public final class IniFile
/**
* Sets the specified java.sql.Timestamp property.
* @param pstrSection the INI section name.
* @param pstrProp the property to be set.
* @param ptsVal the timestamp value to be persisted.
* @param iniSection the INI section name.
* @param propertyKey the property to be set.
* @param propertyValue the timestamp value to be persisted.
*/
public void setTimestampProperty(String pstrSection, String pstrProp,
Timestamp ptsVal, String pstrComments)
public void setTimestampProperty(String iniSection, String propertyKey,
ZonedDateTime propertyValue, String propertyComments)
{
INISection objSec = null;
objSec = (INISection) this.mhmapSections.get(pstrSection);
objSec = (INISection) this.iniSections.get(iniSection);
if (objSec == null)
{
objSec = new INISection(pstrSection);
this.mhmapSections.put(pstrSection, objSec);
objSec = new INISection(iniSection);
this.iniSections.put(iniSection, objSec);
}
objSec.setProperty(pstrProp, timeToStr(ptsVal, this.mstrTimeStampFmt),
pstrComments);
objSec.setProperty(propertyKey, timeToString(propertyValue, this.mstrTimeStampFmt),
propertyComments);
}
/**
* Sets the format to be used to interpreat date values.
* Sets the format to be used to interpret date values.
* @param pstrDtFmt the format string
* @throws IllegalArgumentException if the if the given pattern is invalid
*/
@ -578,7 +558,7 @@ public final class IniFile
------------------------------------------------------------------------------*/
public int getTotalSections()
{
return this.mhmapSections.size();
return this.iniSections.size();
}
/**
@ -593,10 +573,10 @@ public final class IniFile
try
{
if (this.mhmapSections.size() > 0)
if (this.iniSections.size() > 0)
{
arrRet = new String[this.mhmapSections.size()];
for (iter = this.mhmapSections.keySet().iterator();;iter.hasNext())
arrRet = new String[this.iniSections.size()];
for (iter = this.iniSections.keySet().iterator();; iter.hasNext())
{
arrRet[iCntr] = (String) iter.next();
iCntr++;
@ -623,7 +603,7 @@ public final class IniFile
String[] arrRet = null;
INISection objSec = null;
objSec = (INISection) this.mhmapSections.get(pstrSection);
objSec = (INISection) this.iniSections.get(pstrSection);
if (objSec != null)
{
arrRet = objSec.getPropNames();
@ -642,7 +622,7 @@ public final class IniFile
Map<String, INIProperty> hmRet = null;
INISection objSec = null;
objSec = (INISection) this.mhmapSections.get(pstrSection);
objSec = (INISection) this.iniSections.get(pstrSection);
if (objSec != null)
{
hmRet = objSec.getProperties();
@ -661,7 +641,7 @@ public final class IniFile
{
INISection objSec = null;
objSec = (INISection) this.mhmapSections.get(pstrSection);
objSec = (INISection) this.iniSections.get(pstrSection);
if (objSec != null)
{
objSec.removeProperty(pstrProp);
@ -675,8 +655,8 @@ public final class IniFile
*/
public void removeSection(String pstrSection)
{
if (this.mhmapSections.containsKey(pstrSection))
this.mhmapSections.remove(pstrSection);
if (this.iniSections.containsKey(pstrSection))
this.iniSections.remove(pstrSection);
}
/**
@ -696,15 +676,15 @@ public final class IniFile
try
{
if (this.mhmapSections.size() == 0) return false;
objFile = new CSFile(this.mstrFile);
if (this.iniSections.size() == 0) return false;
objFile = new CSFile(this.filepath);
if (objFile.exists()) objFile.delete();
objWriter = new FileWriter(objFile);
itrSec = this.mhmapSections.keySet().iterator();
itrSec = this.iniSections.keySet().iterator();
while (itrSec.hasNext())
{
strName = (String) itrSec.next();
objSec = (INISection) this.mhmapSections.get(strName);
objSec = (INISection) this.iniSections.get(strName);
strTemp = objSec.toString();
objWriter.write(strTemp);
objWriter.write("\r\n");
@ -739,13 +719,13 @@ public final class IniFile
try
{
if (this.mhmapSections.size() == 0) return false;
if (this.iniSections.size() == 0) return false;
objWriter = new OutputStreamWriter(stream, "UTF-8");
itrSec = this.mhmapSections.keySet().iterator();
itrSec = this.iniSections.keySet().iterator();
while (itrSec.hasNext())
{
strName = (String) itrSec.next();
objSec = (INISection) this.mhmapSections.get(strName);
objSec = (INISection) this.iniSections.get(strName);
strTemp = objSec.toString();
objWriter.write(strTemp);
objWriter.write("\r\n");
@ -891,7 +871,7 @@ public final class IniFile
{
// Section start reached create new section
if (objSec != null)
this.mhmapSections.put(strSection.trim(), objSec);
this.iniSections.put(strSection.trim(), objSec);
objSec = null;
strSection = strLine.substring(1, strLine.length() - 1);
objSec = new INISection(strSection.trim(), strRemarks);
@ -912,22 +892,22 @@ public final class IniFile
}
}
if (objSec != null)
this.mhmapSections.put(strSection.trim(), objSec);
this.mblnLoaded = true;
this.iniSections.put(strSection.trim(), objSec);
this.fileSuccessfullyLoaded = true;
}
}
}
catch (FileNotFoundException FNFExIgnore)
{
this.mhmapSections.clear();
this.iniSections.clear();
}
catch (IOException IOExIgnore)
{
this.mhmapSections.clear();
this.iniSections.clear();
}
catch (NullPointerException NPExIgnore)
{
this.mhmapSections.clear();
this.iniSections.clear();
}
finally
{
@ -961,7 +941,7 @@ public final class IniFile
try
{
objFRdr = new FileReader(this.mstrFile);
objFRdr = new FileReader(this.filepath);
if (objFRdr != null)
{
objBRdr = new BufferedReader(objFRdr);
@ -991,7 +971,7 @@ public final class IniFile
{
// Section start reached create new section
if (objSec != null)
this.mhmapSections.put(strSection.trim(), objSec);
this.iniSections.put(strSection.trim(), objSec);
objSec = null;
strSection = strLine.substring(1, strLine.length() - 1);
objSec = new INISection(strSection.trim(), strRemarks);
@ -1012,22 +992,22 @@ public final class IniFile
}
}
if (objSec != null)
this.mhmapSections.put(strSection.trim(), objSec);
this.mblnLoaded = true;
this.iniSections.put(strSection.trim(), objSec);
this.fileSuccessfullyLoaded = true;
}
}
}
catch (FileNotFoundException FNFExIgnore)
{
this.mhmapSections.clear();
this.iniSections.clear();
}
catch (IOException IOExIgnore)
{
this.mhmapSections.clear();
this.iniSections.clear();
}
catch (NullPointerException NPExIgnore)
{
this.mhmapSections.clear();
this.iniSections.clear();
}
finally
{
@ -1080,17 +1060,17 @@ public final class IniFile
/**
* Helper method to check the existance of a file.
* @param the full path and name of the file to be checked.
* @param pathName the full path and name of the file to be checked.
* @return true if file exists, false otherwise.
*/
private boolean checkFile(String pstrFile)
private boolean checkFile(String pathName)
{
boolean blnRet = false;
File objFile = null;
try
{
objFile = new CSFile(pstrFile);
objFile = new CSFile(pathName);
blnRet = (objFile.exists() && objFile.isFile());
}
catch (Exception e)
@ -1106,19 +1086,19 @@ public final class IniFile
/**
* Converts a java.util.date into String
* @param pd Date that need to be converted to String
* @param pstrFmt The date format pattern.
* @param date Date to be converted to String
* @param dateFormat The date format pattern.
* @return String
*/
private String utilDateToStr(Date pdt, String pstrFmt)
private String utilDateToStr(Date date, String dateFormat)
{
String strRet = null;
SimpleDateFormat dtFmt = null;
try
{
dtFmt = new SimpleDateFormat(pstrFmt);
strRet = dtFmt.format(pdt);
dtFmt = new SimpleDateFormat(dateFormat);
strRet = dtFmt.format(date);
}
catch (Exception e)
{
@ -1135,34 +1115,33 @@ public final class IniFile
* Converts the given sql timestamp object to a string representation. The format
* to be used is to be obtained from the configuration file.
*
* @param pobjTS the sql timestamp object to be converted.
* @param pblnGMT If true formats the string using GMT timezone
* otherwise using local timezone.
* @param zonedDateTime the sql timestamp object to be converted.
* @param timeFormat the time format used to store the zonedDateTime value.
* @return the formatted string representation of the timestamp.
*/
private String timeToStr(Timestamp pobjTS, String pstrFmt)
private String timeToString(ZonedDateTime zonedDateTime, String timeFormat)
{
String strRet = null;
SimpleDateFormat dtFmt = null;
String stringValue = null;
DateTimeFormatter dateTimeFormatter = null;
try
{
dtFmt = new SimpleDateFormat(pstrFmt);
strRet = dtFmt.format(pobjTS);
dateTimeFormatter = DateTimeFormatter.ofPattern(timeFormat);
stringValue = dateTimeFormatter.format(zonedDateTime);
}
catch (IllegalArgumentException iae)
{
strRet = "";
stringValue = "";
}
catch (NullPointerException npe)
{
strRet = "";
stringValue = "";
}
finally
{
if (dtFmt != null) dtFmt = null;
if (dateTimeFormatter != null) dateTimeFormatter = null;
}
return strRet;
return stringValue;
}
/**

View File

@ -9,10 +9,11 @@ import java.io.InputStream;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
@ -88,6 +89,8 @@ import org.slf4j.LoggerFactory;
public class FilesystemPackageCacheManager extends BasePackageCacheManager implements IPackageCacheManager {
public static final String INI_TIMESTAMP_FORMAT = "yyyyMMddHHmmss";
public enum FilesystemPackageCacheMode {
USER, SYSTEM, TESTING, CUSTOM
}
@ -486,8 +489,8 @@ public class FilesystemPackageCacheManager extends BasePackageCacheManager imple
Utilities.renameDirectory(tempDir, packRoot);
IniFile ini = new IniFile(Utilities.path(cacheFolder, "packages.ini"));
ini.setTimeStampFormat("yyyyMMddhhmmss");
ini.setTimestampProperty("packages", id + "#" + v, Timestamp.from(Instant.now()), null);
ini.setTimeStampFormat(INI_TIMESTAMP_FORMAT);
ini.setTimestampProperty("packages", id + "#" + v, ZonedDateTime.now(), null);
ini.setIntegerProperty("package-sizes", id + "#" + v, npm.getSize(), null);
ini.save();
if (progress)

View File

@ -0,0 +1,70 @@
package org.hl7.fhir.utilities;
import org.junit.Test;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.text.ParseException;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class IniFileTest {
public static final String EXPECTED_TIMESTAMP_STRING = "1979-12-31 19:16:40";
public static final String DUMMY_SECTION = "dummy-section";
public static final String DUMMY_TIMESTAMP_KEY = "dummyTimestamp";
public static final String DUMMY_TIMESTAMP_COMMENT = "dummy comment";
public static final String INTEGER_ONLY_DATETIME_STRING = "19791231191640";
public static final String INTEGER_ONLY_DATE_TIME_FORMAT = "yyyyMMddHHmmss";
public ZonedDateTime getDummyInstant() throws ParseException {
DateTimeFormatter dtFmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.systemDefault());
return ZonedDateTime.parse(EXPECTED_TIMESTAMP_STRING,dtFmt);
}
@Test
public void testZonedDateTime() {
DateTimeFormatter dtFmt = DateTimeFormatter.ofPattern(INTEGER_ONLY_DATE_TIME_FORMAT);
LocalDateTime dateTime = LocalDateTime.parse(INTEGER_ONLY_DATETIME_STRING,dtFmt);
}
@Test
public void testSetTimestampPropertyDefaultFormat() throws IOException, ParseException {
Path testIni = Files.createTempFile("testIni", ".ini");
IniFile iniFile = new IniFile(testIni.toAbsolutePath().toString());
ZonedDateTime timestamp = getDummyInstant();
iniFile.setTimestampProperty(DUMMY_SECTION, DUMMY_TIMESTAMP_KEY, timestamp, DUMMY_TIMESTAMP_COMMENT);
Date date = iniFile.getTimestampProperty(DUMMY_SECTION, DUMMY_TIMESTAMP_KEY);
assertEquals(EXPECTED_TIMESTAMP_STRING, iniFile.getStringProperty(DUMMY_SECTION, DUMMY_TIMESTAMP_KEY));
assertEquals(Date.from(timestamp.toInstant()).getTime(), date.getTime());
}
@Test
public void voidTestSetTimeStampPropertyExplicitFormat() throws IOException, ParseException {
Path testIni = Files.createTempFile("testIni", ".ini");
IniFile iniFile = new IniFile(testIni.toAbsolutePath().toString());
ZonedDateTime timestamp = getDummyInstant();
iniFile.setTimeStampFormat(INTEGER_ONLY_DATE_TIME_FORMAT);
iniFile.setTimestampProperty(DUMMY_SECTION, DUMMY_TIMESTAMP_KEY, timestamp, DUMMY_TIMESTAMP_COMMENT);
Date date = iniFile.getTimestampProperty(DUMMY_SECTION, DUMMY_TIMESTAMP_KEY);
assertEquals(INTEGER_ONLY_DATETIME_STRING, iniFile.getStringProperty(DUMMY_SECTION, DUMMY_TIMESTAMP_KEY));
assertEquals(Date.from(timestamp.toInstant()).getTime(), date.getTime());
}
}