From 669b7223f790d81744602efe6b0f495b5e5034d9 Mon Sep 17 00:00:00 2001 From: Kai Reinhard Date: Wed, 31 Oct 2018 23:42:59 +0100 Subject: [PATCH] #42: Date-Format in generated doc is ISO (Firefox) --- .../merlin/app/rest/TemplateRunnerRest.java | 8 +++- .../word/templating/TemplateRunContext.java | 46 ++++++++++++++++++- 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/merlin-app/src/main/java/de/reinhard/merlin/app/rest/TemplateRunnerRest.java b/merlin-app/src/main/java/de/reinhard/merlin/app/rest/TemplateRunnerRest.java index 949ead54..aded8365 100644 --- a/merlin-app/src/main/java/de/reinhard/merlin/app/rest/TemplateRunnerRest.java +++ b/merlin-app/src/main/java/de/reinhard/merlin/app/rest/TemplateRunnerRest.java @@ -2,6 +2,7 @@ import de.reinhard.merlin.app.json.JsonUtils; import de.reinhard.merlin.app.storage.Storage; +import de.reinhard.merlin.app.user.UserUtils; import de.reinhard.merlin.logging.MDCHandler; import de.reinhard.merlin.logging.MDCKey; import de.reinhard.merlin.persistency.PersistencyRegistry; @@ -9,6 +10,7 @@ import de.reinhard.merlin.word.WordDocument; import de.reinhard.merlin.word.templating.Template; import de.reinhard.merlin.word.templating.TemplateDefinition; +import de.reinhard.merlin.word.templating.TemplateRunContext; import de.reinhard.merlin.word.templating.WordTemplateRunner; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -18,6 +20,7 @@ import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; +import java.util.Map; @Path("/templates") public class TemplateRunnerRest { @@ -63,7 +66,10 @@ public Response runTemplate(String json) { try { WordDocument doc = WordDocument.load(path); WordTemplateRunner runner = new WordTemplateRunner(templateDefinition, doc); - WordDocument result = runner.run(data.getVariables()); + TemplateRunContext context = new TemplateRunContext(); + context.setLocale(UserUtils.getUserLocale()); + Map variables = context.convertVariables(data.getVariables(), templateDefinition); + WordDocument result = runner.run(variables); String filename = runner.createFilename(path.getFileName().toString(), data.getVariables()); byte[] byteArray = result.getAsByteArrayOutputStream().toByteArray(); Response.ResponseBuilder builder = Response.ok(byteArray); diff --git a/merlin-core/src/main/java/de/reinhard/merlin/word/templating/TemplateRunContext.java b/merlin-core/src/main/java/de/reinhard/merlin/word/templating/TemplateRunContext.java index 199ca5a6..a1290e1d 100644 --- a/merlin-core/src/main/java/de/reinhard/merlin/word/templating/TemplateRunContext.java +++ b/merlin-core/src/main/java/de/reinhard/merlin/word/templating/TemplateRunContext.java @@ -15,7 +15,9 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.HashMap; import java.util.Locale; +import java.util.Map; /** * For defining formats, such as number formats, date formats etc. @@ -26,6 +28,8 @@ public class TemplateRunContext { DateFormat dateFormatter; DateFormat[] dateFormatters; + DateFormat dateFormatterGerman; + Locale locale; private String excelDateFormatPattern; private I18n i18n; @@ -34,11 +38,12 @@ public TemplateRunContext() { i18n = CoreI18n.getDefault(); this.locale = Locale.getDefault(); dateFormatter = new SimpleDateFormat(DEFAULT_DATE_PATTERN); + dateFormatterGerman = new SimpleDateFormat("dd.MM.yyyy"); dateFormatters = new DateFormat[]{ new SimpleDateFormat("yyyy-MM-dd"), new SimpleDateFormat("d/M/yyyy"), new SimpleDateFormat("d/M/yy"), - new SimpleDateFormat("dd.MM.yyyy"), + dateFormatterGerman, new SimpleDateFormat("dd.MM.yy"), new SimpleDateFormat("d.M.yyyy"), new SimpleDateFormat("d.M.yy") @@ -46,6 +51,35 @@ public TemplateRunContext() { excelDateFormatPattern = DateFormatConverter.convert(locale, DEFAULT_DATE_PATTERN); } + /** + * Convert the values matching the user's locale. + * + * @param variables + * @param templateDefinition For getting definitions of variables. If not given, the parameter variables is returen unchanged. + * @return + */ + public Map convertVariables(Map variables, TemplateDefinition templateDefinition) { + if (templateDefinition == null) { + return variables; + } + Map result = new HashMap<>(); + for (Map.Entry entry : variables.entrySet()) { + String varname = entry.getKey(); + VariableDefinition variableDefinition = templateDefinition.getVariableDefinition(varname); + Object value = entry.getValue(); + if (variableDefinition != null) { + if (variableDefinition.getType() == VariableType.DATE) { + Date date = parseDate(value); + if (date != null) { + value = dateToString(date); + } + } + } + result.put(entry.getKey(), value); + } + return result; + } + /** * Default is "dd/MM/yyyy". * @@ -167,6 +201,15 @@ private Date parseDate(DateFormat dateFormatter, String val) { return null; } + public String dateToString(Date date) { + if (locale == null) { + return dateFormatter.format(date); + } else if (locale.getLanguage().equals("de")) { + return dateFormatterGerman.format(date); + } + return dateFormatter.format(date); + } + public static String getBooleanAsString(boolean value) { return value ? "X" : ""; } @@ -198,6 +241,7 @@ public I18n getI18n() { /** * Sets i18n and locale. If you want to use your own i18n, please call {@link #setI18n(I18n)} after {@link #setLocale(Locale)}. + * * @param locale */ public void setLocale(Locale locale) {