| package org.bouncycastle.i18n; |
| |
| import java.text.DateFormat; |
| import java.text.Format; |
| import java.text.MessageFormat; |
| import java.util.Locale; |
| import java.util.MissingResourceException; |
| import java.util.ResourceBundle; |
| import java.util.TimeZone; |
| |
| import org.bouncycastle.i18n.filter.Filter; |
| import org.bouncycastle.i18n.filter.UntrustedInput; |
| |
| public class LocalizedMessage |
| { |
| |
| protected final String id; |
| protected final String resource; |
| |
| protected Object[] arguments; |
| protected Object[] filteredArguments; |
| |
| protected Filter filter = null; |
| |
| /** |
| * Constructs a new LocalizedMessage using <code>resource</code> as the base name for the |
| * RessourceBundle and <code>id</code> as the message bundle id the resource file. |
| * @param resource base name of the resource file |
| * @param id the id of the corresponding bundle in the resource file |
| * @throws NullPointerException if <code>resource</code> or <code>id</code> is <code>null</code> |
| */ |
| public LocalizedMessage(String resource,String id) throws NullPointerException |
| { |
| if (resource == null || id == null) |
| { |
| throw new NullPointerException(); |
| } |
| this.id = id; |
| this.resource = resource; |
| this.arguments = new Object[0]; |
| this.filteredArguments = arguments; |
| } |
| |
| /** |
| * Constructs a new LocalizedMessage using <code>resource</code> as the base name for the |
| * RessourceBundle and <code>id</code> as the message bundle id the resource file. |
| * @param resource base name of the resource file |
| * @param id the id of the corresponding bundle in the resource file |
| * @param arguments an array containing the arguments for the message |
| * @throws NullPointerException if <code>resource</code> or <code>id</code> is <code>null</code> |
| */ |
| public LocalizedMessage(String resource, String id, Object[] arguments) throws NullPointerException |
| { |
| if (resource == null || id == null || arguments == null) |
| { |
| throw new NullPointerException(); |
| } |
| this.id = id; |
| this.resource = resource; |
| this.arguments = arguments; |
| this.filteredArguments = arguments; |
| } |
| |
| /** |
| * Reads the entry <code>id + "." + key</code> from the resource file and returns a |
| * formated message for the given Locale and TimeZone. |
| * @param key second part of the entry id |
| * @param loc the used {@link Locale} |
| * @param timezone the used {@link TimeZone} |
| * @return a Strng containing the localized message |
| * @throws MissingEntryException if the resource file is not available or the entry does not exist. |
| */ |
| public String getEntry(String key,Locale loc, TimeZone timezone) throws MissingEntryException |
| { |
| String entry = id + "." + key; |
| |
| try |
| { |
| ResourceBundle bundle = ResourceBundle.getBundle(resource,loc); |
| String template = bundle.getString(entry); |
| if (arguments == null || arguments.length == 0) |
| { |
| return template; |
| } |
| else |
| { |
| return formatWithTimeZone(template,filteredArguments,loc,timezone); |
| } |
| } |
| catch (MissingResourceException mre) |
| { |
| throw new MissingEntryException("Can't find entry " + entry + " in resource file " + resource + ".", |
| resource, |
| entry); |
| } |
| } |
| |
| protected String formatWithTimeZone( |
| String template, |
| Object[] arguments, |
| Locale locale, |
| TimeZone timezone) |
| { |
| MessageFormat mf = new MessageFormat(" "); |
| mf.setLocale(locale); |
| mf.applyPattern(template); |
| if (!timezone.equals(TimeZone.getDefault())) |
| { |
| Format[] formats = mf.getFormats(); |
| for (int i = 0; i < formats.length; i++) |
| { |
| if (formats[i] instanceof DateFormat) |
| { |
| DateFormat temp = (DateFormat) formats[i]; |
| temp.setTimeZone(timezone); |
| mf.setFormat(i,temp); |
| } |
| } |
| } |
| return mf.format(arguments); |
| } |
| |
| /** |
| * Sets the {@link Filter} that is used to filter the arguments of this message |
| * @param filter the {@link Filter} to use. <code>null</code> to disable filtering. |
| */ |
| public void setFilter(Filter filter) |
| { |
| if (filter == null) |
| { |
| filteredArguments = arguments; |
| } |
| else if (!filter.equals(this.filter)) |
| { |
| filteredArguments = new Object[arguments.length]; |
| for (int i = 0; i < arguments.length; i++) |
| { |
| if (arguments[i] instanceof UntrustedInput) |
| { |
| filteredArguments[i] = filter.doFilter(((UntrustedInput) arguments[i]).getString()); |
| } |
| else |
| { |
| filteredArguments[i] = arguments[i]; |
| } |
| } |
| } |
| this.filter = filter; |
| } |
| |
| /** |
| * Returns the current filter. |
| * @return the current filter |
| */ |
| public Filter getFilter() |
| { |
| return filter; |
| } |
| |
| /** |
| * Returns the id of the message in the resource bundle. |
| * @return the id of the message |
| */ |
| public String getId() |
| { |
| return id; |
| } |
| |
| /** |
| * Returns the name of the resource bundle for this message |
| * @return name of the resource file |
| */ |
| public String getResource() |
| { |
| return resource; |
| } |
| |
| /** |
| * Returns an <code>Object[]</code> containing the message arguments. |
| * @return the message arguments |
| */ |
| public Object[] getArguments() |
| { |
| return arguments; |
| } |
| |
| } |