From 1bdf0ec7f574f78888449e87870ac188507f1ce9 Mon Sep 17 00:00:00 2001 From: Murilo Rodrigues Date: Sun, 23 Sep 2012 16:21:06 -0300 Subject: [PATCH 2/2] ROO-3284: Localize messages on JSF Managed Beans Created a MessageFactory to retrieve formatted messages from ressource-bundle and used it to create FacesMessages on Managed Beans. --- .../roo/addon/jsf/JsfOperationsImpl.java | 3 +- .../jsf/managedbean/JsfManagedBeanMetadata.java | 24 +++--- .../roo/addon/jsf/MessageFactory-template.java | 90 ++++++++++++++++++++++ .../roo/addon/jsf/i18n/messages_de.properties | 6 +- .../roo/addon/jsf/i18n/messages_en.properties | 5 ++ .../roo/addon/jsf/i18n/messages_es.properties | 5 ++ 6 files changed, 120 insertions(+), 13 deletions(-) create mode 100644 addon-jsf/src/main/resources/org/springframework/roo/addon/jsf/MessageFactory-template.java diff --git a/addon-jsf/src/main/java/org/springframework/roo/addon/jsf/JsfOperationsImpl.java b/addon-jsf/src/main/java/org/springframework/roo/addon/jsf/JsfOperationsImpl.java index 9cebcaa..430bf81 100644 --- a/addon-jsf/src/main/java/org/springframework/roo/addon/jsf/JsfOperationsImpl.java +++ b/addon-jsf/src/main/java/org/springframework/roo/addon/jsf/JsfOperationsImpl.java @@ -278,7 +278,8 @@ public class JsfOperationsImpl extends AbstractOperations implements utilPackage); installBean("ViewExpiredExceptionExceptionHandler-template.java", utilPackage); - + installBean("MessageFactory-template.java", utilPackage); + if (fileManager.exists(typeLocationService .getPhysicalTypeCanonicalPath(managedBean, pathResolver.getFocusedPath(Path.SRC_MAIN_JAVA)))) { diff --git a/addon-jsf/src/main/java/org/springframework/roo/addon/jsf/managedbean/JsfManagedBeanMetadata.java b/addon-jsf/src/main/java/org/springframework/roo/addon/jsf/managedbean/JsfManagedBeanMetadata.java index 1bd0b16..bd022ab 100644 --- a/addon-jsf/src/main/java/org/springframework/roo/addon/jsf/managedbean/JsfManagedBeanMetadata.java +++ b/addon-jsf/src/main/java/org/springframework/roo/addon/jsf/managedbean/JsfManagedBeanMetadata.java @@ -175,6 +175,7 @@ public class JsfManagedBeanMetadata extends private JavaSymbolName entityName; private Set locatedFields; private String plural; + private JavaType messageFactory; public JsfManagedBeanMetadata( final String identifier, @@ -217,7 +218,8 @@ public class JsfManagedBeanMetadata extends beanName = annotationValues.getBeanName(); this.plural = plural; entityName = JavaSymbolName.getReservedWordSafeName(entity); - + messageFactory = new JavaType(destination.getPackage().getFullyQualifiedPackageName() + ".util.MessageFactory"); + final JavaSymbolName allEntitiesFieldName = new JavaSymbolName("all" + plural); final JavaType entityListType = getListType(entity); @@ -557,15 +559,15 @@ public class JsfManagedBeanMetadata extends if (governorHasMethod(methodName)) { return null; } - + builder.getImportRegistrationResolver().addImports(FACES_MESSAGE, - FACES_CONTEXT); + FACES_CONTEXT, messageFactory); final InvocableMemberBodyBuilder bodyBuilder = new InvocableMemberBodyBuilder(); bodyBuilder.appendFormalLine(removeMethod.getMethodCall() + ";"); removeMethod.copyAdditionsTo(builder, governorTypeDetails); bodyBuilder - .appendFormalLine("FacesMessage facesMessage = new FacesMessage(\"Successfully deleted\");"); + .appendFormalLine("FacesMessage facesMessage = MessageFactory.getMessage(\"label_successfully_deleted\", " + entityName + ");"); bodyBuilder .appendFormalLine("FacesContext.getCurrentInstance().addMessage(null, facesMessage);"); bodyBuilder.appendFormalLine("reset();"); @@ -649,9 +651,9 @@ public class JsfManagedBeanMetadata extends if (governorHasMethod(methodName, parameterType)) { return null; } - + builder.getImportRegistrationResolver().addImports(FACES_CONTEXT, - FACES_MESSAGE, PRIMEFACES_FILE_UPLOAD_EVENT); + FACES_MESSAGE, PRIMEFACES_FILE_UPLOAD_EVENT, messageFactory); final List parameterNames = Arrays .asList(new JavaSymbolName("event")); @@ -661,7 +663,7 @@ public class JsfManagedBeanMetadata extends + StringUtils.capitalize(fieldName) + "(event.getFile().getContents());"); bodyBuilder - .appendFormalLine("FacesMessage facesMessage = new FacesMessage(\"Successful\", event.getFile().getFileName() + \" is uploaded.\");"); + .appendFormalLine("FacesMessage facesMessage = MessageFactory.getMessage(\"message_successfully_uploaded\", event.getFile().getFileName());"); bodyBuilder .appendFormalLine("FacesContext.getCurrentInstance().addMessage(null, facesMessage);"); @@ -917,7 +919,7 @@ public class JsfManagedBeanMetadata extends } builder.getImportRegistrationResolver().addImports(FACES_MESSAGE, - PRIMEFACES_REQUEST_CONTEXT); + PRIMEFACES_REQUEST_CONTEXT, FACES_CONTEXT, messageFactory); final InvocableMemberBodyBuilder bodyBuilder = new InvocableMemberBodyBuilder(); bodyBuilder.appendFormalLine("String message = \"\";"); @@ -927,13 +929,13 @@ public class JsfManagedBeanMetadata extends bodyBuilder.indent(); bodyBuilder.appendFormalLine(mergeMethod.getMethodCall() + ";"); mergeMethod.copyAdditionsTo(builder, governorTypeDetails); - bodyBuilder.appendFormalLine("message = \"Successfully updated\";"); + bodyBuilder.appendFormalLine("message = \"message_successfully_updated\";"); bodyBuilder.indentRemove(); bodyBuilder.appendFormalLine("} else {"); bodyBuilder.indent(); bodyBuilder.appendFormalLine(persistMethod.getMethodCall() + ";"); persistMethod.copyAdditionsTo(builder, governorTypeDetails); - bodyBuilder.appendFormalLine("message = \"Successfully created\";"); + bodyBuilder.appendFormalLine("message = \"message_successfully_created\";"); bodyBuilder.indentRemove(); bodyBuilder.appendFormalLine("}"); bodyBuilder @@ -943,7 +945,7 @@ public class JsfManagedBeanMetadata extends bodyBuilder.appendFormalLine("context.execute(\"editDialogWidget.hide()\");"); bodyBuilder.appendFormalLine(""); bodyBuilder - .appendFormalLine("FacesMessage facesMessage = new FacesMessage(message);"); + .appendFormalLine("FacesMessage facesMessage = MessageFactory.getMessage(message, " + entityName + ");"); bodyBuilder .appendFormalLine("FacesContext.getCurrentInstance().addMessage(null, facesMessage);"); bodyBuilder.appendFormalLine("reset();"); diff --git a/addon-jsf/src/main/resources/org/springframework/roo/addon/jsf/MessageFactory-template.java b/addon-jsf/src/main/resources/org/springframework/roo/addon/jsf/MessageFactory-template.java new file mode 100644 index 0000000..b149b94 --- /dev/null +++ b/addon-jsf/src/main/resources/org/springframework/roo/addon/jsf/MessageFactory-template.java @@ -0,0 +1,90 @@ +package __PACKAGE__; + +import java.text.MessageFormat; +import java.util.Locale; +import java.util.MissingResourceException; +import java.util.ResourceBundle; + +import javax.faces.application.FacesMessage; +import javax.faces.context.FacesContext; + +public class MessageFactory { + + private static String DEFAULT_DETAIL_SUFFIX = "_detail"; + + private MessageFactory() {} + + public static FacesMessage getMessage(Locale locale, String messageId, FacesMessage.Severity severity, Object... params) { + FacesMessage facesMessage = getMessage(locale, messageId, params); + facesMessage.setSeverity(severity); + + return facesMessage; + } + + public static FacesMessage getMessage(String messageId, FacesMessage.Severity severity, Object... params) { + FacesMessage facesMessage = getMessage(getLocale(), messageId, params); + facesMessage.setSeverity(severity); + + return facesMessage; + } + + public static FacesMessage getMessage(String messageId, Object... params) { + FacesMessage facesMessage = getMessage(getLocale(), messageId, params); + + return facesMessage; + } + + public static FacesMessage getMessage(Locale locale, String messageId, Object... params) { + String summary = null; + String detail = null; + FacesContext context = FacesContext.getCurrentInstance(); + ResourceBundle bundle = context.getApplication().getResourceBundle(context, "messages"); + + try { + summary = getFormattedText(locale, bundle.getString(messageId), params); + } catch (MissingResourceException e) { + summary = messageId; + } + + try { + detail = getFormattedText(locale, bundle.getString(messageId + DEFAULT_DETAIL_SUFFIX), params); + } + catch (MissingResourceException e) { + // NoOp + } + + return new FacesMessage(summary, detail); + } + + private static String getFormattedText(Locale locale, String message, Object params[]) { + MessageFormat messageFormat = null; + + if (params == null || message == null) + return message; + + if (locale != null) + messageFormat = new MessageFormat(message, locale); + else + messageFormat = new MessageFormat(message); + + return messageFormat.format(params); + } + + private static Locale getLocale() { + Locale locale = null; + FacesContext facesContext = FacesContext.getCurrentInstance(); + + if (facesContext != null && facesContext.getViewRoot() != null) { + locale = facesContext.getViewRoot().getLocale(); + + if (locale == null) + locale = Locale.getDefault(); + } + else { + locale = Locale.getDefault(); + } + + return locale; + } +} + diff --git a/addon-jsf/src/main/resources/org/springframework/roo/addon/jsf/i18n/messages_de.properties b/addon-jsf/src/main/resources/org/springframework/roo/addon/jsf/i18n/messages_de.properties index 609f41c..4a1dbe9 100644 --- a/addon-jsf/src/main/resources/org/springframework/roo/addon/jsf/i18n/messages_de.properties +++ b/addon-jsf/src/main/resources/org/springframework/roo/addon/jsf/i18n/messages_de.properties @@ -19,4 +19,8 @@ label_view=Ansehen label_welcome_titlepane=Willkommen zu {0} label_welcome_text=Spring Roo bietet ein interaktives, leichtgewichtiges und vom Anwender anpassbares Tool, welches die schnelle Erstellung von performanten Enterprise Java Applikationen ermöglicht. label_yes=Ja - +message_successfully_created={0} erfolgreich erstellt +message_successfully_updated={0} erfolgreich aktualisiert +message_successfully_deleted={0} erfolgreich gelöscht +message_successfully_uploaded=Erfolgreich +message_successfully_uploaded_detail={0} ist hochgeladen. diff --git a/addon-jsf/src/main/resources/org/springframework/roo/addon/jsf/i18n/messages_en.properties b/addon-jsf/src/main/resources/org/springframework/roo/addon/jsf/i18n/messages_en.properties index 94f81ef..dc8e031 100755 --- a/addon-jsf/src/main/resources/org/springframework/roo/addon/jsf/i18n/messages_en.properties +++ b/addon-jsf/src/main/resources/org/springframework/roo/addon/jsf/i18n/messages_en.properties @@ -19,3 +19,8 @@ label_view=View label_welcome_titlepane=Welcome to {0} label_welcome_text=Spring Roo provides interactive, lightweight and user customizable tooling that enables rapid delivery of high performance enterprise Java applications. label_yes=Yes +message_successfully_created={0} successfully created +message_successfully_updated={0} successfully updated +message_successfully_deleted={0} successfully deleted +message_successfully_uploaded=Successful +message_successfully_uploaded_detail={0} is uploaded. \ No newline at end of file diff --git a/addon-jsf/src/main/resources/org/springframework/roo/addon/jsf/i18n/messages_es.properties b/addon-jsf/src/main/resources/org/springframework/roo/addon/jsf/i18n/messages_es.properties index 598ac19..01ea965 100755 --- a/addon-jsf/src/main/resources/org/springframework/roo/addon/jsf/i18n/messages_es.properties +++ b/addon-jsf/src/main/resources/org/springframework/roo/addon/jsf/i18n/messages_es.properties @@ -19,3 +19,8 @@ label_view=View label_welcome_titlepane=Bienvenido a {0} label_welcome_text=Spring Roo proporciona herramientas interactivas, ligeras y adaptables al usuario que permiten entregar rápidamente aplicaciones empresariales Java de alto rendimiento. label_yes=Sí +message_successfully_created={0} creado con éxito +message_successfully_updated={0} actualizado con éxito +message_successfully_deleted={0} borrado con éxito +message_successfully_uploaded=Éxito +message_successfully_uploaded_detail={0} se ha subido. \ No newline at end of file -- 1.7.11.msysgit.1