diff --git a/utils/src/main/java/li/strolch/utils/helper/FileHelper.java b/utils/src/main/java/li/strolch/utils/helper/FileHelper.java index fa8558aca..682745f40 100644 --- a/utils/src/main/java/li/strolch/utils/helper/FileHelper.java +++ b/utils/src/main/java/li/strolch/utils/helper/FileHelper.java @@ -82,6 +82,7 @@ public class FileHelper { *
  • {@link TempFileOptions#SEPARATE_DATE_SEGMENTS}
  • *
  • {@link TempFileOptions#SEPARATE_HOURS}
  • *
  • {@link TempFileOptions#WITH_HOURS}
  • + *
  • {@link TempFileOptions#MILLIS_FIRST}
  • * * * @param tempPath the directory to which to write the file @@ -92,8 +93,14 @@ public class FileHelper { * @return the temporary file */ public static File getTempFile(File tempPath, String prefix, String suffix, Set options) { + return getTempFile(tempPath, prefix, suffix, options, LocalDateTime.now(), System.currentTimeMillis()); + } + + static File getTempFile(File tempPath, String prefix, String suffix, Set options, + LocalDateTime dateTime, long timestamp) { + prefix = StringHelper.trimOrEmpty(prefix); + suffix = StringHelper.trimOrEmpty(suffix); - LocalDateTime dateTime = LocalDateTime.now(); LocalDate localDate = dateTime.toLocalDate(); boolean separateDateSegments = options.contains(SEPARATE_DATE_SEGMENTS); @@ -113,21 +120,22 @@ public class FileHelper { throw new IllegalStateException("Failed to create path " + path.getAbsolutePath()); boolean appendMillis = options.contains(APPEND_MILLIS); - if (appendMillis) - prefix = (isEmpty(prefix) ? "" : prefix + "_"); - else - prefix = (isEmpty(prefix) ? "" : prefix); + boolean millisFirst = appendMillis && options.contains(MILLIS_FIRST); + if (appendMillis) { + if (isEmpty(prefix)) { + prefix = String.valueOf(timestamp); + } else { + if (millisFirst) + prefix = timestamp + "_" + prefix; + else + prefix = prefix + "_" + timestamp; + } - suffix = (isEmpty(suffix) ? "" : suffix); - if (!suffix.startsWith(".") && appendMillis) - suffix = "_" + suffix; - - String fileName; - if (appendMillis) - fileName = prefix + System.currentTimeMillis() + suffix; - else - fileName = prefix + suffix; + if (!suffix.startsWith(".")) + prefix = prefix + "_"; + } + String fileName = prefix + suffix; return new File(path, fileName); } diff --git a/utils/src/main/java/li/strolch/utils/helper/TempFileOptions.java b/utils/src/main/java/li/strolch/utils/helper/TempFileOptions.java index 318843529..699b03814 100644 --- a/utils/src/main/java/li/strolch/utils/helper/TempFileOptions.java +++ b/utils/src/main/java/li/strolch/utils/helper/TempFileOptions.java @@ -10,5 +10,6 @@ public enum TempFileOptions { SEPARATE_DATE_SEGMENTS, WITH_HOURS, SEPARATE_HOURS, - APPEND_MILLIS + APPEND_MILLIS, + MILLIS_FIRST } diff --git a/utils/src/test/java/li/strolch/utils/helper/FileHelperTest.java b/utils/src/test/java/li/strolch/utils/helper/FileHelperTest.java index a58a4605e..b114a6edd 100644 --- a/utils/src/test/java/li/strolch/utils/helper/FileHelperTest.java +++ b/utils/src/test/java/li/strolch/utils/helper/FileHelperTest.java @@ -6,14 +6,18 @@ import static li.strolch.utils.helper.TempFileOptions.*; import static org.junit.Assert.assertEquals; import java.io.File; +import java.text.MessageFormat; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.Set; import org.junit.BeforeClass; import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class FileHelperTest { + private static final Logger logger = LoggerFactory.getLogger(FileHelperTest.class); private static File tempPath; @@ -25,6 +29,8 @@ public class FileHelperTest { @Test public void shouldCreateTempFileNoOptions() { File path = getTempFile(tempPath, "NoOptions", ".txt"); + logger.info("Temp path: " + path.getAbsolutePath()); + LocalDate today = LocalDate.now(); String expected = today + "/NoOptions.txt"; assertEquals(new File(tempPath, expected), path); @@ -32,35 +38,82 @@ public class FileHelperTest { @Test public void shouldCreateTempFileSeparateDateSegments() { - File path = getTempFile(tempPath, "SeparateDateSegments", ".txt", Set.of(SEPARATE_DATE_SEGMENTS)); + Set options = Set.of(SEPARATE_DATE_SEGMENTS); + File path = getTempFile(tempPath, "SeparateDateSegments", ".txt", options); + logger.info("Temp path: " + path.getAbsolutePath()); + LocalDate today = LocalDate.now(); - String expected = - today.getYear() + "/" + normalizeLength(String.valueOf(today.getMonthValue()), 2, true, '0') + "/" - + normalizeLength(String.valueOf(today.getDayOfMonth()), 2, true, '0') - + "/SeparateDateSegments.txt"; + String month = normalizeLength(String.valueOf(today.getMonthValue()), 2, true, '0'); + String day = normalizeLength(String.valueOf(today.getDayOfMonth()), 2, true, '0'); + String expected = MessageFormat.format("{0,number,#}/{1}/{2}/SeparateDateSegments.txt", today.getYear(), month, + day); assertEquals(new File(tempPath, expected), path); } @Test public void shouldCreateTempFileSeparateDateSegments_WithHours() { - File path = getTempFile(tempPath, "SeparateDateSegments", ".txt", Set.of(SEPARATE_DATE_SEGMENTS, WITH_HOURS)); + Set options = Set.of(SEPARATE_DATE_SEGMENTS, WITH_HOURS); + File path = getTempFile(tempPath, "SeparateDateSegments", ".txt", options); + logger.info("Temp path: " + path.getAbsolutePath()); + LocalDateTime today = LocalDateTime.now(); - String expected = - today.getYear() + "/" + normalizeLength(String.valueOf(today.getMonthValue()), 2, true, '0') + "/" - + normalizeLength(String.valueOf(today.getDayOfMonth()), 2, true, '0') + "_" + normalizeLength( - String.valueOf(today.getHour()), 2, true, '0') + "/SeparateDateSegments.txt"; + String month = normalizeLength(String.valueOf(today.getMonthValue()), 2, true, '0'); + String day = normalizeLength(String.valueOf(today.getDayOfMonth()), 2, true, '0'); + String hour = normalizeLength(String.valueOf(today.getHour()), 2, true, '0'); + String expected = MessageFormat.format("{0,number,#}/{1}/{2}_{3}/SeparateDateSegments.txt", today.getYear(), + month, day, hour); assertEquals(new File(tempPath, expected), path); } @Test public void shouldCreateTempFileSeparateDateSegments_WithHours_SeparateHours() { - File path = getTempFile(tempPath, "SeparateDateSegments", ".txt", - Set.of(SEPARATE_DATE_SEGMENTS, WITH_HOURS, SEPARATE_HOURS)); + Set options = Set.of(SEPARATE_DATE_SEGMENTS, WITH_HOURS, SEPARATE_HOURS); + File path = getTempFile(tempPath, "SeparateDateSegments", ".txt", options); + logger.info("Temp path: " + path.getAbsolutePath()); + LocalDateTime today = LocalDateTime.now(); - String expected = - today.getYear() + "/" + normalizeLength(String.valueOf(today.getMonthValue()), 2, true, '0') + "/" - + normalizeLength(String.valueOf(today.getDayOfMonth()), 2, true, '0') + "/" + normalizeLength( - String.valueOf(today.getHour()), 2, true, '0') + "/SeparateDateSegments.txt"; + String month = normalizeLength(String.valueOf(today.getMonthValue()), 2, true, '0'); + String day = normalizeLength(String.valueOf(today.getDayOfMonth()), 2, true, '0'); + String hour = normalizeLength(String.valueOf(today.getHour()), 2, true, '0'); + String expected = MessageFormat.format("{0,number,#}/{1}/{2}/{3}/SeparateDateSegments.txt", today.getYear(), + month, day, hour); + assertEquals(new File(tempPath, expected), path); + } + + @Test + public void shouldCreateTempFileSeparateDateSegments_WithHours_SeparateHoursWithMillis() { + LocalDateTime today = LocalDateTime.now(); + long timestamp = System.currentTimeMillis(); + + Set options = Set.of(SEPARATE_DATE_SEGMENTS, WITH_HOURS, SEPARATE_HOURS, APPEND_MILLIS); + File path = getTempFile(tempPath, "SeparateDateSegments", ".txt", options, today, timestamp); + logger.info("Temp path: " + path.getAbsolutePath()); + + String month = normalizeLength(String.valueOf(today.getMonthValue()), 2, true, '0'); + String day = normalizeLength(String.valueOf(today.getDayOfMonth()), 2, true, '0'); + String hour = normalizeLength(String.valueOf(today.getHour()), 2, true, '0'); + int year = today.getYear(); + String expected = MessageFormat.format("{0,number,#}/{1}/{2}/{3}/SeparateDateSegments_{4,number,#}.txt", year, + month, day, hour, timestamp); + assertEquals(new File(tempPath, expected), path); + } + + @Test + public void shouldCreateTempFileSeparateDateSegments_WithHours_SeparateHoursWithMillisFirst() { + LocalDateTime today = LocalDateTime.now(); + long timestamp = System.currentTimeMillis(); + + Set options = Set.of(SEPARATE_DATE_SEGMENTS, WITH_HOURS, SEPARATE_HOURS, APPEND_MILLIS, + MILLIS_FIRST); + File path = getTempFile(tempPath, "SeparateDateSegments", ".txt", options, today, timestamp); + logger.info("Temp path: " + path.getAbsolutePath()); + + String month = normalizeLength(String.valueOf(today.getMonthValue()), 2, true, '0'); + String day = normalizeLength(String.valueOf(today.getDayOfMonth()), 2, true, '0'); + String hour = normalizeLength(String.valueOf(today.getHour()), 2, true, '0'); + int year = today.getYear(); + String expected = MessageFormat.format("{0,number,#}/{1}/{2}/{3}/{4,number,#}_SeparateDateSegments.txt", year, + month, day, hour, timestamp); assertEquals(new File(tempPath, expected), path); } }