From cfe120d4f861263ab15cfd55c0cfcf622ba0597a Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Sun, 8 Dec 2024 12:56:34 +0900 Subject: [PATCH] =?UTF-8?q?EL=E5=BC=8F=E3=80=81=E5=A4=89=E6=95=B0=E3=81=AE?= =?UTF-8?q?=E3=81=A8=E3=81=8D=E3=81=AE=E5=86=8D=E5=B8=B0=E8=A9=95=E4=BE=A1?= =?UTF-8?q?=E3=82=92=E5=89=8A=E9=99=A4=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../localization/MessageInterpolator.java | 72 ++----------------- .../localization/MessageInterpolatorTest.java | 31 ++++---- .../SheetValidationMessages.properties | 3 + 3 files changed, 21 insertions(+), 85 deletions(-) diff --git a/src/main/java/com/gh/mygreen/xlsmapper/localization/MessageInterpolator.java b/src/main/java/com/gh/mygreen/xlsmapper/localization/MessageInterpolator.java index a1cfe7f3..d7392e52 100644 --- a/src/main/java/com/gh/mygreen/xlsmapper/localization/MessageInterpolator.java +++ b/src/main/java/com/gh/mygreen/xlsmapper/localization/MessageInterpolator.java @@ -48,16 +48,6 @@ public MessageInterpolator() { } - /** - * EL式のときは再帰的評価するかどうか。 - */ - private boolean recursiveForEl = false; - - /** - * リソースファイルのキーを除く変数のときは再帰的評価するかどうか。 - */ - private boolean recursiveForVar = false; - /** * 再帰処理の最大回数 */ @@ -216,14 +206,10 @@ private String evaluate(final String expression, final Map values, fi final String varName = expression.substring(1, expression.length()-1); if(values.containsKey(varName)) { - // 該当するキーが存在する場合 + // 該当するキーが存在する場合(再帰評価は行わない) final Object value = values.get(varName); final String eval = (value == null) ? "" : value.toString(); - if(!eval.isEmpty() && recursivable(recursive && recursiveForVar, maxRecursiveDepth, currentRecursiveDepth, eval)) { - return parse(eval, values, recursive, currentRecursiveDepth + 1, messageResolver); - } else { - return eval; - } + return eval; } else if(messageResolver != null) { // メッセージコードをとして解決をする。 @@ -245,14 +231,10 @@ private String evaluate(final String expression, final Map values, fi } } else if(expression.startsWith("${")) { - // EL式で処理する + // EL式を評価する(再帰評価は行わない) final String expr = expression.substring(2, expression.length()-1); final String eval = evaluateExpression(expr, values); - if(recursivable(recursive && recursiveForEl, maxRecursiveDepth, currentRecursiveDepth, eval)) { - return parse(eval, values, recursive, currentRecursiveDepth + 1, messageResolver); - } else { - return eval; - } + return eval; } @@ -335,52 +317,6 @@ public void setExpressionLanguage(ExpressionLanguage expressionLanguage) { this.expressionLanguage = expressionLanguage; } - /** - * EL式の場合は再帰的評価するか判定する。 - * - * @since 2.3 - * @return {@literal true}のとき再帰的評価する。 - */ - public boolean isRecursiveForEl() { - return recursiveForEl; - } - - /** - * EL式の場合は再帰的評価するかどうか設定する。 - *

入力値などの任意の値がEL式(${...})の形式の場合、 - * 不要に再帰的に評価されてELインジェクションが発生してしまうのを防ぐために設定します。 - *

デフォルト値は、{@literal false} で再帰的に評価しない。 - * - * @since 2.3 - * @param recursiveForEl {@literal true} のとき再帰的評価する。 - */ - public void setRecursiveForEl(boolean recursiveForEl) { - this.recursiveForEl = recursiveForEl; - } - - /** - * リソースファイルのキーを除く変数を再帰的に評価するかどうか判定する。 - * - * @since 2.3 - * @return {@literal true}のとき再帰的に評価する。 - */ - public boolean isRecursiveForVar() { - return recursiveForVar; - } - - /** - * リソースファイルのキーを除く変数を再帰的評価するかどうか設定する。 - *

入力値などの任意の値が変数({...})の形式の場合、 - * 不要に再帰的に評価されてELインジェクションが発生してしまうのを防ぐために設定します。 - *

デフォルト値は、{@literal false} で再帰的に評価しない。 - * - * @since 2.3 - * @param recursiveForVar {@literal true} のとき再帰的評価する。 - */ - public void setRecursiveForVar(boolean recursiveForVar) { - this.recursiveForVar = recursiveForVar; - } - /** * 評価した変数やEL式を再帰的に処するときの最大回数を取得します。 * diff --git a/src/test/java/com/gh/mygreen/xlsmapper/localization/MessageInterpolatorTest.java b/src/test/java/com/gh/mygreen/xlsmapper/localization/MessageInterpolatorTest.java index cbad26e3..31577ada 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/localization/MessageInterpolatorTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/localization/MessageInterpolatorTest.java @@ -4,6 +4,7 @@ import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; +import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.Map; @@ -20,6 +21,8 @@ */ public class MessageInterpolatorTest { + private MessageResolver testMessageResolver = new ResourceBundleMessageResolver(); + /** * 変数のみ - EL式なし */ @@ -156,13 +159,12 @@ public void testInterpolate_lack_end() { /** * 再起的にメッセージを評価する。 * 変数の再起 + * ※v2.3からは、ELインジェクション対策のため変数は再帰的評価は行わない。 */ @Test public void testInterpolate_recursive_vars() { MessageInterpolator interpolator = new MessageInterpolator(); - interpolator.setRecursiveForVar(true); - interpolator.setRecursiveForEl(true); String message = "{abc} : {message}"; @@ -170,19 +172,19 @@ public void testInterpolate_recursive_vars() { vars.put("message", "${1+2}"); String actual = interpolator.interpolate(message, vars, true); - assertThat(actual, is("{abc} : 3")); + assertThat(actual, is("{abc} : ${1+2}")); } /** * 再起的にメッセージを評価する。 * 式の再起 + * ※v2.3からは、ELインジェクション対策のためEL式は再帰的評価は行わない。 */ @Test public void testInterpolate_recursive_el() { MessageInterpolator interpolator = new MessageInterpolator(); - interpolator.setRecursiveForEl(true); String message = "{abc} : ${value}"; @@ -191,7 +193,7 @@ public void testInterpolate_recursive_el() { vars.put("min", 3); String actual = interpolator.interpolate(message, vars, true); - assertThat(actual, is("{abc} : 3")); + assertThat(actual, is("{abc} : {min}")); } @@ -203,20 +205,17 @@ public void testInterpolate_recursive_el() { public void testInterpolate_recursive_maxDepth() { MessageInterpolator interpolator = new MessageInterpolator(); - interpolator.setRecursiveForVar(true); - String message = "{abc} : {value}"; + String message = "{abc} : {testRecursive.value}"; // depth2 { interpolator.setMaxRecursiveDepth(2); - Map vars = new HashMap<>(); - vars.put("value", "{min}"); - vars.put("min", "{value}"); + Map vars = Collections.emptyMap(); - String actual = interpolator.interpolate(message, vars, true); - assertThat(actual, is("{abc} : {value}")); + String actual = interpolator.interpolate(message, vars, true, testMessageResolver); + assertThat(actual, is("{abc} : {testRecursive.value}")); } @@ -224,12 +223,10 @@ public void testInterpolate_recursive_maxDepth() { { interpolator.setMaxRecursiveDepth(3); - Map vars = new HashMap<>(); - vars.put("value", "{min}"); - vars.put("min", "{value}"); + Map vars = Collections.emptyMap(); - String actual = interpolator.interpolate(message, vars, true); - assertThat(actual, is("{abc} : {min}")); + String actual = interpolator.interpolate(message, vars, true, testMessageResolver); + assertThat(actual, is("{abc} : {testRecursive.min}")); } diff --git a/src/test/resources/SheetValidationMessages.properties b/src/test/resources/SheetValidationMessages.properties index 197f67ba..eac8689d 100644 --- a/src/test/resources/SheetValidationMessages.properties +++ b/src/test/resources/SheetValidationMessages.properties @@ -12,3 +12,6 @@ sample.web.validator.hibernatevalidator.DateRange.message=値を{min}~{max}の ## cellFieldError.pattern.list.email=メールアドレスの書式に一致しません。 +# 再帰用のテスト +testRecursive.value={testRecursive.min} +testRecursive.min={testRecursive.value}