Skip to content

Commit e812e43

Browse files
committed
add getLocalMessage method
1 parent 78ef301 commit e812e43

6 files changed

Lines changed: 58 additions & 25 deletions

File tree

server/integration-test/src/test/java/com/oceanbase/odc/service/notification/helper/MessageTemplateProcessorTest.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,36 @@ public void testReplaceVariables_VariableNotExists_ReplaceEmptyString() {
6161

6262
Assert.assertEquals(expected, actual);
6363
}
64+
65+
@Test
66+
public void testGetLocalMessage_NullLocale_ReturnTemplate() {
67+
String template = "fake template";
68+
String message = MessageTemplateProcessor.getLocalMessage(null, template);
69+
Assert.assertEquals(template, message);
70+
}
71+
72+
@Test
73+
public void testGetLocalMessage_VariousLocale_Success() {
74+
Locale locale1 = new Locale("en", "US");
75+
String template1 = "${com.oceanbase.odc.builtin-resource.collaboration.environment.dev.name}";
76+
String message1 = MessageTemplateProcessor.getLocalMessage(locale1, template1);
77+
Assert.assertEquals("dev", message1);
78+
Locale locale2 = new Locale("zh", "TW");
79+
String template2 = "${com.oceanbase.odc.builtin-resource.collaboration.environment.dev.name}";
80+
String message2 = MessageTemplateProcessor.getLocalMessage(locale2, template2);
81+
Assert.assertEquals("開發", message2);
82+
Locale locale3 = new Locale("zh", "CN");
83+
String template3 = "${com.oceanbase.odc.builtin-resource.collaboration.environment.dev.name}";
84+
String message3 = MessageTemplateProcessor.getLocalMessage(locale3, template3);
85+
Assert.assertEquals("开发", message3);
86+
}
87+
88+
@Test
89+
public void testGetLocalMessage_NullTemplate_ReturnNull() {
90+
Locale locale = new Locale("zh", "CN");
91+
String template = null;
92+
String message = MessageTemplateProcessor.getLocalMessage(locale, template);
93+
Assert.assertEquals(null, message);
94+
}
95+
6496
}

server/odc-common/src/main/java/com/oceanbase/odc/common/i18n/I18nOutputSerializer.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@
1616
package com.oceanbase.odc.common.i18n;
1717

1818
import java.io.IOException;
19-
import java.util.HashMap;
2019
import java.util.Locale;
2120
import java.util.Map;
21+
import java.util.concurrent.ConcurrentHashMap;
2222
import java.util.regex.Matcher;
2323
import java.util.regex.Pattern;
2424

@@ -31,7 +31,7 @@
3131

3232
public class I18nOutputSerializer extends JsonSerializer<String> {
3333
private static final Pattern I18N_RESOURCE_PATTERN = Pattern.compile("\\$\\{([^{^}]*)\\}");
34-
private static final Map<Locale, Map<String, String>> MESSAGES_MAP = new HashMap<>();
34+
private static final Map<Locale, Map<String, String>> MESSAGES_MAP = new ConcurrentHashMap<>();
3535

3636
@Override
3737
public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
@@ -49,9 +49,8 @@ protected String convertString(String resource) {
4949
if (!matcher.find()) {
5050
return resource;
5151
}
52-
5352
Locale currentLocale = LocaleContextHolder.getLocale();
54-
MESSAGES_MAP.putIfAbsent(currentLocale, new HashMap<>());
53+
MESSAGES_MAP.putIfAbsent(currentLocale, new ConcurrentHashMap<>());
5554
int cursor = 0;
5655
while (matcher.find(cursor)) {
5756
String key = matcher.group();

server/odc-core/src/main/resources/i18n/BusinessMessages.properties

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -882,5 +882,3 @@ com.oceanbase.odc.PartitionPlanVariableKey.LAST_PARTITION_VALUE=The value of the
882882
com.oceanbase.odc.partitionplan.TimeDataType=Time type
883883
com.oceanbase.odc.partitionplan.NumberDataType=Number type
884884

885-
# DatabaseChangeTranslate:
886-
com.oceanbase.odc.DatabaseChangeTranslate.BATCH_NUMBER=batch no.

server/odc-service/src/main/java/com/oceanbase/odc/service/flow/task/MultipleDatabaseChangeRuntimeFlowableTask.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,10 @@
4949
import com.oceanbase.odc.service.flow.model.QueryFlowInstanceParams;
5050
import com.oceanbase.odc.service.flow.task.model.MultipleDatabaseChangeParameters;
5151
import com.oceanbase.odc.service.flow.task.model.MultipleDatabaseChangeTaskResult;
52-
import com.oceanbase.odc.service.flow.util.DescriptionGenerator;
5352
import com.oceanbase.odc.service.flow.util.FlowTaskUtil;
5453
import com.oceanbase.odc.service.iam.model.User;
5554
import com.oceanbase.odc.service.iam.util.SecurityContextUtils;
55+
import com.oceanbase.odc.service.notification.helper.MessageTemplateProcessor;
5656
import com.oceanbase.odc.service.task.TaskService;
5757

5858
import lombok.extern.slf4j.Slf4j;
@@ -339,10 +339,10 @@ private String generateDescription(Locale locale, DatabaseChangeDatabase databas
339339
String i18nKey = "com.oceanbase.odc.builtin-resource.multiple-async.sub-ticket.description";
340340
String description = I18n.translate(
341341
i18nKey,
342-
new Object[] {DescriptionGenerator.localEnvName(database.getEnvironment().getName(), locale),
342+
new Object[] {database.getEnvironment().getName(),
343343
flowInstanceId, batchId + 1,
344344
database.getDataSource().getName(), database.getName()},
345345
locale);
346-
return description;
346+
return MessageTemplateProcessor.getLocalMessage(locale, description);
347347
}
348348
}

server/odc-service/src/main/java/com/oceanbase/odc/service/flow/util/DescriptionGenerator.java

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,15 @@
1919
import java.util.Locale;
2020
import java.util.stream.Collectors;
2121

22-
import javax.validation.constraints.NotNull;
23-
2422
import org.springframework.context.i18n.LocaleContextHolder;
2523

26-
import com.oceanbase.odc.common.i18n.I18n;
2724
import com.oceanbase.odc.common.util.StringUtils;
2825
import com.oceanbase.odc.core.shared.constant.Symbols;
2926
import com.oceanbase.odc.core.shared.constant.TaskType;
3027
import com.oceanbase.odc.service.databasechange.model.DatabaseChangeDatabase;
3128
import com.oceanbase.odc.service.flow.model.CreateFlowInstanceReq;
3229
import com.oceanbase.odc.service.flow.task.model.MultipleDatabaseChangeParameters;
30+
import com.oceanbase.odc.service.notification.helper.MessageTemplateProcessor;
3331

3432
/**
3533
* @Author:tinker
@@ -39,30 +37,24 @@
3937
public class DescriptionGenerator {
4038

4139
public static void generateDescription(CreateFlowInstanceReq req) {
42-
Locale locale = LocaleContextHolder.getLocale();
4340
if (StringUtils.isEmpty(req.getDescription())) {
41+
Locale locale = LocaleContextHolder.getLocale();
4442
// descriptions is recommended for localization.Facilitate fuzzy query
4543
String descFormat = Symbols.LEFT_BRACKET.getLocalizedMessage() + "%s"
4644
+ Symbols.RIGHT_BRACKET.getLocalizedMessage() + "%s.%s";
4745
if (req.getTaskType() == TaskType.MULTIPLE_ASYNC) {
4846
MultipleDatabaseChangeParameters parameters = (MultipleDatabaseChangeParameters) req.getParameters();
4947
List<DatabaseChangeDatabase> databases = parameters.getDatabases();
5048
String description = databases.stream()
51-
.map(db -> String.format(descFormat, localEnvName(db.getEnvironment().getName(), locale),
49+
.map(db -> String.format(descFormat, db.getEnvironment().getName(),
5250
db.getDataSource().getName(), db.getName()))
5351
.collect(Collectors.joining(Symbols.COMMA.getLocalizedMessage()));
54-
req.setDescription(description);
52+
req.setDescription(MessageTemplateProcessor.getLocalMessage(locale, description));
5553
} else {
56-
req.setDescription(String.format(descFormat,
57-
localEnvName(req.getEnvironmentName(), locale), req.getConnectionName(),
58-
req.getDatabaseName()));
54+
req.setDescription(MessageTemplateProcessor.getLocalMessage(locale, String.format(descFormat,
55+
req.getEnvironmentName(), req.getConnectionName(),
56+
req.getDatabaseName())));
5957
}
6058
}
6159
}
62-
63-
public static String localEnvName(@NotNull String envName, @NotNull Locale locale) {
64-
String envKey = envName.substring(2, envName.length() - 1);
65-
return I18n.translate(envKey, null, envKey, locale);
66-
}
67-
6860
}

server/odc-service/src/main/java/com/oceanbase/odc/service/notification/helper/MessageTemplateProcessor.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.util.Locale;
2020
import java.util.Map;
2121
import java.util.Objects;
22+
import java.util.concurrent.ConcurrentHashMap;
2223

2324
import org.apache.commons.text.StringSubstitutor;
2425
import org.springframework.util.CollectionUtils;
@@ -32,7 +33,7 @@
3233
* @Description: []
3334
*/
3435
public class MessageTemplateProcessor {
35-
private static final Map<Locale, StringSubstitutor> LOCALE2SUBSTITUTOR = new HashMap<>();
36+
private static final Map<Locale, StringSubstitutor> LOCALE2SUBSTITUTOR = new ConcurrentHashMap<>();
3637

3738
public static String replaceVariables(final String template, Locale locale, final Map<String, String> variables) {
3839
if (StringUtils.isEmpty(template)) {
@@ -55,7 +56,18 @@ public static String replaceVariables(final String template, Locale locale, fina
5556
.setDisableSubstitutionInValues(true)
5657
.setVariableResolver(key -> copiedVariables.getOrDefault(key, ""));
5758
String message = sub.replace(template);
59+
message = getLocalMessage(locale, message);
60+
return message;
61+
}
5862

63+
/**
64+
* Localise the string containing '${key}'
65+
*
66+
* @param locale
67+
* @param message
68+
* @return
69+
*/
70+
public static String getLocalMessage(Locale locale, String message) {
5971
if (Objects.nonNull(locale)) {
6072
StringSubstitutor i18n =
6173
LOCALE2SUBSTITUTOR.computeIfAbsent(locale, l -> new StringSubstitutor(I18n.getAllMessages(l)));

0 commit comments

Comments
 (0)