package com.floreysoft.jmte.message;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;
import com.floreysoft.jmte.Engine;
import com.floreysoft.jmte.token.Token;
public class ResourceBundleMessage implements Message {
protected static String getTemplate(ResourceBundle bundle, String key,
String fallback) {
return key != null && bundle.containsKey(key) ? bundle.getString(key)
: fallback;
}
private final String messageCode;
public ResourceBundleMessage(String messageCode) {
this.messageCode = messageCode;
}
private String locationCode = "location";
private String prefixCode = "prefix";
private String frameCode = "frame";
private Map<String, Object> argumentModel = new HashMap<String, Object>();
private String baseName = "com.floreysoft.jmte.message.messages";
public ResourceBundleMessage useLocationCode(String locationCode) {
this.locationCode = locationCode;
return this;
}
public ResourceBundleMessage onToken(Token token) {
this.argumentModel.put("token", token);
return this;
}
public ResourceBundleMessage usePrefixCode(String prefixCode) {
this.prefixCode = prefixCode;
return this;
}
public ResourceBundleMessage useFrameCode(String frameCode) {
this.frameCode = frameCode;
return this;
}
public ResourceBundleMessage withModel(Map<String, Object> model) {
if (model != null) {
this.argumentModel.putAll(model);
}
return this;
}
public ResourceBundleMessage withBaseName(String baseName) {
this.baseName = baseName;
return this;
}
public String getMessageCode() {
return messageCode;
}
public String getLocationCode() {
return locationCode;
}
public String getPrefixCode() {
return prefixCode;
}
public String getFrameCode() {
return frameCode;
}
public Map<String, Object> getArgumentModel() {
return argumentModel;
}
public String getBaseName() {
return baseName;
}
@Override
public String format() {
return format(new Locale("en"));
}
@Override
public String format(Locale locale) {
final ResourceBundle messages = ResourceBundle.getBundle(baseName, locale);
final String frameTemplate = getTemplate(messages, frameCode, "${prefix} ${location}: ${message}");
final String prefixTemplate = getTemplate(messages, prefixCode, "");
final String locationTemplate = getTemplate(messages, locationCode, "");
final String messageTemplate = getTemplate(messages, messageCode, "");
Engine engine = new Engine();
engine.setErrorHandler(new InternalErrorHandler());
argumentModel.put("prefix", engine.transform(prefixTemplate, argumentModel));
argumentModel.put("location", engine.transform(locationTemplate, argumentModel));
argumentModel.put("message", engine.transform(messageTemplate, argumentModel));
String transformed = engine.transform(frameTemplate, argumentModel);
return transformed;
}
@Override
public String formatPlain() {
return formatPlain(new Locale("en"));
}
@Override
public String formatPlain(Locale locale) {
final ResourceBundle messages = ResourceBundle.getBundle(baseName, locale);
final String messageTemplate = getTemplate(messages, messageCode, "");
Engine engine = new Engine();
engine.setErrorHandler(new InternalErrorHandler());
String transformed = engine.transform(messageTemplate, argumentModel);
return transformed;
}
}