From a55ff0bfb7b1800ceba6e97909a47f4b6d8cf7ce Mon Sep 17 00:00:00 2001 From: jy95 Date: Mon, 6 Jan 2025 23:36:49 +0100 Subject: [PATCH] refactor: Put deterministic MessageFormat messages in class fields https://github.com/jy95/fds/issues/7 --- .../r4/dosage/utils/translators/AsNeeded.java | 16 +++++++---- .../utils/translators/BoundsDuration.java | 10 ++++--- .../utils/translators/BoundsPeriod.java | 12 ++++---- .../dosage/utils/translators/BoundsRange.java | 10 ++++--- .../utils/translators/CountCountMax.java | 20 +++++++------ .../dosage/utils/translators/DayOfWeek.java | 9 ++++-- .../utils/translators/DoseQuantity.java | 10 ++++--- .../dosage/utils/translators/DoseRange.java | 10 ++++--- .../translators/DurationDurationMax.java | 20 +++++++------ .../translators/FrequencyFrequencyMax.java | 28 +++++++++++-------- .../translators/MaxDosePerAdministration.java | 12 +++++--- .../utils/translators/MaxDosePerLifetime.java | 10 ++++--- .../utils/translators/MaxDosePerPeriod.java | 10 ++++--- .../utils/translators/PeriodPeriodMax.java | 18 ++++++++---- .../utils/translators/RateQuantity.java | 10 ++++--- .../dosage/utils/translators/RateRange.java | 10 ++++--- .../dosage/utils/translators/RateRatio.java | 10 ++++--- .../dosage/utils/translators/TimeOfDay.java | 9 ++++-- .../dosage/utils/translators/TimingEvent.java | 11 ++++---- 19 files changed, 148 insertions(+), 97 deletions(-) diff --git a/src/main/java/jy95/fhir/r4/dosage/utils/translators/AsNeeded.java b/src/main/java/jy95/fhir/r4/dosage/utils/translators/AsNeeded.java index 9f3ccaf7a..80b9972e0 100644 --- a/src/main/java/jy95/fhir/r4/dosage/utils/translators/AsNeeded.java +++ b/src/main/java/jy95/fhir/r4/dosage/utils/translators/AsNeeded.java @@ -11,8 +11,16 @@ public class AsNeeded extends AbstractTranslator { + // Translations + private final MessageFormat asNeededForMsg; + private final String asNeededMsg; + public AsNeeded(FDUConfig config) { super(config); + var bundle = getResources(); + var msg = bundle.getString("fields.asNeededFor"); + asNeededForMsg = new MessageFormat(msg, this.getConfig().getLocale()); + asNeededMsg = bundle.getString("fields.asNeeded"); } @Override @@ -22,7 +30,6 @@ public CompletableFuture convert(Dosage dosage) { // Complex case - "as-need" for ... if (dosage.hasAsNeededCodeableConcept()) { var code = dosage.getAsNeededCodeableConcept(); - var msg = bundle.getString("fields.asNeededFor"); var codeAsText = this .getConfig() .getFromCodeableConceptToString() @@ -30,14 +37,11 @@ public CompletableFuture convert(Dosage dosage) { return codeAsText .thenApplyAsync(v -> ListToString.convert(bundle, List.of(v))) - .thenApplyAsync(v -> { - MessageFormat messageFormat = new MessageFormat(msg, this.getConfig().getLocale()); - return messageFormat.format(new Object[]{v}); - }); + .thenApplyAsync(v -> asNeededForMsg.format(new Object[]{v})); } // Simple case - only "as-needed" - return CompletableFuture.supplyAsync(() -> bundle.getString("fields.asNeeded")); + return CompletableFuture.supplyAsync(() -> asNeededMsg); } @Override diff --git a/src/main/java/jy95/fhir/r4/dosage/utils/translators/BoundsDuration.java b/src/main/java/jy95/fhir/r4/dosage/utils/translators/BoundsDuration.java index 9c3dd65e2..de768cbd8 100644 --- a/src/main/java/jy95/fhir/r4/dosage/utils/translators/BoundsDuration.java +++ b/src/main/java/jy95/fhir/r4/dosage/utils/translators/BoundsDuration.java @@ -10,8 +10,13 @@ public class BoundsDuration extends AbstractTranslator { + // Translations + private final MessageFormat boundsDurationMsg; + public BoundsDuration(FDUConfig config) { super(config); + String msg = getResources().getString("fields.boundsDuration"); + boundsDurationMsg = new MessageFormat(msg, getConfig().getLocale()); } @Override @@ -20,10 +25,7 @@ public CompletableFuture convert(Dosage dosage) { var boundsDuration = dosage.getTiming().getRepeat().getBoundsDuration(); return QuantityToString .convert(bundle, getConfig(), boundsDuration) - .thenApplyAsync((durationText) -> { - String msg = bundle.getString("fields.boundsDuration"); - return new MessageFormat(msg, getConfig().getLocale()).format(new Object[]{durationText}); - }); + .thenApplyAsync((durationText) -> boundsDurationMsg.format(new Object[]{durationText})); } @Override diff --git a/src/main/java/jy95/fhir/r4/dosage/utils/translators/BoundsPeriod.java b/src/main/java/jy95/fhir/r4/dosage/utils/translators/BoundsPeriod.java index db71be7e2..88da7feaf 100644 --- a/src/main/java/jy95/fhir/r4/dosage/utils/translators/BoundsPeriod.java +++ b/src/main/java/jy95/fhir/r4/dosage/utils/translators/BoundsPeriod.java @@ -12,8 +12,13 @@ public class BoundsPeriod extends AbstractTranslator { + // Translations + private final MessageFormat boundsPeriodMsg; + public BoundsPeriod(FDUConfig config) { super(config); + var msg = getResources().getString("fields.boundsPeriod"); + boundsPeriodMsg = new MessageFormat(msg, this.getConfig().getLocale()); } @Override @@ -23,17 +28,12 @@ public CompletableFuture convert(Dosage dosage) { var boundPeriods = dosage.getTiming().getRepeat().getBoundsPeriod(); var hasStart = boundPeriods.hasStart(); var hasEnd = boundPeriods.hasEnd(); - var bundle = this.getResources(); var locale = this.getConfig().getLocale(); - var msg = bundle.getString("fields.boundsPeriod"); // Prepare date values using FormatDateTimes.convert() String startDate = hasStart ? FormatDateTimes.convert(locale, boundPeriods.getStartElement()) : ""; String endDate = hasEnd ? FormatDateTimes.convert(locale, boundPeriods.getEndElement()) : ""; - // Use ICU MessageFormat for more flexible and locale-sensitive formatting - MessageFormat messageFormat = new MessageFormat(msg, this.getConfig().getLocale()); - // Choose the correct condition based on the presence of start and end dates String condition = hasStart && hasEnd ? "0" : (hasStart ? "1" : "other"); @@ -45,7 +45,7 @@ public CompletableFuture convert(Dosage dosage) { ); // Format the message with the named arguments - return messageFormat.format(arguments); + return boundsPeriodMsg.format(arguments); }); } diff --git a/src/main/java/jy95/fhir/r4/dosage/utils/translators/BoundsRange.java b/src/main/java/jy95/fhir/r4/dosage/utils/translators/BoundsRange.java index 21df4ee46..533f06439 100644 --- a/src/main/java/jy95/fhir/r4/dosage/utils/translators/BoundsRange.java +++ b/src/main/java/jy95/fhir/r4/dosage/utils/translators/BoundsRange.java @@ -12,21 +12,23 @@ public class BoundsRange extends AbstractTranslator { + // Translations + private final MessageFormat boundsRangeMsg; + public BoundsRange(FDUConfig config) { super(config); + String msg = getResources().getString("fields.boundsRange"); + boundsRangeMsg = new MessageFormat(msg, getConfig().getLocale()); } @Override public CompletableFuture convert(Dosage dosage) { var boundsRange = dosage.getTiming().getRepeat().getBoundsRange(); var bundle = this.getResources(); - var locale = this.getConfig().getLocale(); - String msg = bundle.getString("fields.boundsRange"); - MessageFormat messageFormat = new MessageFormat(msg, locale); return RangeToString .convert(bundle, this.getConfig(), boundsRange) - .thenApplyAsync(v -> messageFormat.format(new Object[]{v})); + .thenApplyAsync(v -> boundsRangeMsg.format(new Object[]{v})); } @Override diff --git a/src/main/java/jy95/fhir/r4/dosage/utils/translators/CountCountMax.java b/src/main/java/jy95/fhir/r4/dosage/utils/translators/CountCountMax.java index 3c131d752..7610e7dbc 100644 --- a/src/main/java/jy95/fhir/r4/dosage/utils/translators/CountCountMax.java +++ b/src/main/java/jy95/fhir/r4/dosage/utils/translators/CountCountMax.java @@ -10,8 +10,18 @@ public class CountCountMax extends AbstractTranslator { + // Translations + private final MessageFormat countMaxMsg; + private final MessageFormat countMsg; + public CountCountMax(FDUConfig config) { super(config); + var bundle = this.getResources(); + var locale = this.getConfig().getLocale(); + var msg1 = bundle.getString("fields.countMax"); + var msg2 = bundle.getString("fields.count"); + countMaxMsg = new MessageFormat(msg1, locale); + countMsg = new MessageFormat(msg2, locale); } @Override @@ -36,30 +46,24 @@ public boolean isPresent(Dosage dosage) { } private String turnCountAndCountMaxToText(Dosage dosage) { - var locale = this.getConfig().getLocale(); - var bundle = this.getResources(); var repeat = dosage.getTiming().getRepeat(); var countMin = repeat.getCount(); var countMax = repeat.getCountMax(); - var countMsg = bundle.getString("fields.countMax"); Map arguments = Map.of( "minCount", countMin, "maxCount", countMax ); - return new MessageFormat(countMsg, locale).format(arguments); + return countMaxMsg.format(arguments); } private String turnCountToText(Dosage dosage) { - var locale = this.getConfig().getLocale(); - var bundle = this.getResources(); var repeat = dosage.getTiming().getRepeat(); var count = repeat.getCount(); - var countMsg = bundle.getString("fields.count"); - return new MessageFormat(countMsg, locale).format(new Object[]{count}); + return countMsg.format(new Object[]{count}); } } diff --git a/src/main/java/jy95/fhir/r4/dosage/utils/translators/DayOfWeek.java b/src/main/java/jy95/fhir/r4/dosage/utils/translators/DayOfWeek.java index c9649a689..fdbfd4c3a 100644 --- a/src/main/java/jy95/fhir/r4/dosage/utils/translators/DayOfWeek.java +++ b/src/main/java/jy95/fhir/r4/dosage/utils/translators/DayOfWeek.java @@ -12,8 +12,13 @@ public class DayOfWeek extends AbstractTranslator { + // Translations + private final MessageFormat dayOfWeekMsg; + public DayOfWeek(FDUConfig config){ super(config); + var msg = getResources().getString("fields.dayOfWeek"); + dayOfWeekMsg = new MessageFormat(msg, getConfig().getLocale()); } @Override @@ -39,7 +44,6 @@ public CompletableFuture convert(Dosage dosage) { .toList(); var dayOfWeeksAsString = ListToString.convert(bundle, dayOfWeeksCodes); - var msg = bundle.getString("fields.dayOfWeek"); Map messageArguments = Map.of( "dayCondition", dayOfWeeks.size(), @@ -47,8 +51,7 @@ public CompletableFuture convert(Dosage dosage) { ); // Use ICU MessageFormat for plural and select formatting - MessageFormat messageFormat = new MessageFormat(msg, this.getConfig().getLocale()); - return messageFormat.format(messageArguments); + return dayOfWeekMsg.format(messageArguments); }); } diff --git a/src/main/java/jy95/fhir/r4/dosage/utils/translators/DoseQuantity.java b/src/main/java/jy95/fhir/r4/dosage/utils/translators/DoseQuantity.java index 74cf2904c..99f8a52ba 100644 --- a/src/main/java/jy95/fhir/r4/dosage/utils/translators/DoseQuantity.java +++ b/src/main/java/jy95/fhir/r4/dosage/utils/translators/DoseQuantity.java @@ -12,8 +12,13 @@ public class DoseQuantity extends AbstractTranslator { + // Translations + private final MessageFormat doseQuantityMsg; + public DoseQuantity(FDUConfig config) { super(config); + var doseMsg = getResources().getString("fields.doseQuantity"); + doseQuantityMsg = new MessageFormat(doseMsg, getConfig().getLocale()); } @Override @@ -25,10 +30,7 @@ public CompletableFuture convert(Dosage dosage) { .apply(doseAndRate, DoseAndRateKey.DOSE_QUANTITY); return QuantityToString .convert(bundle, getConfig(), (Quantity) doseQuantity) - .thenApplyAsync(quantityText -> { - var doseMsg = bundle.getString("fields.doseQuantity"); - return new MessageFormat(doseMsg, getConfig().getLocale()).format(new Object[]{quantityText}); - }); + .thenApplyAsync(quantityText -> doseQuantityMsg.format(new Object[]{quantityText})); } @Override diff --git a/src/main/java/jy95/fhir/r4/dosage/utils/translators/DoseRange.java b/src/main/java/jy95/fhir/r4/dosage/utils/translators/DoseRange.java index 4f4587be9..9f4980235 100644 --- a/src/main/java/jy95/fhir/r4/dosage/utils/translators/DoseRange.java +++ b/src/main/java/jy95/fhir/r4/dosage/utils/translators/DoseRange.java @@ -12,8 +12,13 @@ public class DoseRange extends AbstractTranslator { + // Translations + private final MessageFormat doseRangeMsg; + public DoseRange(FDUConfig config) { super(config); + var msg = getResources().getString("fields.doseRange"); + doseRangeMsg = new MessageFormat(msg, getConfig().getLocale()); } @Override @@ -26,10 +31,7 @@ public CompletableFuture convert(Dosage dosage) { return RangeToString .convert(bundle, getConfig(), (Range) doseRange) - .thenApplyAsync(rangeText -> { - var rangeMsg = bundle.getString("fields.doseRange"); - return new MessageFormat(rangeMsg, getConfig().getLocale()).format(new Object[]{rangeText}); - }); + .thenApplyAsync(rangeText -> doseRangeMsg.format(new Object[]{rangeText})); } @Override diff --git a/src/main/java/jy95/fhir/r4/dosage/utils/translators/DurationDurationMax.java b/src/main/java/jy95/fhir/r4/dosage/utils/translators/DurationDurationMax.java index cedf0005d..eaaf1815a 100644 --- a/src/main/java/jy95/fhir/r4/dosage/utils/translators/DurationDurationMax.java +++ b/src/main/java/jy95/fhir/r4/dosage/utils/translators/DurationDurationMax.java @@ -12,8 +12,18 @@ public class DurationDurationMax extends AbstractTranslator { + // Translations + private final MessageFormat durationMsg; + private final MessageFormat durationMaxMsg; + public DurationDurationMax(FDUConfig config) { super(config); + var locale = this.getConfig().getLocale(); + var bundle = this.getResources(); + var msg1 = bundle.getString("fields.duration"); + var msg2 = bundle.getString("fields.durationMax"); + durationMsg = new MessageFormat(msg1, locale); + durationMaxMsg = new MessageFormat(msg2, locale); } @Override @@ -60,29 +70,23 @@ public boolean isPresent(Dosage dosage) { } private String turnDurationToString(Dosage dosage) { - var locale = this.getConfig().getLocale(); - var bundle = this.getResources(); var repeat = dosage.getTiming().getRepeat(); var durationUnit = repeat.getDurationUnit().toCode(); var durationQuantity = repeat.getDuration(); - var durationMsg = bundle.getString("fields.duration"); var durationText = quantityToString(durationUnit, durationQuantity); - return new MessageFormat(durationMsg, locale).format(new Object[]{durationText}); + return durationMsg.format(new Object[]{durationText}); } private String turnDurationMaxToString(Dosage dosage) { - var locale = this.getConfig().getLocale(); - var bundle = this.getResources(); var repeat = dosage.getTiming().getRepeat(); var durationUnit = repeat.getDurationUnit().toCode(); var durationQuantity = repeat.getDurationMax(); - var durationMsg = bundle.getString("fields.durationMax"); var durationText = quantityToString(durationUnit, durationQuantity); - return new MessageFormat(durationMsg, locale).format(new Object[]{durationText}); + return durationMaxMsg.format(new Object[]{durationText}); } private String quantityToString(String durationUnit, BigDecimal quantity){ diff --git a/src/main/java/jy95/fhir/r4/dosage/utils/translators/FrequencyFrequencyMax.java b/src/main/java/jy95/fhir/r4/dosage/utils/translators/FrequencyFrequencyMax.java index cff9e66f9..7e5a52486 100644 --- a/src/main/java/jy95/fhir/r4/dosage/utils/translators/FrequencyFrequencyMax.java +++ b/src/main/java/jy95/fhir/r4/dosage/utils/translators/FrequencyFrequencyMax.java @@ -10,8 +10,21 @@ public class FrequencyFrequencyMax extends AbstractTranslator { + // Translations + private final MessageFormat frequencyAndFrequencyMaxMsg; + private final MessageFormat frequencyMaxMsg; + private final MessageFormat frequencyMsg; + public FrequencyFrequencyMax(FDUConfig config) { super(config); + var locale = this.getConfig().getLocale(); + var bundle = this.getResources(); + var msg1 = bundle.getString("fields.frequencyAndFrequencyMax"); + var msg2 = bundle.getString("fields.frequencyMax"); + var msg3 = bundle.getString("fields.frequency"); + frequencyAndFrequencyMaxMsg = new MessageFormat(msg1, locale); + frequencyMaxMsg = new MessageFormat(msg2, locale); + frequencyMsg = new MessageFormat(msg3, locale); } @Override @@ -43,41 +56,32 @@ public boolean isPresent(Dosage dosage) { } private String turnFrequencyAndFrequencyMaxToString(Dosage dosage) { - var locale = this.getConfig().getLocale(); - var bundle = this.getResources(); var repeat = dosage.getTiming().getRepeat(); var frequencyMin = repeat.getFrequency(); var frequencyMax = repeat.getFrequencyMax(); - var frequencyMsg = bundle.getString("fields.frequencyAndFrequencyMax"); Map arguments1 = Map.of( "frequency", frequencyMin, "maxFrequency", frequencyMax ); - return new MessageFormat(frequencyMsg, locale).format(arguments1); + return frequencyAndFrequencyMaxMsg.format(arguments1); } private String turnFrequencyMaxToString(Dosage dosage) { - var locale = this.getConfig().getLocale(); - var bundle = this.getResources(); var repeat = dosage.getTiming().getRepeat(); var frequencyMax = repeat.getFrequencyMax(); - var frequencyMsg = bundle.getString("fields.frequencyMax"); - return new MessageFormat(frequencyMsg, locale).format(new Object[]{frequencyMax}); + return frequencyMaxMsg.format(new Object[]{frequencyMax}); } private String turnFrequencyToString(Dosage dosage) { - var locale = this.getConfig().getLocale(); - var bundle = this.getResources(); var repeat = dosage.getTiming().getRepeat(); var frequency = repeat.getFrequency(); - var frequencyMsg = bundle.getString("fields.frequency"); - return new MessageFormat(frequencyMsg, locale).format(new Object[]{frequency}); + return frequencyMsg.format(new Object[]{frequency}); } } diff --git a/src/main/java/jy95/fhir/r4/dosage/utils/translators/MaxDosePerAdministration.java b/src/main/java/jy95/fhir/r4/dosage/utils/translators/MaxDosePerAdministration.java index 2d1db8f6f..eb8c40907 100644 --- a/src/main/java/jy95/fhir/r4/dosage/utils/translators/MaxDosePerAdministration.java +++ b/src/main/java/jy95/fhir/r4/dosage/utils/translators/MaxDosePerAdministration.java @@ -10,8 +10,13 @@ public class MaxDosePerAdministration extends AbstractTranslator { + // Translations + private final MessageFormat maxDosePerAdministrationMsg; + public MaxDosePerAdministration(FDUConfig config) { super(config); + String msg = getResources().getString("fields.maxDosePerAdministration"); + maxDosePerAdministrationMsg = new MessageFormat(msg, getConfig().getLocale()); } @Override @@ -21,10 +26,9 @@ public CompletableFuture convert(Dosage dosage) { return QuantityToString .convert(bundle, getConfig(), quantity) - .thenApplyAsync((quantityText) -> { - String msg = bundle.getString("fields.maxDosePerAdministration"); - return new MessageFormat(msg, getConfig().getLocale()).format(new Object[] { quantityText }); - }); + .thenApplyAsync( + (quantityText) -> maxDosePerAdministrationMsg.format(new Object[] { quantityText }) + ); } @Override diff --git a/src/main/java/jy95/fhir/r4/dosage/utils/translators/MaxDosePerLifetime.java b/src/main/java/jy95/fhir/r4/dosage/utils/translators/MaxDosePerLifetime.java index f203e3e5f..d98247482 100644 --- a/src/main/java/jy95/fhir/r4/dosage/utils/translators/MaxDosePerLifetime.java +++ b/src/main/java/jy95/fhir/r4/dosage/utils/translators/MaxDosePerLifetime.java @@ -10,8 +10,13 @@ public class MaxDosePerLifetime extends AbstractTranslator { + // Translations + private final MessageFormat maxDosePerLifetimeMsg; + public MaxDosePerLifetime(FDUConfig config) { super(config); + String msg = getResources().getString("fields.maxDosePerLifetime"); + maxDosePerLifetimeMsg = new MessageFormat(msg, getConfig().getLocale()); } @Override @@ -21,10 +26,7 @@ public CompletableFuture convert(Dosage dosage) { return QuantityToString .convert(bundle, getConfig(), quantity) - .thenApplyAsync((quantityText) -> { - String msg = bundle.getString("fields.maxDosePerLifetime"); - return new MessageFormat(msg, getConfig().getLocale()).format(new Object[] { quantityText }); - }); + .thenApplyAsync((quantityText) -> maxDosePerLifetimeMsg.format(new Object[] { quantityText })); } @Override diff --git a/src/main/java/jy95/fhir/r4/dosage/utils/translators/MaxDosePerPeriod.java b/src/main/java/jy95/fhir/r4/dosage/utils/translators/MaxDosePerPeriod.java index 35d2b72ad..88ff85657 100644 --- a/src/main/java/jy95/fhir/r4/dosage/utils/translators/MaxDosePerPeriod.java +++ b/src/main/java/jy95/fhir/r4/dosage/utils/translators/MaxDosePerPeriod.java @@ -10,8 +10,13 @@ public class MaxDosePerPeriod extends AbstractTranslator { + // Translations + private final MessageFormat maxDosePerPeriodMsg; + public MaxDosePerPeriod(FDUConfig config) { super(config); + String msg = getResources().getString("fields.maxDosePerPeriod"); + maxDosePerPeriodMsg = new MessageFormat(msg, getConfig().getLocale()); } @Override @@ -21,10 +26,7 @@ public CompletableFuture convert(Dosage dosage) { return RatioToString .convert(bundle, getConfig(), ratio) - .thenApplyAsync((ratioText) -> { - String msg = bundle.getString("fields.maxDosePerPeriod"); - return new MessageFormat(msg, getConfig().getLocale()).format(new Object[] { ratioText }); - }); + .thenApplyAsync((ratioText) -> maxDosePerPeriodMsg.format(new Object[] { ratioText })); } @Override diff --git a/src/main/java/jy95/fhir/r4/dosage/utils/translators/PeriodPeriodMax.java b/src/main/java/jy95/fhir/r4/dosage/utils/translators/PeriodPeriodMax.java index 18804ead3..427f49d0b 100644 --- a/src/main/java/jy95/fhir/r4/dosage/utils/translators/PeriodPeriodMax.java +++ b/src/main/java/jy95/fhir/r4/dosage/utils/translators/PeriodPeriodMax.java @@ -10,8 +10,18 @@ public class PeriodPeriodMax extends AbstractTranslator { + // Translations + private final MessageFormat periodMaxMsg; + private final MessageFormat periodMsg; + public PeriodPeriodMax(FDUConfig config) { super(config); + var locale = this.getConfig().getLocale(); + var bundle = this.getResources(); + var msg1 = bundle.getString("fields.periodMax"); + var msg2 = bundle.getString("fields.period"); + periodMaxMsg = new MessageFormat(msg1, locale); + periodMsg = new MessageFormat(msg2, locale); } @Override @@ -44,7 +54,6 @@ public boolean isPresent(Dosage dosage) { } private String turnPeriodAndPeriodMaxToString(Dosage dosage) { - var locale = this.getConfig().getLocale(); var bundle = this.getResources(); var repeat = dosage.getTiming().getRepeat(); @@ -52,7 +61,6 @@ private String turnPeriodAndPeriodMaxToString(Dosage dosage) { var periodMin = repeat.getPeriod(); var periodUnit = repeat.getPeriodUnit().toCode(); - var durationMsg = bundle.getString("fields.periodMax"); var unitMsg = bundle.getString("withoutCount." + periodUnit); var unitText = MessageFormat.format(unitMsg, periodMax); @@ -62,18 +70,16 @@ private String turnPeriodAndPeriodMaxToString(Dosage dosage) { "unit",unitText ); - return new MessageFormat(durationMsg, locale).format(arguments); + return periodMaxMsg.format(arguments); } private String turnPeriodToString(Dosage dosage) { - var locale = this.getConfig().getLocale(); var bundle = this.getResources(); var repeat = dosage.getTiming().getRepeat(); var period = repeat.getPeriod(); var periodUnit = repeat.getPeriodUnit().toCode(); - var durationMsg = bundle.getString("fields.period"); var unitMsg = bundle.getString("withoutCount." + periodUnit); var unitText = MessageFormat.format(unitMsg, period); @@ -82,7 +88,7 @@ private String turnPeriodToString(Dosage dosage) { "periodUnit",unitText ); - return new MessageFormat(durationMsg, locale).format(arguments); + return periodMsg.format(arguments); } } diff --git a/src/main/java/jy95/fhir/r4/dosage/utils/translators/RateQuantity.java b/src/main/java/jy95/fhir/r4/dosage/utils/translators/RateQuantity.java index c6b0ab37f..b7235e3fb 100644 --- a/src/main/java/jy95/fhir/r4/dosage/utils/translators/RateQuantity.java +++ b/src/main/java/jy95/fhir/r4/dosage/utils/translators/RateQuantity.java @@ -12,8 +12,13 @@ public class RateQuantity extends AbstractTranslator { + // Translations + private final MessageFormat rateQuantityMsg; + public RateQuantity(FDUConfig config) { super(config); + var doseMsg = getResources().getString("fields.rateQuantity"); + rateQuantityMsg = new MessageFormat(doseMsg, getConfig().getLocale()); } @Override @@ -25,10 +30,7 @@ public CompletableFuture convert(Dosage dosage) { .apply(doseAndRate, DoseAndRateKey.RATE_QUANTITY); return QuantityToString .convert(bundle, getConfig(), (Quantity) rateQuantity) - .thenApplyAsync(rateQuantityText -> { - var doseMsg = bundle.getString("fields.rateQuantity"); - return new MessageFormat(doseMsg, getConfig().getLocale()).format(new Object[]{rateQuantityText}); - }); + .thenApplyAsync(rateQuantityText -> rateQuantityMsg.format(new Object[]{rateQuantityText})); } @Override diff --git a/src/main/java/jy95/fhir/r4/dosage/utils/translators/RateRange.java b/src/main/java/jy95/fhir/r4/dosage/utils/translators/RateRange.java index 30cd4122c..77633b879 100644 --- a/src/main/java/jy95/fhir/r4/dosage/utils/translators/RateRange.java +++ b/src/main/java/jy95/fhir/r4/dosage/utils/translators/RateRange.java @@ -12,8 +12,13 @@ public class RateRange extends AbstractTranslator { + // Translations + private final MessageFormat rateRangeMsg; + public RateRange(FDUConfig config) { super(config); + var msg1 = getResources().getString("fields.rateRange"); + rateRangeMsg = new MessageFormat(msg1, getConfig().getLocale()); } @Override @@ -26,10 +31,7 @@ public CompletableFuture convert(Dosage dosage) { return RangeToString .convert(bundle, getConfig(), (Range) rateRange) - .thenApplyAsync(rateRatioText -> { - var doseRateMsg = bundle.getString("fields.rateRange"); - return new MessageFormat(doseRateMsg, getConfig().getLocale()).format(new Object[]{rateRatioText}); - }); + .thenApplyAsync(rateRatioText -> rateRangeMsg.format(new Object[]{rateRatioText})); } @Override diff --git a/src/main/java/jy95/fhir/r4/dosage/utils/translators/RateRatio.java b/src/main/java/jy95/fhir/r4/dosage/utils/translators/RateRatio.java index ce7ab0571..f17fe8bfc 100644 --- a/src/main/java/jy95/fhir/r4/dosage/utils/translators/RateRatio.java +++ b/src/main/java/jy95/fhir/r4/dosage/utils/translators/RateRatio.java @@ -12,8 +12,13 @@ public class RateRatio extends AbstractTranslator { + // Translations + private final MessageFormat rateRatioMsg; + public RateRatio(FDUConfig config) { super(config); + var msg = getResources().getString("fields.rateRatio"); + rateRatioMsg = new MessageFormat(msg, getConfig().getLocale()); } @Override @@ -26,10 +31,7 @@ public CompletableFuture convert(Dosage dosage) { return RatioToString .convert(bundle, getConfig(), (Ratio) rateRatio) - .thenApplyAsync(rateRatioText -> { - var doseRateMsg = bundle.getString("fields.rateRatio"); - return new MessageFormat(doseRateMsg, getConfig().getLocale()).format(new Object[]{rateRatioText}); - }); + .thenApplyAsync(rateRatioText -> rateRatioMsg.format(new Object[]{rateRatioText})); } @Override diff --git a/src/main/java/jy95/fhir/r4/dosage/utils/translators/TimeOfDay.java b/src/main/java/jy95/fhir/r4/dosage/utils/translators/TimeOfDay.java index 0cd87f85d..acb2a1e5c 100644 --- a/src/main/java/jy95/fhir/r4/dosage/utils/translators/TimeOfDay.java +++ b/src/main/java/jy95/fhir/r4/dosage/utils/translators/TimeOfDay.java @@ -14,8 +14,13 @@ public class TimeOfDay extends AbstractTranslator { + // Translations + private final MessageFormat timeOfDayMsg; + public TimeOfDay(FDUConfig config){ super(config); + var msg = getResources().getString("fields.timeOfDay"); + timeOfDayMsg = new MessageFormat(msg, this.getConfig().getLocale()); } @Override @@ -28,15 +33,13 @@ public CompletableFuture convert(Dosage dosage) { .toList(); var timeOfDaysAsString = ListToString.convert(bundle, timeOfDays); - var message = bundle.getString("fields.timeOfDay"); - MessageFormat messageFormat = new MessageFormat(message, this.getConfig().getLocale()); Map messageArguments = Map.of( "timeOfDay", timeOfDaysAsString, "count", timeOfDays.size() ); - return messageFormat.format(messageArguments); + return timeOfDayMsg.format(messageArguments); }); } diff --git a/src/main/java/jy95/fhir/r4/dosage/utils/translators/TimingEvent.java b/src/main/java/jy95/fhir/r4/dosage/utils/translators/TimingEvent.java index 14956f185..04260ac33 100644 --- a/src/main/java/jy95/fhir/r4/dosage/utils/translators/TimingEvent.java +++ b/src/main/java/jy95/fhir/r4/dosage/utils/translators/TimingEvent.java @@ -15,8 +15,13 @@ public class TimingEvent extends AbstractTranslator { + // Translations + private final MessageFormat eventMsg; + public TimingEvent(FDUConfig config) { super(config); + var msg = getResources().getString("fields.event"); + eventMsg = new MessageFormat(msg, this.getConfig().getLocale()); } @Override @@ -24,15 +29,11 @@ public CompletableFuture convert(Dosage dosage) { return CompletableFuture.supplyAsync(() -> { var bundle = this.getResources(); - var msg = bundle.getString("fields.event"); DateTimeType[] events = dosage.getTiming().getEvent().toArray(DateTimeType[]::new); List eventsList = FormatDateTimes.convert(this.getConfig().getLocale(), events); String eventsAsString = ListToString.convert(bundle, eventsList); - // Use ICU MessageFormat for more flexible and locale-sensitive formatting - MessageFormat messageFormat = new MessageFormat(msg, this.getConfig().getLocale()); - // Create a map of named arguments Map arguments = Map.of( "eventCondition", eventsList.size(), @@ -40,7 +41,7 @@ public CompletableFuture convert(Dosage dosage) { ); // Format the message with the named arguments - return messageFormat.format(arguments); + return eventMsg.format(arguments); }); }