From 07a697c6538fb82801fc14355fb96c0228a1d51e Mon Sep 17 00:00:00 2001 From: dotasek Date: Wed, 26 Jul 2023 10:43:37 -0400 Subject: [PATCH 1/3] WIP tests --- .../src/test/java/org/hl7/fhir/utilities/IniFileTest.java | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 org.hl7.fhir.utilities/src/test/java/org/hl7/fhir/utilities/IniFileTest.java diff --git a/org.hl7.fhir.utilities/src/test/java/org/hl7/fhir/utilities/IniFileTest.java b/org.hl7.fhir.utilities/src/test/java/org/hl7/fhir/utilities/IniFileTest.java new file mode 100644 index 000000000..6f69e06db --- /dev/null +++ b/org.hl7.fhir.utilities/src/test/java/org/hl7/fhir/utilities/IniFileTest.java @@ -0,0 +1,2 @@ +package org.hl7.fhir.utilities;public class IniFileTest { +} From f88dae6ab8838ec624aebfb0cf9de00cdd83fee0 Mon Sep 17 00:00:00 2001 From: dotasek Date: Wed, 26 Jul 2023 10:43:54 -0400 Subject: [PATCH 2/3] WIP tests --- .../java/org/hl7/fhir/utilities/IniFile.java | 214 +++++++++--------- .../npm/FilesystemPackageCacheManager.java | 4 +- .../org/hl7/fhir/utilities/IniFileTest.java | 47 +++- 3 files changed, 153 insertions(+), 112 deletions(-) diff --git a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/IniFile.java b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/IniFile.java index 839f3cc7b..7a4e1bf46 100644 --- a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/IniFile.java +++ b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/IniFile.java @@ -1,33 +1,33 @@ package org.hl7.fhir.utilities; -/* - Copyright (c) 2011+, HL7, Inc. - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of HL7 nor the names of its contributors may be used to - endorse or promote products derived from this software without specific - prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - - */ +/* + Copyright (c) 2011+, HL7, Inc. + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of HL7 nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + */ @@ -47,14 +47,7 @@ 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.util.*; /** @@ -74,34 +67,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 mhmapSections; + private LinkedHashMap 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(); - this.mstrFile = pstrPathAndName; + this.iniSections = new LinkedHashMap(); + 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(); - this.mstrFile = null; + this.iniSections = new LinkedHashMap(); + this.filepath = null; // Load the specified INI file. loadStream(stream); } @@ -115,7 +108,7 @@ public final class IniFile */ public String getFileName() { - return this.mstrFile; + return this.filepath; } /** @@ -130,7 +123,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 +159,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 +191,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 +228,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 +265,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 +303,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); @@ -353,7 +346,7 @@ public final class IniFile INIProperty objProp = null; INISection objSec = null; - objSec = (INISection) this.mhmapSections.get(pstrSection); + objSec = this.iniSections.get(pstrSection); if (objSec != null) { objProp = objSec.getProperty(pstrProp); @@ -362,7 +355,8 @@ public final class IniFile if (objProp != null) strVal = objProp.getPropValue(); if (strVal != null) { - dtFmt = new SimpleDateFormat(this.mstrDateFmt); + dtFmt = new SimpleDateFormat(this.mstrTimeStampFmt); + dtFmt.setTimeZone(TimeZone.getTimeZone("UTC")); dtTmp = dtFmt.parse(strVal); tsRet = new Timestamp(dtTmp.getTime()); } @@ -394,11 +388,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 +409,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 +429,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 +452,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 +472,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 +492,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 +512,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,23 +524,23 @@ 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, + Timestamp 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, timeToStr(propertyValue, this.mstrTimeStampFmt), + propertyComments); } /** @@ -578,7 +572,7 @@ public final class IniFile ------------------------------------------------------------------------------*/ public int getTotalSections() { - return this.mhmapSections.size(); + return this.iniSections.size(); } /** @@ -593,10 +587,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 +617,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 +636,7 @@ public final class IniFile Map 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 +655,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 +669,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 +690,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 +733,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 +885,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 +906,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 +955,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 +985,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 +1006,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 { @@ -1083,14 +1077,14 @@ public final class IniFile * @param 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) diff --git a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/npm/FilesystemPackageCacheManager.java b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/npm/FilesystemPackageCacheManager.java index 4f98bd5f1..55cf1254b 100644 --- a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/npm/FilesystemPackageCacheManager.java +++ b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/npm/FilesystemPackageCacheManager.java @@ -88,6 +88,8 @@ import javax.annotation.Nonnull; public class FilesystemPackageCacheManager extends BasePackageCacheManager implements IPackageCacheManager { + public static final String INI_TIMESTAMP_FORMAT = "yyyyMMddhhmmss"; + public enum FilesystemPackageCacheMode { USER, SYSTEM, TESTING, CUSTOM } @@ -486,7 +488,7 @@ public class FilesystemPackageCacheManager extends BasePackageCacheManager imple Utilities.renameDirectory(tempDir, packRoot); IniFile ini = new IniFile(Utilities.path(cacheFolder, "packages.ini")); - ini.setTimeStampFormat("yyyyMMddhhmmss"); + ini.setTimeStampFormat(INI_TIMESTAMP_FORMAT); ini.setTimestampProperty("packages", id + "#" + v, Timestamp.from(Instant.now()), null); ini.setIntegerProperty("package-sizes", id + "#" + v, npm.getSize(), null); ini.save(); diff --git a/org.hl7.fhir.utilities/src/test/java/org/hl7/fhir/utilities/IniFileTest.java b/org.hl7.fhir.utilities/src/test/java/org/hl7/fhir/utilities/IniFileTest.java index 6f69e06db..5081f2d2f 100644 --- a/org.hl7.fhir.utilities/src/test/java/org/hl7/fhir/utilities/IniFileTest.java +++ b/org.hl7.fhir.utilities/src/test/java/org/hl7/fhir/utilities/IniFileTest.java @@ -1,2 +1,47 @@ -package org.hl7.fhir.utilities;public class IniFileTest { +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.sql.Timestamp; +import java.time.Instant; +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"; + + @Test + public void testSetTimestampPropertyDefaultFormat() throws IOException { + Path testIni = Files.createTempFile("testIni", ".ini"); + IniFile iniFile = new IniFile(testIni.toAbsolutePath().toString()); + java.sql.Timestamp timestamp = Timestamp.valueOf(EXPECTED_TIMESTAMP_STRING); + 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(timestamp.getTime(), date.getTime()); + + } + + @Test + public void voidTestSetTimeStampPropertyExplicitFormat() throws IOException { + Path testIni = Files.createTempFile("testIni", ".ini"); + IniFile iniFile = new IniFile(testIni.toAbsolutePath().toString()); + java.sql.Timestamp timestamp = Timestamp.valueOf(EXPECTED_TIMESTAMP_STRING); + iniFile.setTimeStampFormat("yyyyMMddhhmmss"); + iniFile.setTimestampProperty(DUMMY_SECTION, DUMMY_TIMESTAMP_KEY, timestamp, DUMMY_TIMESTAMP_COMMENT); + + Date date = iniFile.getTimestampProperty(DUMMY_SECTION, DUMMY_TIMESTAMP_KEY); + + assertEquals("19791231071640", iniFile.getStringProperty(DUMMY_SECTION, DUMMY_TIMESTAMP_KEY)); + assertEquals(timestamp.getTime(), date.getTime()); + } } From 50047af493f4f19eb55544623431ac0e65f15ab1 Mon Sep 17 00:00:00 2001 From: dotasek Date: Wed, 26 Jul 2023 17:08:08 -0400 Subject: [PATCH 3/3] Switch to ZonedDateTime implementation get tests passing --- .../java/org/hl7/fhir/utilities/IniFile.java | 103 ++++++++---------- .../npm/FilesystemPackageCacheManager.java | 9 +- .../org/hl7/fhir/utilities/IniFileTest.java | 43 ++++++-- 3 files changed, 82 insertions(+), 73 deletions(-) diff --git a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/IniFile.java b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/IniFile.java index 7a4e1bf46..603c95b79 100644 --- a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/IniFile.java +++ b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/IniFile.java @@ -43,10 +43,13 @@ 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.time.ZonedDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; import java.util.*; @@ -333,47 +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 = this.iniSections.get(pstrSection); - if (objSec != null) - { - objProp = objSec.getProperty(pstrProp); - try - { - if (objProp != null) strVal = objProp.getPropValue(); - if (strVal != null) - { - dtFmt = new SimpleDateFormat(this.mstrTimeStampFmt); - dtFmt.setTimeZone(TimeZone.getTimeZone("UTC")); - 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; } /*------------------------------------------------------------------------------ @@ -529,7 +515,7 @@ public final class IniFile * @param propertyValue the timestamp value to be persisted. */ public void setTimestampProperty(String iniSection, String propertyKey, - Timestamp propertyValue, String propertyComments) + ZonedDateTime propertyValue, String propertyComments) { INISection objSec = null; @@ -539,12 +525,12 @@ public final class IniFile objSec = new INISection(iniSection); this.iniSections.put(iniSection, objSec); } - objSec.setProperty(propertyKey, timeToStr(propertyValue, this.mstrTimeStampFmt), + 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 */ @@ -1074,7 +1060,7 @@ 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 pathName) @@ -1100,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) { @@ -1129,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; } /** diff --git a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/npm/FilesystemPackageCacheManager.java b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/npm/FilesystemPackageCacheManager.java index 55cf1254b..13a3f5c84 100644 --- a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/npm/FilesystemPackageCacheManager.java +++ b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/npm/FilesystemPackageCacheManager.java @@ -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,7 +89,7 @@ import javax.annotation.Nonnull; public class FilesystemPackageCacheManager extends BasePackageCacheManager implements IPackageCacheManager { - public static final String INI_TIMESTAMP_FORMAT = "yyyyMMddhhmmss"; + public static final String INI_TIMESTAMP_FORMAT = "yyyyMMddHHmmss"; public enum FilesystemPackageCacheMode { USER, SYSTEM, TESTING, CUSTOM @@ -489,7 +490,7 @@ public class FilesystemPackageCacheManager extends BasePackageCacheManager imple IniFile ini = new IniFile(Utilities.path(cacheFolder, "packages.ini")); ini.setTimeStampFormat(INI_TIMESTAMP_FORMAT); - ini.setTimestampProperty("packages", id + "#" + v, Timestamp.from(Instant.now()), null); + ini.setTimestampProperty("packages", id + "#" + v, ZonedDateTime.now(), null); ini.setIntegerProperty("package-sizes", id + "#" + v, npm.getSize(), null); ini.save(); if (progress) diff --git a/org.hl7.fhir.utilities/src/test/java/org/hl7/fhir/utilities/IniFileTest.java b/org.hl7.fhir.utilities/src/test/java/org/hl7/fhir/utilities/IniFileTest.java index 5081f2d2f..8699c1c37 100644 --- a/org.hl7.fhir.utilities/src/test/java/org/hl7/fhir/utilities/IniFileTest.java +++ b/org.hl7.fhir.utilities/src/test/java/org/hl7/fhir/utilities/IniFileTest.java @@ -5,8 +5,11 @@ import org.junit.Test; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.sql.Timestamp; -import java.time.Instant; +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; @@ -17,31 +20,51 @@ public class IniFileTest { 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 testSetTimestampPropertyDefaultFormat() throws IOException { + 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()); - java.sql.Timestamp timestamp = Timestamp.valueOf(EXPECTED_TIMESTAMP_STRING); + 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(timestamp.getTime(), date.getTime()); + assertEquals(Date.from(timestamp.toInstant()).getTime(), date.getTime()); } + @Test - public void voidTestSetTimeStampPropertyExplicitFormat() throws IOException { + public void voidTestSetTimeStampPropertyExplicitFormat() throws IOException, ParseException { Path testIni = Files.createTempFile("testIni", ".ini"); IniFile iniFile = new IniFile(testIni.toAbsolutePath().toString()); - java.sql.Timestamp timestamp = Timestamp.valueOf(EXPECTED_TIMESTAMP_STRING); - iniFile.setTimeStampFormat("yyyyMMddhhmmss"); + 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("19791231071640", iniFile.getStringProperty(DUMMY_SECTION, DUMMY_TIMESTAMP_KEY)); - assertEquals(timestamp.getTime(), date.getTime()); + assertEquals(INTEGER_ONLY_DATETIME_STRING, iniFile.getStringProperty(DUMMY_SECTION, DUMMY_TIMESTAMP_KEY)); + assertEquals(Date.from(timestamp.toInstant()).getTime(), date.getTime()); } + + }