MessageFormatterMethod should detect and map SimpleNumber

Closes #43993

Fixes: java.lang.IllegalArgumentException: Cannot format given Object as a Number

freemarker.template.SimpleNumber was added as is, expected was freemarker.template.Number from java.text.NumberFormat::format

Signed-off-by: Felix Herbst <ofherbst@googlemail.com>
This commit is contained in:
Felix Herbst 2025-11-11 13:21:25 +01:00 committed by GitHub
parent ded372a57f
commit f9fd9bce9e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 21 additions and 4 deletions

View File

@ -19,6 +19,7 @@ package org.keycloak.theme.beans;
import static java.util.Optional.ofNullable;
import freemarker.template.SimpleNumber;
import freemarker.template.SimpleScalar;
import freemarker.template.TemplateMethodModelEx;
import freemarker.template.TemplateModelException;
@ -67,11 +68,14 @@ public class MessageFormatterMethod implements TemplateMethodModelEx {
private List<Object> resolve(List<Object> list) {
ArrayList<Object> result = new ArrayList<>();
for (Object item: list) {
if (item instanceof SimpleScalar) {
item = ((SimpleScalar) item).getAsString();
if (item instanceof SimpleScalar scalar) {
item = scalar.getAsString();
} else if (item instanceof SimpleNumber number) {
item = number.getAsNumber();
}
if (item instanceof String) {
result.add(TemplatingUtil.resolveVariables((String) item, messages));
if (item instanceof String string) {
result.add(TemplatingUtil.resolveVariables(string, messages));
} else {
result.add(item);
}

View File

@ -17,6 +17,8 @@
package org.keycloak.theme.beans;
import freemarker.template.SimpleNumber;
import freemarker.template.SimpleScalar;
import freemarker.template.TemplateModelException;
import org.junit.Assert;
import org.junit.Test;
@ -40,6 +42,7 @@ public class MessageFormatterMethodTest {
properties.setProperty("backToClient", "Back to {0}");
properties.setProperty("client_admin-console", "Admin Console");
properties.setProperty("realm_example-realm", "Example Realm");
properties.setProperty("key", "foo {0,choice,0#foo|1#bar|1<{0} foobar} bar");
MessageFormatterMethod fmt = new MessageFormatterMethod(locale, properties);
@ -52,5 +55,15 @@ public class MessageFormatterMethodTest {
msg = (String) fmt.exec(Arrays.asList("backToClient", "client '${client_admin-console}' from '${realm_example-realm}'."));
Assert.assertEquals("Back to client 'Admin Console' from 'Example Realm'.", msg);
msg = (String) fmt.exec(Arrays.asList(new SimpleScalar("key"),new SimpleNumber(0)));
Assert.assertEquals("foo foo bar", msg);
msg = (String) fmt.exec(Arrays.asList(new SimpleScalar("key"),new SimpleNumber(1)));
Assert.assertEquals("foo bar bar", msg);
msg = (String) fmt.exec(Arrays.asList(new SimpleScalar("key"),new SimpleNumber(2)));
Assert.assertEquals("foo 2 foobar bar", msg);
}
}