package restx.i18n.admin;
import restx.admin.AdminModule;
import restx.annotations.GET;
import restx.annotations.POST;
import restx.annotations.RestxResource;
import restx.factory.Component;
import restx.i18n.Messages;
import restx.i18n.MutableMessages;
import restx.i18n.SupportedLocale;
import restx.security.RolesAllowed;
import javax.inject.Named;
import java.io.IOException;
import java.util.*;
/**
* Date: 25/1/14
* Time: 16:34
*/
@RestxResource(group = "restx-admin")
@Component
public class MessagesAdminResource {
private final Messages messages;
private final Collection<SupportedLocale> supportedLocales;
public MessagesAdminResource(@Named("Messages") Messages messages, Collection<SupportedLocale> supportedLocales) {
this.messages = messages;
this.supportedLocales = supportedLocales;
}
@RolesAllowed(AdminModule.RESTX_ADMIN_ROLE)
@GET("/@/i18n/keys")
public Iterable<String> keys() {
return messages.keys();
}
@RolesAllowed(AdminModule.RESTX_ADMIN_ROLE)
@GET("/@/i18n/locales")
public Iterable<String> locales() {
Collection<String> locales = new ArrayList<>();
for (SupportedLocale supportedLocale : supportedLocales) {
String tag = supportedLocale.getLocale().toLanguageTag();
locales.add(Locale.ROOT.toLanguageTag().equals(tag) ? "/" : tag);
}
return locales;
}
@RolesAllowed(AdminModule.RESTX_ADMIN_ROLE)
@GET("/@/i18n/messages/{locale}")
public Map<String, String> messages(String locale) {
Locale l = toLocale(locale);
Map<String, String> m = new LinkedHashMap<>();
for (String key : messages.keys()) {
m.put(key, messages.getMessageTemplate(key, l));
}
return m;
}
@RolesAllowed(AdminModule.RESTX_ADMIN_ROLE)
@POST("/@/i18n/messages/{locale}")
public void setMessage(String locale, Map<String, String> entries) {
if (!(messages instanceof MutableMessages)) {
throw new IllegalStateException(
"can't update messages: not a MutableMessages instance. Are you in PROD mode?");
}
try {
for (Map.Entry<String, String> entry : entries.entrySet()) {
((MutableMessages) messages).setMessageTemplate(
entry.getKey(), entry.getValue(), toLocale(locale));
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
protected Locale toLocale(String locale) {
return "/".equals(locale) ? Locale.ROOT : Locale.forLanguageTag(locale);
}
}